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

news/2024/9/25 17:18:25/

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/icon-default.png?t=N7T8http://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,问题得以解决。


http://www.ppmy.cn/news/1450887.html

相关文章

深入探索MinIO:高性能的开源对象存储服务器

深入探索MinIO:高性能的开源对象存储服务器 文章目录 深入探索MinIO:高性能的开源对象存储服务器一、引言二、MinIO概述三、MinIO的特点四、MinIO的架构五、MinIO的使用场景六、MinIO的安装部署七、MinIO的操作管理八、MinIO的生态系统九、MinIO的扩展性…

SpringBoot-@Transactional注解失效

Transactional注解失效 Transactional失效场景 以下是一些常见导致Transactional注解失效的场景,配合相应的Java代码演示: 1、方法修饰符非公开(非public) Transactional注解失效的原因在于Spring事务管理器如何实现对事务的代…

Python爬虫--爬取糗事百科段子

爬取糗事百科段子&#xff1a; 段子在 <div class"content"> 里面的 <span> 标签里面 不过这里有个坑&#xff0c;div 标签跟 span 标签 之间有很多空行 普通 .*? 是匹配不了的&#xff0c;需要使用模式修饰符 S S 的意思 让 .(点) 匹配&#xff0c…

快速确定网络号的范围

目录 方法 下列IP地址中属于网络号的是(C) 十进制转换二进制 二进制转换十进制 计算IP地址中的网络号最直接和简单的方法是使用子网掩码来“屏蔽”掉IP地址中的主机号部分&#xff0c;从而直接得到网络号。这种方法不需要进行复杂的二进制转换和按位与运算&#xff0c;而是…

能源系统-有功无功科普

正向有功总电能表示用户使用电能进行有用功率&#xff08;比如照明、电热器等&#xff09;的总量&#xff0c;而正向无功总电能表示用户使用电能进行无用功率&#xff08;比如电动机、变压器等产生的无功功率&#xff09;的总量。 举个例子来说&#xff0c;正向有功总电能就好…

unittest_parameterized批量测试测试用例

import unittest from parameterized import parameterizeddef add(x, y):return xy"""问题&#xff1a;如果有三组数据需要测试&#xff1f;[(1,1,2), (1,2,3), (0,3,3)] """def get_data():return [(1, 2, 3), (3, 0, 3), (2, 1, 3)]# 定义测试…

CogAgent:开创性的VLM在GUI理解和自动化任务中的突破

尽管LLMs如ChatGPT在撰写电子邮件等任务上能够提供帮助&#xff0c;它们在理解和与GUIs交互方面存在挑战&#xff0c;这限制了它们在提高自动化水平方面的潜力。数字世界中的自主代理是许多现代人梦寐以求的理想助手。这些代理能够根据用户输入的任务描述自动完成如在线预订票务…

【C语言的完结】:最后的测试题

看到这句话的时候证明&#xff1a; 此刻你我都在努力~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;语言的起点-----C语言 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹…