配置IIS实现反向代理

安装IIS

打开服务管理器,点击添加角色和功能,选择安装Web 服务器(IIS)

一般来说,直接按默认设置一路下一步就好。

Web平台安装程序

下一步要安装Web平台安装程序,即Web Platform Installer,简写为WebPI。

如果使用ARR离线安装包,这一步可以省去。

Application Request Routing

通过WebPI安装Application Request Routing,简写ARR。

如果无法通过WebPI在线安装,也可直接下载离线安装包

设置反向代理

开启ARR的代理功能

这一步其实也能省略,如果没有开启ARR的代理功能,在进入URL重写(rewrite)的时候会提示要不要打开。

URL重写

这里简单记录一下反向代理域名到本地端口的设置方式。

  1. 添加空白入站规则。

  2. 匹配URL

这里的模式一般填(.*)就好,所有URL我们都要反向代理。

  1. 条件

条件输入为{HTTP_HOST},模式为域名,如^www\.yourdomain\.com

  1. 操作

重写到本地端口,如http://localhost:3000/{R:1}

关于后引用比如{R:1}{C:1}的使用可查看微软官方文档

  1. 勾选停止处理后续规则

当反向代理匹配成功后,停止继续匹配后续规则,防止出现幺娥子。

开启https

安装SSL证书

首先需要有SSL证书,推荐的有两种方式:

  1. 使用阿里云免费SSL证书
  2. 使用acme.sh

其中,acme是linux专供,但它的续期是自动的,不需要每年一次额外的手动更新证书。

如果用在IIS,就只能使用阿里云。安装方法参见阿里云文档在IIS服务器上安装SSL证书

导入证书

既可以通过mmcWindows服务器控制台(MMC,Microsoft Management Console)导入,也可以通过IIS的服务器证书导入。

绑定证书

进入绑定界面

添加绑定

完成配置

注意要将类型切换至https,填入正确的域名(免费证书只对应一个单域名),且选中需要服务器名称指示(Server Name Indication)。

如不选中需要服务器名称指示,会使用同一个证书。

将http重定向至https

已经有了https,就不需要再保留不安全的http了。

创建一个新的URL重写规则,判断{HTTPS}^OFF${HTTP_METHOD}^GET$,且域名为已开启https的域名,则重定向至https://{HTTP_POST}/{R:1}

重定向类型可以用302 Found

注意

  • 要将此条规则优化级挪至反向代理的规则之上,避免直接走了反向代理的规则执行不到这里。

  • 重定向一定要指定仅对get方法生效,避免影响post。

不同的客户端对post返回的状态码处理方法有不同,会生产不同的效果。

比如.Net的HttpClient对307的第二次请求就会去除Authentication信息,而nodejs的axios和postman会带上。

客户端IP

Application Request Routing Cache–>Server Proxy Settings–>Preserve Client IP in the following header设置中,可以指定客户端IP的传递方式。

默认是保存在X-Forwarded-For中,如果需要保存在其他的header中,可以在这里修改。或者留空,不保存。

可参阅Application Request Routing Page文档

日志

通常服务器的系统盘容量都不会特别大,如果不做限制,IIS的日志将会成为很大的负担。

更改日志文件目录

我们可以从这里进入日志配置。

默认日志文件存储在%SystemDrive%\inetpub\logs\LogFiles下,我们可以把它更改至有更大剩余容量的硬盘上。

但这样并不能完全解决问题,不论多大的硬盘,以IIS日志每天几百兆的速度还是很快会有满的一天,真正的解决方案还是类似只保留最近30天的日志之类的。

使用IIS Log Cleaner工具

最简单的办法是使用微软自家的IIS Log Cleaner Tool

参见微软文档,下载后直接运行,第一次运行需要先进行设置,之后就会自动清除了。

需要注意的是,IISLogCleaner.exe并不会注册服务,也就是说重启后需要手动再次启动。所以我们需要把它的快捷方式扔进%appdata%\Microsoft\Windows\Start Menu\Programs\Startup来完成自启。

添加客户端IP到日志

在日志页,我们可以添加客户端IP到日志中。

在日志文件栏的选择字段中,添加Request Header的X-Forward-For自定义字段。