7.2.3 配置文件结构与核心指令

配置文件以 nginx.conf 为主,常见结构为全局块、events 块、http 块;http 内可包含 upstream、server、location 等。全局块用于运行用户、工作进程数、pid 文件、错误日志路径与级别;events 主要控制连接处理与并发模型;http 块是核心业务区,定义 MIME、日志格式、超时、压缩、缓存等通用指令,并可通过 include 引入其他配置片段实现分层管理。

原理草图(结构与请求路径):

文章图片

核心指令要点:
- worker_processes:通常设置为 CPU 核心数或 auto;与 worker_connections 一起决定最大并发。
- include:拆分配置,如 conf.d/.conf、sites-enabled/.conf,提升可维护性。
- server_name、listen:定义虚拟主机域名与监听端口,支持通配与正则。
- location:路由匹配与处理优先级(=、^~、~、~*、前缀),决定请求落点。
- root/alias:静态资源路径映射,alias 用于替换匹配前缀。
- proxy_pass/fastcgi_pass/uwsgi_pass:反向代理与动态应用对接。
- access_log、error_log、log_format:访问与错误日志管理。
- client_max_body_size、keepalive_timeout、sendfile、tcp_nopush、gzip:请求体、连接与性能相关指令。

完整可执行示例(含目录结构与站点拆分):

# 1) 创建目录
sudo mkdir -p /etc/nginx/conf.d /var/www/html /var/log/nginx

# 2) 编写主配置(/etc/nginx/nginx.conf)
sudo tee /etc/nginx/nginx.conf >/dev/null <<'EOF'
user  nginx;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log warn;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';
    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    keepalive_timeout 65;
    client_max_body_size 20m;
    gzip on;

    include /etc/nginx/conf.d/*.conf;
}
EOF

# 3) 编写站点配置(/etc/nginx/conf.d/site.conf)
sudo tee /etc/nginx/conf.d/site.conf >/dev/null <<'EOF'
upstream app_backend {
    server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
}

server {
    listen 80;
    server_name example.local;

    root /var/www/html;
    index index.html;

    location = /health {
        return 200 "ok\n";
    }

    location /static/ {
        alias /var/www/html/static/;
        access_log off;
    }

    location /api/ {
        proxy_pass http://app_backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
EOF

# 4) 创建静态页面
echo "hello nginx" | sudo tee /var/www/html/index.html

# 5) 语法检查与重载
sudo nginx -t
sudo systemctl reload nginx

命令解释与预期效果:
- nginx -t:校验配置语法与文件可读性,成功会输出 “syntax is ok”。
- systemctl reload nginx:平滑重载配置,不中断现有连接。
- 访问 http://example.local/ 返回 “hello nginx”;访问 /health 返回 ok;/api/ 反向代理至 127.0.0.1:8080。

排错思路与典型问题:

# 1) 配置不生效
sudo nginx -t
# 预期:syntax is ok; test is successful

# 2) 端口占用
sudo ss -lntp | grep ':80'
# 若被占用,先停掉占用服务或改 listen 端口

# 3) 403/404
sudo tail -n 50 /var/log/nginx/error.log
# 重点检查 root/alias 路径、权限

# 4) 502 Bad Gateway
sudo tail -n 50 /var/log/nginx/error.log
# 检查后端 127.0.0.1:8080 是否存活

配置组织建议:
- 统一在 http 块定义通用参数与日志格式,server 块只放站点级差异。
- 使用 include 拆分站点、upstream 与安全策略,避免单文件过大。
- 配置变更后使用 nginx -t 校验,确保指令生效与语法正确。
- 不同环境(测试/生产)用独立 include 目录或变量隔离差异。

练习:
1) 将 worker_connections 改为 2048,重新加载并验证是否生效(观察 nginx -T 输出)。
2) 新增一个 server 监听 8081,server_name 为 demo.local,返回纯文本 “demo”。
3) 练习 location 匹配:新增 location ^~ /images/,用 alias 指向 /var/www/html/img/ 并测试访问。
4) 故意写错 include 路径,执行 nginx -t,观察错误信息并修复。