基于Nginx实现项目平滑部署

2022-06-281458

背景

在给客户部署项目的时候, 总是需要把之前的项目终止 再重新把新的项目文件复制上去,运行起来 这个过程相对比较漫长,还需要停止服务,很影响用户体验

实现思路

因为项目总是在"单兵作战", 一旦出现问题,则会出现停止响应, 需要手动去重新启动服务. 那么,可以再启动一个项目,两个项目一起抗 当其中一个服务倒下了,另一个服务就顶上, 避免出现无响应的情况 在部署项目的时候,也可以考虑这种情况 在其中一个服务下线了,另一个服务还可以继续提供支持

开始实现

既然理论存在,那么实战开始

1.通过Nginx的端口转发实现

在我们项目中通常都会通过Nginx的端口转发(或代理转发) 将用户的请求转发到我们启动的端口, 从而实现服务提供. 在此基础上,我们在启动新服务时,可以先启动一个新的端口的服务 通过Nginx的端口转发配置,指定新的服务 之后将旧服务进行下线, 这样就完成了一次服务的平滑部署, 理论上不影响用户处理, 因为在Nginx的重载时,它是由多个 worker 进程来处理的 当用户请求过来,只需要其中一个worker在工作,就可以进行响应 在这个过程中,worker的停止和启动,就完成了端口的切换 也就完成了服务的更新

首先,先假定原有项目的端口为 9421

它的 Nginx 配置文件为: server { listen 80; server_name nick.xin;

client_max_body_size 150M; 
location / {
  proxy_pass http://localhost:9420/;
  proxy_redirect default;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

然后,我们启动了新的服务,端口为 9421

则将Nginx的配置文件修改为:

server {
    listen 80;
    server_name  nick.xin;

    client_max_body_size 150M; 
    location / {
      proxy_pass http://localhost:9421/;
      proxy_redirect default;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

最后再执行重启Nginx的命令

# 这个命令是判断 nginx 配置文件是否正确
nginx -t

# 重启 nginx 服务
service nginx reload

# 或者 systemctl reload nginx

非 root 账号 记得加上 sudo 在启动之后

通过Nginx的负载均衡实现

在Nginx中有一个 upstream 的配置 它可以将我们的请求分配到几个服务中去 那么我们可以在里面分配两个以上的服务端口 在其中一个服务重启更新之后,并不会影响正在运行的总体服务 在所有的服务都启动之后,也就成功平滑的启动了服务 那么开始

首先,配置 upstream

upstream api {
  server localhost:9421;
  server localhost:9420;
}

server {
    listen 80;
    server_name  nick.xin;

    client_max_body_size 150M; 
    location / {
      proxy_pass http://api/;
      proxy_redirect default;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

然后依次启动相关服务

因为upstream 会自动进行负载均衡, 当有服务访问不了的时候,则会自动切换到其他的服务 所以,我只需依次启动服务即可

分享
点赞0
打赏
上一篇:Docker常用命令笔记(一)
下一篇:用 docker 创建 jmeter 容器, 实现性能测试