NGINX反向代理websockets并启用SSL(wss://)?

我非常迷茫,并且自己创buildNGINX,但是我希望能够在没有附加层的情况下启用安全的websockets。

我不想在websocket服务器本身上启用SSL,而是想用NGINX来添加SSL层。

每一个网页都说我做不到,但我知道我可以! 感谢谁(我)可以告诉我如何!

只要注意,nginx现在支持1.3.13版本的Websockets。 使用示例:

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

您还可以检查nginx更新日志和WebSocket代理文档。

不要害怕,因为一个勇敢的Ops程序员团队已经解决了这个问题,一个崭新的nginx_tcp_proxy_module

写在2012年8月,所以如果你是来自未来,你应该做你的功课。

先决条件

假设你正在使用CentOS:

build立你的新NGINX

再次假设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 (如果需要,可以添加更多模块)
  • make
  • make install

可选的:

  • sudo /sbin/chkconfig nginx on

设置Nginx

如果您想重新使用它们,请记得先复制旧的configuration文件。

重要提示:您将需要在您的conf中创build最高级别的tcp {}指令。 确保它不在你的http {}指令中。

下面的示例configuration显示了一个上游websocket服务器和两个SSL和非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; } } 

这对我工作:

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

– 借用: https : //github.com/nicokaiser/nginx-websocket-proxy/blob/df67cd92f71bfcb513b343beaa89cb33ab09fb05/simple-wss.conf

Pankaj Malhotra的一篇很好的简明文章讨论了如何使用NGINX来做到这一点,可以在这里find 。

NGINXconfiguration的基础知识如下:

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

对我来说,它下降到proxy_pass位置设置。 需要将http://nodeserverhttps://nodeserver ,并在节点服务器端设置有效的SSL证书。 这样,当我引入一个外部节点服务器,我只需要改变IP,其他一切都保持相同的configuration。

我希望这可以帮助一路上的人……我一直在盯着这个问题……叹息…

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

.net core 2.0带有SSL的Nginx

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

这对我有效