单机器如何实现 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更多内容,请看官方文档https://nginx.org/en/docs/

Comments

No comments yet. Why don’t you start the discussion?

发表评论