01
一句話讀懂 Nginx
把 Nginx 想象成商場里最會看人的金牌導購,顧客(用戶)只需說“我要買 X”,導購(Nginx)立刻把他領到最合適的店(后端服務)。
更牛的是,這位導購還能防黃牛(防攻擊)、查庫存(健康檢查)、給 VIP 插隊(權重分流),一人頂一隊,堪稱“全能管家”。
02
配置語法冷啟動
一行行帶你拆解最常用指令
2.1 最小可運行配置
# /etc/nginx/nginx.conf
user nginx; # **進程身份**:用 nginx 用戶啟動,安全隔離
worker_processes auto; # **CPU 親和**:有幾核就起幾個工作進程
events {
worker_connections1024; # **并發上限**:單進程最大 1024 條連接
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 性能三連
sendfile on; # **零拷貝**內核直發文件,省 CPU
tcp_nopush on; # **包合并**攢一波再發,省帶寬
keepalive_timeout65; # **長連接**65 秒內復用 TCP
# 日志雙生花
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Gzip 壓縮
gzipon;
gzip_types text/plain text/css application/json;
# 虛擬主機示例
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
}
注解:
- 1.
user
與 worker_processes
決定安全與性能基線。 - 2.
sendfile
+ tcp_nopush
是靜態資源大殺器。 - 3.
keepalive_timeout
讓短連接變“長情”,減少握手開銷。
2.2 HTTPS 一鍵升級(含 TLS1.3)
server {
listen 443 ssl http2; # **HTTP2** + **TLS**
server_name example.com;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
# 只放行當代密碼套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on; # **服務器說了算**
}
注解:
- 1.
http2
讓多路復用起飛,同域名資源并行下載。 - 2. TLS1.3 砍掉歷史包袱,握手往返從 2-RTT 縮到 1-RTT。
- 3. 指定
ciphers
避免出現“弱雞”加密算法。
2.3 反向代理 + 緩存組合拳
# 1. 先聲明緩存區
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
listen80;
server_name api.example.com;
# 2. 正式開緩存
location / {
proxy_pass http://backend_cluster;
proxy_cache my_cache; # **緩存名字叫 my_cache**
proxy_cache_valid20030210m; # **10 分鐘快樂緩存**
proxy_cache_key $scheme$host$request_uri;# **緩存鍵值**,防止串味
}
}
注解:
- 1.
levels=1:2
把 1 萬文件散到兩級目錄,避免 inode 爆表。 - 2.
inactive=60m
60 分鐘沒人訪問就踢出緩存。 - 3.
proxy_cache_key
決定哪些參數參與緩存命中,務必包含核心變量。
03
負載均衡全攻略
:讓流量像坐過山車一樣絲滑
3.1 輪詢 vs 加權 vs IP 哈希
| | |
---|
| | 人人平等 |
| weight= | 高配多勞 |
| ip_hash; | 粘人精 |
| least_conn; | 能者多勞 |
3.2 真·實戰配置(含健康檢查)
upstream web_app {
least_conn; # **誰閑誰上**
server10.0.0.1:8080 weight=3 max_fails=3 fail_timeout=30s;
server10.0.0.2:8080 weight=1;
server10.0.0.3:8080 backup; # **備胎機**,主全掛才啟用
keepalive32; # **32 條長連接**復用
}
server {
listen80;
server_name app.example.com;
location / {
proxy_pass http://web_app;
proxy_http_version1.1;
proxy_set_header Connection ""; # **長連接標配**
proxy_connect_timeout2s;
proxy_read_timeout 5s;
}
}
注解:
- 1.
backup
讓 10.0.0.3 平時摸魚,關鍵時刻救命。 - 2.
keepalive 32
與 HTTP1.1 長連接搭配,減少握手風暴。 - 3.
max_fails
+ fail_timeout
自動拉黑“假死”節點,30 秒后給復活機會。
3.3 灰度發布:權重“溫水煮青蛙”
upstream canary {
server 10.0.0.10:8080 weight=9; # **老版本**
server 10.0.0.11:8080 weight=1; # **新版本**,先放 10% 流量
}
注解:
- 1. 通過
weight
逐步上調,肉眼無感完成版本切換。 - 2. 出問題秒切回
weight=0
,零回滾時間。
3.4 日志“顯微鏡”:一眼定位慢節點
log_format upstream_log '$remote_addr [$time_local] '
'up_addr=$upstream_addr status=$status '
'rt=$request_time u_rt=$upstream_response_time';
access_log /var/log/nginx/lb_access.log upstream_log;
注解:
- 1.
$upstream_response_time
暴露后端真實耗時。 - 2.
request_time
減去 upstream_response_time
就能算出 Nginx 自身開銷。
結尾
3 行命令檢查你的 Nginx 是否健康
nginx -t # **語法體檢**
ss -tulnp | grep nginx # **端口監聽一覽**
curl -I https://example.com | grep server # **響應頭確認**
閱讀原文:原文鏈接
該文章在 2025/8/18 12:36:02 編輯過