如何通过Nginx将http升级为https,ws升级成wss

项目需要部署上线,前端采用的是小程序客户端,小程序部署上线需要使用更为安全的https协议进行通信。使用Nginx接收到前端发送的https请求,并将请求反向代理到处理http请求的后端服务器上。这样可以在不进行任何后端代码更改的条件下,完成http到https的升级。以下是操作步骤和注意事项。

1.下载Nginx

Linux 安装 Nginx 并配置为系统服务(超详细)-阿里云开发者社区 (aliyun.com)

2.升级Nginx,并完成http到https协议的升级

直接从步骤二看起

Nginx或Tengine服务器配置SSL证书_数字证书管理服务(原SSL证书)(SSL Certificate)-阿里云帮助中心 (aliyun.com)

 

在配置文件中,我们将所有的http请求重写成https请求,nginx这时候会进行转发,由监听443端口的server模块进行处理。

3.编写wss部分的配置文件

wss的配置如上,我们可以将ws理解成http的升级,wss理解成https的升级,并且ws默认使用80端口,wss默认使用443端口和http、https相同。

完整配置文件信息

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    server {
        listen       80;
        server_name  www.lzfamily.cn;

	    #将请求转成https
        rewrite ^(.*)$ https://$host$1;
	   
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
             root   html;
        }

    }  


  # HTTPS server
    
    server {
        listen       443 ssl;
        server_name  www.lzml.cn;
	   #	ssl证书的 pem 文件路径   
        ssl_certificate      /usr/local/nginx/cert/lzml.cn.pem;
        # ssl证书的 key 文件路径
        ssl_certificate_key  /usr/local/nginx/cert/lzml.cn.key;
        ssl_session_cache    shared:SSL:10m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
        	root      /opt/dihuaxia/houtai;
		    try_files $uri $uri/ /index.html;
            index index.html index.htm;
        }
        
        location /api {
             proxy_pass     http://8.136.112.32:8000;
        }
       
    	location /ws {
           proxy_redirect off;
           proxy_read_timeout 60s;
           proxy_send_timeout 60s;
           proxy_pass http://8.136.112.32:8001;
           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";
        }
    }

思考:如果使用 wss://ip地址/ws 请求服务器会发生什么?

会发生一个奇怪的现象,在apifox里面可以正常建立websocket长连接,但是在websocket在线测试却无法进行连接,甚至我们的nginx都收不到建立websocket的请求

在apifox请求是正常的,可以正常的建立websocket连接

 websocket在线测试连接失败,我们的nginx没有接收到连接信息 在线测试网址:WebSocket在线测试工具 (wstool.js.org)
nginx是否接收到请求可查看/usr/local/nginx/logs/access.log日志中的信息
打开控制台进行查看原因:

 从上面的js中我们可以看出来,脚本执行到  var wsInstance = new WebSocket(this.address) 创建websocket实例的时候就已经报错了,很有可能是我们使用的wss协议的时候,一定要使用域名进行请求,不能够使用IP地址进行websocket实例的创建。apifox是一个请求测试工具,和浏览器发送出来的实际请求不太相同。例如:apifox不会存在跨域问题,但是前端项目部署完成后,可能会存在跨域问题。

<think>好的,我现在需要帮用户配置Nginx,将WSS请求转发到WS。用户的问题是关于如何通过Nginx配置实现WSSWS的反向代理。根据用户提供的引用内容,我需要先整理相关的配置信息,并确保步骤正确。 首先,用户提供的引用中有几个关键点。引用[2]和[4]都提到了配置location块,设置proxy_pass指向后端服务器,以及必要的HTTP头信息,如Upgrade和Connection。此外,引用[3]提到生产环境下使用wss://ip:port/wss/,经过Nginx代理后转向http://后端地址。这说明配置中需要注意路径匹配和代理地址的正确性。 接下来,我需要考虑SSL证书的配置,因为WSS是基于HTTPS的,所以Nginx必须启用SSL,并配置证书和私钥的路径。这在用户的引用中没有直接提到,但这是必须的步骤,否则WSS无法正常工作。 然后,配置反向代理部分。根据引用中的例子,location块需要处理WebSocket升级请求,设置proxy_http_version为1.1,并且正确设置Upgrade和Connection头部。同时,可能还需要处理真实IP的转发,比如X-real-ip和X-Forwarded-For,这在引用[2]中有提到。 还需要检查Nginx配置文件的语法是否正确,使用nginx -t命令,然后重新加载配置,如引用[1]所述。测试部分可能需要用户使用WebSocket客户端工具连接wss地址,验证是否能够成功代理到后端的WS服务。 可能遇到的问题包括:证书配置错误导致SSL握手失败,location路径不匹配导致代理不生效,或者缺少必要的HTTP头设置导致WebSocket升级失败。需要提醒用户注意这些点。 总结步骤应该是:生成或获取SSL证书,配置Nginx的server块监听443端口并启用SSL,设置location处理WebSocket请求,配置代理到后端WS服务,检查配置并重启Nginx,最后测试连接是否成功。 需要确保所有步骤都清晰,并且用户能够按照指导操作。同时,根据用户提供的引用,确保配置示例正确无误,特别是proxy_pass的地址和端口是否正确,以及头部的设置是否完整。另外,提醒用户如果后端服务在本地,可以使用localhost,否则需要替换为实际的IP和端口。</think>以下是配置Nginx实现WSSWS反向代理的逐步说明: ### 一、基础配置步骤 1. **启用SSL模块** 在Nginx配置文件中添加SSL证书路径(需提前申请证书): ```nginx server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/privkey.pem; ``` *若需强制HTTPS,可添加`return 301 https://$host$request_uri;`到80端口配置[^4]* 2. **配置WebSocket代理规则** 在server块内添加location规则,匹配WebSocket请求路径: ```nginx location /wss { proxy_pass http://127.0.0.1:8088; # 后端WS服务地址 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_http_version 1.1`:启用HTTP/1.1协议支持 - `Upgrade`和`Connection`:处理协议升级WebSocket[^2] ### 二、完整配置示例 ```nginx server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; location /wss { proxy_pass http://localhost:8088; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 86400; # 保持长连接 } } ``` ### 三、验证与调试 1. **配置检查** 执行命令检查语法: ```bash nginx -t ``` 重启服务: ```bash nginx -s reload ``` 2. **测试方法** - 使用浏览器开发者工具查看`WebSocket`连接状态 - 通过`wscat`命令行工具测试: ```bash wscat -c wss://example.com/wss ``` ### 四、常见问题处理 | 现象 | 排查方向 | 解决方案 | |---------------------|-----------------------------------|-----------------------------------| | 502 Bad Gateway | 后端服务未启动或端口不匹配 | 检查`proxy_pass`地址和端口 | | 无法建立WS连接 | 缺少协议升级头 | 确认`Upgrade`和`Connection`头设置 | | 证书错误 | 证书路径错误或权限不足 | 检查证书文件权限设为644 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值