๐ง Linux Nginx ๅๅไปฃ็ๅฏฆๆฐ:HTTPS、่ฒ ่ผๅนณ่กก่ๅพ็ซฏๆๅๆดๅ
ๅจ็พไปฃ็็ถฒ็ซ่ๆๅๆถๆงไธญ,Nginx ๅๅไปฃ็(Reverse Proxy) ๅนพไนๆฏๆจๆบ้ ๅ。 ไธ่ซๆฏ่ฆ็ตฑไธ็ฎก็ HTTPS ๆ่ญ、ๅจๅคๅฐๅพ็ซฏไน้ๅ่ฒ ่ผๅนณ่กก、ๆๅฐๅค็จฎๆๅๆดๅๅจๅไธๅ็ถฒๅๅบไธ, Nginx ้ฝ่ฝ็จ็ฐกๆฝ็่จญๅฎๅฎๆ。
ๆฌ็ฏไปฅ Linux ็ฐๅข็บไธป,ๅพๆฆๅฟตๅฐๅฏฆๆฐ้ ็ฝฎ,ๅฎๆดไป็ดน:
- ไป้บผๆฏ「ๅๅไปฃ็」?่「ๆญฃๅไปฃ็」ๆไป้บผไธๅ?
- ๅฆไฝๅจ Linux ๅฎ่ฃ่ๅ็จ Nginx
- ไฝฟ็จ Nginx ๅปบ็ซ HTTP/HTTPS ๅๅไปฃ็
- ๆดๅ Let's Encrypt ่ชๅ็ฐฝ็ผๅ ่ฒปๆ่ญ
- ๅคๅฐๅพ็ซฏๆๅ็่ฒ ่ผๅนณ่กก่จญๅฎ
- ่็ WebSocket、REST API ็ญ็นๆฎๆ ๅข
- ๅธธ่ฆๅ้ก่้ค้ฏๆๅทง
ไธ、ๅๅไปฃ็ๆฏไป้บผ?่ๆญฃๅไปฃ็็ๅทฎๅฅ
1. ๆญฃๅไปฃ็(Forward Proxy)
ๆญฃๅไปฃ็ๆฏ「็ซๅจ็จๆถ้ไธๅด」็ไปฃ็ไผบๆๅจ:
- ็จๆถ็ดๆฅ้ฃ็ทๅฐ Proxy,ๅ็ฑ Proxy ๆฟ็จๆถๅ็ถฒ่ทฏไธ็็ถฒ็ซ็ผๅบ่ซๆฑ。
- ๅธธ่ฆ็จ้:ๅ ฌๅธๅ ง้จไธ็ถฒๆง็ฎก、็ฟป็ Proxy、ๅฟซๅๅค้จ็ถฒ็ซ็ญ。
2. ๅๅไปฃ็(Reverse Proxy)
ๅๅไปฃ็ๅๆฏ「็ซๅจไผบๆๅจ้ไธๅด」:
- ๅค้จ็จๆถๅช็ๅฐๅๅไปฃ็็ IP / ็ถฒๅ。
- ๅๅไปฃ็ๅๆ นๆ่ทฏๅพ、Host、Header ็ญๆขไปถ,ๆ่ซๆฑ่ฝ็ผ็ตฆๅ ง้จ็ๅพ็ซฏๆๅ。
- ็จๆถๅฎๅ จไธ้่ฆ็ฅ้ๅพ็ซฏๆๅ็ๆญฃ็ IP ๆ Port。
ๅๅไปฃ็ๅธธ่ฆ็จ้ๅ ๆฌ:
- ้ไธญ็ฎก็ HTTPS(็ตฑไธ็ต็ต TLS,ๅพ็ซฏ่ตฐ HTTP)。
- ๅคๅฐๅพ็ซฏๆๅ็่ฒ ่ผๅนณ่กก(Load Balancing)。
- ๅฐๅคๅๆ็จ(API、ๅ็ซฏ、ๅพๅฐ)ๆดๅๅจๅไธๅ็ถฒๅไธ。
- ไฝ็บ็ฌฌไธๅฑค้ฒ็ท:้ๅถไพๆบ IP、Rate Limit、ๅบๆฌ WAF ่ฆๅ็ญ。
ไบ、ๅจ Linux ไธๅฎ่ฃ่ๅๅ Nginx
ไปฅไธ็คบไพไปฅ Debian/Ubuntu ่ RHEL/CentOS ็บไธป,ๅ ถๅฎ็ผ่ก็ๅฏๅฐๆๅ่ช็ๅฅไปถ็ฎก็ๅทฅๅ ท。
1. Debian / Ubuntu
sudo apt update
sudo apt install -y nginx
# ๅๅ่่จญๅฎ้ๆฉ่ชๅๅๅ
sudo systemctl enable --now nginx
# ๆชขๆฅๆๅ็ๆ
sudo systemctl status nginx
2. RHEL / CentOS / Rocky / AlmaLinux
sudo dnf install -y nginx # ่็ๅฏ็จ yum
sudo systemctl enable --now nginx
sudo systemctl status nginx
ๅฎ่ฃๅพ,ๅฆๆ้ฒ็ซ็ๆๅ็จ,่จๅพๆ้ HTTP/HTTPS:
# ไปฅ firewalld ็บไพ
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
็่ฆฝๅจๆ้ http://ไผบๆๅจIP,ๆ่ฉฒๅฐฑๆ็ๅฐ Nginx ็้ ่จญๆญก่ฟ้ ้ข。
ไธ、ๅบๆฌ Nginx ็ตๆง่่จญๅฎๆชไฝ็ฝฎ
ๅธธ่ฆ็ Nginx ็ฎ้็ตๆง(ไปฅ Debian/Ubuntu ็บไพ):
/etc/nginx/nginx.conf:ไธป่จญๅฎๆช,ๆ include ๅ ถไป conf。/etc/nginx/sites-available/:ๅ็ซๅฐ่จญๅฎ(่ๆฌไธปๆฉ)。/etc/nginx/sites-enabled/:ๅฏฆ้ๅ็จ็็ซๅฐ่จญๅฎ(ๅค็จ symlink)。/var/www/:้ ่จญ็ถฒ็ซๆ น็ฎ้。/var/log/nginx/access.log、error.log:ๅญๆพๅญๅ่้ฏ่ชค็ด้。
ๆธฌ่ฉฆ Nginx ่จญๅฎๆชๆฏๅฆๆญฃ็ขบ:
sudo nginx -t # ๆชขๆฅ่ชๆณ
sudo systemctl reload nginx # ๅนณๆป้ๆฐ่ผๅ
ฅ่จญๅฎ
ๅ、HTTP ๅๅไปฃ็ๅบๆฌ็ฏไพ
ๆ
ๅข:Nginx ๅฐๅค้ๆพ 80 port,ๅพ็ซฏๆไธๅ่ทๅจ 127.0.0.1:8080 ็ Web ๆ็จ็จๅผ。
1. ๅปบ็ซ็ซๅฐ่จญๅฎๆช
ๅจ /etc/nginx/sites-available/myapp.conf ๅปบ็ซ:
server {
listen 80;
server_name example.com;
# ๅฏ้ธๆ่จ้ๅฐ็จ log
access_log /var/log/nginx/myapp_access.log;
error_log /var/log/nginx/myapp_error.log;
location / {
proxy_pass http://127.0.0.1:8080;
# ไฟ็็ๅฏฆ Client IP ่ Host
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. ๅ็จ็ซๅฐ
# ๅปบ็ซ symlink ๅ็จ
sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/
# ๆธฌ่ฉฆ่จญๅฎไธฆ้ๆฐ่ผๅ
ฅ
sudo nginx -t
sudo systemctl reload nginx
ไนๅพไฝฟ็จ่
ๅช่ฆ้ฃๅฐ http://example.com,ๅฏฆ้ไธๅฐฑๆฏ็ฑ Nginx ๆฟไป้ฃๅฐ 127.0.0.1:8080。
ไบ、HTTPS ่ๆ่ญ็ฎก็:ๅๅไปฃ็ไฝ็บ TLS ็ต็ต้ป
็พไปฃ็ถฒ็ซๅนพไน้ฝ่ฆๆฑไฝฟ็จ HTTPS,ๅ ไธ็่ฆฝๅจไนๆๅฐ HTTP ้กฏ็คบ「ไธๅฎๅ จ」่ญฆๅ。 ๆๅ ธๅๅๆณๆฏ่ฎ Nginx ่ฒ ่ฒฌ TLS ็ต็ต(Terminating TLS),ๅพ็ซฏ็ถญๆ HTTP, ๅฆๆญคๅฏ้ไธญ็ฎก็ๆ่ญ、ๆธๅฐๅพ็ซฏ่ฒ ๆ。
1. ไฝฟ็จ Let's Encrypt + Certbot ่ชๅ็ฐฝ็ผๆ่ญ
# Debian / Ubuntu
sudo apt install -y certbot python3-certbot-nginx
# ้้ Nginx ๅคๆ่ชๅ่จญๅฎ HTTPS
sudo certbot --nginx -d example.com -d www.example.com
Certbot ๆ่ชๅๅนซไฝ :
- ่ Let's Encrypt ACME ไผบๆๅจๆบ้。
- ็ฐฝ็ผๆ่ญไธฆๅญๆพๅฐ
/etc/letsencrypt。 - ไฟฎๆนๅฐๆ็ Nginx server ๅๅก,ๅ ๅ
ฅ
listen 443 ssl;็ญ่จญๅฎ。 - ๅ ๅ ฅๆ็จ(systemd timer)่ชๅ็บ็ด。
ๆๅๅพ่จญๅฎๆชๆ้ทๅพๅ้ๆจฃ(็ฐกๅ็):
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1: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;
}
}
ไธ้ขไน็คบ็ฏไบไธๅๅธธ่ฆๅๆณ:ๆๆ HTTP 80 ้ฃ็ทไธๅพ 301 ่ฝๅฐ HTTPS。
ๅ ญ、ๅค็ซๅฐๆดๅ:ๅไธๅฐ Nginx ไปฃ็ๅคๅๅพ็ซฏๆๅ
ๅจๅฏฆๅไธญ,ๅธธๅธธๆ้ๅฐไธๅฐไธปๆฉไธ่ทๅพๅคๆๅ,ไพๅฆ:
- ๅ็ซฏ็ถฒ็ซ
https://www.example.com - API ไผบๆๅจ
https://api.example.com - ๅพๅฐ็ฎก็ไป้ข
https://admin.example.com
1. ไพ「็ถฒๅ」ๅๆต(vhost)
ๅฏไปฅ็บไธๅ็ Host ๅปบ็ซไธๅ server ๅๅก:
# ๅ็ซฏ
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# API
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 / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
2. ไพ「่ทฏๅพ」ๅๆต
่ฅๅชๆณไฝฟ็จๅไธๅ็ถฒๅ,ไนๅฏไปฅไพ็ ง URL ่ทฏๅพ่ฝ็ผ:
server {
listen 443 ssl http2;
server_name example.com;
# /api/* ่ฝ็ตฆๅพ็ซฏ API ไผบๆๅจ
location /api/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# /admin/* ่ฝ็ตฆๅพๅฐ
location /admin/ {
proxy_pass http://127.0.0.1:9000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# ๅ
ถไป่ทฏๅพ็ถไฝๅ็ซฏ็ถฒ็ซ
location / {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
ๆณจๆ proxy_pass ๅพ้ข็「ๅฐพ็ซฏๆ็ท」ๆ่ชๆๅทฎ็ฐ,ๆๅฝฑ้ฟๅฏฆ้่ฝ็ผ็่ทฏๅพ。
ไธ่ฌๆ
ๆณไธ,ๅปบ่ญฐ「location ไปฅ / ็ตๅฐพ,proxy_pass ไนไปฅ / ็ตๅฐพ」,ไฟๆไธ่ด่ผไธๆๆททไบ。
ไธ、่ฒ ่ผๅนณ่กก:ๅคๅฐๅพ็ซฏๆๅๅๆต
็ถๅฎๅฐๅพ็ซฏๆๅๆฟๅไธไบๆต้ๆ,ๅฐฑๅฏไปฅๅจ Nginx ๅ้ขๅ ๅ ฅ่ฒ ่ผๅนณ่กกๆฉๅถ, ๅฐ่ซๆฑๅๆฃๅฐๅคๅฐๅพ็ซฏไผบๆๅจ。
1. ่จญๅฎ upstream ๅๅก
ๅจ /etc/nginx/nginx.conf ๆ็จ็ซ conf ่ฃกๅฎ็พฉ:
upstream myapp_backend {
# ้ ่จญๆฏ round-robin
server 10.0.0.11:8080;
server 10.0.0.12:8080;
# ๅฏไปฅ่จญ่จๆฌ้,ไพๅฆ:
# server 10.0.0.11:8080 weight=2;
# server 10.0.0.12:8080 weight=1;
}
2. ๅจ server ๅๅกไธญไฝฟ็จ upstream
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
location / {
proxy_pass http://myapp_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;
}
}
3. ๅธธ่ฆ่ฒ ่ผๅนณ่กก็ญ็ฅ
- round-robin(้ ่จญ):่ซๆฑ่ผชๆตๅ้ ๅฐๅๅพ็ซฏ。
- least_conn:ๅชๅ ๅ้ ็ตฆ็ฎๅ้ฃ็ทๆธๆๅฐ็ๅพ็ซฏ。
- ip_hash:็ฑ Client IP ๆฑบๅฎ่ฆ้ฃๅฐๅชไธๅฐ,็จๆผ้่ฆ「ๆ่ฉฑ้ป่(sticky)」็ๆๅ。
ไพๅฆ:
upstream myapp_backend {
least_conn;
server 10.0.0.11:8080;
server 10.0.0.12:8080;
}
ๅ ซ、็นๆฎๆ ๅข:WebSocket ่้ท้ฃ็ทๆๅ
ไธไบ็พไปฃ Web ๆ็จๆไฝฟ็จ WebSocket(ไพๅฆๅณๆ่ๅคฉ、ๅณๆ็ฃๆง), ๆๆฏ้่ฆ้ทๆ้ไฟๆ้ฃ็ท็ SSE(Server-Sent Events)。้้กๆ ๆณ้่ฆ่ชฟๆดไธไบ proxy ็ธ้ๅๆธ。
1. WebSocket ๅๅไปฃ็็คบไพ
location /ws/ {
proxy_pass http://127.0.0.1:7000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
2. ่ชฟๆด Timeout,้ฟๅ ้ท้ฃ็ท่ขซ้ๆฉๅๆท
proxy_read_timeout 3600;
proxy_send_timeout 3600;
ๅฏฆ้ๅผๅฏไพๆๅ็นๆง่ชฟๆด,้ฟๅ ้็ญ้ ๆ้ฃ็ท้ ป็น้ๅปบ,้้ทๅๅฏ่ฝๆตช่ฒป่ณๆบ。
ไน、ๅฎๅ จๅผทๅ่ๆไฝณๅฏฆๅ
ๅๅไปฃ็ๆบๅจๆๅ้ข,่ช็ถไนๆฏ็ฌฌไธๅฑคๅฎๅ จ้ฒ็ท,ๅปบ่ญฐ้ ๅไปฅไธๅๆณ:
1. ๅ ้ๆพๅฟ ่ฆ Port
- ๅฐๅคๅช้ 80/443,ๅพ็ซฏๆๅๅช่ฝ localhost ๆๅ ง็ถฒ IP。
- ้ ๅ Linux ้ฒ็ซ็(iptables / nftables / firewalld)้ๅถไพๆบ。
2. ๅดๆ ผ HTTP Header ่ๅคงๅฐ้ๅถ
# ้ๅถ่ซๆฑ้ซๅคงๅฐ,้ฟๅ
่ขซๆฟไพไธๅณ่ถ
ๅคงๆชๆก
client_max_body_size 10m;
# ๅ ๅ
ฅๅฎๅ
จ็ธ้ Header(ๅฏไพๆ
ๆณ่ชฟๆด)
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
3. ไฝฟ็จ HTTP/2 ่ TLS ๅผทๅ่จญๅฎ
ๅจ listen ่กๅ ไธ http2,ไธฆๆก็จ่ผๆฐ็ TLS ็ๆฌ่ Cipher。
4. ๆญ้ Fail2Ban ๆ WAF
ๅฏ้้ log pattern ๆญ Fail2Ban ้ฒ่ก็ฐกๆ้ฒ็ฆฆ,ๆๅฐๅ ฅๅฆ ModSecurity ็ญ WAF ่งฃๆฑบๆนๆก, ๅฐๆกๆ่ก็บๆๅจๅๅไปฃ็้ไธๅฑค。
ๅ、ๅธธ่ฆๅ้ก่้ค้ฏๆๅทง
1. 502 Bad Gateway / 504 Gateway Timeout
ไปฃ่กจ Nginx ่ๅพ็ซฏๆๅ้็ๆบ้ๆๅ้ก,ๆๆฅๆนๅๅ ๆฌ:
- ๅพ็ซฏๆๅๆฏๅฆๆๅๅ?Port ๆฏๅฆๆญฃ็ขบ?
- Nginx ๆฏๅฆ่ฝ้ฃๅฐๅพ็ซฏ IP(้ฒ็ซ็、SELinux、ๅฎนๅจ็ถฒ่ทฏ…)。
- ่ถ
ๆ่จญๅฎๆฏๅฆ้็ญ(
proxy_read_timeout)。
2. ้ๆ ๆชๆก่ทฏๅพ้ฏไบ / ้่ค็่ทฏๅพๅ็ถด
้ๅธธ่ location ่ proxy_pass ็ๅฐพๆ็ทๆ้。
่ฅ้ๅฐๅ้ก,ๅปบ่ญฐๅ
็ฐกๅ่จญๅฎ,ๅช่็ / ่ทฏๅพ,ๅ้ๆญฅๆๅบ /api、/admin ็ญๅญ่ทฏๅพ。
3. ็ๅฏฆ IP ๆฒๆๅบ็พๅจๅพ็ซฏ Log
็ขบ่ชๆฏๅฆๆ่จญๅฎ:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
ไธฆๅจๅพ็ซฏ Web Server(ไพๅฆ Apache、Node.js ๆ็จ)ไธญ่จญๅฎไฝฟ็จๆญค Header, ๅไปฃ็ดๆฅ่ฎๅ remote_addr。
4. ่จญๅฎไฟฎๆนๅพๅปๆฒๆ็ๆ
- ๆฏๅฆๆๅฐ็ซๅฐ conf ๆพๅฐ
sites-enabled(ๆ include ็็ฎ้)? - ไฟฎๆนๅพๆฏๅฆๆๅท่ก
nginx -t่systemctl reload nginx? - ๆฏๅฆๆๅคๅ็ธๅ
server_name็ server ๅๅกไบ็ธ่ก็ช?
ๅไธ、ๆด็่ๅปถไผธ:ๆ Nginx ่ฎๆไฝ ็「็ตฑไธๅ ฅๅฃ」
ๅพๅฏฆๅ่งๅบฆไพ็,Nginx ๅๅไปฃ็ๅฏไปฅๅนซไฝ ๅๅฐ:
- ๅฐๅคๅช้ไธ็ต IP / ็ถฒๅ,ๅ ง้จๆๅๅฎๅ จ่ๅจๅพ้ข。
- ้ไธญ็ฎก็ HTTPS ๆ่ญ(ๅฐคๅ ถๆญ้ Let's Encrypt ้ๅธธๆนไพฟ)。
- ๅจๅคๅฐๅพ็ซฏไน้ๅๆฃๆต้,ไธฆ็ฐกๅๆดๅ ๆต็จ。
- ้ๅงๅฐๅ ฅๆด้ฒ้็ DevOps ๆถๆง,ไพๅฆๅฎนๅจๅ、ๅพฎๆๅ、Kubernetes ็ญ。
็ถไฝ ๆๅธธ็จ็ๅๅไปฃ็้ ็ฝฎๆด็ๆ ๆจๆบๆจกๆฟ ไนๅพ, ไธ่ซๆฏๆฐๅฐๆกไธ็ท、ๆๅๆฌ้ท、ๆ่จๆๅขๅ ๆธฌ่ฉฆ็ฐๅข, ๅช่ฆ่ค่ฃฝไธไปฝ conf、่ชฟๆดๅนพๅๅๆธ,ๅฐฑ่ฝๅฟซ้ๅฎๆ。
✅ ๅปบ่ญฐไธไธๆญฅๅฏไปฅๆญ้ :
- Linux ้ฒ็ซ็่ Fail2Ban(้ๅถไพๆบ / ้ฃ็ทๆฌกๆธ)。
- ไฝฟ็จ Prometheus + Grafana ็ฃๆง Nginx ่ๅพ็ซฏๆๅ็ๆ 。
- ๅฐ Nginx ๅๅไปฃ็่ Docker / Proxmox ็ฐๅขๆดๅ,ไฝ็บๆดๅๅ ง็ถฒๆๅ็「ๅ ฅๅฃ้้」。
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ