我已经为 android 和 ios 开发了一个 react native 游戏。它通过套接字连接到使用 digi cert SSL 证书运行的 nginx 服务器。在 nginx 后面,4 个 node.js 服务器正在运行
分别为 3000、3001、3002、3017 端口。整个架构位于 AWS EC2 c5.x 实例中。 AWS 防火墙的所有入站和出站端口都开放用于测试目的。
我可以从我的笔记本电脑浏览器监听相应的端口,它会给出正确的响应。另一方面,移动应用程序仅通过套接字进行通信。
有些设备无法连接到服务器(socket 'connect' 事件没有被监听并显示 websocket 连接错误),而其他设备可以轻松连接。
显示如下错误:
Error: websocket error
at WS.Transport.onError (/home/ubuntu/TTP-Server/node_modules/engine.io-client/lib/transport.js:64:13)
at WebSocket.ws.onerror (/home/ubuntu/TTP-Server/node_modules/engine.io-client/lib/transports/websocket.js:150:10)
at WebSocket.onError (/home/ubuntu/TTP-Server/node_modules/engine.io-client/node_modules/ws/lib/EventTarget.js:109:16)
at emitOne (events.js:116:13)
at WebSocket.emit (events.js:211:7)
at WebSocket.finalize (/home/ubuntu/TTP-Server/node_modules/engine.io-client/node_modules/ws/lib/WebSocket.js:182:41)
at ClientRequest._req.on (/home/ubuntu/TTP-Server/node_modules/engine.io-client/node_modules/ws/lib/WebSocket.js:647:10)
at emitOne (events.js:116:13)
at ClientRequest.emit (events.js:211:7)
at Socket.socketErrorListener (_http_client.js:387:9)
所有设备均在android 6和ios 10以上版本
我已根据在线 SSL 验证器检查了我的网站。它显示了以下结果:
这是我的相关文件和代码:
nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events
{
worker_connections 768;
}
http
{
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl on;
ssl_certificate PATH_TO_CRT_FILE;
ssl_certificate_key PATH_TO_KEY_FILE;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
upstream lobby
{
server 127.0.0.1:3000;
}
upstream table_1
{
server 127.0.0.1:3001;
}
upstream table_2
{
server 127.0.0.1:3002;
}
upstream analytics
{
server 127.0.0.1:3017;
}
server
{
listen 443;
server_name tpa;
location /3000/
{
proxy_pass http://lobby/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /3001/
{
proxy_pass http://table_1/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /3002/
{
proxy_pass http://table_2/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /3017/
{
proxy_pass http://analytics/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
在我的 react native 代码中,我使用了节点的 Socket.IO我正在使用以下代码进行连接:
let options = {
transports: ["websocket"],
query: `userID=${this.props.phoneNumber}&ipAddress=${ip}&sessionId=${uuid}`,
reconnection: true,
reconnectionAttempts: Infinity,
path: "/3000/socket.io"
};
socket = io(`${Constants.serverIP}`, options);
自从过去 2 天以来,它让我彻夜难眠。请帮忙。谢谢。
Best Answer-推荐答案 strong>
在做了很多工作后,我能够解决这个问题。它可能会帮助其他人在同一架构上工作。
多次深入研究后:
- AWS 架构
- Nginx 配置
- nginx 访问和错误日志
- 网络防火墙
- node.js 服务器日志
我得出的结论是,这不是 Nginx 或 AWS 端的问题,似乎是域或中间服务器的问题。
我尝试检查网络的上一级。之后,我遇到了一些配置:
- 一些请求没有被记录在
nginx 的 access.log 或 error.log 文件中。
- 在 Go Daddy 注册的域拥有 Wiplon 服务器的 NS 记录。
- Wiplon 服务器创建了一个子域,并重定向到 aws 服务器。
还有A ip-4地址重定向记录集。
我已经创建了一个图表以供理解:
这导致流量转移到 wiplon 服务器和记录集中的任何一个,
这是问题的根本原因。
解决方案:
从 Wiplon Cpanel 删除子域重定向解决了这个问题。还要确保 DNS 区域中只有一个 A ip4 记录,使问题得到 100% 解决。
我之前没有遇到过此类问题,因为我们通常假设更高级别的网络配置并且已经由域和 DNS 提供商很好地处理。
在那之后,我再也没有在任何 ios 或 android 设备上遇到过任何连接问题。
关于android - 到 nginx 的 SSL 套接字连接在某些 android 和 ios 设备上不起作用,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/53133460/
|