面向Clojure WebSocket应用的Nginx生产环境配置求助
解决Clojure WebSocket应用的Nginx反向代理配置问题
我帮你梳理下解决这个问题的具体方案——毕竟WebSocket是长连接协议,Nginx默认的HTTP代理配置没法直接适配,得做针对性调整才行。结合你服务器已经托管多个站点的情况,你可以添加一个独立的Nginx server块来处理wss://domain.com:8001的请求,具体步骤如下:
1. 添加Nginx反向代理配置
编辑你的Nginx配置文件(通常在/etc/nginx/nginx.conf或者/etc/nginx/sites-available/目录下的站点配置文件),加入以下server块:
server { listen 8001 ssl; server_name domain.com; # 替换成你的SSL证书路径(wss必须用SSL,不然浏览器会拒绝连接) ssl_certificate /path/to/your/fullchain.pem; ssl_certificate_key /path/to/your/privkey.pem; # 可选但推荐的SSL优化配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { # 把这里的端口改成你的Clojure应用实际监听的本地端口(比如3000) proxy_pass http://localhost:3000; # WebSocket核心配置:处理协议升级 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 传递客户端真实信息给Clojure应用 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_set_header X-Forwarded-Proto $scheme; # 延长超时时间适配WebSocket长连接特性(默认超时太短会断连) proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; } }
2. 关键配置说明
- 协议升级配置:
proxy_http_version 1.1、Upgrade和Connection这三个头是必须的——WebSocket依赖HTTP/1.1的升级机制,没有这些配置,Nginx会把WebSocket请求当成普通HTTP请求处理,直接返回错误。 - 超时设置:WebSocket是长连接,Nginx默认的超时时间(几秒到几分钟)会导致连接被意外断开,所以把超时时间设为7天完全够用。
- SSL配置:因为你用的是
wss(加密的WebSocket),必须配置有效的SSL证书,否则前端浏览器会直接拒绝建立连接。
3. 验证配置并重启Nginx
先检查配置有没有语法错误:
sudo nginx -t
如果提示test is successful,就重启Nginx让配置生效:
sudo systemctl restart nginx
4. 额外排查点
- 确认你的Clojure应用确实在监听你配置的本地端口(比如3000),而且服务器本地能正常访问这个端口(可以用
curl http://localhost:3000测试)。 - 检查服务器防火墙规则,确保8001端口已经对外开放(比如用
ufw allow 8001/tcp,如果是iptables的话对应调整规则)。
这样配置后,外部的wss://domain.com:8001请求就能被Nginx正确转发到你的Clojure应用,解决外部无响应的问题了。
内容的提问来源于stack exchange,提问作者TrivialCase
相关产品推荐
相关产品推荐

