众所周知,nginx是一个高性能的web静态服务器,同时具有很强大的反向代理以及fastcgi功能,因此现在在web端最常用的配置方式就是ngixn处理静态元素,然后使用apache+php模块,tomcat,php-fpm等工具处理动态代码。
通常apache+php模块,tomcat直接使用反向代理的方式,而php-fpm则使用fastcgi的通信方式。但是在web通信中,还有一种使用非常流行的通信方式,那就是websocket通信,他是基于web的长链接技术,由于这个技术的出现,保证了客户端可以被动的接收来自服务器的消息。
考虑到数据安全问题,现在越来越多的网站开始使用https协议,一种将数据通过ssl加密后传输的一种技术。websocket协议也有其对应的ssl加密技术,其协议标识为wss(普通的为ws)。但是由于ws与https这两个协议配置都需要服务器的支持。由于我以前一直在使用nginx,对于在nginx下配置ssl非常熟练,但是这次的案子需要我配置wss协议。一下子我人都傻了。
下面来说说我是这么解决给wss协议配置ssl的吧。
其实说起来也没什么,而且还有点卑鄙,由于我一开始想直接在websocket服务器软件上配置ssl,但是通过实验得知,websocket服务器配置了wss,就不具备ws功能了,而目前我的另一个案子又需要使用不加密的ws通信方式,所以直接在websocket下配置的方式没有走通,后来我想到以前有通过nginx配置https协议,反向代理apache的http协议,因此我想,是否可以通过配置nginx,反向代理wss协议到ws上去呢?按照这个思路我查询了相关资料,最后居然被我给找到方法来了。
server {
listen 15301;
listen [::]:15301;
server_name www.worldflying.cn;
ssl on;
ssl_certificate /var/www/worldflying/www.worldflying.cn.pem;
ssl_certificate_key /var/www/worldflying/www.worldflying.cn.key;
location / {
proxy_pass http://127.0.0.1:15300;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
上面的配置就是我之前的那个案子的配置,意思是wss协议的端口是15301,ws协议的端口是15300,当有客户通过正确的域名与15301这个端口来连接wss协议时,就会在服务器内部反向代理到15300这个普通的ws端口去,由于在服务器内部反向代理,自然也就不存在安全问题。这样我就成功的实现了websocket服务器中,ws协议与wss协议共存的问题了。
文章来源武汉APP开发 http://www.worldflying.cn/article-id-13.html