利用nginx/apache代理wss
除了用Workerman自身的SSL,也可以利用nginx/apache作為wss代理轉(zhuǎn)發(fā)給workerman(注意此方法workerman部分千萬不要設置ssl,否則將無法連接)。
通訊原理及流程是:
1、客戶端發(fā)起wss連接連到nginx/apache
2、nginx/apache將wss協(xié)議的數(shù)據(jù)轉(zhuǎn)換成ws協(xié)議數(shù)據(jù)并轉(zhuǎn)發(fā)到Workerman的websocket協(xié)議端口
3、Workerman收到數(shù)據(jù)后做業(yè)務邏輯處理
4、Workerman給客戶端發(fā)送消息時,則是相反的過程,數(shù)據(jù)經(jīng)過nginx/apache轉(zhuǎn)換成wss協(xié)議然后發(fā)給客戶端
nginx配置參考
前提條件及準備工作:
1、已經(jīng)安裝nginx,版本不低于1.3
2、假設Workerman監(jiān)聽的是8282端口(websocket協(xié)議)
3、已經(jīng)申請了證書(pem/crt文件及key文件)放在了/etc/nginx/conf.d/ssl下
4、打算利用nginx開啟443端口對外提供wss代理服務(端口可以根據(jù)需要修改)
5、nginx一般作為網(wǎng)站服務器運行著其它服務,為了不影響原來的站點使用,這里使用地址 域名/wss 作為wss的代理入口。也就是客戶端連接地址為 wss://域名/wss
nginx配置類似如下:
server { listen 443; ssl on; ssl_certificate /etc/ssl/server.pem; ssl_certificate_key /etc/ssl/server.key; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; location /wss { proxy_pass http://127.0.0.1:8282; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header X-Real-IP $remote_addr; } # location / {} 站點的其它配置... }
測試
// 證書是會檢查域名的,請使用域名連接 ws = new WebSocket("wss://域名/wss");
ws.onopen = function() {
alert("連接成功");
ws.send('tom');
alert("給服務端發(fā)送一個字符串:tom");
};
ws.onmessage = function(e) {
alert("收到服務端的消息:" + e.data);
};
利用apache代理wss
也可以利用apache作為wss代理轉(zhuǎn)發(fā)給workerman(注意如使用apache代理SSL,則workerman部分千萬不要設置ssl,否則將無法連接)。
準備工作:
1、GatewayWorker 監(jiān)聽 8282 端口(websocket協(xié)議)
2、已經(jīng)申請了ssl證書, 放在了/server/httpd/cert/ 下
3、利用apache轉(zhuǎn)發(fā)443端口至指定端口8282
4、httpd-ssl.conf 已加載
5、openssl 已安裝
啟用 proxy_wstunnel_module 模塊
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
配置SSL及代理
#extra/httpd-ssl.conf DocumentRoot "/網(wǎng)站/目錄" ServerName 域名 # Proxy Config SSLProxyEngine on ProxyRequests Off ProxyPass /wss ws://127.0.0.1:8282/wss ProxyPassReverse /wss ws://127.0.0.1:8282/wss # 添加 SSL 協(xié)議支持協(xié)議,去掉不安全的協(xié)議 SSLProtocol all -SSLv2 -SSLv3 # 修改加密套件如下 SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM SSLHonorCipherOrder on # 證書公鑰配置 SSLCertificateFile /server/httpd/cert/your.pem # 證書私鑰配置 SSLCertificateKeyFile /server/httpd/cert/your.key # 證書鏈配置, SSLCertificateChainFile /server/httpd/cert/chain.pem
測試
// 證書是會檢查域名的,請使用域名連接 ws = new WebSocket("wss://域名/wss");
ws.onopen = function() {
alert("連接成功");
ws.send('tom');
alert("給服務端發(fā)送一個字符串:tom");
};
ws.onmessage = function(e) {
alert("收到服務端的消息:" + e.data);
};