单机器如何实现 Nginx 百万并发连接

近期文章: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
image 3

二、配置 Linux 最大打开文件数

/etc/security/limits.conf新增下面内容

* soft nofile 1000000 * hard nofile 1000000

重新登录查看最大打开文件数已生效

ulimit -a
image 4

三、调整 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配置

image 5
cat /proc/sys/fs/file-nr 527040	0	1000000 #值的的解释:当前已经分配的文件句柄数;闲置的文件句柄数;最大文件句柄数

调整之后正常了,nginx日志也无报错了

查看系统 tcp连接

当前业务 tcp连接在 50w左右徘徊(基本上都是长连接)

ss -s 
image 6

高峰期实际会达到 70w,远没有达到 100W,够用了

nginx更多内容,请看官方文档