近期文章:Python脚本实现又拍云图片批量迁移攻略
单台服务器,想突破单个ip最多只能开 65535个不同端口的限制,达到100W,于是便在 eth0网卡上创建多个子网卡,将请求分配到不同子网 ip上来实现
一、命令行创建子网卡
ifconfig eth0:0 192.168.1.11/24 up ifconfig eth0:1 192.168.1.12/24 up ifconfig eth0:2 192.168.1.13/24 up ifconfig eth0:3 192.168.1.14/24 up ifconfig eth0:4 192.168.1.15/24 up ifconfig eth0:5 192.168.1.16/24 up ifconfig eth0:6 192.168.1.17/24 up ifconfig eth0:7 192.168.1.18/24 up ifconfig eth0:8 192.168.1.19/24 up ifconfig eth0:9 192.168.1.10/24 up ifconfig eth0:10 192.168.1.20/24 up ifconfig eth0:11 192.168.1.21/24 up ifconfig eth0:12 192.168.1.22/24 up ifconfig eth0:13 192.168.1.23/24 up ifconfig eth0:14 192.168.1.24/24 up
二、配置 Linux 最大打开文件数
/etc/security/limits.conf新增下面内容
* soft nofile 1000000 * hard nofile 1000000
重新登录查看最大打开文件数已生效
ulimit -a
三、调整 nginx配置
1、修改Nginx最大打开文件数为 100w
worker_rlimit_nofile 1000000;
2、修改Nginx事件处理模型
events { use epoll; worker_connections 1000000; }
3、配置应用请求
后端 go应用程序监听在 9505 端口,nginx中配置 upstream
upstream go-ws { server 127.0.0.1:9505; keepalive 128; } location /ws { proxy_redirect off; proxy_bind $split_ip; proxy_pass http://go-ws; proxy_bind $spl_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # WebSocket 支持的核心配置 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_intercept_errors on; client_max_body_size 20m; } #将请求分配到不同ip上 split_clients "$remote_addr$remote_port" $split_ip { 10% 192.168.1.11; 10% 192.168.1.12; 10% 192.168.1.13; 10% 192.168.1.14; 10% 192.168.1.15; 10% 192.168.1.16; 10% 192.168.1.17; 10% 192.168.1.18; 10% 192.168.1.19; 10% 192.168.1.20; 10% 192.168.1.21; 10% 192.168.1.22; 10% 192.168.1.23; 10% 192.168.1.24; * 192.168.1.10; }
压测发现,句柄数并未达到100万就报http: Accept error: accept tcp [::]:9505: accept4: too many open files; retrying in 40ms
最后发现是supervisorctl句柄数据没有调整
四 优化supervisor配置
cat /proc/sys/fs/file-nr 527040 0 1000000 #值的的解释:当前已经分配的文件句柄数;闲置的文件句柄数;最大文件句柄数
调整之后正常了,nginx日志也无报错了
查看系统 tcp连接
当前业务 tcp连接在 50w左右徘徊(基本上都是长连接)
ss -s
高峰期实际会达到 70w,远没有达到 100W,够用了
nginx更多内容,请看官方文档https://nginx.org/en/docs/