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

๐ŸŒ Nginx ๅๅ‘ไปฃ็†้€ฒ้šŽ็ฏ‡:ๅคš็ซ™้ปž、Rewrite ่ฆๅ‰‡、Proxy Cache ๅฎŒๆ•ดๆ•™ๅญธ

    ๐ŸŒ Nginx ๅๅ‘ไปฃ็†้€ฒ้šŽ็ฏ‡:ๅคš็ซ™้ปž、Rewrite ่ฆๅ‰‡、Proxy Cache ๅฎŒๆ•ดๆ•™ๅญธ

    ๅœจไฝ ๅทฒ็ถ“ๅ…ทๅ‚™ๅŸบๆœฌ Nginx Reverse Proxy ่ƒฝๅŠ›ๅพŒ,ไธ‹ไธ€ๆญฅๅฐฑๆ˜ฏๆทฑๅ…ฅ「้€ฒ้šŽๅไปฃๆžถๆง‹」:ๅคš็ซ™้ปžไปฃ็†、Rewrite URL ่ฆๅ‰‡、Proxy Cache ้œๆ…‹ๅŠ ้€Ÿ、ๅฅๅบทๆชขๆŸฅ่ˆ‡ๅพŒ็ซฏ้Œฏ่ชค่™•็†็ญ‰。 ๆœฌๆ–‡ๅฎŒๆ•ดๆ•ด็†ไผๆฅญ่ˆ‡ๅคงๅž‹็ถฒ็ซ™ๅธธ็”จ็š„ Nginx ๅไปฃๆŠ€ๅทง,ๅพžๅŸบ็คŽๆžถๆง‹ๅœ–、่จญๅฎš็ฏ„ไพ‹ๅˆฐๆœ€ไฝณๅŒ–ๅƒๆ•ธๅ…จ้ƒฝๆถต่“‹。 ้€™็ฏ‡ๆ–‡็ซ ้ฉๅˆๅทฒ็ถ“้ƒจ็ฝฒๅŸบๆœฌๅไปฃ、ๆƒณ่ฎ“็ถฒ็ซ™ๆ›ดๅฟซ、ๆ›ด็ฉฉ、ๆ›ดๅฏ็ถญ้‹็š„ไฝ 。

    ไธ€、ๅๅ‘ไปฃ็†็š„ๅฎŒๆ•ดๅทฅไฝœๆต็จ‹ๅœ–

    ็†่งฃ Nginx ไฝœ็‚บ Reverse Proxy ็š„่ง’่‰ฒ,ๆœ‰ๅŠฉๆ–ผ้…็ฝฎๆ›ดๅŠ ๆญฃ็ขบ:

    [Client] → HTTPS → [Nginx Reverse Proxy] → HTTP/HTTPS → [Backend Web App]
    │
    └─> SSL/TLS Termination(Nginx)
             ├─ URL Rewrite
             ├─ Load Balancing(้ธๆ“‡ๆ€ง)
             ├─ Header ๆ”นๅฏซ(Host / X-Forwarded-For)
             ├─ Proxy Cache(้œๆ…‹/ๅ‹•ๆ…‹้ ้ขๅŠ ้€Ÿ)
             └─ Error Handling(502/504 ้‡่ฉฆ)
    

    Nginx ็š„ๅƒนๅ€ผๅฐฑๅœจๆ–ผ「ๆŠฝ่ฑกๅŒ–ๅพŒ็ซฏ」,ไธฆๅœจไธญ้–“ๅฑคๆไพ›ๅŠ ้€Ÿ、ๅฎ‰ๅ…จ、็›ฃๆŽง่ˆ‡ๅฝˆๆ€ง้ƒจ็ฝฒ。

    ไบŒ、ๅคš็ซ™้ปžๅไปฃ(Multi-Site Reverse Proxy)

    ็•ถไฝ ๆƒณๅœจไธ€ๅฐ Nginx ไธŠไปฃ็†ๅคšๅ€‹ๅพŒ็ซฏ็ซ™้ปž,ๅฏไปฅไฝฟ็”จ server_name ๅˆ†ๆต。

    2-1. ๅคš็ถฒๅŸŸๅไปฃ็ฏ„ไพ‹

    # /etc/nginx/sites-available/multi-proxy.conf
    
    server {
        listen 80;
        server_name api.example.com;
    
        location / {
            proxy_pass http://10.10.0.10:8080;
            include proxy_params;
        }
    }
    
    server {
        listen 80;
        server_name blog.example.com;
    
        location / {
            proxy_pass http://10.10.0.20:8000;
            include proxy_params;
        }
    }
    

    ๅฆ‚ๆญคไธ€ไพ† api.example.com ่ˆ‡ blog.example.com ็š„ๆต้‡ๅฐฑ่ƒฝๅˆ†ๅˆฅๅไปฃ่‡ณไธๅŒๅพŒ็ซฏ。

    2-2. ๅญ่ทฏๅพ‘ๅไปฃ(Path-based Reverse Proxy)

    ่‹ฅไฝ ๆƒณไปฅๅญ่ทฏๅพ‘ไฝœๅ€้š”(ไพ‹ๅฆ‚ /api/app):

    server {
        listen 80;
        server_name example.com;
    
        location /api/ {
            proxy_pass http://10.10.0.10:8080/;
            include proxy_params;
        }
    
        location /app/ {
            proxy_pass http://10.10.0.20:9000/;
            include proxy_params;
        }
    }
    

    ๆณจๆ„ proxy_pass ็ตๅฐพๆ˜ฏๅฆๅŒ…ๅซ /,ๆœƒๅฝฑ้Ÿฟ URL ๅฐๆ‡‰ๆ–นๅผ,ๆ˜ฏๅไปฃๅธธ่ฆ‹่ธฉ้›ท。

    ไธ‰、URL Rewrite ๅฏฆๅ‹™:ๆœ€ๅฎนๆ˜“ๆž้ŒฏไนŸๆœ€ๅธธ็”จ็š„ๅŠŸ่ƒฝ

    Rewrite ๆ˜ฏ Nginx ็”จๆ–ผ URL ๆ”นๅฏซ、่ทณ่ฝ‰่ˆ‡ๅพŒ็ซฏ่ทฏๅพ‘่ชฟๆ•ด็š„้‡่ฆๅทฅๅ…ท。

    3-1. ๅธธ่ฆ‹่ทณ่ฝ‰้œ€ๆฑ‚:HTTP → HTTPS

    server {
        listen 80;
        server_name example.com;
        return 301 https://$host$request_uri;
    }
    

    3-2. ็งป้™ค URL ็ตๅฐพๆ–œ็ทš

    rewrite ^/(.*)/$ /$1 permanent;
    

    3-3. ไฟ็•™ query string ็š„ rewrite(้žๅธธ้‡่ฆ)

    rewrite ^/old/(.*)$ /new/$1 last;
    

    ่‹ฅ็”จ ? ็ตๅฐพๆœƒๆธ…้™ค query string,ๅ‹™ๅฟ…ๆณจๆ„:

    rewrite ^/old/(.*)$ /new/$1? last;   # ← query string ๆœƒ่ขซๆธ…ๆމ
    

    3-4. ๅ‰็ซฏ SPA(Vue/React)ๅฐŽๅ‘ index.html

    location / {
        try_files $uri $uri/ /index.html;
    }
    

    ๅ››、Proxy Cache:่ฎ“ๅไปฃไผบๆœๅ™จ่ฎŠๆˆๅŠ ้€Ÿๅ™จ

    Nginx ็š„ proxy_cache ๅฏไปฅๆœ‰ๆ•ˆ้™ไฝŽๅพŒ็ซฏ่ฒ ่ผ‰,้ฉ็”จ:

    • ้œๆ…‹ API ็ตๆžœ(ๅฆ‚ๆŸฅ่ฉขๆธ…ๅ–ฎ、ๆŽ’่กŒๆฆœ)
    • ้ซ˜ QPS ็š„ๅœ–็‰‡/็ธฎๅœ–ๆœๅ‹™
    • ็ฌฌไธ‰ๆ–น API ็ทฉๅญ˜

    4-1. ๅปบ็ซ‹ Cache ๅ€ๅŸŸ

    # ๅœจ http {} ๅ€ๅกŠๅ…ง
    
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:50m inactive=30m max_size=5g;
    

    ่ชชๆ˜Ž:

    • keys_zone=mycache:50m:ๅ„ฒๅญ˜ๅฟซๅ–็ดขๅผ•็š„ๅ…ฑไบซ่จ˜ๆ†ถ้ซ”ๅคงๅฐ。
    • inactive=30m:็„กไบบๅญ˜ๅ–ๅพŒๅคšๅฐ‘ๆ™‚้–“่‡ชๅ‹•ๅˆช้™ค。
    • max_size=5g:ๆ•ด้ซ”ๅฟซๅ–ไธŠ้™。

    4-2. ๅœจๅไปฃ server ไธญๅ•Ÿ็”จ cache

    location /api/ {
        proxy_cache mycache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_pass http://10.10.0.10:8080;
    }
    

    ้€™ไปฃ่กจ:

    • 200/302 ๅ›žๆ‡‰ๅฟซๅ– 10 ๅˆ†้˜
    • 404 ๅ›žๆ‡‰ๅฟซๅ– 1 ๅˆ†้˜(้ฟๅ…ๅคง้‡็„กๆ•ˆๆŸฅ่ฉข)

    4-3. ้ฟๅ…ๅฟซๅ–็™ปๅ…ฅ่ณ‡ๆ–™(Cookie ้Žๆฟพ)

    ๅธธ่ฆ‹ๅฎ‰ๅ…จ้œ€ๆฑ‚:็™ปๅ…ฅๅพŒไธ่ƒฝๅฟซๅ–。

    proxy_cache_bypass $http_authorization $cookie_sessionid;
    proxy_no_cache      $http_authorization $cookie_sessionid;
    

    ไบ”、ๆๅ‡ๅพŒ็ซฏ็ฉฉๅฎšๆ€ง:้‡่ฉฆ、่ถ…ๆ™‚、็ทฉ่กๅ€้šŠๅˆ—

    5-1. ่จญๅฎš Proxy ่ถ…ๆ™‚ๅ€ผ

    proxy_connect_timeout 5s;
    proxy_read_timeout 30s;
    proxy_send_timeout 30s;
    proxy_buffering on;
    

    5-2. ๅไปฃ้‡่ฉฆ(้ฟๅ…็Ÿญๆšซ 502)

    proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
    proxy_next_upstream_tries 3;
    

    ็•ถๅพŒ็ซฏ็ŸญๆšซๆŽ›ๆމ,Nginx ๅฏๅ˜—่ฉฆ้‡ๆ–ฐ้€ฃ็ทš,่ฎ“ๅ‰็ซฏไธๆœƒ็ซ‹ๅณ 502。

    ๅ…ญ、่ฒ ่ผ‰ๅนณ่กกๅฟซ้€Ÿ่จญๅฎš(Round Robin / Least Conn)

    Nginx ๅ…งๅปบ upstream ่ฒ ่ผ‰ๅนณ่กก:

    6-1. Round-Robin

    upstream backend {
        server 10.10.0.10;
        server 10.10.0.11;
    }
    
    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }
    

    6-2. Least Connections(้ฉๅˆ API)

    upstream backend {
        least_conn;
        server 10.10.0.10;
        server 10.10.0.11;
    }
    

    6-3. ๅฅๅบทๆชขๆŸฅ(่ขซๅ‹•ๆชขๆŸฅ)

    proxy_next_upstream error timeout http_502 http_503;
    

    ไธƒ、ๅฎ‰ๅ…จๆ€ง่จญๅฎš:Header、XFF、้™ๅˆถๅคงๅฐ、้ป‘ๅๅ–ฎ

    7-1. ่จญๅฎš็œŸๅฏฆ่จชๅฎข IP(X-Forwarded-For)

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    

    7-2. ้™ๅˆถไธŠๅ‚ณๅคงๅฐ

    client_max_body_size 20M;
    

    7-3. ๅฐ้Ž–ๆƒกๆ„ UA

    if ($http_user_agent ~* (badbot|crawler|scanner)) {
        return 403;
    }
    

    ๅ…ซ、ๅฎŒๆ•ด็ฏ„ไพ‹:ๅ‰็ซฏ + ๅคš็ซ™้ปž + Cache + Rewrite ๆ•ดๅˆ้…็ฝฎ

    # /etc/nginx/sites-available/full-reverse-proxy.conf
    
    upstream api_backend {
        least_conn;
        server 10.10.0.10;
        server 10.10.0.11;
    }
    
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:50m inactive=30m max_size=10g;
    
    server {
        listen 80;
        server_name api.example.com;
    
        # ๅผทๅˆถ HTTPS
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl http2;
        server_name api.example.com;
    
        ssl_certificate     /etc/letsencrypt/live/api.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
    
        location /v1/ {
            rewrite ^/v1/(.*)$ /api/$1 last;
        }
    
        location /api/ {
            proxy_pass http://api_backend;
    
            # 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;
    
            # Cache
            proxy_cache mycache;
            proxy_cache_valid 200 10m;
            proxy_cache_use_stale error timeout invalid_header updating;
        }
    }
    

    ้€™ๆ˜ฏไธ€ๅ€‹็œŸๅฏฆไผๆฅญๅธธ็”จๆžถๆง‹,ๅฏๆ”ฏๆด้ซ˜ๆต้‡、้ซ˜ๆ•ˆ็އ็š„ API ๆœๅ‹™。

    ไน、ๅ•้กŒๆŽ’ๆŸฅ:502、504、rewrite ้Œฏ่ชค็š„ๅธธ่ฆ‹ๅŽŸๅ› 

    9-1. ๅไปฃ URL ้Œฏไฝ

    # ้Œฏ่ชค(ๅคšไธ€ๅฑค่ทฏๅพ‘)
    proxy_pass http://10.0.0.1/api/;
    
    # ๆญฃ็ขบ
    proxy_pass http://10.0.0.1/;
    

    9-2. ๅพŒ็ซฏ็„กๆณ•ๆŽฅๆ”ถ Host

    ้ƒจๅˆ†ๅพŒ็ซฏ้œ€่ฆๆญฃ็ขบ Host header:

    proxy_set_header Host $host;
    

    9-3. ๅ› ๅพŒ็ซฏๅปถ้ฒ้€ ๆˆ 504

    proxy_read_timeout 30s;   # ไพ้œ€ๆฑ‚่ชฟๆ•ด
    

    9-4. Cache ๆœช็”Ÿๆ•ˆ

    • ๅพŒ็ซฏๅ›žๆ‡‰ header ่จญๅฎš Cache-Control: no-store
    • cookie ๆœชๅฟฝ็•ฅ,้€ ๆˆ cache bypass

    ๅ、้ƒจ็ฝฒๅปบ่ญฐ:ๅฆ‚ไฝ•่ฎ“ไฝ ็š„ Nginx ๆžถๆง‹ๆ›ด้•ทไน…ๅฏ็ถญ่ญท?

    • ๅˆ†้›ข่จญๅฎšๆช”(upstream / server / rewrite ๅ„่‡ช็จ็ซ‹)
    • ไฝฟ็”จ include proxy_params ็ฐกๅŒ–้‡่ค‡่จญๅฎš
    • ๅปบ็ซ‹ Health Check ๆฉŸๅˆถ้ฟๅ…ๅพŒ็ซฏๆ•…้šœ้€ ๆˆๅคง่ฆๆจก 502
    • proxy_cache ๅกซๆปฟๆ™‚่ฆ่ชฟๆ•ด max_size,้ฟๅ… I/O ๆปฟ่ผ‰
    • ไฝฟ็”จ systemd ่จญๅฎš limit ๅƒๆ•ธๆๅ‡้€ฃ็ทš่ƒฝๅŠ›

    ๐Ÿ”— ๅปถไผธ้–ฑ่ฎ€

    — WWFandy・Nginx ๅไปฃๆžถๆง‹็ญ†่จ˜

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

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

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

    ๅญ—็ดš