【发布时间】:2019-04-07 13:50:54
【问题描述】:
我已经为 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 本机代码中,我使用了节点的 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 天以来,它让我彻夜难眠。请帮忙。谢谢。
【问题讨论】:
-
“某些设备无法连接到服务器,..”不是一个有用的问题描述。这种连接失败的性质是什么?是否有抛出异常、返回错误、超时……什么?
-
建议在服务器上使用 tcpdump 和/或Wireshark 以获取有关该问题的更多信息。
-
@JamesKPolk Socket 'connect' 事件未监听连接。我已经编辑了我的问题。
标签: android ios react-native ssl nginx