Мне удалось найти руководства, относящиеся к различным комбинациям 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;
}
}