<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 創建wss服務 **問:** Workerman如何創建一個wss服務,使得客戶端可以用過wss協來連接通訊,比如在微信小程序中連接服務端。 **答:** wss協議實際是[websocket](http://baike.baidu.com/item/WebSocket)+[SSL](http://baike.baidu.com/item/ssl),就是在websocket協議上加入[SSL](http://baike.baidu.com/item/ssl)層,類似[https](http://baike.baidu.com/item/https)([http](http://baike.baidu.com/item/http)+[SSL](http://baike.baidu.com/item/ssl))。Workerman支持[websocket](http://baike.baidu.com/item/WebSocket)+[SSL](http://baike.baidu.com/item/ssl)協議,同時也支持[SSL](http://baike.baidu.com/item/ssl)(```需要Workerman版本>=3.3.7```), 所以只需要在[websocket](http://baike.baidu.com/item/WebSocket)協議的基礎上開啟[SSL](http://baike.baidu.com/item/ssl)即可支持wss協議。 ## 方法一 ,直接用Workerman開啟SSL **準備工作:** 1、Workerman版本不小于3.3.7 2、PHP安裝了openssl擴展 3、已經申請了證書(pem/crt文件及key文件)放在了/etc/nginx/conf.d/ssl下 **代碼:** ```php <?php require_once __DIR__ . '/Workerman/Autoloader.php'; use Workerman\Worker; // 證書最好是申請的證書 $context = array( 'ssl' => array( // 使用絕對路徑 'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // 也可以是crt文件 'local_pk' => '/etc/nginx/conf.d/ssl/server.key', 'verify_peer' => false, ) ); // 這里設置的是websocket協議 $worker = new Worker('websocket://0.0.0.0:4431', $context); // 設置transport開啟ssl,websocket+ssl即wss $worker->transport = 'ssl'; $worker->onMessage = function($con, $msg) { $con->send('ok'); }; Worker::runAll(); ``` 通過以上的代碼,Workerman就監聽了wss協議,客戶端就可以通過wss協議來連接workerman實現安全即時通訊了。 **測試** 打開chrome瀏覽器,按F12打開調試控制臺,在Console一欄輸入(或者把下面代碼放入到html頁面用js運行) ```php // 證書是會檢查域名的,請使用域名連接 ws = new WebSocket("wss://域名:4431"); ws.onopen = function() { alert("連接成功"); ws.send('tom'); alert("給服務端發送一個字符串:tom"); }; ws.onmessage = function(e) { alert("收到服務端的消息:" + e.data); }; ``` **注意:** 1、wss端口只能通過wss協議訪問,ws無法訪問wss端口。 2、證書一般是與域名綁定的,所以測試的時候請使用域名,不要使用ip。 3、如果出現無法訪問的情況,請檢查服務器防火墻。 ## 方法二、利用nginx作為SSL的代理 除了用Workerman自身的SSL,也可以利用nginx作為SSL代理實現wss(注意如使用nginx代理SSL,則workerman部分不要設置ssl,避免會沖突)。 通訊原理及流程是: 1、客戶端發起wss連接連到nginx 2、nginx將wss協議的數據轉換成ws協議并轉發到Workerman的websocket協議端口 3、Workerman收到數據后做業務邏輯處理 4、Workerman給客戶端發送消息時,則是相反的過程,數據經過nginx轉換成wss協議然后發給客戶端 ## nginx配置參考 **前提條件及準備工作:** 1、假設Workerman監聽的是8282端口(websocket協議) 2、已經申請了證書(pem/crt文件及key文件)放在了/etc/nginx/conf.d/ssl下 3、打算利用nginx開啟4431端口對外提供wss代理服務(端口可以根據需要修改) **nginx配置類似如下**: ```php server { listen 4431; ssl on; ssl_certificate /etc/nginx/conf.d/ssl/server.pem; ssl_certificate_key /etc/nginx/conf.d/ssl/laychat/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 / { 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; } } ``` ## 透過nginx wss代理如何獲取客戶端真實ip ? 使用nginx作為wss代理,nginx實際上充當了workerman的客戶端,所以在workerman上獲取的客戶端ip為nginx服務器的ip,并非實際的客戶端ip。如何獲取客戶端真實ip可以參考下面的方法。 **原理:** nginx將客戶端真實ip通過http header傳遞進來,即上面nginx配置中location里的```proxy\_set\_header X-Real-IP $remote\_addr;```設置。workerman通過讀取這個header值,將此值保存到```$connection對象里```,(GatewayWorker可以保存到```$\_SESSION```變量里),使用的時候直接讀取變量即可。 **workerman從nginx設置的header里讀取客戶端ip** ```php <?php require_once __DIR__ . '/../Workerman/Autoloader.php'; use Workerman\Worker; $worker = new Worker('websocket://0.0.0.0:7272'); // 客戶端練上來時,即完成TCP三次握手后的回調 $worker->onConnect = function($connection) { /** * 客戶端websocket握手時的回調onWebSocketConnect * 在onWebSocketConnect回調中獲得nginx通過http頭中的X_REAL_IP值 */ $connection->onWebSocketConnect = function($connection){ /** * connection對象本沒有realIP屬性,這里給connection對象動態添加個realIP屬性 * 記住php對象是可以動態添加屬性的,你也可以用自己喜歡的屬性名 */ $connection->realIP = $_SERVER['HTTP_X_REAL_IP']; }; }; $worker->onMessage = function($connection, $data) { // 當使用客戶端真實ip時,直接使用$connection->realIP即可 $connection->send($connection->realIP); }; Worker::runAll(); ``` **GatewayWorker從nginx設置的header里獲取客戶端ip** 在start\_gateway.php加上下面的代碼 ```php $gateway->onConnect = function($connection) { $connection->onWebSocketConnect = function($connection , $http_header) { $_SESSION['realIP'] = $_SERVER['HTTP_X_REAL_IP']; }; }; ``` 代碼加完后需要重啟GatewayWorker。 這樣就可以在Events.php中通過```$\_SESSION\['realIP'\]```得到客戶端的真實ip了
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看