将 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 进程多次启动导致绑定错误的主要内容,如果未能解决你的问题,请参考以下文章

将 certbot 与 nginx 一起使用的问题

直接将 AWS ELB 与 Gunicorn 一起使用(没有 nginx)有啥缺点?

使用 Django、Nginx、Gunicorn 和主管进行空日志记录

如何将 GKE Ingress 与 Nginx Ingress 一起使用?

将 TCP_QUICKACK 与 nginx 一起使用

仅使用 Node.js 与将 Node.js 与 Apache/Nginx 一起使用