You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为C# System.Net.WebSocket服务配置Nginx安全WebSocket?

Nginx配置安全WebSocket(WSS)支持C# WebSocket服务器

要让你的C# WebSocket服务器通过Nginx提供wss://localhost:9000的安全连接,核心是让Nginx处理SSL加密,并把WebSocket请求反向代理到你的后端C#服务。下面是完整的配置方案和关键要点:

完整Nginx配置示例

首先,假设你的C# WebSocket服务器正在监听ws://localhost:8080(如果你的后端端口不同,替换成实际值),下面是Nginx的配置片段:

server {
    # 监听9000端口的HTTPS请求(即WSS的入口)
    listen 9000 ssl;
    server_name localhost;

    # 配置SSL证书和私钥路径
    # 如果是本地测试,可以用openssl生成自签名证书:
    # openssl req -x509 -newkey rsa:4096 -keyout localhost.key -out localhost.crt -days 365 -nodes
    ssl_certificate /path/to/localhost.crt;
    ssl_certificate_key /path/to/localhost.key;

    # 优化SSL协议和加密套件(可选但推荐)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        # 反向代理到你的C# WebSocket服务器
        proxy_pass http://localhost:8080;

        # WebSocket必须依赖HTTP/1.1的Upgrade机制
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 传递必要的请求头给后端
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 设置长超时,避免WebSocket连接被Nginx提前断开
        proxy_connect_timeout 7d;
        proxy_send_timeout 7d;
        proxy_read_timeout 7d;
    }
}

关键配置说明

  • SSL监听listen 9000 ssl; 指定Nginx在9000端口处理HTTPS请求,这就是客户端连接的wss://localhost:9000对应的端口。
  • SSL证书:必须配置ssl_certificatessl_certificate_key,本地测试可以用自签名证书,生产环境建议使用信任的CA颁发的证书。
  • WebSocket升级头proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";是实现WebSocket协议转换的核心,告诉Nginx把客户端的WebSocket升级请求转发到后端服务。
  • HTTP版本proxy_http_version 1.1; 必须设置,因为WebSocket基于HTTP/1.1协议。
  • 超时设置:默认Nginx代理超时较短,设置7天的超时可以避免长连接被意外断开,根据你的业务需求调整即可。

验证步骤

  1. 把上述配置添加到你的Nginx配置文件中(通常在/etc/nginx/nginx.conf或者/etc/nginx/sites-available/目录下)。
  2. 检查配置是否正确:nginx -t(Linux)或者在Windows下通过Nginx的命令行工具验证。
  3. 重启Nginx:nginx -s reload(Linux)或者重启Windows上的Nginx服务。
  4. 用WSS客户端测试连接,比如浏览器的JavaScript代码:
const ws = new WebSocket('wss://localhost:9000');
ws.onopen = () => console.log('WSS连接成功!');
ws.onmessage = (event) => console.log('收到消息:', event.data);
ws.onerror = (error) => console.error('连接错误:', error);

注意:如果用自签名证书,浏览器会提示连接不安全,需要手动信任证书才能正常连接。

额外注意事项

  • 确保你的C# WebSocket服务器正常运行,并且监听的端口和Nginx配置中的proxy_pass地址一致。
  • 如果有防火墙,要开放9000端口的HTTPS访问权限。
  • 生产环境中,建议配置更严格的SSL策略,比如禁用旧的TLS版本和弱加密套件。

内容的提问来源于stack exchange,提问作者Daulat Kadam

火山引擎 最新活动