草庐IT

android - 与 nginx 的 SSL 套接字连接在某些 android 和 ios 设备上不起作用

coder 2024-01-28 原文

我在 react native 中为 androidios 开发了一款游戏。它通过套接字连接到使用 digi cert SSL 证书运行的 nginx 服务器。在 nginx 的背后,运行着 4 个 node.js 服务器 分别为 3000、3001、3002、3017 端口。整个架构位于 AWS EC2 c5.x 实例中。 AWS 防火墙的所有入站和出站端口均开放用于测试目的。

我可以从我的笔记本电脑浏览器中监听各个端口,并且它给出了正确的响应。另一方面,移动应用仅通过套接字进行通信。

部分设备连接不上服务器(没有监听到socket'connect'事件,显示websocket connection err),而其他设备可以轻松连接。

显示以下错误:

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";
    }
  }
}

在我的 native 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 天以来,它让我彻夜难眠。请帮忙。谢谢。

最佳答案

我做了很多工作后才能够解决这个问题。它可能会对使用相同架构的其他人有所帮助。

多次深入研究后:

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

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

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

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

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

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

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

我之前没有遇到过这种问题,因为我们通常认为更高级别的网络配置已经由域和 DNS 提供商妥善处理。

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

关于android - 与 nginx 的 SSL 套接字连接在某些 android 和 ios 设备上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53133460/

有关android - 与 nginx 的 SSL 套接字连接在某些 android 和 ios 设备上不起作用的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  7. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  8. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

    s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

  9. ruby-on-rails - "assigns"在 Ruby on Rails 中有什么作用? - 2

    我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o

  10. ruby-on-rails - Ruby 的 'open_uri' 是否在读取或失败后可靠地关闭套接字? - 2

    一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我

随机推荐