NGINX para revertir proxy websockets Y habilitar SSL (wss: //)?

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!

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 .

No temas, porque un valiente grupo de progtwigdores de Ops ha resuelto la situación con un nuevo y 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í https://github.com/yaoweibin/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; } } 

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

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í

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; } } 

Un artículo bueno y conciso de Pankaj Malhotra habla sobre cómo hacer esto con NGINX y está disponible aquí .

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; } }