NGINX实现Websocket的wss

551 阅读1分钟

业务场景

公司的业务之前是HTTP,临时需要使用HTTPS服务,申请了证书,现在需要升级websocket为wss。项目结构是前后分离的所以我这边设想的就是NGINX的转发内部后端接口

1.转发后端

 server {
        listen       443 ssl;
        server_name  //域名地址;

		//请求时间防止slowloris攻击
        client_body_timeout 60s; 
        client_header_timeout 60s; 
	    client_max_body_size 20m; 
        //设置代理的请求time_out
	    proxy_connect_timeout 300s;
	    proxy_send_timeout 300s;
	    proxy_read_timeout 300s;

        ssl_certificate      /etc/ssl/server.pem;
        ssl_certificate_key  /etc/ssl/server.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_prefer_server_ciphers  on;


        location ^~ /trans/ {
            proxy_pass  http://xxxx:8080;//后端的IP和端口
        }

        location ^~ /api/ {
            proxy_pass  http://xxxx:8081;//后端的IP和端口
        }
        location / {
            proxy_pass http://xxxx:8081;//前端的IP和端口
        }
    }

2.添加wss的请求转发

因为本质上wss是建立TLS的基础上的,其实本质上也是HTTP的握手后的升级 所以Nginx上添加升级的头

location /ws/ {
            proxy_pass http://xxxx:3000;//websocket的IP和端口
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }