Socket.io с nginx

Я пытаюсь обслуживать статические файлы с помощью nginx 1.6 и прокси-сокета, идущего с веб-сервера Node.js с socket.io.

Это важная часть nginx.conf:

location /socket.io/ {
            proxy_pass http://localhost:3000;       
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_set_header Host $host;
        }

Он отлично работает непосредственно между браузером и Node.js, но socket.io занимает слишком много времени при проксировании с nginx 1.6. Протокол установления связи занимает слишком много времени, но если он не прерывается, он начинает работать через пару минут.

Доставка статических файлов nginx отлично работает.

В чем может быть проблема?

UPDATE:

Я немного проанализировал сетевой трафик и определил, что следующий запрос длится около минуты (он точно при запросе обновления):

Sec-WebSocket-Key: LhZ1frRdl+myuwyR/T03lQ==
Cookie: io=1-A7tpvwmoGbrSvTAAA5
Connection: keep-alive, Upgrade
Upgrade: websocket
....

Ожидаемый ответ код 101 и:

Connection: upgrade
Sec-WebSocket-Accept: HXx3KKJadQYjDa11lpK5y1nENMM=
Upgrade: websocket
...

вместо этого браузер получает 400 и:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:8888
Connection: keep-alive
Content-Type: application/json
Server: nginx/1.6.2
Transfer-Encoding: chunked

ОБНОВЛЕНИЕ 2:

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

Ответ 1

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

  # Requests for socket.io are passed on to Node on port 3000
  location ~* \.io {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy false;

      proxy_pass http://localhost:3000;
      proxy_redirect off;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }

Ответ 2

Каждый пример, который я видел (Nginx docs, блог Nginx) использует:

proxy_set_header Connection "upgrade";

Обратите внимание на все строчные "обновления". В вашем примере есть капитал "U". Возможно, стоит попробовать.

Ответ 3

Вы можете забыть про proxy_redirect off;

location / {
            proxy_pass http://localhost:3000/;
            include proxy_params;
            proxy_redirect off;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
    }