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.typesMIME 类型表缺它会返回错误的 Content-Type
/var/log/nginx/access.logerror.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_connectionsworker_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报错时容易误判固定套路:先 -treload
直接 restart 换配置配置有错时站点立刻不可用配置变更一律用 reload
user 与静态目录属主不一致静态资源 403user 与目录属主一致
忘写 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 -tsystemctl reload nginx,能用重载就不要重启;日志格式一定带上 $request_time$upstream_response_time,排障时一眼就能分辨慢在 Nginx 还是慢在应用。

笔记加载中…