解决Nginx端口号耗尽问题

/ 运维 / 没有评论 / 67浏览

问题

原因

1.当客户端直接访问服务器时,tcp的组合方式是以下方式,不会出现端口耗尽问题:

本地ip + 本地port + 远程ip + 远程port

2.但是当使用nginx进行转发到web服务后则变为:

本地ip + 本地port + 本地ip + 本地port

例如,我的nginx将通过域名访问的443端口,转发到我的端口号为9000的博客web服务:
访问几次后发现,由于nginx转发了访问,所以远程ip改为了内网ip alt

#解决

一.添加临时ip,使用内网ip负载转发

1.添加临时ip

(1)使用ipconfig或ip a s 查看ip及网卡,添加临时ip
   ifconfig eth0:0 192.168.1.110 netmask 255.255.255.0

   ip addr add 192.168.1.110/24 dev eth0:0

(2)删除临时ip方法
 ip addr delete 192.168.1.110 dev eth0:0

2.设置nginx配置文件

upstream blog {
        server 127.0.0.1:9000;
        server 192.168.1.110:9000;
}
server {
        listen 443 ssl http2;
        server_name www.kakuiwong.cn;
        ssl_certificate /opt/nginx_crt/1_www.kakuiwong.cn_bundle.crt;
        ssl_certificate_key /opt/nginx_crt/2_www.kakuiwong.cn.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_prefer_server_ciphers on;

        error_page 503 /xxoo.html;


        location / {
            #限流
            limit_req   zone=mylimit;

            proxy_pass  http://blog;

            proxy_read_timeout 300;
            proxy_connect_timeout 300;
            proxy_redirect     off;

            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   Host              $http_host;
            proxy_set_header   X-Real-IP         $remote_addr;
        }

查看端口状态,可以设置更多临时ip,此时端口65535限制由于本地ip不同以突破; alt

二.使用proxy_bind

此处不详细介绍;

三.使用端口重用

类似配置,可能会出现几率的脏数据:

net.ipv4.tcp_tw_recycle = 0 关掉快速回收
net.ipv4.tcp_tw_reuse = 1   开启tw状态的端口复用(客户端角色)
net.ipv4.tcp_timestamps = 1 复用需要timestamp校验为1 
net.ipv4.tcp_max_tw_buckets = 30000 放大bucket
net.ipv4.ip_local_port_range = 15000 65000 放大本地端口范围

参考:

https://www.nginx.com/blog/overcoming-ephemeral-port-exhaustion-nginx-plus

https://www.sundayle.com/nginx-proxy-65535-port/

https://blog.csdn.net/Wjhsmart/article/details/107385614