nginx + узел + ssl + websockets, на одном сервере - PullRequest
0 голосов
/ 04 июля 2018

Мне удалось найти руководства, относящиеся к различным комбинациям nginx, node, ssl и websockets, но никогда не все вместе и никогда на одном сервере.

В конечном счете, это то, что я преследую, и я не уверен, возможно ли это вообще:

  • один сервер (Ubuntu 14.04)
  • принудительный HTTPS (просмотр до http://site, пересылка до https://)
  • приложение узла размещено на localhost: 3000
  • приложение узла использует веб-сокеты
  • это одностраничное приложение React без маршрутизации, поэтому мне не нужны маршруты. Повторяю, у меня только одна страница без навигации.

С приведенным ниже конфигом у меня все работает, кроме веб-сокетов - клиент выдает ошибку, которая не происходит, если я перехожу прямо к серверу узла и не использую nginx (перейдите к http://my.domain:3000):

bundle.js:26 WebSocket connection to 'wss://<my domain>/socket.io/?EIO=3&transport=websocket&sid=x1uQtRzF3gYYEvfIAAAi' failed: Error during WebSocket handshake: Unexpected response code: 400

server {
  listen 80;
  return 301 https://my/domain$request_uri;
}

server {
  listen 443 ssl;
  listen [::]:443;

  ssl_certificate     /path/cert.crt;
  ssl_certificate_key /path/key.key;
  ssl_session_cache shared:SSL:10m;

  server_name blaze.chat;

  location / {
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_pass              http://localhost:3000;
    proxy_http_version      1.1;
    proxy_set_header        Upgrade $http_upgrade;
    proxy_set_header        Host $host;
    proxy_redirect          http://localhost:3000 https://my.domain;
  }

}

1 Ответ

0 голосов
/ 04 июля 2018

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

proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;

В моем случае websockets не будет работать без этих строк, в отличие от многих других постов, где задавались похожие вопросы. Не уверен, в чем разница. Как ни странно, это указано в качестве требования в документе Nginx Websocket Proxying ... Должен начаться там, мой плохой.

http://nginx.org/en/docs/http/websocket.html

Примечание: я просто использую это для корневого пути /, который отлично работает.

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