คำตอบสั้น ๆ: ให้ IIS รับคำขอจากภายนอกแล้วส่งต่อไปยังแอปที่รันอยู่หลังบ้าน เช่น Node.js หรือเครื่องอื่น พร้อมส่ง IP จริงของผู้ใช้ไปด้วย
คู่มือนี้อธิบาย Reverse Proxy ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
องค์กรจำนวนมากมี IIS เป็นเว็บเซิร์ฟเวอร์หลักอยู่แล้ว แต่ทีมพัฒนาเขียนแอปใหม่ด้วย Node.js หรือรันใน Container ซึ่งฟังพอร์ตของตัวเอง การให้ IIS ทำหน้าที่รับคำขอจากภายนอกแล้วส่งต่อไปยังแอปเหล่านั้นทำให้ใช้โดเมนและใบรับรอง SSL ร่วมกันได้โดยไม่ต้องเปิดพอร์ตเพิ่ม
คู่มือนี้ติดตั้งสองส่วนที่ต้องใช้คู่กันคือ Application Request Routing และ URL Rewrite แล้วตั้งค่าให้ครบรวมถึงการส่ง IP จริงของผู้ใช้ซึ่งมักถูกลืม
สิ่งที่ต้องเตรียม (Reverse Proxy)
- Windows Server ที่ติดตั้ง IIS แล้ว
- แอปหลังบ้านที่ทำงานอยู่ เช่น Node.js ที่ฟังพอร์ต 3000 บน localhost
- สิทธิ์ Administrator
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
Get-Website
ขั้นตอนที่ 1: ติดตั้งส่วนขยาย (Reverse Proxy)
ติดตั้งผ่าน Web Platform Installer หรือดาวน์โหลดตัวติดตั้งโดยตรงจากเว็บไซต์ของ Microsoft ทั้งสองตัวนี้
- URL Rewrite ตัวเขียนกฎเปลี่ยนเส้นทาง
- Application Request Routing ตัวที่ทำให้ส่งต่อคำขอข้ามเครื่องได้
ลำดับสำคัญ ต้องติดตั้ง URL Rewrite ก่อน ARR เสมอ ไม่เช่นนั้นจะใช้ร่วมกันไม่ได้
ตรวจว่าติดตั้งแล้ว
Get-WebGlobalModule | Where-Object Name -like "*Rewrite*"
Get-WebGlobalModule | Where-Object Name -like "*RequestRouter*"
ขั้นตอนที่ 2: เปิดโหมด Proxy (Reverse Proxy)
ขั้นตอนนี้เป็นสวิตช์หลักที่ถ้าไม่เปิดแล้วทุกอย่างจะไม่ทำงาน ในหน้าจอ IIS Manager คลิกที่ชื่อเซิร์ฟเวอร์ระดับบนสุด เปิด Application Request Routing Cache แล้วกด Server Proxy Settings ทางขวา ติ๊ก Enable proxy
หรือสั่งด้วยคำสั่ง
Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter "system.webServer/proxy" -Name "enabled" -Value "True"
Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
-Filter "system.webServer/proxy" -Name "preserveHostHeader" -Value "True"
Get-WebConfiguration -Filter "system.webServer/proxy" -PSPath 'MACHINE/WEBROOT/APPHOST'
preserveHostHeader ทำให้แอปหลังบ้านเห็นชื่อโดเมนจริงที่ผู้ใช้เรียก ไม่ใช่ localhost ซึ่งสำคัญมากกับแอปที่สร้างลิงก์จากชื่อโฮสต์
ขั้นตอนที่ 3: เขียนกฎส่งต่อ
แก้ไฟล์ web.config ของเว็บไซต์นั้น
notepad C:\inetpub\wwwroot\web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Proxy to Node app" stopProcessing="true">
<match url="^api/(.*)" />
<action type="Rewrite" url="http://127.0.0.1:3000/{R:1}" />
<serverVariables>
<set name="HTTP_X_FORWARDED_PROTO" value="https" />
</serverVariables>
</rule>
</rules>
<outboundRules>
<!-- แก้ลิงก์ที่แอปหลังบ้านส่งกลับมาให้ชี้ถูกที่ -->
<rule name="Fix redirect location" preCondition="IsRedirection">
<match serverVariable="RESPONSE_Location" pattern="^http://127.0.0.1:3000/(.*)" />
<action type="Rewrite" value="https://{HTTP_HOST}/api/{R:1}" />
</rule>
<preConditions>
<preCondition name="IsRedirection">
<add input="{RESPONSE_STATUS}" pattern="3\d\d" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
ขั้นตอนที่ 4: อนุญาตให้ตั้งตัวแปรของเซิร์ฟเวอร์
การใช้ serverVariables ต้องประกาศอนุญาตก่อน ไม่เช่นนั้นจะได้ข้อผิดพลาด 500.50
Add-WebConfiguration -Filter "/system.webServer/rewrite/allowedServerVariables" `
-PSPath "MACHINE/WEBROOT/APPHOST" -Value @{name="HTTP_X_FORWARDED_PROTO"}
Add-WebConfiguration -Filter "/system.webServer/rewrite/allowedServerVariables" `
-PSPath "MACHINE/WEBROOT/APPHOST" -Value @{name="HTTP_X_FORWARDED_HOST"}
Get-WebConfiguration -Filter "/system.webServer/rewrite/allowedServerVariables" `
-PSPath "MACHINE/WEBROOT/APPHOST"