ssl - node - nginx websocket timeout
NGINX para revertir proxy websockets Y habilitar SSL(wss://)? (6)
Esto funcionó para mí:
location / {
# redirect all HTTP traffic to localhost:8080
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
- tomado de: https://github.com/nicokaiser/nginx-websocket-proxy/blob/df67cd92f71bfcb513b343beaa89cb33ab09fb05/simple-wss.conf
Estoy tan perdido y nuevo en la construcción de NGINX solo, pero quiero poder habilitar websockets seguros sin tener una capa adicional.
No quiero habilitar SSL en el servidor websocket en sí, pero en su lugar quiero usar NGINX para agregar una capa SSL a todo.
Cada página web dice que no puedo hacerlo, ¡pero sé que puedo! ¡Gracias a quien (yo) pueda mostrarme cómo!
No temas, porque un valiente grupo de programadores de Ops ha resuelto la situación con un nuevo nginx_tcp_proxy_module flamante nginx_tcp_proxy_module
Escrito en agosto de 2012, entonces si eres del futuro deberías hacer tu tarea.
Requisitos previos
Asume que estás usando CentOS:
- Elimine la instancia actual de NGINX (sugiera usar el servidor de desarrollo para esto)
- Si es posible, guarde sus viejos archivos de configuración NGINX para que pueda volver a usarlos (eso incluye su
init.d/nginx
) -
yum install pcre pcre-devel openssl openssl-devel
y cualquier otra librería necesaria para construir NGINX - Obtenga el nginx_tcp_proxy_module de GitHub aquí nginx_tcp_proxy_module y recuerde la carpeta donde lo colocó (asegúrese de que no esté comprimido)
Construye tu nueva NGINX
Nuevamente, asume CentOS:
-
cd /usr/local/
-
wget ''http://nginx.org/download/nginx-1.2.1.tar.gz''
-
tar -xzvf nginx-1.2.1.tar.gz
-
cd nginx-1.2.1/
-
patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch
-
./configure --add-module=/path/to/nginx_tcp_proxy_module --with-http_ssl_module
(puede agregar más módulos si los necesita) -
make
-
make install
Opcional:
-
sudo /sbin/chkconfig nginx on
Configurar Nginx
Recuerde copiar primero sus viejos archivos de configuración si desea volver a usarlos.
Importante: deberá crear una directiva tcp {}
al más alto nivel en su conf. Asegúrese de que no esté dentro de su directiva http {}
.
La siguiente configuración de ejemplo muestra un servidor websocket upstream único y dos proxies para SSL y Non SSL.
tcp {
upstream websockets {
## webbit websocket server in background
server 127.0.0.1:5501;
## server 127.0.0.1:5502; ## add another server if you like!
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
server_name _;
listen 7070;
timeout 43200000;
websocket_connect_timeout 43200000;
proxy_connect_timeout 43200000;
so_keepalive on;
tcp_nodelay on;
websocket_pass websockets;
websocket_buffer 1k;
}
server {
server_name _;
listen 7080;
ssl on;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.key;
timeout 43200000;
websocket_connect_timeout 43200000;
proxy_connect_timeout 43200000;
so_keepalive on;
tcp_nodelay on;
websocket_pass websockets;
websocket_buffer 1k;
}
}
Para mí todo se redujo a la configuración de ubicación proxy_pass
. Necesita cambiar el http://nodeserver
a https://nodeserver
, y tener una configuración de certificado SSL válida en el servidor de nodos. De esa manera cuando presento un servidor de nodo externo, solo tengo que cambiar la IP y todo lo demás permanece en la misma configuración.
Espero que esto ayude a alguien en el camino ... Estaba mirando el problema todo el tiempo ... suspiro ...
map $http_upgrade $connection_upgrade {
default upgrade;
'''' close;
}
upstream nodeserver {
server 127.0.0.1:8080;
}
server {
listen 443 default_server ssl http2;
listen [::]:443 default_server ssl http2 ipv6only=on;
server_name mysite.com;
ssl_certificate ssl/site.crt;
ssl_certificate_key ssl/site.key;
location /horizon {
proxy_pass https://nodeserver;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_intercept_errors on;
proxy_redirect off;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_ssl_session_reuse off;
}
}
Solo para observar que nginx ahora tiene soporte para Websockets en la versión 1.3.13. Ejemplo de uso:
location /websocket/ {
proxy_pass ​http://backend_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
También puede consultar el registro de cambios de nginx y la documentación de proxies de WebSocket .
Un artículo bueno y conciso de Pankaj Malhotra habla sobre cómo hacer esto con NGINX y está disponible here .
La configuración básica de NGINX se reproduce a continuación:
map $http_upgrade $connection_upgrade {
default upgrade;
'''' close;
}
upstream appserver {
server 192.168.100.10:9222; # appserver_ip:ws_port
}
server {
listen 8888; // client_wss_port
ssl on;
ssl_certificate /path/to/crt;
ssl_certificate_key /path/to/key;
location / {
proxy_pass http://appserver;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}
para .net core 2.0 Nginx con SSL
location / {
# redirect all HTTP traffic to localhost:8080
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}
Esto funcionó para mí