【问题标题】:SSL Socket Connection to nginx not working on some android and ios devices到 nginx 的 SSL 套接字连接在某些 android 和 ios 设备上不起作用
【发布时间】:2019-04-07 13:50:54
【问题描述】:

我已经为 androidios 开发了一个 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


【解决方案1】:

在做了很多工作后,我能够解决这个问题。它可能会帮助其他人在同一架构上工作。

多次深入研究后:

  • AWS 架构
  • Nginx 配置
  • nginx 访问和错误日​​志
  • 网络防火墙
  • node.js 服务器日志

我得出的结论是,这不是 Nginx 或 AWS 端的问题,似乎是域或中间服务器的问题。

我尝试检查网络的上一级。之后,我遇到了一些配置:

  • 一些请求没有登录到access.logerror.log nginx 的文件中。
  • 在 Go Daddy 注册的域具有 Wiplon 服务器的 NS 记录。
  • Wiplon 服务器创建了一个子域,并重定向到 aws 服务器。 还有A ip-4地址重定向记录集。

我已经创建了一个图表以供理解:

这导致流量转移到 wiplon 服务器和记录集中的任何一个, 这是问题的根本原因。

解决方案: 从 Wiplon Cpanel 删除子域重定向解决了这个问题。还要确保 DNS 区域中只有一个 A ip4 记录,使问题得到 100% 解决。

我之前没有遇到过此类问题,因为我们通常假设更高级别的网络配置并且已经由域和 DNS 提供商很好地处理。

在那之后,我再也没有在任何 ios 或 android 设备上遇到过任何连接问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2013-10-14
    • 1970-01-01
    相关资源
    最近更新 更多