Kỹ Thuật Triển khai

Hướng Dẫn Cấu Hình IIS 10 Reverse Proxy & URL Rewrite (FastAPI)

IIS Configuration Guide v0.1 — CXK Tuổi Bạc

Phiên bản: 0.1 DRAFT
Server: Windows Server 2022 + IIS 10
Backend: FastAPI (Python 3.12) via HttpPlatformHandler


1. Architecture Overview

NCT Browser/Voice ──► IIS (port 443/80)
                        │
                        ├─► Static files (HTML/CSS/JS)
                        │
                        └─► /api/* ──► HttpPlatformHandler
                                        │
                                        └─► FastAPI (uvicorn, port 8000)
                                              │
                                              ├─► Knowledge Base (files/MSSQL)
                                              ├─► LLM API (Gemini/GPT)
                                              └─► Audit Log (MSSQL)

2. Prerequisites

# Install IIS features
Install-WindowsFeature Web-Server,Web-WebSockets,Web-Asp-Net45 -IncludeManagementTools

# Install HttpPlatformHandler v1.2
# Download from: https://www.iis.net/downloads/microsoft/httpplatformhandler
# Or via Web Platform Installer

# Install Python 3.12
# Download from: https://www.python.org/downloads/
# Ensure added to PATH

# Install FastAPI dependencies
pip install fastapi uvicorn python-multipart pyodbc

3. IIS Site Configuration

web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="httpPlatformHandler" 
           path="api/*" 
           verb="*" 
           modules="httpPlatformHandler" 
           resourceType="Unspecified" />
    </handlers>

    <httpPlatform 
      processPath="C:\Python312\python.exe"
      arguments="-m uvicorn app.main:app --host 127.0.0.1 --port %HTTP_PLATFORM_PORT%"
      stdoutLogEnabled="true"
      stdoutLogFile=".\logs\stdout"
      startupTimeLimit="60"
      requestTimeout="00:05:00">
      <environmentVariables>
        <environmentVariable name="PYTHONPATH" value="." />
        <environmentVariable name="CXK_DB_CONNECTION" 
          value="Driver={ODBC Driver 18 for SQL Server};Server=localhost;Database=CXK_TuoiBac;Trusted_Connection=yes;" />
        <environmentVariable name="CXK_ENV" value="production" />
      </environmentVariables>
    </httpPlatform>

    <!-- Static files -->
    <staticContent>
      <mimeMap fileExtension=".json" mimeType="application/json" />
      <mimeMap fileExtension=".woff2" mimeType="font/woff2" />
    </staticContent>

    <!-- Security headers -->
    <httpProtocol>
      <customHeaders>
        <add name="X-Content-Type-Options" value="nosniff" />
        <add name="X-Frame-Options" value="DENY" />
        <add name="X-XSS-Protection" value="1; mode=block" />
        <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
        <add name="Content-Security-Policy" 
             value="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com" />
      </customHeaders>
    </httpProtocol>

    <!-- HTTPS redirect -->
    <rewrite>
      <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
          <match url="(.*)" />
          <conditions>
            <add input="{HTTPS}" pattern="off" ignoreCase="true" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" 
                  redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

4. SSL Certificate

# Option 1: Let's Encrypt via win-acme
# Download: https://github.com/win-acme/win-acme

# Option 2: Self-signed for dev
New-SelfSignedCertificate -DnsName "cxk.local" -CertStoreLocation cert:\LocalMachine\My

5. Application Pool Settings

Setting Value
.NET CLR Version No Managed Code
Managed Pipeline Mode Integrated
Identity ApplicationPoolIdentity
Idle Timeout 0 (disable)
Recycling 1x/day at 3:00 AM

6. Firewall Rules

# Allow HTTPS
New-NetFirewallRule -DisplayName "CXK HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow

# Allow HTTP (redirect only)
New-NetFirewallRule -DisplayName "CXK HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow

# Block direct FastAPI access
New-NetFirewallRule -DisplayName "Block FastAPI Direct" -Direction Inbound -Protocol TCP -LocalPort 8000 -Action Block

7. Health Check Endpoint

FastAPI should expose GET /api/health:

{
  "status": "healthy",
  "version": "0.1.0",
  "db_connected": true,
  "kb_items_count": 19,
  "timestamp": "2026-09-28T10:00:00Z"
}

IIS Health Check monitoring via Application Request Routing.

8. Deployment Checklist

  • [ ] Windows Server 2022 updated
  • [ ] IIS installed with WebSockets + HttpPlatformHandler
  • [ ] Python 3.12 installed
  • [ ] MSSQL 2022 running, CXK_TuoiBac database created
  • [ ] SSL certificate installed
  • [ ] web.config deployed
  • [ ] FastAPI app deployed
  • [ ] Firewall rules applied
  • [ ] Health check passing
  • [ ] Audit log writing to MSSQL
⚠️

Khuyến Cáo & Miễn Trừ Trách Nhiệm Y Khoa

Hệ thống Trợ lý AI đóng vai trò hỗ trợ giáo dục sức khỏe và hướng dẫn tự chăm sóc hệ vận động. AI không thay thế chẩn đoán hoặc chỉ định điều trị của bác sĩ chuyên khoa. Khi xuất hiện các triệu chứng cờ đỏ (sốt, sụt cân, đau dữ dội, mất kiểm soát tiêu tiểu), người bệnh cần đến ngay cơ sở y tế gần nhất.

🔍
Gõ từ khóa để tìm kiếm nhanh trong toàn bộ 132+ tài liệu dự án CXK.