首先要申請(qǐng)SSL證書悼粮,必須為pem格式。
如圖為寶塔環(huán)境所申請(qǐng)Let's Encrypt免費(fèi)證書的所在位置:
Linux安裝openssl支持:
yum install -y openssl
移到Swoole安裝包目錄嬉愧,重新編譯安裝,并加入openssl支持:(相關(guān)文章:Linux下源碼包安裝Swoole及基本使用)
$ sudo /usr/bin/phpize # 如果不知道路徑,請(qǐng)使用find / -name "phpize" 進(jìn)行查找
$ sudo ./configure --enable-openssl --with-php-config=/www/server/php/72/bin/php-config
$ sudo make clean make && make install
#這個(gè)注意php-config的目錄是你php真實(shí)安裝路徑
#寶塔面板可以點(diǎn)擊php查看安裝路徑 绢掰,我的是在/www/server/php/72/bin/php-config
#如果是集成環(huán)境,需要使用名 find / -name "php-config" 查詢路徑童擎。還有phpize的路路徑和php-config基本是一個(gè)路徑 滴劲,/www/server/php/72/bin/phpize
開(kāi)啟swoole擴(kuò)展
$ cd /etc/php.d/
$ sudo vim php.ini
; Enable xsl extension module
extension=swoole.so
查看Swoole已經(jīng)開(kāi)啟openssl支持:
php --ri swoole
Websocket服務(wù)器中開(kāi)啟SSL隧道,并配置證書路徑:
ws_server.php:
<?php
//創(chuàng)建websocket服務(wù)器對(duì)象顾复,監(jiān)聽(tīng)0.0.0.0:9501端口班挖,開(kāi)啟SSL隧道
$ws = new swoole_websocket_server("0.0.0.0", 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
//配置參數(shù)
$ws ->set([ 'daemonize' => false, //守護(hù)進(jìn)程化。
//配置SSL證書和密鑰路徑
'ssl_cert_file' => "/etc/letsencrypt/live/oyhdo.com/fullchain.pem",
'ssl_key_file' => "/etc/letsencrypt/live/oyhdo.com/privkey.pem" ]);
//監(jiān)聽(tīng)WebSocket連接打開(kāi)事件
$ws->on('open', function ($ws, $request) {
echo "client-{$request->fd} is open\n";
});
//監(jiān)聽(tīng)WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
echo "Message: {$frame->data}\n";
$ws->push($frame->fd, "server: {$frame->data}");
});
//監(jiān)聽(tīng)WebSocket連接關(guān)閉事件
$ws->on('close', function ($ws, $fd) {
echo "client-{$fd} is closed\n"; });
$ws->start();
頁(yè)面js中即可使用wss連接WebSocket服務(wù)器(使用與證書對(duì)應(yīng)的域名):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>WebSocket</title>
</head>
<body></body>
<script type="text/javascript">
var websocket = new WebSocket('wss://www.oyhdo.com:9501');
websocket.onopen = function (evt) { onOpen(evt) };
websocket.onclose = function (evt) { onClose(evt) };
websocket.onmessage = function (evt) { onMessage(evt) };
websocket.onerror = function (evt) { onError(evt) };
function onOpen(evt) {
console.log("Connected to WebSocket server.");
websocket.send('666');}
function onClose(evt) {
console.log("Disconnected"); }
function onMessage(evt) {
console.log('Retrieved data from server: ' + evt.data);
}
function onError(evt) {
console.log('Error occured: ' + evt.data);
}</script>
</html>
啟動(dòng)WebSocket服務(wù):
php ws_server.php
瀏覽器訪問(wèn)結(jié)果:(注意必須為https訪問(wèn))
服務(wù)器監(jiān)聽(tīng)結(jié)果: