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,观察错误信息并修复。