如何部署nestjs与nuxtjs到linux服务器
NuxtJs
NuxtJs打包部署到服务器有两种方式,一种是常规的SSR,还有一种就是像Vue一样构建一个SPA应用。
SPA
项目设置
Nuxt也可以打包为一个spa应用
nuxt.config.ts:
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
ssr: false,
})
将配置项中的ssr设置为false即可。
package.json
"scripts": {
"generate": "nuxt generate --dotenv .env.production",
"generate:test": "nuxt generate --dotenv .env.test",
}
此时在根目录会输出 .output/public
进入目录,就能看到很多的静态资源,把.output/public目录下的文件全部上传到服务器上,然后使用nginx作为web服务器
Nginx配置
server
{
listen 80;
listen 443 ssl http2;
server_name chh.hometownjs.top;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/chh.hometownjs.top;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
ssl_certificate /www/server/panel/vhost/cert/chh.hometownjs.top/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/chh.hometownjs.top/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-00.conf;
#PHP-INFO-END
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/chh.hometownjs.top.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
#禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location / {
client_max_body_size 1000m;
client_body_buffer_size 1m;
root /www/wwwroot/chh.hometownjs.top/fe;
index index.html index.htm;
try_files $uri $uri/ /fe/index.html;
}
access_log /www/wwwlogs/chh.hometownjs.top.log;
error_log /www/wwwlogs/chh.hometownjs.top.error.log;
}
SSR
SSR的形式需要将整个项目传输到服务器上,然后安装依赖,使用pm2启动服务,也可以使用Docker进行部署。
NestJs
NestJs的部署也有两种方式,一种是常规的node pm2部署,还有一种是docker进行部署,我推荐使用docker,虽然慢,但是当服务器上存在多个node项目,并且对node版本有强要求的时候,可以有效的做到环境的隔离。
项目配置
我比较喜欢用Docker进行部署,所以这里就不介绍pm2了,pm2的方式就是正常的部署node服务。
docker-compose.yml:
这里因为还没使用到mysql 与 redies,所以还没配置,后续使用到了再加
version: "3.0"
services:
app:
build: # 根据Dockerfile构建镜像
context: .
dockerfile: Dockerfile
ports:
- 3333:3333
Dockerfile:
FROM node:latest
# 设置时区
ENV TZ=Asia/Shanghai \
DEBIAN_FRONTEND=noninteractive
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime && echo ${TZ} > /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata && rm -rf /var/lib/apt/lists/*
RUN mkdir -p /app
WORKDIR /app
COPY package.json pnpm-lock.yaml /app/
RUN npm install -g pnpm
RUN pnpm install
COPY . /app/
EXPOSE 3000
CMD ["pnpm", "start:prod"]
Docker
通过Docker部署也有很多方式,比如在本地构建好镜像,传输到服务器中,然后在服务器上构建容器。
还有一种就是将NestJs项目本身上传到服务器上,不需要上传node_modules,其他的上传。
上传完了以后进入到服务器中,进入项目根目录执行:
docker-compose up
Docker 相关命令
# 查看所有容器
docker ps -a
# 启动一个已停止的容器
docker start 容器id
# 停止一个容器
docker stop 容器id
# 重启容器
docker restart 容器id
# 初次启动时
docker run -itd --name <容器名> <镜像名> /bin/bash
# 进入容器
docker exec -it 容器id /bin/bash
# 导出容器
docker export 容器id > 容器名.tar
# 导入容器 镜像
cat docker/容器名.tar | docker import - test/容器名
# 删除容器
docker rm -f 容器id
Nginx 配置
server
{
listen 80;
listen 443 ssl http2;
server_name chh.hometownjs.top;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/chh.hometownjs.top;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
ssl_certificate /www/server/panel/vhost/cert/chh.hometownjs.top/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/chh.hometownjs.top/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-00.conf;
#PHP-INFO-END
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/chh.hometownjs.top.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
#禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location / {
client_max_body_size 1000m;
client_body_buffer_size 1m;
root /www/wwwroot/chh.hometownjs.top/fe;
index index.html index.htm;
try_files $uri $uri/ /fe/index.html;
}
location /api {
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $http_x_real_ip; #$remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 128m;
client_body_buffer_size 128k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_pass http://localhost:3333;
}
access_log /www/wwwlogs/chh.hometownjs.top.log;
error_log /www/wwwlogs/chh.hometownjs.top.error.log;
}