【運維】在Windows上使用IIS方向代理配置Websocket


  最近在做小程序的項目,微信要求所有數據請求通道都要走https或wss。而我們的項目建設如下:

    api基於C#的MVC webapi開發。

    websocket基於Nodejs的thinkjs框架開發。

  因此會導致一個要求,就是api暫時不支持.net core,因此只能部署在windows下,使用IIS作為web服務器。又因為IIS占用了80端口,因此沒法用nginx作為反向代理。

  經過一番研究后發現,IIS8以上版本可以作為反向代理服務器。因此只要將IIS作為反向代理服務器,將SSL證書和域名綁定到IIS上,再通過IIS新增的URL重寫模塊將請求轉向給內部的websocket服務就可以了。

       具體操作如下:

  一、下載ARR

  下載地址:http://www.iis.net/downloads/microsoft/application-request-routing

  下載完后無腦點擊運行,一直點下一步就可以了。

  二、啟動Proxy

  

 

 

 

  三、新增反向代理服務器,設置方向代理URL重寫規則

  在IIS中新增一個網站,然后點擊URL重寫模塊。在右側點擊【添加規則】--【入站規則】 -- 【空白規則】

  

       將URL的匹配模式設置成^(.*),再將重寫URL設置成:http://localhost:8361/{R:1}

  舉個例子:

    入站前:http:www.beta.com/?params=1

    重寫后:http://localhost:8361/params=1

  這樣通過這個規則,可以將URL從域名轉換成內部的局域網URL

      

  

  

  

  四、設置websocket重寫規則

  在步驟三中,可以通過反向代理服務器將外部訪問的URL請求轉成內部的URL請求。

  但是,別忘記我們這個是一個websocket專用的反向代理服務器。

  而websocket在請求的時候,不是http://開頭,而是以ws://開頭。因此我們要重新配置一下。

  在條件中加入以下配置:

  

  同時將重寫URL改成:

  

  這么些是什么意味呢?

  就是說如果是http請求:

    入站前:https:www.beta.com/?params=1

    重寫后:http://localhost:8361/params=1

  如果是ws請求:

    入站前:wss:www.beta.com/?params=1

    重寫后:ws://localhost:8361/params=1

  這樣既能應對http請求的URL轉換,又能應對websocket的URL轉換。

  心細的朋友可能是注意到,為什么要將https轉成http,將wss轉成ws

  這就回到問題的原點,因為小程序的請求規則里要求,所有數據請求通道都要走https或wss。所謂外部過來的請求必然要帶https或wss。但是內部處理的時候又不需要帶SSL認證,因此需要將頭里面的s給去掉。

  

  五、綁定SSL證書和域名

  此時,我們只要將SSL證書和域名綁定到代理服務器上就行了。具體就不多說了。

  只是有一點要特別注意一下,因為IIS只支持一個SSL,多個網站綁定不同的SSL證書時會導致443端口沖突。因此在綁定https的時候,一定要記得勾選。

       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM