Nginx в качестве прокси-сервера для веб-сокета sockio.io не работает на удаленном компьютере

На моем развивающемся компьютере у меня есть nginx в качестве прокси-сервера для веб-сокета со следующей конфигурацией:

server {
  listen       80;

  location /socket.io {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:3001;
    proxy_redirect off;
  }

  location / {
    proxy_pass http://trunk.alban:81;
    client_max_body_size 500M;

  }
}

Когда я получаю доступ с того же компьютера через Firefox, веб-сокеты правильно подключаются и начинают обмениваться сообщениями:

[root@localhost nodejs]# node websocket.js 

2014-12-04 10:27:16 ==> Listening on port: 3001
2014-12-04 10:27:16 ==> Auth token: alyt4qxs9k9k95a7q1if6r3a8b7yzaor
2014-12-04 10:27:29 ==> Client authorized: alyt4qxs9k9k95a7q1if6r3a8b7yzaor == alyt4qxs9k9k95a7q1if6r3a8b7yzaor
2014-12-04 10:27:29 ==> IP: [127.0.0.1], URL:[http://trunk.alban], Agent: [Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0] 
2014-12-04 10:27:35 ==> Broadcasting clients: amend-view-status_13 {}

Но когда я получаю доступ с другого компьютера, он подключается, но не отправляет/не получает никаких сообщений, просто зацикливается на переключении протоколов, подключении и отключении:

2014-12-04 10:32:23 ==> Client authorized: alyt4qxs9k9k95a7q1if6r3a8b7yzaor == alyt4qxs9k9k95a7q1if6r3a8b7yzaor
2014-12-04 10:32:23 ==> IP: [127.0.0.1], URL:[http://192.168.57.130], Agent: [Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0] 
2014-12-04 10:32:43 ==> Client Disconnected
2014-12-04 10:32:44 ==> Client authorized: alyt4qxs9k9k95a7q1if6r3a8b7yzaor == alyt4qxs9k9k95a7q1if6r3a8b7yzaor
2014-12-04 10:32:44 ==> IP: [127.0.0.1], URL:[http://192.168.57.130], Agent: [Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0] 
2014-12-04 10:33:04 ==> Client Disconnected
2014-12-04 10:33:06 ==> Client authorized: alyt4qxs9k9k95a7q1if6r3a8b7yzaor == alyt4qxs9k9k95a7q1if6r3a8b7yzaor
2014-12-04 10:33:06 ==> IP: [127.0.0.1], URL:[http://192.168.57.130], Agent: [Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0] 

У меня установлен nginx 1.6.2 и socket.io 1.2.1.

Я отключил все возможные брандмауэры.

ПРИМЕЧАНИЕ. Если я удаляю nginx в качестве прокси-сервера, просто указывая на сервер socket.io напрямую, он отлично работает на любом компьютере.

ПРИМЕЧАНИЕ 2: принудительное использование опроса работает без проблем. Кажется, проблема с протоколом nginx/ws...

Любые идеи?


person albanx    schedule 04.12.2014    source источник


Ответы (1)


ОК, я нашел проблему: на стороне клиента я установил опцию транспорта:

this.socket = io.connect(this.adress, {query: 'token='+this.token /* , resource: 'ws/socket.io' */, transports:['websocket', 'polling']});

Удалив его:

this.socket = io.connect(this.adress, {query: 'token='+this.token});

ЭТО РАБОТАЕТ из любого удаленного соединения!!! Я не могу объяснить, почему, но это работает.

Надеюсь, это поможет любому другому пользователю

person albanx    schedule 04.12.2014