用nginx反向代理功能将WS转为加密websocket (wss)

         原来写的服务器端程序支持websocket非加密协议,即仅支持 ws://ip/file 形式的访问,现在网站的主协议变成了https了,再通过ws://协议来访问原服务器,浏览器阻止了。查找原因就是,如果一个网页的协议是https的,则内部的子连接必须也是安全套接字,如果原来是ws协议,则现在必须变为wss协议。

         由于时间紧,来不及修改原服务器了。发现nginx可以将ws协议通过反向代理的方式转为wss,目前苟且采用这种替代方案吧。

nginx配置成websocket的反向代理的配置文件如下 :

server {
	listen 443;
	server_name live.xxxxx.com;

	access_log logs/live.xxxxx.log main;

	ssl on;
	ssl_certificate /etc/live.xxxxx.com.cer;     # 这里是服务端的证书路径
	ssl_certificate_key /etc/live.xxxxx.com.key; # 这里是秘钥路径
	ssl_session_timeout 5m;
	ssl_session_cache shared:SSL:10m;
	ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
	#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 /wss {
		proxy_redirect off;
		proxy_pass http://127.0.0.1:8006/live;
		proxy_http_version 1.1;
		proxy_set_header Connection "upgrade";
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Host $host;
		proxy_set_header Remote_addr $remote_addr;
		proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
		proxy_read_timeout 100s;
	}
}

如下两行表示将http协议头升级为websocket协议:

proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Nginx可以作为反向代理来处理WebSocket连接。在Nginx中,需要使用proxy_pass指令来将WebSocket请求转发到后端WebSocket服务器。同时,需要在Nginx配置文件中添加一些特定的设置,以确保WebSocket连接可以正常工作。 具体来说,需要在Nginx配置文件中添加以下设置: 1. 在http块中添加: ``` map $http_upgrade $connection_upgrade { default upgrade; '' close; } ``` 这个设置将根据请求头中的Upgrade字段来判断是否需要升级连接。 2. 在server块中添加: ``` location /ws/ { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; } ``` 这个设置将WebSocket请求转发到名为backend的后端服务器,并设置一些必要的请求头信息,以确保WebSocket连接可以正常工作。 需要注意的是,以上设置中的/ws/路径可以根据实际情况进行修改,以匹配实际的WebSocket请求路径。同时,backend也需要根据实际情况进行修改,以指向正确的后端WebSocket服务器。 ### 回答2: Nginx是一个高性能的Web服务器软件,可以同时支持反向代理、负载均衡、静态文件服务、动态内容生成等多种功能,同时还支持WebSockets协议,因此在实现WebSockets应用中,使用Nginx可以达到更好的性能和可靠性。 使用Nginx反向代理WebSockets需要进行以下步骤: 1、配置Nginx 需要在Nginx的配置文件(nginx.conf)中添加配置项,以支持WebSockets协议。具体配置如下: ``` server { listen 80; server_name example.com; location /websocket { proxy_pass http://127.0.0.1:8080; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; } } ``` 其中,listen指定监听端口,server_name指定域名或IP地址,location指定要代理的URL路径,proxy_pass指定代理到的实际服务器地址,$http_upgrade和Connection "Upgrade"用于启用WebSockets功能,Host $host用于将请求头中的Host字段代理到实际服务器。 2、启动WebSockets应用程序 在实际服务器上启动WebSockets应用程序,可以使用Node.js等技术实现,代码示例如下: ``` var WebSocketServer = require('ws').Server; var wss = new WebSocketServer({ port: 8080 }); wss.on('connection', function(ws) { ws.on('message', function(message) { console.log('received: %s', message); }); ws.send('Hello, world!'); }); ``` 该程序使用ws模块创建WebSocket服务器,并在connection事件中监听客户端连接请求。在收到客户端的消息后,会将消息打印到控制台,并发送一条欢迎消息。 3、测试WebSockets连接 使用支持WebSockets协议的浏览器,如Google Chrome等,访问Nginx反向代理的URL路径(例如:http://example.com/websocket),可以检查控制台输出并确认WebSockets连接已成功建立。 总之,使用Nginx反向代理WebSockets可以提高性能和可靠性,在实现WebSocket应用时值得尝试。 ### 回答3: Nginx作为一款高性能的Web服务器和反向代理服务器,也能支持WebSocket通信协议。WebSocket是一种双向通信协议,比如我们使用的即时通讯、直播等服务都是基于WebSocket实现的。要实现Nginx反向代理WebSocket,需要进行以下几个步骤: 1. 安装Nginx 首先要安装Nginx软件,可以到官网上下载适合自己操作系统的版本,并按照官方文档进行安装。 2. 安装Nginx扩展模块 为了让Nginx支持WebSocket协议,需要安装NginxWebSocket模块。可以通过在编译Nginx时添加--with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --add-dynamic-module=/path/to/ngx_http_geoip2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_geoip2_module --add-dynamic-module=/path/to/ngx_stream_geoip2_module --with-threads等支持WebSocket的模块来实现。 3. 配置Nginx 要实现Nginx反向代理WebSocket服务,需要在Nginx配置文件中进行相应的配置。在http段中添加如下配置: ```nginx map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name example.com; location /ws/ { proxy_pass http://wsbackend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; } } ``` 其中,proxy_pass代表WebSocket的后端服务地址,$http_upgrade为请求头中的Upgrade字段,$connection_upgrade为请求头中的Connection字段。 4. 配置WebSocket后端服务 WebSocket后端服务需要在支持WebSocket的编程语言中编写,如Node.js、Java等。以Node.js为例,可以使用ws库提供的模块来实现WebSocket服务器端。在Node.js服务应用中添加如下代码: ```javascript const WebSocket = require('ws'); const server = new WebSocket.Server({ port: 8080 }); server.on('connection', (ws) => { ws.on('message', (message) => { console.log('received: %s', message); ws.send(message); }); }); ``` 其中,WebSocket服务器端监听8080端口,接收来自客户端的连接请求。同时,当客户端与服务器端建立连接之后,可以相互进行数据传输。当其中一个连接方发送消息时,另一个连接方将接收到对应的消息并在控制台输出。 综上所述,实现Nginx反向代理WebSocket需要在Nginx中添加WebSocket模块,并在Nginx配置文件中添加如上所述的配置。同时,在后端服务中使用支持WebSocket协议的编程语言编写WebSocket服务器端,完成客户端与服务器端的数据传输。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值