Я хочу использовать nginx в качестве обратного прокси-сервера для соединений через веб-сокеты.
Считайте эхо.websocket.org моей серверной службой веб-сокетов. В качестве тестового клиента использую wscat из https://github.com/websockets/wscat.
Что работает:
клиент <-- ws --> серверная часть:
wscat --connect ws://echo.websocket.org
клиент <-- wss -->: wscat --connect wss://echo.websocket.org
клиент <-- ws --> прокси <-- ws --> серверная часть: wscat --connect ws://localhost со следующей конфигурацией nginx:
events {
}
http {
server {
listen 80;
location / {
proxy_pass http://echo.websocket.org;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
}
}
}
клиент <-- wss --> прокси <-- ws --> серверная часть: wscat -n --connect wss://localhost со следующей конфигурацией nginx:
events {
}
http {
server {
listen 443 ssl;
ssl_certificate /pki/cert.pem;
ssl_certificate_key /pki/key.pem;
location / {
proxy_pass http://echo.websocket.org;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
}
}
}
Что я хочу и в чем мне нужна помощь, так это в настройке nginx для использования безопасных веб-сокетов для подключения к серверной части. Я хочу эту конфигурацию:
клиент <-- wss --> прокси <-- wss --> серверная часть
Я безуспешно пытался изменить http://echo.websocket.org на https://echo.websocket.org. Это приводит к тайм-ауту шлюза 504.
Я понятия не имею, что изменилось между пятницей и сегодня, но сейчас это работает, ничего не меняя. В любом случае, спасибо, что заставили меня попробовать еще раз :D
Я рад, что это работает :)
@merl Пожалуйста, посмотрите образец, возможно, сертификаты или информация о домене не были обновлены вчера, может быть, это может быть вам полезно.

Это мой конфиг upstream, server_name, ssl_certificate, HTTP 301:
server {
listen 80; # nginx 80
location / {
return 301 https://$host$request_uri;
}
location ^~ /.well-known/acme-challenge/ {
# Set correct content type. According to this:
# https://community.letsencrypt.org/t/using-the-webroot-domain-verification-method/1445/29
# Current specification requires "text/plain" or no content header at all.
# It seems that "text/plain" is a safe option.
default_type "text/plain";
# This directory must be the same as in /etc/letsencrypt/cli.ini
# as "webroot-path" parameter. Also don't forget to set "authenticator" parameter
# there to "webroot".
# Do NOT use alias, use root! Target directory is located here:
# /var/www/common/letsencrypt/.well-known/acme-challenge/
root /var/www/html;
}
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/***0***0.ru/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/***0***0.ru/privkey.pem; # managed by Certbot
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name ***0***0.ru; # server name
location /sockjs-node/ {
proxy_pass http://node; # wep application
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location / {
proxy_pass http://node;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /smpp {
rewrite /smpp(.*) /$1 break;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
proxy_pass http://smpp;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
upstream smpp {
server localhost:5001;
}
upstream node {
server localhost:5000;
}
Вам нужно использовать proxy_ssl_certificate и proxy_ssl_certificate_key, как указано в Документы Nginx.
Я думаю, вам не хватает настроек SSL-сертификата прокси-сервера. Посмотрите на
proxy_ssl_certificateдокументация и Руководство по защите HTTP-трафика к вышестоящим серверам... он должен (вероятно) работать и с WebSockets.