cover
项目部署 #docker #部署 #node

前后端(node)项目部署流程

Asea
2022-11-18 18

已经部署过很多个项目了,但每次都有些问题,所以打算做个记录

# 前端

# 上传

# 脚本

可以通过FileZillia等ssh工具上传,也可以通过脚本(后续更新常用这个)上传

scp -r ./dist/* root@你的IP:/usr/local/vue/某个文件夹

# 自动创建文件夹

如果当前文件夹不存在的话会报错,你可以在FileZillia手动创建,或者使用下面的命令:

# 首先检查文件夹是否存在
ssh root@你的IP "[ -d /usr/local/vue/某个文件夹 ] && echo ok || mkdir -p /usr/local/vue/某个文件夹"
scp -r ./dist/* root@你的IP:/usr/local/vue/某个文件夹

# 免密

scp每次都需要输入密码,可以设置免密

  1. 在A中执行命令:

    ssh-keygen -t rsa -P ""
    

这会在 ~/.ssh 目录下生成两个文件:id_rsa 和 id_rsa.pub

  1. 在A中执行命令,拷贝A的id_rsa.pub到B(具体路径根据windos和linux做调整):

    scp /.ssh/id_rsa.pub root@你的IP:/root/.ssh
    
  2. 在B中执行命令,把id_rsa.pub输入到B的authorized_keys文件中:

    cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
    

# Nginx

# 配置

这里贴一下常用的配置,可以自己根据需要做调整

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    client_max_body_size     50m;
    client_body_buffer_size  10m; 	  
    client_header_timeout    1m;
    client_body_timeout      1m;

    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_comp_level  4;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    
    # http
    server {
        listen       80;
        server_name  域名;

        location / {
            root   /usr/local/vue/test;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }

        location ^~ /api/ {
            proxy_pass http://IP:端口/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            rewrite  ^/api/(.*)$ /$1 break;
        }
    }
    
    # https
    server {
        listen  443 ssl;
        server_name  域名;

        # ssl on;
        ssl_certificate    /usr/local/nginx/cert/test.com_bundle.pem; # 需要配置证书
        ssl_certificate_key  /usr/local/nginx/cert/test.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
            root   /usr/local/vue/test;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }

        location ^~ /list {
            proxy_pass http://IP:端口/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            rewrite  ^/list/(.*)$ /$1 break;
        }
    }
    
    # http + socket.io
    server {
        listen       80;
        server_name  域名;

        location / {
                root   /usr/local/vue/test;
                index  index.html index.htm;
                try_files $uri $uri/ /index.html;
            }

            location ^~ /socket.io/ {
                proxy_pass http://1.15.113.60:30010/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
            }
            location ^~ /upload/ {
                proxy_pass http://1.15.113.60:30010/;
            }
    }
    
    # https + socket.io
    server {
        listen  443 ssl;
        server_name  域名;

        # ssl on;
        ssl_certificate    /usr/local/nginx/cert/test.com_bundle.pem;
        ssl_certificate_key  /usr/local/nginx/cert/test.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
            root   /usr/local/vue/test;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }

        location ^~ /socket.io/ {
            proxy_pass http://124.221.154.52:5000; # 这里不能加/
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_http_version 1.1;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
        }
    }
}

# https证书

去腾讯云申请免费证书

# 启动

启动nginx就不说了,因为我直接

docker restart nginx

# 后端

# Dockerfile

类似,先上传,然后编写dockerfile

FROM node # # FROM 表示设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载
WORKDIR /home/backend/meeting # RUN的工作目录
COPY . /home/backend/meeting # 复制到容器内的目录
RUN npm config set registry https://registry.npm.taobao.org # 换源
RUN npm i  # 安装包
EXPOSE 5000 # 端口号
CMD ["node","server.js"] # 容器启动时执行的命令

将dockerfile放在文件夹里,执行

docker build -t 起个名字 .

然后等待

# 启动镜像

docker images # 可以看到自己构建的镜像
docker run -d -p 5000:5000 镜像名字

# 常用命令
docker ps # 查看容器
docker ps -a # 查看所有容器(包括killed的)
docker logs --tail 10 容器id

# 更新

更新有两条路:

  1. 删除原有镜像和容器,上传新的文件,重新构建镜像并启动
  2. 直接将文件上传到容器内,然后重启容器 下面以第二种为例
@REM 上传-拷贝-重启(必须在本目录下执行,因为有相对路径)
scp ./server.js root@你的IP:/usr/local/backend/meeting/
ssh root@IP "docker cp  /usr/local/backend/meeting/server.js 容器id:/home/backend/meeting; docker restart 容器id;"
echo 后端更新成功

这里只拷贝了server.js,而且不涉及其它依赖下载,如果还要下载其它依赖更推荐第一种

# 其它配置

# DNS解析

自己到域名服务器解析一下

# 端口防火墙

根据自己的项目需求打开防火墙

CC BY-NC-SA 4.0 Licensed

COMMENTS (0)

2025 AseaBlog

豫ICP备2022022909号