我经常使用 Supervisor,在这个项目中我有一个由 Supervisord 管理的 nginx 进程。配置的相关部分如下:
[supervisord]
logfile=/home/projects/eceee-web/prod/var/log/supervisord.log
logfile_maxbytes=5MB
logfile_backups=10
loglevel=info
pidfile=/home/projects/eceee-web/prod/var/supervisord.pid ;
childlogdir=/home/projects/eceee-web/prod/var/log
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
directory=/home/projects/eceee-web/prod
[program:nginx]
command = /home/projects/eceee-web/prod/bin/nginx
redirect_stderr = true
autostart= true
autorestart = true
directory = /home/projects/eceee-web/prod
stdout_logfile = /home/projects/eceee-web/prod/var/log/nginx-stdout.log
stderr_logfile = /home/projects/eceee-web/prod/var/log/nginx-stderr.log
该/home/projects/eceee-web/prod/bin/nginx
命令将在前台启动 nginx,它不会自行解除进程。但是,停止它仍会失败:
supervisorctl stop nginx
不会给出任何答案,但过程会继续。有什么想法吗?
这是在 OS X Darwin 上,带有 Supervisor 3.0a9 和 nginx 0.7.65。
答案1
您应该能够使用 nginx.conf 中的“daemon off”指令。
答案2
好的,问题是这样的:
我需要启动 nginx 并设置 LD_LIBRARY_PATH,以便 pcre、libxslt 和 libxml 位于路径中(这些都是自定义构建,带有构建以便于环境复制)。
因此我有一个 sh 脚本,它设置 LD_LIBRARY_PATH 然后启动 nginx,所以如果我想启动 nginx,则不必明确设置它。
当然,我让 nginx 启动该脚本。
但是,当它终止该父进程时,nginx 不会死!
即使不在守护进程模式下运行,nginx 似乎也会与启动它的 shell 分离。
解决方案:直接调用 nginx 二进制文件,并使用正确的环境设置:
[program:nginx]
command = /Volumes/Macintosh-HD2/ServiceData/Web/eceee.org/staging/parts/nginx/sbin/nginx
environment = LD_LIBRARY_PATH="/Volumes/Macintosh-HD2/ServiceData/Web/eceee.org/staging/parts/lxml/libxml2/lib:/Volumes/Macintosh-HD2/ServiceData/Web/eceee.org/staging/parts/lxml/libxslt/lib:/Volumes/Macintosh-HD2/ServiceData/Web/eceee.org/staging/parts/pcre/lib"
redirect_stderr = true
autostart= true
autorestart = true
directory = /Volumes/Macintosh-HD2/ServiceData/Web/eceee.org/staging
stdout_logfile = /Volumes/Macintosh-HD2/ServiceData/Web/eceee.org/staging/var/log/nginx-stdout.log
stderr_logfile = /Volumes/Macintosh-HD2/ServiceData/Web/eceee.org/staging/var/log/nginx-stderr.log