1. Nginx 安装与环境准备

1.1 系统环境检查

在开始 Nginx 配置学习之前,我们需要先完成 Nginx 的安装。以下是主流 Linux 发行版的安装方法:

Ubuntu/Debian 系统
# 更新软件包索引
sudo apt update

# 安装 Nginx
sudo apt install nginx -y

# 启动 Nginx 服务
sudo systemctl start nginx

# 设置开机自启
sudo systemctl enable nginx

# 检查运行状态
sudo systemctl status nginx
CentOS/RHEL 系统
# 添加 EPEL 仓库(CentOS 7/RHEL 7)
sudo yum install epel-release -y

# 安装 Nginx
sudo yum install nginx -y

# 启动并启用服务
sudo systemctl start nginx
sudo systemctl enable nginx

# 检查状态
sudo systemctl status nginx
通过源码编译安装(获取最新特性)
# 安装编译依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev -y

# 下载最新稳定版(以 nginx-1.24.0 为例)
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

# 配置编译选项(常用模块)
./configure \
  --prefix=/usr/local/nginx \
  --with-http_ssl_module \
  --with-http_v2_module \
  --with-http_realip_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module

# 编译并安装
make
sudo make install

# 创建系统服务(可选)
sudo ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

1.2 验证安装与基础操作

安装完成后,进行基础验证:

# 检查 Nginx 版本
nginx -v
# 或查看详细编译信息
nginx -V

# 测试配置文件语法
nginx -t

# 重新加载配置(不中断服务)
nginx -s reload

# 停止服务
nginx -s stop
# 优雅停止(处理完当前请求)
nginx -s quit

1.3 重要目录结构说明

了解 Nginx 的关键目录有助于后续配置管理:

/etc/nginx/                    # 主配置目录(Linux 包管理安装)
├── nginx.conf                 # 主配置文件
├── conf.d/                    # 额外配置文件目录(推荐存放虚拟主机配置)
├── sites-available/           # 可用的站点配置(Ubuntu/Debian)
├── sites-enabled/             # 已启用的站点配置(符号链接到 sites-available)
├── modules-available/         # 可用模块配置
├── modules-enabled/           # 已启用模块
└── snippets/                  # 可复用的配置片段

/usr/share/nginx/html/         # 默认网站根目录
/var/log/nginx/                # 日志目录
  ├── access.log               # 访问日志
  └── error.log                # 错误日志

/usr/local/nginx/              # 源码编译安装的默认目录
├── conf/nginx.conf            # 主配置文件
├── html/                      # 网站根目录
└── logs/                      # 日志目录

1.4 防火墙配置(如需要)

如果系统启用了防火墙,需要开放 HTTP/HTTPS 端口:

# Ubuntu/Debian (ufw)
sudo ufw allow 'Nginx Full'  # 允许 HTTP(80) 和 HTTPS(443)
sudo ufw status

# CentOS/RHEL (firewalld)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

# 或者直接开放端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

1.5 访问测试

在浏览器中访问服务器 IP 或域名,看到 Nginx 欢迎页面即表示安装成功:

  • http://你的服务器IP
  • http://localhost(本地安装)

如果看到 “Welcome to nginx!” 页面,恭喜你,Nginx 已成功安装并运行!


1. 课程引言:为什么是 Nginx?

各位开发与运维同仁,大家好。

在当今的互联网架构中,Nginx 已从一个高性能的 HTTP 服务器,演变为集反向代理、负载均衡、API 网关、静态资源服务、安全防护于一体的核心基础设施组件。理解并熟练配置 Nginx,是每一位资深工程师的必备技能。

本培训资料将从实战出发,为你系统性地拆解 Nginx 的核心配置文件,解释每一个关键参数的含义,并提供可直接复制使用的样例与注释。最后,我们将探讨生产环境下的高级优化措施,助你构建稳定、高效、安全的服务入口。

2. Nginx 核心配置文件结构

一个典型的 Nginx 配置文件 (nginx.conf) 采用分层的指令块结构,理解其层次是精通配置的第一步。

# 全局块:影响 Nginx 整体运行的指令
user nginx;                    # 定义运行 Nginx 的 worker 进程的用户和组
worker_processes auto;         # 工作进程数,通常设置为 CPU 核心数,`auto` 为自动检测
error_log /var/log/nginx/error.log warn; # 错误日志路径及级别(debug, info, notice, warn, error, crit)
pid /run/nginx.pid;            # 主进程 PID 文件位置

# Events 块:配置影响 Nginx 服务器与用户的网络连接
events {
    worker_connections 1024;   # 每个 worker 进程同时打开的最大连接数
    use epoll;                 # 在 Linux 上使用高效的事件驱动模型(epoll)
    multi_accept on;           # 允许一个工作进程同时接受多个新连接
}

# Http 块:配置 HTTP 服务器相关功能,可以包含多个 Server 块
http {
    # 引入 MIME 类型定义文件
    include /etc/nginx/mime.types;
    # 默认 MIME 类型
    default_type application/octet-stream;

    # 日志格式定义
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    # 访问日志路径及使用的格式
    access_log /var/log/nginx/access.log main;

    # 核心性能与传输优化指令
    sendfile on;               # 启用高效文件传输模式,减少内核态与用户态之间的数据拷贝
    tcp_nopush on;             # 在 sendfile 模式下,等待数据包填满再发送,提高网络效率
    tcp_nodelay on;            # 禁用 Nagle 算法,降低小数据包的延迟,适用于高交互场景
    keepalive_timeout 65;      # 客户端长连接保持时间(秒)
    types_hash_max_size 2048;  # 影响散列表性能,增大可提升处理大量 MIME 类型时的速度

    # 引入其他配置文件(如虚拟主机配置)
    include /etc/nginx/conf.d/*.conf;
}

结构要点

  • 全局块:进程、日志、PID 等顶层设置。
  • Events 块:连接处理模型,是 Nginx 高并发的基石。
  • Http 块:所有 HTTP 相关配置的容器,内部可定义多个 server(虚拟主机)。
  • Server 块:定义一个具体的虚拟主机或监听入口。
  • Location 块:在 server 内部,用于匹配特定的 URI,是配置逻辑的核心。

3. Server 与 Location 块:请求路由的核心

3.1 Server 块详解

server 块定义了一个虚拟主机,监听特定的 IP 和端口。

server {
    # 监听指令:监听 80 端口,IPv4 和 IPv6
    listen 80;
    # 服务器名称:用于匹配 HTTP 请求头中的 `Host` 字段
    server_name example.com www.example.com;

    # 根目录:该 server 块下所有请求的默认文件根目录
    root /usr/share/nginx/html;

    # 默认索引文件:当请求以 `/` 结尾时,按顺序尝试查找这些文件
    index index.html index.htm;

    # 字符集:设置响应头的默认字符集
    charset utf-8;

    # 针对所有 location 的通用错误页面配置
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    # ==================== Location 块示例开始 ====================
    # Location 块:用于匹配特定的请求路径
    location / {
        # 尝试直接访问文件,如果找不到则返回 404
        try_files $uri $uri/ =404;
    }

    # 静态资源缓存优化配置
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        # 禁用访问日志,减少磁盘 I/O(对于高并发静态资源站可考虑)
        access_log off;
        # 设置浏览器缓存时间(1年),利用 `expires` 指令自动生成 Cache-Control 和 Expires 头
        expires 1y;
        # 添加一个 ETag 头,用于缓存验证(Nginx 默认对静态文件开启)
        add_header Cache-Control "public, immutable";
    }

    # 反向代理配置:将所有以 /api/ 开头的请求转发到后端应用服务器
    location /api/ {
        # 重写请求路径:去掉 `/api` 前缀后传递给后端
        rewrite ^/api/(.*)$ /$1 break;
        # 设置后端服务器地址(这里是一个 upstream 组的名称)
        proxy_pass http://backend_app_servers;
        # 将客户端的真实 IP 传递给后端(通常通过 X-Forwarded-For 头)
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        # 代理连接超时时间
        proxy_connect_timeout 30s;
        proxy_read_timeout 60s;
    }
    # ==================== Location 块示例结束 ====================
}

3.2 Location 匹配优先级(面试常考点)

Nginx 的 location 匹配遵循特定顺序,优先级从高到低:

  1. location = /exact/path精确匹配,优先级最高。
  2. location ^~ /static/前缀匹配,且停止正则检查。
  3. location ~ \.php$区分大小写的正则匹配
  4. location ~* \.jpg$不区分大小写的正则匹配
  5. location /通用前缀匹配,优先级最低。

最佳实践:将最精确、最频繁匹配的规则放在前面,并使用 ^~ 避免不必要的正则匹配开销。

4. 核心功能模块配置样例与注释

4.1 反向代理与负载均衡 (Upstream)

# 定义名为 `backend` 的上游服务器组
upstream backend {
    # 负载均衡算法:默认轮询 (round-robin)
    # 其他算法:
    # `least_conn` – 最少连接数
    # `ip_hash` – 基于客户端 IP 的会话保持(注意:非一致性哈希)
    # `hash $key` – 通用哈希,如 `hash $remote_addr`
    least_conn;

    # 后端服务器定义
    # `weight=5` 权重,权重越高被分配请求的概率越大
    # `max_fails=3` 在 `fail_timeout` 时间内失败次数超过此值,则认为服务器不可用
    # `fail_timeout=30s` 服务器被标记为不可用的时间,以及统计失败次数的时间窗口
    # `backup` 备份服务器,当所有主服务器不可用时才启用
    server 192.168.1.101:8080 weight=5 max_fails=3 fail_timeout=30s;
    server 192.168.1.102:8080 weight=3 max_fails=3 fail_timeout=30s;
    server 192.168.1.103:8080 backup;
    # `down` 标记服务器永久下线,通常用于维护
    # server 192.168.1.104:8080 down;

    # 可选:为长连接设置连接池,提升性能
    keepalive 32; # 每个 worker 进程与上游服务器保持的最大空闲连接数
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://backend; # 使用上面定义的 upstream 组
        proxy_http_version 1.1;    # 建议使用 HTTP/1.1 以支持 keepalive
        proxy_set_header Connection ""; # 清空 Connection 头,启用 keepalive

        # 关键超时设置
        proxy_connect_timeout 5s;  # 与后端服务器建立连接的超时时间
        proxy_send_timeout 60s;    # 向后端发送请求的超时时间
        proxy_read_timeout 60s;    # 从后端读取响应的超时时间

        # 缓冲优化:临时存储后端响应,然后一并发送给客户端,提升效率
        proxy_buffering on;
        proxy_buffer_size 4k;      # 存储响应头的缓冲区大小
        proxy_buffers 8 4k;        # 存储响应体的缓冲区数量和大小
        proxy_busy_buffers_size 8k; # 处于“繁忙”状态的缓冲区大小限制
    }
}

4.2 静态文件服务与缓存优化

server {
    listen 80;
    server_name static.example.com;
    root /data/static;

    location / {
        # `try_files` 是静态资源服务的核心指令
        # 尝试顺序:1.请求的文件($uri) 2.请求的目录($uri/) 3.转发给后端(@backend) 4.返回404
        try_files $uri $uri/ @backend;
    }

    # 图片、字体、样式表、脚本文件缓存策略
    location ~* \.(?:jpg|jpeg|png|gif|ico|webp|svg|svgz|mp4|webm|ogg|mp3|wav|woff|woff2|ttf|eot|css|js)$ {
        # 关闭日志,对高并发静态资源站是重要优化
        access_log off;
        log_not_found off;

        # 设置强缓存:客户端缓存1年
        expires 1y;
        # 添加 Cache-Control 头,`immutable` 告知浏览器内容永不变,跳过协商缓存
        add_header Cache-Control "public, immutable, max-age=31536000";

        # 可选:开启文件切片缓存,适用于大文件(如视频)
        # slice 1m; # 将文件切成1MB的片段进行缓存和发送
    }

    # 对于经常变动的文件(如网页),设置较短的缓存或协商缓存
    location ~* \.html$ {
        expires 1h; # 缓存1小时
        add_header Cache-Control "public, max-age=3600";
    }

    # 如果静态文件未找到,则交给后端处理(例如用于单页应用 SPA)
    location @backend {
        proxy_pass http://backend_app;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4.3 安全加固配置示例

server {
    listen 443 ssl http2; # 启用 HTTP/2
    server_name secure.example.com;

    # SSL/TLS 配置 (使用现代、安全的配置)
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的 TLS 1.0/1.1
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
    ssl_prefer_server_ciphers off;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # 安全响应头
    add_header X-Frame-Options "SAMEORIGIN" always; # 防止点击劫持
    add_header X-Content-Type-Options "nosniff" always; # 禁止 MIME 嗅探
    add_header X-XSS-Protection "1; mode=block" always; # 启用 XSS 过滤器(旧浏览器)
    add_header Referrer-Policy "strict-origin-when-cross-origin" always; # 控制 Referer 信息
    # 内容安全策略 (CSP) - 根据实际资源调整
    # add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.example.com;" always;

    # 限制请求方法
    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405; # Method Not Allowed
    }

    # 隐藏 Nginx 版本号(在 http 块或 server 块设置)
    server_tokens off;

    # 限制客户端请求体大小,防止 DoS 攻击
    client_max_body_size 10m;

    location / {
        # 基础认证示例(生产环境建议使用更安全的方案)
        # auth_basic "Restricted Area";
        # auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://backend;
    }
}

5. 高级优化措施与生产环境实战

5.1 性能调优参数

# 在 http 块中设置
http {
    # 1. 连接与缓冲优化
    client_body_buffer_size 10K;    # 客户端请求体缓冲区大小
    client_header_buffer_size 1k;   # 客户端请求头缓冲区大小
    large_client_header_buffers 4 8k; # 存储超大请求头的缓冲区

    # 2. 压缩传输 (Gzip/Brotli)
    gzip on;
    gzip_vary on;
    gzip_min_length 1024; # 小于此值不压缩
    gzip_proxied any;     # 即使是被代理的请求也压缩
    gzip_comp_level 6;    # 压缩级别 (1-9,权衡 CPU 和压缩比)
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    # 若支持 Brotli (需模块),性能更优
    # brotli on;
    # brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # 3. 文件描述符与连接优化
    # 在 events 块中已配置 worker_connections,需与系统 `ulimit -n` 值协调
    # worker_connections 数量 * worker_processes 应小于系统最大文件描述符限制

    # 4. 日志优化 (高并发下)
    access_log /var/log/nginx/access.log main buffer=32k flush=5s;
    # `buffer` 设置内存缓冲区大小,满或超时(`flush`)才写入磁盘,减少 I/O
}

5.2 限流与防刷 (Rate Limiting)

# 在 http 块中定义限流共享内存区
http {
    # 定义名为 `limit_req_zone` 的共享内存区,键为客户端 IP,大小为 10m,速率 10 req/s
    limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;
    # 定义连接数限制区
    limit_conn_zone $binary_remote_addr zone=addr:10m;
}

server {
    location /api/ {
        # 应用请求速率限制,突发队列大小为 20
        limit_req zone=ip_limit burst=20 nodelay;
        # 应用并发连接数限制,每 IP 最多 10 个连接
        limit_conn addr 10;
        # 超过限制时的响应状态码
        limit_req_status 429; # Too Many Requests
        limit_conn_status 429;

        proxy_pass http://backend;
    }

    # 对登录接口实施更严格的限流
    location /api/login {
        limit_req zone=ip_limit burst=5 nodelay;
        proxy_pass http://backend;
    }
}

5.3 健康检查与高可用 (需 ngx_http_upstream_module 支持)

upstream backend {
    zone backend_zone 64k; # 为 upstream 分配共享内存,用于动态配置
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;

    # 被动健康检查:依赖 max_fails 和 fail_timeout
    # 主动健康检查 (需额外模块,如 nginx-plus 或 openresty)
    # health_check interval=5s fails=3 passes=2 uri=/health;
}

6. 调试与常用命令

6.1 配置文件检查与重载

# 1. 检查配置文件语法是否正确(每次修改后必做!)
sudo nginx -t

# 2. 重新加载配置(平滑重启,不影响正在处理的连接)
sudo nginx -s reload

# 3. 重新打开日志文件(用于日志切割后)
sudo nginx -s reopen

# 4. 快速关闭
sudo nginx -s stop
# 优雅关闭(完成当前请求后退出)
sudo nginx -s quit

6.2 日志分析与监控关键指标

  • 错误日志 (error_log): 关注 warnerror 级别信息。
  • 访问日志 (access_log): 分析流量、响应状态
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐