nginx 端口被占用的错误,不知道是那个进程在写错误日志,晕呀

2017-10-06 20:31:15 +08:00
 miniyao

网上看了下,这个端口 still could not bind() 的错误一大堆,各种文章的解决方法都试了,还是没解决问题。

我给 nginx server { ... } 里配置的 error_log 路径明明是:error_log /var/log/nginx/error.log; 但是在 /usr/local/nginx/logs 里面却有一个 error.log 文件,一直记录 bind() 端口 被占用的错误:

2017/10/06 19:46:14 [emerg] 10093#0: bind() to 0.0.0.0:80 failed (98: Address already in use)

我只编译安装了一个 nginx,服务器运行正常。因为端口绑不上,所以 lsof -i:80 也看不到到底是哪个 nginx 在重复请求绑定,ps -ef | grep nginx 也没看到什么异常的进程:

root      1431     1  0 19:51 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    1432  1431  0 19:51 ?        00:00:00 nginx: worker process      
root      1973  1773  0 20:04 pts/0    00:00:00 grep --color=auto nginx

虽然这个错误不影响当前程序的运行,但是明知道一个潜在的 nginx 在不停的请求绑定现有的端口,不知疲倦的在写错误日志,有点郁闷的

2956 次点击
所在节点    问与答
24 条回复
veelog
2017-10-07 08:36:32 +08:00
根据 pid 找到进程路径,进程名不就知道了么
Beebird
2017-10-07 10:17:26 +08:00
另一个 nginx 实例被启动了,而且没有读你的配置文件。可以查查 nginx 的启动脚本是怎么写的。
oott123
2017-10-07 12:21:25 +08:00
根据 19 楼的配置来看,你需要在 nginx 的配置文件里写一个 daemon off;
或者在命令行上写 -g 'daemon off;'

并不是有别的 nginx 进程,而是你的 supervisor 觉得你的 nginx 退出了,在试图重启它,而它并没有挂,只是启动完了。
oott123
2017-10-07 12:25:05 +08:00
这么说可能更容易理解一些:nginx 的二进制程序默认行为是 fork 一个 nginx 进程在后台启动,并退出自己。
而 supervisord 的行为是,检测到前台进程退出后,认为它挂了,重启它。
于是你的 nginx 第一次会正常启动并退出,而 supervisor 则认为这不正常,重启它;重启它又会因为端口被占用,前台进程继续退出,supervisor 继续重启…

解决这个问题有很多种办法,其中最简单的一种是,让 nginx 别在后台启动,而是在前台启动就行了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/395679

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX