nginx端口占用案例分享

摘要:
最后发现这个端口是被nginx占用的。原来,nginx接收了很多请求,进行代理的时候发起tcp连接,这时会占用一个未被使用的随机端口。而后端应用和nginx部署在同一台机器,由于请求过多,nginx发起了大量连接,每个连接都是短连接,占用了大量的随机端口,并且需要经过30秒的TIME_WAIT状态才能释放占用。结论不要把nginx和后端应用部署在同一台机器。

这里分享一个案例,问题的原因是反向代理使用不当。

现象

首先描述一下问题的现象。当时的问题是应用启动失败,日志里面报错显示端口占用。我们的应用都是通过脚本发布的,之前发布过多次都没有出现过问题。那么同样的脚本、同样的机器,这次怎么就发布失败了呢?

报错信息如下:

OSError: [Errno 48] Address already in use

问题排查

这个报错是很常见的,以为是发布的过程中上一个应用没有正常关闭。然后熟练的打开终端,连接到服务器,通过netstat -ant|grep LISTEN命令检查这个端口被谁占用了。这条命令的输出如下:

tcp 0 0 0.0.0.0:53130 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:39308 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:46429 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:51329 0.0.0.0:* LISTEN

tcp6 0 0 0.0.0.0:2280 :::* LISTEN

我们的服务使用8080端口。于是熟练的在输出的内容里寻找8080。可是并没有找到!

看来这次情况跟以往不太一样了。怎么会这样呢?既然没有端口占用,为什么应用会起不来?于是我再次尝试启动应用,还是报了相同的错误。

转机

既然这样,那么我直接搜索8080试试,于是输入了下面的命令:

netstat -ant | grep 8080

很快,得到了下面的结果:

tcp 0 0 192.168.6.55:59580 192.168.6.55:8080 TIME_WAIT

居然出现了TIME_WAIT。在我的三观里TIME_WAIT只会出现在断开连接的时候啊,监听端口是不会出现TIME_WAIT的。这是要打破三观的节奏吗?

真相

真相只有一个。我让运维借用sudo权限看看这个连接是哪个进程的。最后发现这个端口是被nginx占用的。原来,nginx接收了很多请求,进行代理的时候发起tcp连接,这时会占用一个未被使用的随机端口。而后端应用和nginx部署在同一台机器,由于请求过多,nginx发起了大量连接,每个连接都是短连接,占用了大量的随机端口,并且需要经过30秒的TIME_WAIT状态才能释放占用。碰巧把后端应用的8080端口也占用了,导致应用无法启动。

结论

不要把nginx和后端应用部署在同一台机器。会有一定几率导致后端应用的端口被占用。

免责声明:文章转载自《nginx端口占用案例分享》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python之PIL库(Image模块)springboot(十九)-线程池的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux 安装nginx

1、检查服务器上是否已安装nginx:nginx -v 2、查看编译参数:nginx -v 3、 查看安装目录:rpm -ql nginx 4、查看配置文件:/etc/logrotate.d/nginx 5、在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。   5.1、rpm包安装的...

nginx保留真实ip

upstream这个模块提供一个简单方法来实现在轮询和客户端IP之间的后端服务器负荷平衡。upstream abc.com { server 127.0.0.1:8080; server 127.0.0.1:80; server 127.0.0.1:8000;} server { listen 80; server_name www.test.com; l...

nginx重定向

原文链接地址:http://seanlook.com/2015/05/17/nginx-location-rewrite/ location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 /...

ELK之nginx日志使用json格式输出

json  Nginx默认日志输出格式为文本非json格式,修改配置文件即可输出json格式便于收集以及绘图 修改nginx配置文件添加配置,增加一个json输出格式的日志格式 log_format access_log_json '{"user_ip":"$http_x_forwarded_for","lan_ip":"$remote_addr","lo...

ELK 6安装配置 nginx日志收集 kabana汉化

#ELK 6安装配置 nginx日志收集 kabana汉化 环境 centos 7.4 ,ELK 6 ,单节点 服务端 Logstash 收集,过滤 Elasticsearch 存储,索引日志 Kibana 可视化 客户端 filebeat 监控、转发,作为agent filebeat-->Logstash-->Elasticsearch--...

Flask、Tornado、Nginx搭建Https服务

其实Flask可以直接用tornado部署就行: # coding=utf-8 from tornado.wsgi import WSGIContainer from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from app.app_main import...