nginx配置支持ws反代

前言

最近线上项目有个小问题,在F12查看问题的时候发现了另外一个问题,就是今天的主题,ws连接报错了,总是报400错误,下面记录下如何解决

环境

因为项目部署在公司内网,用frp穿透出去用域名访问的,域名又ssl证书,一开始项目用ws协议,报错也是看起来就是需要换成wss协议才行

问题

换了周发现问题还在,但是报错不一样了,没有那么多错误了,不过请求还是400,用postman在公司内网连接ws协议发现没有问题,那就说明要么是frp的问题,要么就是域名所在nginx反代的问题

经过查询frp,发现frp是支持的,以前项目有过这个问题,所以frp不存在不能转发ws协议的问题,所以问题一定处在域名所在nginx,查看nginx的配置后发现确实有问题

解决

如果要让反代支持ws,整体配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
listen 443;
server_name #这里是你申请的域名;

ssl on;

# 这里是你申请域名对应的证书(一定要注意路径的问题,建议绝对路径)
ssl_certificate 你的证书.crt;
ssl_certificate_key 你的密匙.key;

ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_verify_client off;

# 反向代理
location / {
proxy_redirect off;
proxy_pass http://127.0.0.1:9501; # 转发到你本地的9501端口 这里要根据你的业务情况填写
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # 升级协议头
proxy_set_header Connection upgrade;
}
}

重点是以下几行

1
2
3
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # 升级协议头
proxy_set_header Connection upgrade;
  1. **proxy_http_version 1.1;**:
    • 这一行配置指定了在反向代理请求时使用的 HTTP 协议版本。在这里,将协议版本设置为 1.1。
    • WebSocket 协议需要使用 HTTP/1.1 或更高版本,因此必须将协议版本设置为 1.1。
  2. **proxy_set_header Upgrade $http_upgrade;**:
    • 这一行配置用于设置 HTTP 头部,指示 Nginx 将客户端的请求升级为 WebSocket 连接。
    • $http_upgrade 是一个 Nginx 变量,它包含客户端请求的 Upgrade 头部内容。通常,这个头部包含值 “websocket”,以指示客户端希望升级到 WebSocket 连接。
    • 这个配置确保 Nginx 将请求升级为 WebSocket 连接。
  3. **proxy_set_header Connection “upgrade”;**:
    • 这一行配置用于设置 HTTP 头部,指示 Nginx 使用 “upgrade” 连接类型。这是 WebSocket 连接所需的连接类型。
    • 当客户端请求升级到 WebSocket 连接时,Nginx 会使用 “upgrade” 连接类型,以确保连接可以升级为双向 WebSocket 连接