方法一

在nginx.conf配置一下,就可以提供不同类型的服务。本文简单描述下如何转发(反向代理)一个socket服务。

将要配置一个如上图示的转发服务。

1、 首先是需要安装Nginx。一般Linux环境Nginx依赖pcre,OpenSSL-fips ,zlib 。所以在安装Nginx之前需要安装这几个。

./configure --with-stream Nginx的时候需要加上参数 –with-stream才能开启socket的转发。默认是没有的。

后面的make都是一样的。

2、在nginx.conf文件,与events平行的级别,配置一个stream

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#evnets是配置文件已有内容
events{
worker_connections 1024;
}
#以下stream为新增的配置
stream{
upstream mysocket_server{
server 172.10.10.10:6001;
}
server{
listen 16001;
proxy_pass mysocket_server;
}
}

像上面配置好后,保存,启动nginx服务,socket client就可以通过访问172.10.10.11 16001来访问socket server,效果与直接访问172.10.10.10 6001一样。

这个简单的例子,如同很多示例一样,看起来是把简单的东西变复杂,只是为了描述一个转发功能如何配置。

方法二

在nginx配置文件的service节点中添加如下配置

1
2
3
4
5
6
7
8
9
10
11
location /api/
{
proxy_pass http://192.168.0.205:8301/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
limit_req zone=one burst=5000 nodelay;
}

解释一下参数

  • /api这个是代理前缀,告诉Nginx要代理的url,现在我的设置为api,当我访问的我的服务器https://abc.com/api时,Nginx会把我的请求映射到本机的8301端口。
  • proxy_pass 要代理到的url,我的代理到本机的8888端口。
  • proxy_http_version 代理时使用的 http版本。

重点来了:
代理webSocket的关键参数

  • proxy_set_header Upgrade 把代理时http请求头的Upgrade 设置为原来http请求的请求头,wss协议的请求头为websocket
  • proxy_set_header Connection 因为代理的wss协议,所以http请求头的Connection设置为Upgrade
  • proxy_set_header X-Real-IP 给代理设置原http请求的ip,填写$remote_addr 即可

至于websocket协议的response的参数,在反向代理的时候不用管。
到这里,Nginx反向代理webSocket的配置就完成了,重启Nginx,用websocket连接试试,在原来wss地址的地方填写wss://abc.com/api。如果websocket成功连接,说明Nginx反向代理websocket已经成功了。