> 技术文档 > 如何配置Nginx以支持WebSocket?_nginx websocket配置

如何配置Nginx以支持WebSocket?_nginx websocket配置

以下是在 Nginx 中配置 WebSocket 支持的完整指南,涵盖代理设置、连接优化和常见问题排查,特别适配 Laravel 项目(如使用 Laravel Echo 或自定义 WebSocket 服务):


1. WebSocket 基础配置

在 Nginx 的 server 块中添加以下配置,确保代理 WebSocket 连接的核心参数

server { listen 443 ssl; server_name your-domain.com; # SSL 配置(由 Certbot 自动生成或手动配置) ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # WebSocket 代理配置 location /ws { proxy_pass http://localhost:6001; # 指向你的 WebSocket 服务器地址 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; # 连接超时和缓冲优化 proxy_read_timeout 86400s; # WebSocket 长连接保持 proxy_send_timeout 86400s; proxy_buffer_size 128k; proxy_buffers 4 256k; } # Laravel 其他路由配置 location / { proxy_pass http://localhost:8000; # 指向 Laravel 应用 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}

2. 关键参数说明

参数 作用 必需 proxy_http_version 1.1 启用 HTTP/1.1 支持 WebSocket ✅ Upgrade $http_upgrade 协议升级为 WebSocket ✅ Connection \"upgrade\" 保持长连接 ✅ proxy_read_timeout 防止空闲连接断开(建议 ≥86400s) ✅ proxy_set_header Host 传递原始域名 ✅ proxy_buffering off 可选:禁用缓冲(实时性要求高时) ❌

3. Laravel Echo Server 配置示例

如果你的 WebSocket 服务是 Laravel Echo Server(默认端口 6001),需确保:

3.1 laravel-echo-server.json 配置
{ \"authHost\": \"https://your-domain.com\", \"authEndpoint\": \"/broadcasting/auth\", \"host\": \"0.0.0.0\", \"port\": \"6001\", \"protocol\": \"http\", \"sslCertPath\": \"\", \"sslKeyPath\": \"\", \"socketio\": {}}
3.2 Nginx 代理广播认证路由
location /broadcasting/auth { proxy_pass http://localhost:8000; # 指向 Laravel 应用 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;}

4. 生产环境优化

4.1 启用 SSL 直连 WebSocket
location /ws { proxy_pass https://localhost:6002; # WebSocket 服务启用 SSL proxy_ssl_certificate /path/to/client.crt; proxy_ssl_certificate_key /path/to/client.key; # ... 其他 WebSocket 参数 ...}
4.2 负载均衡多节点
upstream websocket_nodes { server ws1.example.com:6001; server ws2.example.com:6001; keepalive 64;}location /ws { proxy_pass http://websocket_nodes; # ... 其他 WebSocket 参数 ...}

5. 本地开发配置(WSL2)

如果本地使用 laravel.test 域名开发,需配置自签名证书:

server { listen 443 ssl; server_name laravel.test; # 自签名证书路径 ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; location /ws { proxy_pass http://localhost:6001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \"upgrade\"; }}

注意:浏览器需手动信任自签名证书。


6. 测试 WebSocket 连接

6.1 使用 wscat 命令行测试
# 安装工具npm install -g wscat# 测试连接wscat -c wss://your-domain.com/ws
6.2 浏览器端检查

打开开发者工具 → Network → WS 过滤,查看连接状态应为 101 Switching Protocols


7. 常见问题排查

问题 1:WebSocket 连接失败(HTTP 426)
  • 原因:Nginx 未正确传递 Upgrade
  • 解决:检查是否遗漏 proxy_set_header Upgrade $http_upgrade;
问题 2:连接频繁断开
  • 原因:Nginx 超时设置过短
  • 解决:调整 proxy_read_timeoutproxy_send_timeout
问题 3:混合内容警告(Mixed Content)
  • 原因:前端页面为 HTTPS,但 WebSocket 连接 HTTP
  • 解决:确保前端代码使用 wss:// 协议
    const socket = new WebSocket(\'wss://your-domain.com/ws\');
问题 4:Laravel Echo 认证失败
  • 原因:Nginx 未正确代理 /broadcasting/auth 路由
  • 解决:检查 Laravel 路由和 Nginx 代理配置

8. 完整配置示例

Nginx + Laravel Echo Server + SSL

server { listen 443 ssl; server_name your-domain.com; ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # WebSocket 路径 location /ws { proxy_pass http://localhost:6001; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \"upgrade\"; proxy_set_header Host $host; proxy_read_timeout 86400s; } # Laravel Echo 认证路由 location /broadcasting/auth { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # Laravel 主应用 location / { proxy_pass http://localhost:8000; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}

9. 性能与安全建议

  1. 启用 HTTP/2:提升多路复用性能
    listen 443 ssl http2;
  2. 限制 WebSocket 连接来源
    location /ws { allow 192.168.1.0/24; deny all; # ... 其他配置 ...}
  3. 监控连接数
    netstat -anp | grep :6001

通过以上配置,你的 Nginx 将完整支持 WebSocket,适配 Laravel 实时应用场景(如通知、聊天室等)。遇到问题时,优先检查 Nginx 错误日志

sudo tail -f /var/log/nginx/error.log