前言
前段时间在对某一个长连接的 wss 服务进行端口优化的时候, 因为原先的端口是一个不常用端口,想改成一个常用的端口,比如 tls 的 443 端口, 又因为这一台服务器已经有安装 nginx,并启用了 443 端口。
所以就采用了 nginx 转发 ws 端口, 然后变成 wss 的 443 端口。 具体可以看: nginx 转发代理 wss 和 https (目标程序是 ws 和 http)
因为 nginx 的端口转发会需要映射到服务器的可用端口,所以就将服务器的可用端口调成一个比较大的值:1
2[kbz@VM-16-9-centos ~]$ cat /proc/sys/net/ipv4/ip_local_port_range
1024 65000
但是只顾了这个要扩大端口号,而忘了也要调整 nginx 的最大可连接数。 导致上线之后没有多久就出现长连接连不上的情况,查看了一下 nginx 的 error log,发现:1
[alert] 23725#0: *1972528 8000 worker_connections are not enough while connecting to upstream, client: 109.xxx.xxx.92,
解决
查了一下,确实是 nginx 的配置文件中,配置的单核最大可连接数只有 8000:1
2
3events {
worker_connections 8000;
}
然后 worker_processes
是 2 核 (几个 CPU 一般就可以调用几个), 所以 nginx 的最大可连接数就是 2 * 8000 = 16000 个, 所以一旦长连接超过了这个数量,就会报上述的错误。
所以解决的方式也很简单,后面将其改成了 50000, 配合我们的 2 核(2 个 cpu), 最大可支持 10w 的最大可连接数 (不可能到 7w, 因为服务器本身的可转发端口就满了)