问题
再使用nginx的时候添加了一个配置,发现访问接口有时候正常,有时候异常排查了,被代理的接口正常的
server {
listen 8088;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /abc/ {
proxy_pass http://localhost:8080/abc/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /bbb/ {
proxy_pass http://localhost:8999/bbb/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Forwarded host=$host:$server_port;
}
location /ccc/ {
proxy_pass http://localhost:8888/ccc/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Forwarded host=$host:$server_port;
}
location /v1/ {
proxy_pass http://localhost:9999/v1/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
每次修改完配置文件
bash
nginx -t
nginx -s reload
都还检查配置文件是否正确。然后才重启的
ps aux | grep nginx
查看进程时间发现一个work 的启动时间是上个月
bash
root 1234 0.0 0.1 43760 2004 ? Ss 12月13 0:00 nginx: master process /usr/sbin/nginx
www-data 1235 0.0 0.1 44100 2104 ? S 11月11 0:00 nginx: worker process
www-data 1236 0.0 0.1 44100 2104 ? S 12月13 0:00 nginx: worker process
上个月的时候配置文件没有配置v1相关的
原因
终于问题找到原因了: 原来我每次修改配置文件之后,都是用命令 nginx -s reload 重启nginx的,这样重启可能有时候导致一个worker没有正常的启动,而另一个worker正常启动了,所以访问的时候,如果是第一个提供了服务,就是404 了,而那个正常的worker提供服务就正常了。
- 在执行
nginx -s reload
时,Nginx 会启动新的 worker 进程来加载新的配置,并在新的 worker 进程准备好后平滑地停止旧的 worker 进程。 - worker_processes 1; 设置的是1 没有平滑的停止掉旧的worker
解决
不要直接使用 nginx -s reload 这样的重启,至于为啥这样还不清楚
最好先关闭, 再查看, 再重启
bash
# 关闭nginx
nginx -s stop
# 查看nginx 服务
ps aux | grep nginx
# 启动nginx
nginx