将 nginx 与主管一起使用 - nginx 进程多次启动导致绑定错误
Posted
技术标签:
【中文标题】将 nginx 与主管一起使用 - nginx 进程多次启动导致绑定错误【英文标题】:Using nginx with supervisor - nginx process launched multiple times leading to bind error 【发布时间】:2014-11-04 15:13:21 【问题描述】:我正在使用带有主管的 nginx。我的supervisord.conf文件内容如下:
[supervisord]
nodaemon=true
logfile=/var/log/supervisor/supervisord.log
[program:nginx]
command=/usr/sbin/nginx -c /etc/nginx/nginx.conf
stdout_logfile=/var/log/supervisor/%(program_name)s.log
stderr_logfile=/var/log/supervisor/%(program_name)s.log
redirect_stderr=true
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
[unix_http_server]
file=/tmp/supervisor.sock ; path to your socket file
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
在确保 netstat -nltp 说所有端口都是空闲的后,我启动了 supervisord,但请在下面找到 nginx 错误日志:
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:81 failed (98: Address already in use)
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:18081 failed (98: Address already in use)
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:18082 failed (98: Address already in use)
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:18083 failed (98: Address already in use)
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:10080 failed (98: Address already in use)
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:8080 failed (98: Address already in use)
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:28080 failed (98: Address already in use)
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:18080 failed (98: Address already in use)
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:20081 failed (98: Address already in use)
2014/09/10 20:39:00 [emerg] 277#0: bind() to 0.0.0.0:81 failed (98: Address already in use)
但是 netstat -nltp 命令给了我以下信息:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:28080 0.0.0.0:* LISTEN 246/nginx: master p
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 246/nginx: master p
tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN 246/nginx: master p
tcp 0 0 0.0.0.0:20081 0.0.0.0:* LISTEN 246/nginx: master p
tcp 0 0 0.0.0.0:18080 0.0.0.0:* LISTEN 246/nginx: master p
tcp 0 0 0.0.0.0:10080 0.0.0.0:* LISTEN 246/nginx: master p
tcp 0 0 0.0.0.0:18081 0.0.0.0:* LISTEN 246/nginx: master p
tcp 0 0 0.0.0.0:18082 0.0.0.0:* LISTEN 246/nginx: master p
tcp 0 0 0.0.0.0:18083 0.0.0.0:* LISTEN 246/nginx: master p
这意味着 nginx 已启动并正在运行。但是,supervisord 是在尝试启动多个 nginx 进程,还是没有从 nginx 收到它已启动的信号。任何人都可以对此有所了解吗?
【问题讨论】:
看起来 nginx(主进程和子进程)已经在运行。检查您的 nginx 配置(/etc/nginx/nginx.conf)很可能它具有这些端口的定义。停止 supervisord,杀死所有 nginx 进程pkill nginx
并重试。
【参考方案1】:
您应该将-g 'daemon off;'
添加到 nginx 参数中。
Supervisor 希望服务在前台运行。默认情况下,nginx 分叉(守护)到后台并退出。 Supervisor 会认为 nginx 在退出并尝试重启时死掉了。
在旧版本的 nginx 中,daemon off
被劝阻,但现在已经不是这样了。
【讨论】:
以上是关于将 nginx 与主管一起使用 - nginx 进程多次启动导致绑定错误的主要内容,如果未能解决你的问题,请参考以下文章
直接将 AWS ELB 与 Gunicorn 一起使用(没有 nginx)有啥缺点?
使用 Django、Nginx、Gunicorn 和主管进行空日志记录