Nginx 高频配置实战:反向代理、动静分离与性能调优
Nginx é«é¢é ç½®å®æï¼åå代çãå¨éåç¦»ä¸æ§è½è°ä¼
Nginx æ¯æ¯ä¸ªå端工ç¨å¸é½ç»ä¸å¼çåºç¡è®¾æ½ã宿¢æ¯åå代çï¼åæ¯éææå¡å¨ï¼è¿æ¯è´è½½åè¡¡å¨åç¼åå±ãæ¬ææå¼"å®è£ ä¸ Hello World"ï¼ç´æ¥èç¦äºä¸ªçº¿ä¸æé«é¢çé ç½®åºæ¯ï¼æ¯ä¸ªåºæ¯é½ç»åºå¯ç´æ¥å¤å¶çé ç½®çæ®µåé¿åè¦ç¹ã
åºæ¯ä¸ï¼åå代çââä¸å°æºå¨æ¿è½½å¤ä¸ªæå¡
æå¸¸è§çè¯æ±ï¼ä¸å°äºä¸»æºä¸è·çå¤ä¸ªç«¯å£ä¸åçæå¡ï¼8080 ç APIã3000 çå端ã9000 ç管çåå°ï¼ï¼å¸æéè¿ 80/443 ç»ä¸å ¥å£è®¿é®ï¼å¹¶æè·¯å¾åæµã
upstream api_backend {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
keepalive 32;
}
server {
listen 80;
server_name example.com;
# /api/* 转åç»å端æå¡
location /api/ {
proxy_pass http://api_backend/;
proxy_http_version 1.1;
proxy_set_header Connection "";
# å
³é®ï¼æçå®å®¢æ·ç«¯ä¿¡æ¯éä¼ ç»å端
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;
}
# å端 SPAï¼history è·¯ç±å·æ° 404 çç»å
¸è§£æ³
location / {
proxy_pass http://127.0.0.1:3000;
try_files $uri $uri/ /index.html;
}
}
ä¸ä¸ªé¿åè¦ç¹ï¼
proxy_passæ«å°¾å¸¦/ä¸ä¸å¸¦/è¯ä¹å®å ¨ä¸åãlocation /api/+proxy_pass http://backend/伿/api/user转æ/userï¼ä¸å¸¦/åä¿ç/api/useråæ ·è½¬åãéåªç§åå³äºå端路ç±è®¾è®¡ï¼å¢éå å¿ é¡»ç»ä¸ãproxy_set_header Host $hostä¸å®è¦æ¾å¼è®¾ç½®ãé»è®¤éä¼ çæ¯proxy_passä¸çå°åï¼å¦127.0.0.1:8080ï¼ï¼åç«¯å¦æåºäº Host åèæä¸»æºå¤ææçæç»å¯¹ URLï¼è¡ä¸ºå°±ä¼éä¹±ã- upstream éå
keepalive 32å¹¶é åproxy_http_version 1.1+ æ¸ ç©ºConnectionå¤´ï¼æè½å¤ç¨å°å端çé¿è¿æ¥ãé«å¹¶ååºæ¯ä¸è¿ä¸é¡¹è½æ¾èåå° TIME_WAIT å 积ã
åºæ¯äºï¼å¨éå离ââ让 Nginx 干宿æ é¿çäº
å¨æè¯·æ±è½¬åç»åºç¨ï¼éæèµæºäº¤ç» Nginx ç´æ¥åï¼å¹¶å 䏿µè§å¨ç¼åï¼
server {
listen 80;
server_name example.com;
# éæèµæºï¼ç´æ¥è¯»ç + é¿æç¼å
location /static/ {
alias /data/web/static/; # 注æ alias ä¸ root çåºå«
expires 30d;
add_header Cache-Control "public, immutable";
}
# 带 hash çæå»ºäº§ç©å¯ä»¥æ°¸ä¹
ç¼å
location ~* \.(js|css|png|jpg|jpeg|gif|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off; # éæèµæºä¸æè®¿é®æ¥å¿ï¼ç IO
}
# å
¥å£æä»¶ä¸ç¼åï¼ä¿è¯åç峿¶çæ
location = /index.html {
add_header Cache-Control "no-cache";
}
}
root ä¸ alias çåºå«æ¯é¢è¯é«é¢é¢ï¼root 伿 location è·¯å¾æ¼å¨æ ¹ç®å½åï¼/static/logo.png â /data/static/logo.pngï¼ï¼alias åæ¯æ¿æ¢ location åç¼ï¼/static/logo.png â /data/web/static/logo.pngï¼ãç¨éäºå°±æ¯ç»å
¸ç 404 çµå¼äºä»¶ã
æå»ºäº§ç©å¸¦ hash æé
immutableã妿æä»¶åæ¯ app.js è¿ç§åºå®åï¼é
äºä¸å¹´ç¼åï¼ç¨æ·æµè§å¨å°æ°¸è¿æ¿ä¸å°æ´æ°ââè¿æ¯"æåäºçä½ç¨æ·æ²¡çæ"ç头å·åå ã
åºæ¯ä¸ï¼Gzip ä¸ä¼ è¾ä¼åââå°æ¹å¨ï¼å¤§æé
http {
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5; # 1-9ï¼CPU ä¸å缩çç平衡ç¹
gzip_min_length 1k; # å°æä»¶ä¸å缩ï¼ç CPU
gzip_types text/plain text/css application/json
application/javascript application/xml+rss
image/svg+xml;
}
注æï¼gzip_types é»è®¤åªå缩 text/htmlãå¾å¤æ°æå¼äº gzip å´åç° JS/CSS 没å缩ï¼å°±æ¯å 为æ¼äº gzip_typesãgzip_comp_level 建议 4-6ï¼å髿¶çéåè CPU æ¶èé¡å¢ã
å¦å¤ä¸¤ä¸ªå¸¸è¢«å¿½ç¥çåæ°ï¼
sendfile on; # é¶æ·è´ä¼ è¾ï¼å¤§æä»¶å¿
å¤
tcp_nopush on; # é
å sendfileï¼ç§¯ç´¯æ°æ®å
䏿¬¡ååº
tcp_nodelay on; # 交äºå¼è¯·æ±ä½å»¶è¿
åºæ¯åï¼HTTPS ä¸å®å ¨ååºå¤´
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3; # æææ¾å¼ TLS 1.0/1.1
ssl_prefer_server_ciphers on;
# HSTSï¼åè¯æµè§å¨ä»¥ååªç¨ HTTPS 访é®
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options nosniff always;
add_header X-Frame-Options SAMEORIGIN always;
}
# HTTP å
¨é跳转 HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
HSTS åªå¨ HTTPS server åéå ï¼ä¸ä¸æ¦å¯ç¨ï¼æµè§å¨å¨ max-age å ä¼å¼ºå¶ HTTPSï¼åé HTTPS éè¦æ¸ çæµè§å¨ HSTS ç¼åï¼ä¸çº¿åå¡å¿ ç¡®è®¤å ¨ç« HTTPS å¯ç¨ã
åºæ¯äºï¼éæµä¸æ éææ¥
éæµé²å·
http {
# æ IP éæµï¼æ¯ç§ 10 个请æ±ï¼çªå 20
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
limit_req_status 429;
limit_conn conn_limit 10;
proxy_pass http://api_backend/;
}
}
è¢«éæµç请æ±è¿å 429ï¼æ¯è®©å端被ææä¼é
å¾å¤ãburst=20 nodelay 表示å
许 20 个çªå请æ±ç«å³å¤çï¼è¶
åºé¨åç´æ¥æç»ã
502 ä¸ 504 çå¿«éå®ä½
| ç¶æç | å ¸ååå | ææ¥å½ä»¤ |
|---|---|---|
| 502 Bad Gateway | å端è¿ç¨æäº / upstream å°ååé | curl -v 127.0.0.1:8080 ç´è¿å端 |
| 504 Gateway Timeout | å端ååºå¤ªæ
¢ï¼è¶
è¿ proxy_read_timeout |
çå端æ¥å¿æ¾æ ¢ SQL/æ ¢æ¥å£ |
| 499 | 客æ·ç«¯ä¸»å¨æå¼ï¼å¸¸è§äºè¶ æ¶åæ¶ï¼ | æ£æ¥å®¢æ·ç«¯è¶ æ¶è®¾ç½® |
# ç Nginx é误æ¥å¿ï¼é常 /var/log/nginx/error.logï¼
tail -f /var/log/nginx/error.log
# éªè¯é
ç½®è¯æ³ï¼reload åå¿
å
nginx -t && nginx -s reload
nginx -t å reloadè¦å½¢æèèè®°å¿ãç´æ¥ reload ä¸ä¸ªå¸¦è¯æ³é误çé
ç½®ï¼Nginx 伿ç»å è½½æ°é
ç½®ä½è master è¿å¨è·ââçç¶æ¯"æ¹äºé
置没çæ"ï¼ææ¥å天æåç°æ¯è¯æ³é误ã
å°ç»
æ¬æè¦çäº Nginx 线ä¸äºå¤§é«é¢åºæ¯ï¼åå代çéä¼ çå® IPãå¨éå离ä¸ç¼åçç¥ãGzip ä¼ è¾ä¼åãHTTPS å®å ¨å åºã鿵䏿 éææ¥ãè¿äºé ç½®çå ±åææ³æ¯ï¼è®© Nginx æ¿æ 宿 é¿çè¿æ¥ç®¡çä¸éæå 容ååï¼æå¨æè¯·æ±é«æå¯é å°è½¬ç»å端ã
建议æ¶èæ¬æï¼ä¸æ¬¡é Nginx æ¶ç´æ¥å¯¹ç §åç¨ãä½ å¨ç产ç¯å¢è¿è¸©è¿åªäº Nginx çåï¼æ¬¢è¿å¨è¯è®ºåºå享ã
- 点赞
- 收藏
- 关注作者
评论(0)