nginx半自动平滑升级最后一步make upgrade时不成功,报错make: *** [upgrade] Error 1
调试发现:kill -USR2 cat /usr/local/nginx/logs/nginx.pid
发送-USR2信号给Nginx要它创建新的Master进程时没有效果,也就没有生成/usr/local/nginx/logs/nginx.pid.oldbi这个文件
原因1:之前启动nginx主进程实例没有用绝对路径的nginx命令,导致现在给这个进程发送信号没有效果:也就是没有使用 /usr/local/nginx/sbin/nginx 启动,而是通过查找环境变量中那个 nginx 命令启动的, 当平滑升级Nginx 在接收到 USR2 信号时使用 execve() 执行原 Nginx 启动命令行的第一个参数启动新实例时就会报找不到 nginx 可执行文件的错误(execve() 并不会查找 PATH 环境变量)这样子的话没办法进行平滑升级
解决: 所以启动nginx实例的时候要用绝对路径命令,以免以后各种麻烦
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
原因2:容器中nginx挂到前台运行: -g “daemon off;” ,这个前台进程结束就会退出docker,所以这种方式运行Nginx也会造成各种问题,包括make: *** [upgrade] Error 1
解决:挂起别的程序在前台运行,nginx仍然后台运行
Dockerfile文件通过CMD运行
CMD touch ~/play.log.txt && /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf && tail -f ~/play.log.txt
或entrypoint运行的sh
#!/bin/bash
touch ~/play.log.txt
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf && tail -f ~/play.log.txt
参考:
https://jpuyy.com/2016/05/nginx-upgrade-failed.html
https://groups.google.com/forum/#!topic/openresty/HiV3c-JwTZ4