【问题标题】:Nginx config for WSSWSS 的 Nginx 配置
【发布时间】:2024-10-15 15:55:02
【问题描述】:

我在通过 WSS 连接到我的服务器时遇到问题。我按照以下文章使用 websockets 设置 nginx:http://www.letseehere.com/reverse-proxy-web-sockets

以下是我的 nginx 配置,用于播放!应用:

#user  nobody;
worker_processes  1;  

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

tcp {

     upstream websockets {
      ## Play! WS location
       server 127.0.0.1:9000;
     }    

    server {
        listen 80; 
        listen 8000;
        server_name socket.domain.com;

        tcp_nodelay on; 
        proxy_pass websockets;
        proxy_send_timeout 300;
    }   

     # virtual hosting
     #include /usr/local/nginx/vhosts/*;
}

http {

  server {
        listen 443 ssl;
        server_name socket.artoo.in;

        ssl_certificate      /usr/local/nginx/key/socket.domain.com.crt;
        ssl_certificate_key  /usr/local/nginx/key/socket.domain.com.key;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;

        location / {
            proxy_pass http://127.0.0.1:9000;
        }
  }
}

虽然服务器可以通过http://socket.domain.comhttps://socket.domain.com、ws://socket.domain.com 访问,但不能通过 wss://socket.domain.com 访问

【问题讨论】:

标签: ssl nginx websocket


【解决方案1】:

我能够整理出问答格式的指南,向您展示如何使用 NGINX 模块完成所有这些工作,这要容易得多;)

NGINX to reverse proxy websockets AND enable SSL (wss://)?

您需要重新构建 NGINX 并按照上述问题中的配置进行操作。

【讨论】:

  • 这是 *.com,不确定我是否理解问题所在?
【解决方案2】:

我至少在短期内通过使用 stunnel 解决了它(参考这篇文章:http://www.darkcoding.net/software/proxy-socket-io-and-nginx-on-the-same-port-over-ssl/)。

Stunnel 可以将 HTTPS 转换为 HTTP,并通过该令牌将 WSS 转换为 WS。 Nginx 像往常一样为在 9000 端口上运行的套接字应用程序提供服务:

/etc/stunnel/stunnel.conf

[https]
accept  = 443
connect = 80 
TIMEOUTclose = 0

/usr/local/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;  

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

tcp {

     upstream websockets {
      ## Play! WS location
       server 127.0.0.1:9000;
       check interval=3000 rise=2 fall=5 timeout=1000;
     }    

    server {
        listen 80; 
        listen 8000;
        server_name socket.artoo.in;

        tcp_nodelay on; 
        proxy_pass websockets;
        proxy_send_timeout 300;

    }   

     # virtual hosting
     #include /usr/local/nginx/vhosts/*;
}

#http {
#
#  server {
#        listen 443 ssl;
#        server_name socket.artoo.in;
#
#        ssl_certificate      /usr/local/nginx/key/socket.domain.com.crt;
#        ssl_certificate_key  /usr/local/nginx/key/socket.domain.com.key;
#
#        ssl_session_timeout  5m;
#
#        ssl_protocols  SSLv2 SSLv3 TLSv1;
#        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#        ssl_prefer_server_ciphers   on;
#
#        location / {
#            proxy_pass http://127.0.0.1:9000;
#        }
#  }
#}

现在我唯一需要担心的是如何增加 nginx 上 websockets 的超时时间,连接似乎每 75 秒中断一次(nginx 的默认值)。

【讨论】:

  • 如何解决这个超时问题?还有什么比将超时设置为一个巨大的数字更优雅的吗?