架设WebSocket的最后一环,如何设置好nginx反向代理

WebScoket都已经完工快一个月,经过一段时间的测试,公司还是准备把服务器换到鹅厂,用EO来解决CDN内容分发和DDOS防护问题,由于EO并不支持URL 路径转发,只支持转发到一个站点的80或则443端口,如果想做路径分发,就必须用负载均衡,这个服务并不便宜,迫不得已,我只能在服务器上用Nginx来做反向代理。根据不同的路径转发到不同的服务器和端口。

Nginx 的配置文件很简单:

map http_upgrade connection_upgrade {

default upgrade;

'' close;

}

server {

listen 80;

server_name xxxx.cn;

location / {

proxy_http_version 1.1;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $http_host;

proxy_set_header X-NginX-Proxy true;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "$connection_upgrade";

proxy_connect_timeout 5s;

proxy_read_timeout 60s;

proxy_send_timeout 30s;

proxy_pass http://127.0.0.1:8360;

proxy_redirect off;

}

}

这个是给缺省的Web服务器用的 ,接下来就是给游戏服务器的配置:

location /op {

proxy_http_version 1.1;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $http_host;

proxy_set_header X-NginX-Proxy true;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "$connection_upgrade";

proxy_connect_timeout 5s;

proxy_read_timeout 60s;

proxy_send_timeout 30s;

proxy_pass http://127.0.0.1:16001;

proxy_redirect off;

}

例如:游戏访问游戏服务器,用 ws://test.cn/op 作为URL来建立WebScoket,那么Nginx就必须对路径进行规划,比如发现有 op 作为路径的请求,全部转发给游戏服务器。

注意:无论是不是使用WebScoket,在设置反向代理的时候都必须用 http 协议,不能写 ws 作为地址开头,Nginx 不支持这种写法。

在测试的时候,这一切都运行都很好,但是在实际开服的时候,当人数达到一定程度,游戏就会出现无法登录的情况,然后报网络连接错误的错误,这让我很困惑,我尝试修改了nginx 的一些配置:

worker_processes 4;

events {

worker_connections 4096;

}

建立了4个进程,并允许每个进程有4K的连接数量上限,但是并没有效果,连接不上的情况依旧出现。

我仔细观察了发生故障的时候的网络请求,一个获取版本号的URL得到了500错误,这让我很惊讶,但我很快注意到网页下面有nginx的版本号,证明这个是nginx返回的错误。

我打开了nginx的错误日志,在里面发现了大量的错误信息:

2024/04/30 10:55:48 [error] 8840#8344: *162104 maximum number of descriptors supported by select() is 1024 while waiting for request, client: xxxxxx, server: 0.0.0.0:80

在网上搜索了一下这个错误,原因是nginx编译的时候指定的参数导致的:

--with-cc-opt=-DFD_SETSIZE=1024

编译的时候的问题肯定是没办法的,好在给出了解决方案:

Index of /download/http://nginx-win.ecsds.eu/download/

如果是使用Windows版本,可以直接访问这个 URL,下载其中的一个包

下载之后,上传到服务器,解压之后,执行一个注册表的修改文件:

其内容是:

HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters

"TcpWindowSize"=dword:0000faf0

"MaxUserPort"=dword:0000F000

"TcpTimedWaitDelay"=dword:0000001e

"MaxFreeTWTcbs"=dword:000003E8

"MaxHashTableSize"=dword:0000800

"MaxFreeTcbs"=dword:0000800

"TcpNumConnections"=dword:00fffffe

; "StrictTimeWaitSeqCheck"=dword:00000001

主要是修改TCP相关的参数。

修改之后,把 nginx_basic.exe 拷贝到原来的 nginx 的目录,执行下面的命令停止nginx服务。

nginx -s stop

然后将原有的nginx.exe改一个名,比如 nginx.exe.bak ,然后将 nginx_basic.exe 改名成 nginx.exe。

重新启动nginx,问题得以解决。

相关推荐
上海云盾安全满满33 分钟前
高防 IP 是如何帮助数藏行业防刷
网络·网络协议·tcp/ip
吠品2 小时前
免费SSL证书自动化申请:DNS代理验证
网络协议·自动化·ssl
捷米研发三部6 小时前
CC-Link转Modbus TCP协议转换网关实现三菱 PLC与传感器通讯在快递分拣中心的应用案例
网络·网络协议
嵌入式-小王6 小时前
每天掌握一个网络协议----ARP协议
网络·网络协议·arp
zhuyasen6 小时前
Go Web 开发利器:如何让你的 Gin 服务拥有 Nginx 般的静态文件处理能力?
nginx·go·gin
achi0106 小时前
Ubuntu 24.04 LTS 下 Vue 3 开发环境搭建与生产部署完整指南
nginx·node·nvm·vue 3·ubuntu 24·开发环境搭建·国内镜像仓库
阿珊和她的猫8 小时前
HTTP 状态码 301 和 302 的区别与使用场景
网络·网络协议·http
让学习成为一种生活方式10 小时前
植物中验证蛋白相互作用的Pull-down和Co-IP技术--文献精读181
网络·网络协议·tcp/ip
普普通通的南瓜10 小时前
IP证书在关键信息基础设施安全防护中的实践与挑战
网络·数据库·网络协议·tcp/ip·安全·ssl
2501_9219392613 小时前
11.25Nginx服务器和Wordpress服务器
运维·服务器·nginx