【运维】在Windows上使用IIS方向代理配置Websocket

时间:2024-03-12 08:43:22

  最近在做小程序的项目,微信要求所有数据请求通道都要走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的时候,一定要记得勾选。