Myluzh Blog

在Nginx和Ingress-Nginx中配置WebSocket(WS/WSS)

发布时间: 2025-2-26 文章作者: myluzh 分类名称: Kubernetes 朗读文章


0x01 Nginx
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/your/certificate.crt;
    ssl_certificate_key /path/to/your/private.key;

    location /ws/ {
        proxy_pass http://backend_server;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Forwarded-Proto $scheme;
        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_http_version 1.1;
将代理的 HTTP 协议版本设置为 1.1。WebSocket 需要 HTTP/1.1 支持,因为 HTTP/1.1 引入了 Upgrade 机制,允许将 HTTP 连接升级为 WebSocket 连接。
proxy_set_header Upgrade $http_upgrade;
设置 Upgrade 请求头,值为客户端发送的 Upgrade 头(通常是 websocket)。这是 WebSocket 协议的关键步骤,用于告诉服务器将连接升级为 WebSocket。
proxy_set_header Connection "Upgrade";
设置 Connection 请求头为 Upgrade,表示客户端希望将连接升级为 WebSocket。这是 WebSocket 握手的必要部分。
proxy_set_header X-Forwarded-Proto $scheme;
设置 X-Forwarded-Proto 请求头,值为客户端使用的协议(http 或 https)。这有助于后端服务器识别客户端是通过 HTTP 还是 HTTPS 访问的。
proxy_set_header Host $host;
设置 Host 请求头,值为客户端请求的原始主机名。这确保后端服务器知道客户端请求的域名。
proxy_set_header X-Real-IP $remote_addr;
设置 X-Real-IP 请求头,值为客户端的真实 IP 地址。这有助于后端服务器获取客户端的真实 IP,而不是代理服务器的 IP。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
设置 X-Forwarded-For 请求头,值为客户端的原始 IP 地址。如果请求已经经过其他代理,该头会追加客户端的 IP 地址,形成一个 IP 链。


2、Kubernetes Ingress-Nginx
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jump-ingress
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "3600"
    nginx.ingress.kubernetes.io/websocket-services: "jump-server"
    nginx.ingress.kubernetes.io/proxy-set-header: X-Forwarded-Proto $scheme
    nginx.ingress.kubernetes.io/proxy-set-header: Upgrade $http_upgrade
    nginx.ingress.kubernetes.io/proxy-set-header: Connection "upgrade"   
为了支持WebSocket,需要在Ingress资源中添加特定的注解(annotations),如:
nginx.ingress.kubernetes.io/websocket-services: 指定支持WebSocket的服务。
nginx.ingress.kubernetes.io/proxy-http-version: 设置HTTP版本为1.1。
nginx.ingress.kubernetes.io/proxy-set-header: 设置WebSocket升级所需的HTTP头。
此外,为了确保WebSocket连接的稳定性,还可以配置超时时间,如proxy-read-timeout、proxy-send-timeout和proxy-connect-timeout。

标签: k8s nginx ingress-nginx ws wss

发表评论