SSL Socket Подключение к nginx не работает на некоторых устройствах Android и IOS - PullRequest
0 голосов
/ 03 ноября 2018

Я разработал игру на реагировать нативно для android и ios . Он подключается через сокеты к серверу nginx , который работает с сертификатом SSL Digi Cert. За nginx работают 4 node.js сервера 3000, 3001, 3002, 3017 портов соответственно. Вся архитектура находится внутри экземпляра AWS EC2 c5.x. Все входящие и исходящие порты брандмауэра AWS открыты для целей тестирования.

Я могу прослушивать соответствующие порты из браузера моего ноутбука, и он дает правильные ответы. Мобильное приложение, с другой стороны, общается только через сокеты.

Некоторые устройства не могут подключиться к серверу (событие «подключения» сокета не прослушивается и отображается ошибка подключения к веб-сокету), в то время как другие могут подключаться без усилий.

Отображается следующая ошибка:

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. Показывает следующие результаты:

enter image description here

Вот мои связанные файлы и коды:

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

Внутри моего собственного исходного кода я использовал узел 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 дней. Пожалуйста помоги. Спасибо.

1 Ответ

0 голосов
/ 27 ноября 2018

Я смог решить проблему после проделанной работы. Это может помочь кому-то другому, работающему над той же архитектурой.

После многократного изучения следующего:

  • Архитектура AWS
  • Конфигурация Nginx
  • Доступ к nginx и журналы ошибок
  • сетевой брандмауэр
  • Журнал сервера node.js

Я пришел к выводу, что это не проблема на стороне Nginx или AWS, похоже, проблема связана с проблемой домена или промежуточного сервера.

Я попытался проверить один уровень в сети. После этого я наткнулся на несколько настроек:

  • Некоторые запросы не были зарегистрированы ни в access.log, ни в error.log файлах nginx.
  • Домен, зарегистрированный на Go У папы были NS-записи Wiplon Server.
  • На Wiplon Server был создан поддомен с перенаправлением на сервер aws. Также он имеет набор записей перенаправления IP-адреса.

Я создал диаграмму для понимания:

enter image description here

Это привело к перемещению трафика на оба сервера wiplon и набор записей, которая была основной причиной проблемы.

Решение: Удаление перенаправления поддомена из Wiplon Cpanel решило эту проблему. Также убедитесь, что в DNS-зоне присутствует только одна запись A ip4, что позволило решить проблему на 100%.

Я не сталкивался с такого рода проблемами ранее, потому что мы обычно предполагаем, что сетевые конфигурации более высокого уровня уже хорошо обработаны поставщиком домена и DNS.

После этого у меня никогда не возникало проблем с подключением ни на одном устройстве iOS или Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...