๐ 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 ๅๆธๆๅ้ฃ็ท่ฝๅ
๐ ๅปถไผธ้ฑ่ฎ
- ๐ Nginx ๅๅไปฃ็่ HTTPS ๅฎๆดๆๅญธ
- ๐ง Linux ้ฒ็ซ็ๆดๅ:Firewalld / iptables / nftables
- ๐ Systemd + Logrotate ๆดๅๆๅญธ
- ๐งฑ Linux ๅฎๅ จๆงๅฎๆดๆๅ:SELinux / AppArmor / Auditd ่งฃๆ
- ๐งฉ Linux ๆชๆก็ณป็ตฑๆฏ่ผ:ext4 vs XFS vs Btrfs vs ZFS
— WWFandy・Nginx ๅไปฃๆถๆง็ญ่จ
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ