Nginx 安装、配置结构与 reload
Nginx 在部署链路里的角色是固定的:监听 80/443、终止 HTTPS、把请求转给本机应用或直接返回静态文件。它同时是排障链路上最容易定位问题的一环——nginx -t 校验语法、access.log 记录每个请求、error.log 记录每个上游错误。本章把安装方式、配置结构与重载姿势讲清楚。
安装:发行版包 vs 官方源
| 方式 | 优点 | 缺点 | 建议 |
|---|---|---|---|
apt install nginx | 一条命令,随系统更新 | 版本偏旧,模块名与官方略有差异 | 快速起步够用 |
| 官网 nginx.org 源 | 版本新、模块齐全 | 需自己加源与签名 | 需要 HTTP/3、stream 等新特性时选它 |
Docker 镜像 nginx:1.27-alpine | 环境一致,升级就是换 tag | 配置与证书要挂进去 | 已用 Compose 的项目首选 |
# 方式一:发行版包
sudo apt -y install nginx && nginx -v
# 方式二:官方源(Ubuntu / Debian)
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo gpg --dearmor -o /usr/share/keyrings/nginx-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
sudo apt update && sudo apt -y install nginx && sudo systemctl enable --now nginx
目录结构
| 路径 | 用途 | 备注 |
|---|---|---|
/etc/nginx/nginx.conf | 主配置 | 只放全局设置与 include |
/etc/nginx/conf.d/*.conf | 站点/通用片段 | 官方源与 CentOS 系默认引入这里 |
/etc/nginx/sites-available/、sites-enabled/ | 可用站点与生效站点 | Debian/Ubuntu 特有,用软链开关站点 |
/etc/nginx/mime.types | MIME 类型表 | 缺它会返回错误的 Content-Type |
/var/log/nginx/access.log、error.log | 访问日志与错误日志 | 502/504 的第一现场在 error.log |
/usr/share/nginx/html | 默认站点根目录 | 生产换成 /srv/www/<name> |
主配置关键块
# /etc/nginx/nginx.conf
user www-data; # CentOS 系为 nginx;要与静态目录属主匹配
worker_processes auto; # 等于 CPU 核数,通常最优
worker_rlimit_nofile 65535; # 单 worker 可打开的句柄数
events {
worker_connections 10240; # 单 worker 并发连接上限
}
http {
include /etc/nginx/mime.types;
sendfile on; # 静态文件零拷贝,必开
keepalive_timeout 65;
server_tokens off; # 隐藏版本号
gzip on;
gzip_min_length 1k;
gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" '
'rt=$request_time urt=$upstream_response_time';
access_log /var/log/nginx/access.log main;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*; # Debian/Ubuntu 目录结构才需要
}
worker_connections 与 worker_processes 的乘积是理论并发上限,但必须同时放大 worker_rlimit_nofile 与系统的 LimitNOFILE,否则会先撞在句柄上。
server 块最小可用模板
# /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri; # 80 统一跳 443
}
server {
listen 443 ssl;
http2 on; # 1.25.1 起写 on;旧版写 listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/certs/example.com.pem;
ssl_certificate_key /etc/nginx/certs/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:10m;
client_max_body_size 20m; # 上传接口要调大,否则 413
location = /healthz { return 200 "ok\n"; access_log off; }
location / {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
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;
proxy_read_timeout 60s;
}
}
nginx -t 校验与重载
| 操作 | 命令 | 是否中断连接 | 适用 |
|---|---|---|---|
| 校验 | nginx -t | 否 | 每次改配置后必做 |
| 平滑重载 | systemctl reload nginx(等价 nginx -s reload) | 否 | 改配置、换证书 |
| 重启 | systemctl restart nginx | 短暂中断 | 升级二进制、加载新模块 |
| 重新打开日志 | nginx -s reopen | 否 | 日志被 logrotate 切走后 |
sudo nginx -t && sudo systemctl reload nginx # 校验通过才重载
顺序不能反:先 nginx -t 再 reload。语法错误时 reload 会失败但老配置仍在跑,服务不会挂;若直接 restart,Nginx 会启动失败,站点立刻不可用。
日志与排查
tail -f /var/log/nginx/access.log
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head # 状态码分布
grep -o 'rt=[0-9.]*' /var/log/nginx/access.log | sort -t= -k2 -rn | head # 慢请求
sudo tail -100 /var/log/nginx/error.log # 502/504 现场
nginx -T | grep -n 'server_name'
自定义日志格式里 $request_time 是 Nginx 从收到请求到发送完响应的总耗时,$upstream_response_time 是上游(应用)的耗时。两者对比能立刻区分是网慢还是应用慢:总耗时很大而上游耗时很小,问题在 Nginx 之前;上游耗时大,就去查应用与数据库。
常见坑
| 坑 | 现象 | 做法 |
|---|---|---|
改配置不 nginx -t 就 reload | 报错时容易误判 | 固定套路:先 -t 再 reload |
直接 restart 换配置 | 配置有错时站点立刻不可用 | 配置变更一律用 reload |
user 与静态目录属主不一致 | 静态资源 403 | 让 user 与目录属主一致 |
忘写 include /etc/nginx/conf.d/*.conf | 站点配置完全不生效 | 主配置末尾确认 include 行 |
client_max_body_size 默认 1m | 上传大文件报 413 | 按业务调大 |
没传 X-Forwarded-For | 应用日志里全是 127.0.0.1 | 代理头四件套都加上 |
小结:Nginx 用发行版包装起步即可,需要新特性再换官方源;配置按主配置加 conf.d(或 sites-enabled)分层,全局只放 worker、日志与 gzip;每次改配置固定走 nginx -t 再 systemctl reload nginx,能用重载就不要重启;日志格式一定带上 $request_time 与 $upstream_response_time,排障时一眼就能分辨慢在 Nginx 还是慢在应用。