眾所周知,nginx是一個(gè)高性能的web靜態(tài)服務(wù)器,同時(shí)具有很強(qiáng)大的反向代理以及fastcgi功能,因此現(xiàn)在在web端最常用的配置方式就是ngixn處理靜態(tài)元素,然后使用apache+php模塊,tomcat,php-fpm等工具處理動(dòng)態(tài)代碼。
通常apache+php模塊,tomcat直接使用反向代理的方式,而php-fpm則使用fastcgi的通信方式。但是在web通信中,還有一種使用非常流行的通信方式,那就是websocket通信,他是基于web的長鏈接技術(shù),由于這個(gè)技術(shù)的出現(xiàn),保證了客戶端可以被動(dòng)的接收來自服務(wù)器的消息。
考慮到數(shù)據(jù)安全問題,現(xiàn)在越來越多的網(wǎng)站開始使用https協(xié)議,一種將數(shù)據(jù)通過ssl加密后傳輸?shù)囊环N技術(shù)。websocket協(xié)議也有其對應(yīng)的ssl加密技術(shù),其協(xié)議標(biāo)識為wss(普通的為ws)。但是由于ws與https這兩個(gè)協(xié)議配置都需要服務(wù)器的支持。由于我以前一直在使用nginx,對于在nginx下配置ssl非常熟練,但是這次的案子需要我配置wss協(xié)議。一下子我人都傻了。
下面來說說我是這么解決給wss協(xié)議配置ssl的吧。
其實(shí)說起來也沒什么,而且還有點(diǎn)卑鄙,由于我一開始想直接在websocket服務(wù)器軟件上配置ssl,但是通過實(shí)驗(yàn)得知,websocket服務(wù)器配置了wss,就不具備ws功能了,而目前我的另一個(gè)案子又需要使用不加密的ws通信方式,所以直接在websocket下配置的方式?jīng)]有走通,后來我想到以前有通過nginx配置https協(xié)議,反向代理apache的http協(xié)議,因此我想,是否可以通過配置nginx,反向代理wss協(xié)議到ws上去呢?按照這個(gè)思路我查詢了相關(guān)資料,最后居然被我給找到方法來了。
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";
}
}
上面的配置就是我之前的那個(gè)案子的配置,意思是wss協(xié)議的端口是15301,ws協(xié)議的端口是15300,當(dāng)有客戶通過正確的域名與15301這個(gè)端口來連接wss協(xié)議時(shí),就會在服務(wù)器內(nèi)部反向代理到15300這個(gè)普通的ws端口去,由于在服務(wù)器內(nèi)部反向代理,自然也就不存在安全問題。這樣我就成功的實(shí)現(xiàn)了websocket服務(wù)器中,ws協(xié)議與wss協(xié)議共存的問題了。
文章來源:武漢app開發(fā) http://www.worldflying.cn/article-id-13.html