็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐ŸŒ Nginx Reverse Proxy Advanced:Multisite、Rewrite、Caching、Load Balancing ๅ…จๆ”ป็•ฅ

    ๐ŸŒ Nginx Reverse Proxy Advanced:Multisite、Rewrite、Caching、Load Balancing ๅ…จๆ”ป็•ฅ

    ๅœจ็พไปฃ Web ๆžถๆง‹่ฃก,Nginx Reverse Proxy(ๅๅ‘ Proxy) ๅนพไนŽๆ˜ฏๆจ™้…:
    ไธ€ๅ€‹ๅฐๅค–็š„ๅ…ฅๅฃๅฑค,่ƒŒๅพŒๅฏไปฅๆ˜ฏๅคšๅฐ Web Server、Application Server、API、ๅพฎๆœๅ‹™、็”š่‡ณๆ˜ฏไธๅŒ็ถฒๆฎตไธญ็š„ๅ…ง้ƒจ็ณป็ตฑ。

    ๅพˆๅคšไบบๅช็”จ Nginx ่ฝ‰็™ผๅนพๅ€‹ๅพŒ็ซฏๆœๅ‹™ๅฐฑๅœๆ‰‹,ไฝ†ๅœจๅฏฆๅ‹™ไธŠ,ๆˆ‘ๅ€‘ๅธธๅธธๆœƒ้‡ๅˆฐ:

    • ๅŒไธ€ๅ€‹็ถฒๅŸŸไธ‹่ฆๆœๅ‹™ๅคšๅ€‹ๆ‡‰็”จ:/app1/app2/grafana
    • ๅŒไธ€ๅ€‹ IP ่ฆๆ‰ฟ่ผ‰ๅคšๅ€‹็ถฒๅŸŸ(Multisite):app.example.comapi.example.com
    • ๆƒณ็”จ Rewrite ็ตฑไธ€็ถฒๅ€็ตๆง‹,้ฟๅ…่ˆŠ้€ฃ็ต 404。
    • ๅธŒๆœ›ๅ‰็ซฏๅธถไธ€ๅฑค ๅฟซๅ–่ˆ‡่ฒ ่ผ‰ๅ‡่กก,ๆธ›่ผ•ๅพŒ็ซฏๅฃ“ๅŠ›。

    ๆœฌๆ–‡ๅพžๆฆ‚ๅฟต、ๆžถๆง‹,ๅˆฐๅฏฆ้š›่จญๅฎš็ฏ„ไพ‹่ˆ‡ๆŽ’้Œฏๅฟƒๆณ•,ไธ€ๆฌกๆ•ด็† Nginx Reverse Proxy ็š„้€ฒ้šŽ็Žฉๆณ•, ๅนซไฝ ๆŠŠ Nginx ๆ‰“้€ ๆˆ็ฉฉๅฎš、ๅฏ่ง€ๆธฌ、ๅฏๆ“ดๅ……็š„ๅ‰็ซฏๅ…ฅๅฃๅฑค。

    ๐Ÿ“‘ ็›ฎ้Œ„

    ไธ€、Nginx Reverse Proxy ็š„่ง’่‰ฒ่ˆ‡ๆ ธๅฟƒๆฆ‚ๅฟต

    Nginx ๅœจๅ…ฅๅฃๅฑคไธป่ฆๆ‰ฎๆผ”ๅนพๅ€‹่ง’่‰ฒ:

    • Reverse Proxy:ๆŽฅๆ”ถ Client ่ซ‹ๆฑ‚,ๅ†ๅนซๅฎƒ่ฝ‰็™ผๅˆฐๅ…ง้ƒจๆœๅ‹™。
    • ้›†ไธญ TLS ็ต‚็ต:ๅฐๅค–ๅชๅœจ Nginx ๅš HTTPS,ๅ…ง้ƒจ่ˆ‡ๅพŒ็ซฏๆŽก HTTP。
    • URL ่ˆ‡ Host Routing:ไพ Hostname、URL ่ทฏๅพ‘ๅˆ†ๆตๅˆฐไธๅŒๆœๅ‹™。
    • ๅฟซๅ–่ˆ‡ๅฃ“็ธฎ:้œๆ…‹ๆช”ๆกˆ่ˆ‡ๅฏๅฟซๅ– API ็”ฑๅ‰็ซฏๅ…ˆๆ“‹ไฝๅคง้‡ๆต้‡。
    • ่ฒ ่ผ‰ๅ‡่กก:ไธ€็ต„ upstream ่ƒŒๅพŒๅฏไปฅๆŽ›ๅคšๅฐๅพŒ็ซฏ。

    ๆ ธๅฟƒ่ง€ๅฟตๆ˜ฏ:ๅฐๅค–ๅช็œ‹ๅˆฐ Nginx;ๅฐๅ…ง็”ฑๅฎƒๆŽŒๆŽงไธ€ๅˆ‡่ซ‹ๆฑ‚ๆ‡‰่ฉฒๅŽปๅ“ช่ฃก、ไปฅไป€้บผๆจฃ็š„้€Ÿๅบฆ่ˆ‡่ฆๅ‰‡้€้”。

    ไบŒ、ๆœ€ๅฐๅฏ็”จ็ฏ„ไพ‹:ๅ–ฎไธ€ๆœๅ‹™ Reverse Proxy

    ๅ…ˆๅพžๆœ€ๅŸบๆœฌ็š„ไพ‹ๅญ้–‹ๅง‹:Nginx ๆŽฅไฝ https://app.example.com,่ƒŒๅพŒๆ˜ฏไธ€ๅฐๅœจๅ…ง้ƒจ็ถฒๆฎต็š„ Web ๆœๅ‹™。

    # /etc/nginx/conf.d/app.conf
    server {
        listen 80;
        server_name app.example.com;
    
        # ่‹ฅๅทฒๅœจๅค–้ƒจๅš TLS ็ต‚็ต,ๅฏๅ…ˆ็”จ HTTP;่‹ฅ่ฆ Nginx ็ต‚็ต TLS ๅ‰‡ๆ”น็‚บ listen 443 ssl ...
    
        location / {
            proxy_pass http://10.0.10.20:8080;
    
            # ๅŸบๆœฌ Header ๅ‚ณ้ž
            proxy_set_header Host              $host;
            proxy_set_header X-Real-IP         $remote_addr;
            proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    ๆชขๆŸฅ่จญๅฎšไธฆ้‡ๆ–ฐ่ผ‰ๅ…ฅ:

    sudo nginx -t
    sudo systemctl reload nginx
    

    ้€™ๅฐฑๆ˜ฏๆœ€ๅฐๅฏ็”จ็š„ Reverse Proxy ้…็ฝฎ,ไฝ†ๅฏฆๅ‹™ไธŠๆˆ‘ๅ€‘้‚„ๆœƒๆƒณ่ฆ:

    • ๅคšๅ€‹็ถฒๅŸŸ / ๅญ็ถฒๅŸŸ(Host-Based Multisite)。
    • ๅŒ็ถฒๅŸŸไธ‹ไพ็…ง่ทฏๅพ‘ๅˆ†ๆตๅˆฐไธๅŒๆœๅ‹™(Path-Based Routing)。
    • ๅœจๅ…ฅๅฃๅฑคๅšๅฟซๅ–、่ฒ ่ผ‰ๅ‡่กก、Rewrite ่ˆŠ็ถฒๅ€็ญ‰。

    ไธ‰、ๅคš็ซ™้ปžๆžถๆง‹:Host-Based ่ˆ‡ Path-Based Routing

    1. Host-Based:ๅคšๅ€‹็ถฒๅŸŸๆˆ–ๅญ็ถฒๅŸŸ

    ๅ…ธๅž‹็”จๆณ•:ไธ€ๅ€‹ Nginx ๅฐๆ‡‰ๅคšๅ€‹ๆœๅ‹™,ๅ„่‡ชๆœ‰ไธๅŒ็ถฒๅŸŸ。

    # /etc/nginx/conf.d/app1.conf
    server {
        listen 80;
        server_name app1.example.com;
    
        location / {
            proxy_pass http://10.0.10.21:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    # /etc/nginx/conf.d/app2.conf
    server {
        listen 80;
        server_name app2.example.com;
    
        location / {
            proxy_pass http://10.0.10.22:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    2. Path-Based:ๅŒ็ถฒๅŸŸไธ‹ๅˆ‡ๅˆ†ๆ‡‰็”จ่ทฏๅพ‘

    ๅฆไธ€็จฎๅธธ่ฆ‹ๆƒ…ๅขƒ:ๅ…จ้ƒจ้ƒฝ่ตฐ https://portal.example.com,ไฝ†ไธๅŒ่ทฏๅพ‘ๅฐๆ‡‰ไธๅŒๆœๅ‹™。

    # /etc/nginx/conf.d/portal.conf
    server {
        listen 80;
        server_name portal.example.com;
    
        # /app1 → ่ฝ‰็ตฆๅ…ง้ƒจ 10.0.10.31
        location /app1/ {
            proxy_pass http://10.0.10.31:8080/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    
        # /app2 → ่ฝ‰็ตฆๅ…ง้ƒจ 10.0.10.32
        location /app2/ {
            proxy_pass http://10.0.10.32:8080/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    
        # /grafana → Grafana ๅพŒ็ซฏ
        location /grafana/ {
            proxy_pass http://10.0.10.40:3000/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    ๆณจๆ„ location /path/ ่ˆ‡ proxy_pass ็š„็ตๅฐพๆ–œ็ทš้—œไฟ‚,ๆœƒๅฝฑ้Ÿฟ URL ่ขซ่ฝ‰็™ผๆ™‚็š„่ทฏๅพ‘ๆ‹ผๆŽฅๆ–นๅผ, ่‹ฅ่™•็†ไธ็•ถๅพˆๅฎนๆ˜“ๅ‡บ็พ // ๆˆ–่ทฏๅพ‘่ขซๅƒๆމ็š„้Œฏ่ชค。ๅปบ่ญฐๅœจๅฏฆ้š›็’ฐๅขƒๅคšๅšๅนพๅ€‹ๅฐ็…งๆธฌ่ฉฆ。

    ๅ››、Rewrite ่ˆ‡ URL ่จญ่จˆ:return / rewrite / try_files

    ๅœจๅš Reverse Proxy ๆ™‚,ๅธธๅธธ่ฆ่™•็†่ˆŠ็ถฒๅ€ๅฐŽๅ‘、ๆ–ฐ่ˆŠ API ่ทฏๅพ‘ๅˆ‡ๆ›、ๆˆ–ๆ˜ฏ่ฎ“้œๆ…‹็ถฒ็ซ™ๆก†ๆžถ(ไพ‹ๅฆ‚ SPA、ๅ‰็ซฏ Router)ๆญฃๅธธๅทฅไฝœ, ้€™ๆ™‚ๅ€™ๅฐฑๆœƒ็”จๅˆฐ Rewrite ่ˆ‡ Redirect

    1. ็”จ return ๅš็ฐกๅ–ฎ 301/302 ๅฐŽ่ฝ‰

    # ๅฐ‡่ˆŠ็ถฒๅ€ /old-path ๆฐธไน…ๅฐŽๅ‘ๆ–ฐ็ถฒๅ€ /new-path
    location = /old-path {
        return 301 /new-path;
    }
    
    # ๅฐ‡ http ๅ…จ้ƒจๅฐŽๅ‘ https(ๅธธ่ฆ‹)
    server {
        listen 80;
        server_name app.example.com;
        return 301 https://$host$request_uri;
    }
    

    2. ็”จ rewrite ๅš่ทฏๅพ‘ๆ”นๅฏซ(ๅ…ง้ƒจ่ฝ‰ๅ‘)

    # ๅฐ‡ /api/v1/... ๆ”นๅฏซๆˆ /v1/... ๅ†ไบค็ตฆๅพŒ็ซฏ(ไธๆ”น่ฎŠ็€่ฆฝๅ™จไฝๅ€ๅˆ—)
    location /api/ {
        rewrite ^/api/(.*)$ /$1 break;
        proxy_pass http://10.0.10.50:8080;
    }
    

    break ไปฃ่กจๆ”นๅฏซๅฎŒๅพŒๅœจๅŒไธ€ๅ€‹ location ็นผ็บŒ่™•็†,ไธๅ†้‡ๆ–ฐ่ท‘ไธ€ๆฌก location ๅŒน้…。

    3. try_files:้œๆ…‹ๆช”ๆกˆ่ˆ‡ SPA ็š„ๅฅฝๆœ‹ๅ‹

    # ๅ…ธๅž‹ SPA ๅ‰็ซฏ่จญๅฎš:ไธๅญ˜ๅœจ็š„่ทฏๅพ‘้ƒฝไธŸ็ตฆ index.html
    location / {
        try_files $uri $uri/ /index.html;
    }
    

    ็‚บไบ†้ฟๅ…ๅ‡บ็พ Redirect ่ฟดๅœˆ่ˆ‡้›ฃไปฅ็ถญ่ญท็š„ rewrite ่ฆๅ‰‡, ไธ€่ˆฌๅปบ่ญฐ็š„็ญ–็•ฅๆ˜ฏ:่ƒฝ็”จ return ็š„ๅœฐๆ–นๅฐฑ็”จ return,ๅชๆœ‰้œ€่ฆๅ…ง้ƒจๆ”นๅฏซๆ™‚ๆ‰ไธŠ rewrite。

    ไบ”、Nginx Proxy Cache:็‚บๅพŒ็ซฏๆธ›ๅฃ“็š„ๅฟซๅ–ๅฑค

    Nginx ๅฏไปฅ็›ดๆŽฅๅœจ Reverse Proxy ๅฑคๅš HTTP Cache,ๅฐๆ–ผไธๅธธ่ฎŠๅ‹•็š„ API ๆˆ–้œๆ…‹ๅ…งๅฎนไพ†่ชช, ่ƒฝๅคงๅน…ๆธ›ๅฐ‘ๅพŒ็ซฏๅฃ“ๅŠ›่ˆ‡ๅ›žๆ‡‰ๆ™‚้–“。

    1. ๅฎš็พฉๅฟซๅ–ๅ€่ˆ‡ Key

    # http ๅ€ๆฎต(้€šๅธธๅœจ nginx.conf)
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:100m
                     max_size=10g inactive=60m use_temp_path=off;
    

    ่ชชๆ˜Ž:

    • keys_zone=my_cache:100m:ๅฟซๅ–็ดขๅผ•ๅ„ฒๅญ˜ๅœจ่จ˜ๆ†ถ้ซ”ไธญ,็ด„ 100MB。
    • max_size=10g:ๅฟซๅ–ๆช”ๆกˆๆœ€ๅคšไฝฟ็”จ 10GB ็ฃ็ขŸ็ฉบ้–“。
    • inactive=60m:60 ๅˆ†้˜ๆฒ’่ขซ่จชๅ•็š„ cache ๆœƒ่ขซๆธ…้™ค。

    2. ๅœจ server / location ๅ•Ÿ็”จ Cache

    server {
        listen 80;
        server_name api.example.com;
    
        location /v1/ {
            proxy_pass http://10.0.20.10:8080;
    
            proxy_cache my_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            add_header X-Proxy-Cache $upstream_cache_status;
    
            proxy_set_header Host              $host;
            proxy_set_header X-Real-IP         $remote_addr;
            proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    ไน‹ๅพŒไฝ ๅฏไปฅ่ง€ๅฏŸ X-Proxy-Cache Header(ไพ‹ๅฆ‚ MISS / HIT / EXPIRED), ไพ†ๅˆคๆ–ทๅฟซๅ–ๅ‘ฝไธญ็‹€ๆณ。

    ๅ…ญ、Load Balancing:ๅคšๅฐๅพŒ็ซฏ็š„ๆต้‡ๅˆ†ๆ•ฃ็ญ–็•ฅ

    Nginx ็š„ upstream ๆจก็ต„ๅฏไปฅ่ฎ“ไฝ ้žๅธธๅฎนๆ˜“ๆŠŠๆต้‡ๅˆ†ๆ•ฃๅˆฐๅคšๅฐๅพŒ็ซฏไธปๆฉŸ。

    1. ๅŸบๆœฌ round-robin ่ฒ ่ผ‰ๅ‡่กก

    # http ๅ€ๆฎตไธญๅฎš็พฉ upstream
    upstream app_backend {
        server 10.0.30.11:8080;
        server 10.0.30.12:8080;
    }
    
    server {
        listen 80;
        server_name app.example.com;
    
        location / {
            proxy_pass http://app_backend;
            proxy_set_header Host              $host;
            proxy_set_header X-Real-IP         $remote_addr;
            proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    2. least_conn、ip_hash ็ญ‰็ญ–็•ฅ

    # ไปฅ้€ฃ็ทšๆ•ธๆœ€ๅฐ‘็‚บๅ„ชๅ…ˆ(้ฉๅˆ้•ท้€ฃ็ทšๆˆ–่ณ‡ๆบๅทฎ็•ฐ่ผƒๅคง็š„ๅพŒ็ซฏ)
    upstream app_backend_least {
        least_conn;
        server 10.0.30.11:8080;
        server 10.0.30.12:8080;
    }
    
    # ไปฅ client IP ็ฎ— hash(็ฐกๆ˜“ session ้ป่‘—)
    upstream app_backend_sticky {
        ip_hash;
        server 10.0.30.11:8080;
        server 10.0.30.12:8080;
    }
    

    ่‹ฅไฝ ็š„ๆ‡‰็”จๅฐ Session ้ป่‘—ๅบฆๆœ‰่ฆๆฑ‚(ไพ‹ๅฆ‚ Session ๅญ˜ๅœจ local memory), ๅฏไปฅๆญ้… ip_hash ๆˆ–ๆ”น็”จๅค–้ƒจ Session Store(Redis ็ญ‰),ๅฐฑๅฏไปฅไฝฟ็”จๆ›ดๅนณๅ‡็š„ๅˆ†ๆต็ญ–็•ฅ。

    ไธƒ、X-Forwarded-* ่ˆ‡ Header ่™•็†:่ฎ“ๅพŒ็ซฏ็Ÿฅ้“็œŸๅฏฆไธ–็•Œ

    Reverse Proxy ไน‹ๅพŒ,ๅพŒ็ซฏ็œ‹ๅˆฐ็š„ Client IP ๆœƒ่ฎŠๆˆ Nginx ็š„ IP,ๅ› ๆญคๆˆ‘ๅ€‘้€šๅธธๆœƒ้€้Žๆจ™ๆบ– Header ๆŠŠ็œŸๅฏฆ Client ่ณ‡่จŠๅธถ้€ฒๅŽป:

    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    
    • X-Real-IP:่จ˜้Œ„ๆœ€ๆŽฅ่ฟ‘ Client ็š„ไพ†ๆบ IP。
    • X-Forwarded-For:ไธ€ๆข Proxy ้ˆ่ทฏไธŠ็š„ๆ‰€ๆœ‰ IP。
    • X-Forwarded-Proto:ๅ‘Š่จดๅพŒ็ซฏๅŽŸๆœฌๆ˜ฏ HTTP ้‚„ๆ˜ฏ HTTPS。

    ๅพˆๅคšๆ‡‰็”จๆœƒไพๆ“š้€™ไบ› Header ไพ†็”ข็”Ÿๆ—ฅ่ชŒ、็”ข็”Ÿ็ต•ๅฐ็ถฒๅ€、ๆˆ–ๅˆคๆ–ทๆ˜ฏๅฆๅผทๅˆถ่ทณ่ฝ‰ HTTPS, ๅฆ‚ๆžœๆฒ’่จญๅฎšๅฅฝ,ๅธธๅ‡บ็พ「ๅœจ HTTPS ็š„ๅ‰็ซฏ,ไฝ†ๅพŒ็ซฏไปฅ็‚บๆ˜ฏ HTTP」ไน‹้กž็š„ๆ€ช็•ฐ่กŒ็‚บ。

    ๅ…ซ、Timeout / Buffer / ้™ๅˆถๅ€ผ:้ฟๅ…่Žซๅๆ–ท็ทš่ˆ‡็ˆ†่จ˜ๆ†ถ้ซ”

    ๅœจ้ซ˜ๅปถ้ฒๆˆ–ๅพŒ็ซฏๆŸฅ่ฉข่ผƒๆ…ข็š„็’ฐๅขƒ่ฃก,ๅฆ‚ๆžœ Proxy timeout ๅคช็Ÿญ,ๅฐฑๆœƒ็œ‹ๅˆฐๅคง้‡ 502/504。 ๅธธ็”จๅƒๆ•ธๅŒ…ๆ‹ฌ:

    # server ๆˆ– location ็ฏ„ๅœ็š†ๅฏ่จญๅฎš
    proxy_connect_timeout   5s;
    proxy_send_timeout      60s;
    proxy_read_timeout      60s;
    
    # ๆŽงๅˆถ Nginx ๆŽฅๆ”ถไธŠๆธธๅ›žๆ‡‰็š„ buffer
    proxy_buffer_size       16k;
    proxy_buffers           4 32k;
    proxy_busy_buffers_size 64k;
    

    ๅœจ่ชฟๆ•ด้€™ไบ›ๆ•ธๅ€ผๆ™‚,ๅปบ่ญฐๅ…ˆ็†่งฃๅพŒ็ซฏๆ‡‰็”จ็š„ๅนณๅ‡่ˆ‡ๆœ€้•ท่™•็†ๆ™‚้–“,ๅ†้ ็•™ๅˆ็†็ฉบ้–“,้ฟๅ…ไธ€ๅ‘ณๆ‹‰ๅพˆ้•ท้€ ๆˆ่ณ‡ๆบ้•ทๆ™‚้–“่ขซๅ ็”จ。

    ไน、ๆŽ’้Œฏ่ˆ‡ๅฏฆๆˆฐๅฟƒๆณ•:502/504、่ฟดๅœˆ Redirect、Header ๅ•้กŒ

    1. 502 / 504 ้Œฏ่ชค

    • ็ขบ่ชๅพŒ็ซฏๆœๅ‹™ๆ˜ฏๅฆ็œŸ็š„ๆœ‰ๅœจๆŒ‡ๅฎš IP/Port ไธŠ listen。
    • ๆชขๆŸฅ Nginx error log ่ฃก็š„่ฉณ็ดฐ้Œฏ่ชค่จŠๆฏ(ๅฆ‚ connect() failedupstream timed out)。
    • ่ชฟๆ•ด proxy_connect_timeoutproxy_read_timeout ็ญ‰ๅƒๆ•ธ。
    • ็ขบ่ช Security Group / ้˜ฒ็ซ็‰†ๆ˜ฏๅฆๆ”พ่กŒ Nginx ่ˆ‡ๅพŒ็ซฏไน‹้–“็š„้€ฃ็ทš。

    2. ็„ก้™ Redirect / URL ่ฟดๅœˆ

    • ๅธธ่ฆ‹ๆ–ผ HTTP→HTTPS、ๆˆ–ๆ‡‰็”จ็จ‹ๅผๅ…งๅ†่ฝ‰ไธ€ๆฌก Redirect。
    • ๆชขๆŸฅๆ‡‰็”จๆ˜ฏๅฆไพๆ“š X-Forwarded-Proto ๅˆคๆ–ทๅ”ๅฎš,่‹ฅๆฒ’่จญๅฅฝๆœƒไปฅ็‚บ่‡ชๅทฑๅœจ HTTP ไธŠๅ†่ฝ‰ไธ€ๆฌก HTTPS。
    • ็ฐกๅŒ– Rewrite ่ฆๅ‰‡,่ƒฝ็”จ return ๅฐฑไธ็”จ่ค‡้›œ็š„ rewrite ๆญฃๅ‰‡。

    3. Client IP ้ƒฝ่ฎŠๆˆ Nginx ็š„ IP

    • ็ขบ่ชๆœ‰่จญๅฎš X-Real-IP ่ˆ‡ X-Forwarded-For
    • ๅœจๅพŒ็ซฏ Web Server ๆˆ–ๆ‡‰็”จๆก†ๆžถไธญ,่จญๅฎšๆŽก็”จ้€™ไบ› Header ไฝœ็‚บ็œŸๅฏฆ IP ็š„ไพ†ๆบ。
    • ๅฆ‚ๆžœๆœ‰ๅคšๅฑค Proxy,่ฆๅšไฟกไปป Proxy ๅˆ—่กจ(้ฟๅ…ๅฝ้€  Header)。

    ๅ、ๅธธ่ฆ‹ๅ•้กŒ FAQ

    Q1. ไป€้บผๆƒ…ๆณไธ‹้ฉๅˆๅœจๅ‰็ซฏไฝฟ็”จ Nginx Reverse Proxy?

    ๅช่ฆไฝ ็š„ๆžถๆง‹ไธญๅญ˜ๅœจๅคšๅ€‹ๅพŒ็ซฏๆœๅ‹™、้œ€่ฆ้›†ไธญๆŽง็ฎกๅฐๅค–ๅ…ฅๅฃ、ๆˆ–่€…ๅธŒๆœ›ๆŠŠ TLS、ๅฟซๅ–、Rewrite、ๅญ˜ๅ–ๆŽงๅˆถ้›†ไธญ่™•็†, ๅนพไนŽ้ƒฝๅฏไปฅ่€ƒๆ…ฎๅœจๅ‰็ซฏๆ”พไธ€ๅฑค Nginx Reverse Proxy。็‰นๅˆฅๆ˜ฏ็•ถไฝ ๆœชไพ†ๆœ‰่จˆ็•ซๅฐŽๅ…ฅๅพฎๆœๅ‹™ๆˆ–ๅฎนๅ™จๅนณๅฐๆ™‚, ้€™ๅฑคๅ…ฅๅฃๆœƒ่ฎŠๅพ—ๆ›ดๅŠ ้—œ้ต。

    Q2. Nginx Reverse Proxy ๅ’Œ Load Balancer ๆœ‰ไป€้บผๅทฎๅˆฅ?

    Nginx ๆœฌ่บซๆ—ขๅฏไปฅๆ˜ฏ Reverse Proxy,ไนŸๅฏไปฅๆ˜ฏ Load Balancer。ๆฆ‚ๅฟตไธŠ:

    • Reverse Proxy:ไปฃ่กจๅพŒ็ซฏๆœๅ‹™ๆŽฅๆ”ถ่ซ‹ๆฑ‚,่™•็† URL、Header、Cookie、ๅฃ“็ธฎ、TLS ็ญ‰้‚่ผฏ。
    • Load Balancer:ๅฐˆๆณจๅœจๆŠŠๆต้‡ๅˆ†ๆ•ฃๅˆฐๅคšๅฐๅพŒ็ซฏไธปๆฉŸไธŠ。

    ๅพˆๅคšๅฏฆไฝœๆœƒ็›ดๆŽฅๅœจๅŒไธ€ๅฐ Nginx ไธŠๅŒๆ™‚ๅš้€™ๅ…ฉไปถไบ‹,็œŸๆญฃ็š„ๅทฎๅˆฅๆฏ”่ผƒๅๅ‘「ๆžถๆง‹่ง’่‰ฒ」่€Œ้žๅทฅๅ…ทๆœฌ่บซ。

    Q3. ่ฆไธ่ฆๆŠŠ้œๆ…‹ๆช”ๆกˆ็›ดๆŽฅๆ”พๅœจ Nginx ไธŠ,่€Œไธๆ˜ฏๅพŒ็ซฏ?

    ๅœจๅคšๆ•ธๆƒ…ๆณไธ‹ๆ˜ฏๅ€ผๅพ—็š„。ๅฐ‡้œๆ…‹ๆช”ๆกˆ(ๅœ–็‰‡、CSS、JS、ๅ‰็ซฏๆ‰“ๅŒ…็ตๆžœ็ญ‰)็›ดๆŽฅ็”ฑ Nginx ๆไพ›,ๅฏไปฅๅคงๅน…ๆธ›ๅฐ‘ๅพŒ็ซฏ่ฒ ๆ“”, ไธฆไธ”ๆ›ดๅฎนๆ˜“่จญๅฎš Cache-Control ่ˆ‡ๅฃ“็ธฎ,ไธ้Žไฝ ไป็„ถ้œ€่ฆ่€ƒๆ…ฎ้ƒจ็ฝฒๆต็จ‹(ๅฆ‚ไฝ•ๅŒๆญฅๆช”ๆกˆ)่ˆ‡็‰ˆๆœฌ็ฎก็†็ญ–็•ฅ。

    Q4. ่ฆไธ่ฆ็›ดๆŽฅๆŠŠๅฟซๅ–่ˆ‡่ฒ ่ผ‰ๅ‡่กก้ƒฝๅšๅœจๅŒไธ€ๅฐ Nginx ไธŠ?

    ๅฐๅž‹ๆˆ–ๅ–ฎไธ€ๅ€ๅŸŸ็š„็’ฐๅขƒ,ๅฏไปฅ็”จ「ไธ€ๅฐ Nginx ๅšๅˆฐๅบ•」็š„ๆ–นๅผ,็ถญ่ญท็ฐกๅ–ฎ、ๆˆๆœฌไฝŽ; ไฝ†ๅœจ้ซ˜ๆต้‡、ๅคšๅœฐ้ƒจ็ฝฒๆˆ–้ซ˜ๅบฆ้—œ้ต็ณป็ตฑไธญ,้€šๅธธๆœƒๅˆ†ๅฑค:L4 ่ฒ ่ผ‰ๅ‡่กก、CDN ๆˆ–ๅฐˆ็”จๅฟซๅ–ๅฑค、L7 Reverse Proxy,ๅ†ๅพ€ๅพŒๆ‰ๆ˜ฏๆ‡‰็”จ。

    ๐Ÿงญ ่กŒๅ‹•ๆธ…ๅ–ฎ:ๅฆ‚ไฝ•ๆŠŠ้€™ไบ›่จญๅฎš่ฝๅœฐๅˆฐไฝ ็š„็’ฐๅขƒ?

    ✅ ๅ…ˆๆ•ด็†็พๆœ‰ๆœๅ‹™ๆธ…ๅ–ฎ:ๆœ‰ๅ“ชไบ›็ถฒๅŸŸ / ่ทฏๅพ‘ / ๅ…ง้ƒจ IP / Port?
    ✅ ๆฑบๅฎš Multisite ็ญ–็•ฅ:ไปฅ Host ็‚บไธป,้‚„ๆ˜ฏไปฅ Path ็‚บไธป,ๆˆ–ๅ…ฉ่€…ๆทท็”จ?
    ✅ ๅœจ Lab ๆˆ–ๆธฌ่ฉฆ็’ฐๅขƒๅ…ˆๆญไธ€ๅฑค Nginx Reverse Proxy,้ฉ—่ญ‰ Proxy / Rewrite / Header ่กŒ็‚บ
    ✅ ๅฐ้œๆ…‹ๅ…งๅฎนๆˆ–ๅฏๅฟซๅ– API ๅ•Ÿ็”จ Proxy Cache,่ง€ๅฏŸ Hit Rate ่ˆ‡ๅพŒ็ซฏ่ฒ ่ผ‰่ฎŠๅŒ–
    ✅ ๅฐ่ฒ ่ผ‰่ผƒ้‡็š„ๆœๅ‹™่จญ่จˆ upstream load balancing,ๆญ้… least_conn ๆˆ– ip_hash
    ✅ ๅฏซไธ€ไปฝ็ฐก็Ÿญ็š„「ๆŽ’้Œฏๆ‰‹ๅ†Š」,ๅŒ…ๅซๅธธ่ฆ‹ 502/504、Redirect ่ฟดๅœˆ、Client IP ๅ•้กŒ็š„่™•็†ๆญฅ้ฉŸ
    

    ๐Ÿ’ฌ ไธ€่ตทๅˆ†ไบซไฝ ็š„ Nginx Reverse Proxy ๆžถๆง‹

    ไฝ ็›ฎๅ‰็š„ Nginx Reverse Proxy ๆ˜ฏๆ€Ž้บผ่จญ่จˆ็š„?
    ๆ˜ฏๅ–ฎไธ€ๅ‰็ซฏ Gateway,้‚„ๆ˜ฏๆญ้…ๅคšๅฑค Load Balancer ่ˆ‡ CDN?
    ๅœจๅฐŽๅ…ฅๅคš็ซ™้ปž、Rewrite、ๅฟซๅ–่ˆ‡่ฒ ่ผ‰ๅ‡่กก็š„้Ž็จ‹ไธญ,ๆœ‰ๆฒ’ๆœ‰่ธฉ้Žไป€้บผๆœ‰่ถฃ็š„ๅ‘?
    ๆญก่ฟŽๅœจไธ‹ๆ–น็•™่จ€ๅˆ†ไบซไฝ ็š„ๅฏฆๆˆฐ็ถ“้ฉ—,ไนŸๅฏไปฅๆๅ‡บๆƒณ็œ‹็š„ๅปถไผธไธป้กŒ(ไพ‹ๅฆ‚่ˆ‡ Kubernetes Ingress、Service Mesh ็š„ๆ•ดๅˆ), ๆˆ‘ๆœƒๅ†ๆ•ด็†ๆˆๅพŒ็บŒๆ–‡็ซ  ๐Ÿ™Œ


    — WWFandy・Nginx Reverse Proxy ็ญ†่จ˜

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš