Nginx 终极指南:从入门到深度调优

引言

Nginx(发音为 "engine x")是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。因其稳定性、丰富的功能集、简单的配置文件和极低的资源消耗而闻名于世。如今,Nginx 已成为全球最受欢迎的 Web 服务器之一,承载着互联网上大量最繁忙的网站。本文将带你全面掌握 Nginx,从安装配置到架构原理和深度优化。第一部分:基础概念与安装

92090b6802b3fd0b81642392f7e.png
1. Nginx 是什么?它能做什么?
  • Web 服务器: 像 Apache 一样,Nginx 可以处理 HTTP 请求并返回静态资源(HTML、CSS、JS、图片等),性能极高。
  • 反向代理服务器: 这是 Nginx 最核心的功能。它接收客户端请求,并将其转发给后端的内部服务器(如 Tomcat、PHP-FPM、Node.js 等),然后将结果返回给客户端。对外屏蔽了内部结构,提高了安全性和可扩展性。
  • 负载均衡器: 作为反向代理,Nginx 可以将流量分发到多个后端服务器,避免单一服务器压力过大,提高整体性能和可靠性。
  • 邮件代理服务器: 可以代理 IMAP、POP3、SMTP 协议。
  • API 网关: 通过丰富的模块,可以实现路由、认证、限流、日志等 API 管理功能。
2. 核心架构:为什么 Nginx 这么快?
  • Nginx 采用经典的 Master-Worker 多进程模型,这是一种事件驱动的异步非阻塞架构。
  • Master 进程: 主进程,以 root 身份运行。负责:
  • 读取和验证配置文件。
  • 管理 Worker 进程(启动、停止、平滑升级)。
  • 不处理具体的网络请求。
  • Worker 进程: 工作进程,以普通用户身份运行(提高安全性)。负责:
  • 处理实际的客户端连接和请求。
  • 多个 Worker 之间是独立的,互不影响。
  • 每个 Worker 都是单线程的,但采用 异步非阻塞(epoll, kqueue) 的方式来处理数万个连接,这是高性能的关键。
  • 优势:
  • 高并发: 一个 Worker 可以轻松处理数万连接,资源占用极低。
  • 高可靠性: 一个 Worker 崩溃,Master 可以立刻拉起新的,不影响其他 Worker。
  • 热部署: 修改配置后,可以不停机重载(nginx -s reload)。升级二进制文件时,可以平滑升级。
3. 安装 Nginx在 CentOS/RHEL 上:
# 添加 EPEL 仓库(如果需要)
sudo yum install epel-release
# 安装 Nginx
sudo yum install nginx
# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
在 Ubuntu/Debian 上:
sudo apt updatesudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
从源码编译安装(获取最新版本和自定义模块):
wget http://nginx.org/download/nginx-1.22.1.tar.gz
tar zxvf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module # 可以添加很多其他模块
make
sudo make install
安装完成后,访问服务器 IP,你应该能看到 Nginx 的默认欢迎页面。第二部分:核心配置与语法Nginx 的配置文件通常位于 /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf。其语法遵循特定结构。1. 配置文件结构配置文件由 指令(Directives) 和 上下文(Contexts) 组成。
# 全局上下文,影响整个Nginx
user nginx;                    # Worker进程运行的用户
worker_processes auto;         # Worker进程数,通常设置为CPU核心数
error_log /var/log/nginx/error.log warn; # 错误日志路径和级别
pid /var/run/nginx.pid;        # 主进程PID文件位置

 events上下文,配置网络连接

events {
    worker_connections 1024;   # 每个Worker进程的最大连接数
    use epoll;                 # 使用epoll高效事件模型(Linux)
    multi_accept on;           # 一个worker同时接受多个新连接
}

 http上下文,配置HTTP服务器相关所有内容

http {
    # 引入MIME类型定义
    include /etc/nginx/mime.types;
    default_type application/octet-stream;    # 日志格式
    access_log /var/log/nginx/access.log;    # 核心服务器配置
    server {
        listen 80;             # 监听端口
        server_name example.com www.example.com; # 服务器域名        # location上下文,配置如何响应特定请求URI
        location / {
            root /usr/share/nginx/html; # 根目录
            index index.html index.htm;  # 默认索引文件
        }        location /images/ {
            # 别名,将/images/映射到另一个目录
            alias /data/images/;
            # 开启文件高效传输
            sendfile on;
        }
    }    # 可以包含其他server配置文件,方便管理
    include /etc/nginx/conf.d/*.conf;
}
2. 核心功能配置1. 静态资源服务这是 Nginx 最基本也是最擅长的功能。
server {
    listen 80;
    server_name static.example.com;    location / {
        root /data/www;
        # 尝试访问URI,如果没找到再尝试URI.html,最后尝试URI/下的index.html
        try_files $uri $uri.html $uri/ /index.html;
    }    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        root /data/www/static;
        # 设置静态资源的浏览器缓存时间
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}
2. 反向代理将请求转发到后端应用服务器。
server {
    listen 80;
    server_name app.example.com;    location / {
        # 设置反向代理的后端服务器地址
        proxy_pass http://localhost:8080;        # 传递重要的客户端信息给后端
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;        # 一些超时和缓冲区的优化配置
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
    }
}
3. 负载均衡Nginx 支持多种负载均衡算法:round-robin(轮询,默认)、least_conn(最少连接)、ip_hash(基于客户端 IP 哈希,实现会话保持)。
# 在http上下文中定义一个上游服务器组(upstream)
http {
    upstream backend_servers {
        # ip_hash; # 启用IP哈希会话保持
        least_conn; # 使用最少连接算法        server 192.168.1.10:8080 weight=3; # weight代表权重,越高分配越多请求
        server 192.168.1.11:8080;
        server 192.168.1.12:8080 backup;   # backup表示备份服务器,只有当主服务器都宕机时才启用
    }    server {
        listen 80;
        server_name loadbalancer.example.com;        location / {
            proxy_pass http://backend_servers;
            # ... 其他proxy_set_header等配置
        }
    }
}
第三部分:高级应用与优化1. 动静分离将动态请求和静态资源请求分开处理,是提升网站性能的关键架构。
server {
    listen 80;
    server_name www.example.com;    # 所有静态资源请求由Nginx直接处理
    location ~* .(jpg|jpeg|png|gif|css|js|ico|woff|ttf)$ {
        root /data/www/static;
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off; # 静态资源可以不记录访问日志,减少磁盘IO
    }    # 动态请求代理给后端应用服务器(如Tomcat, Node.js)
    location / {
        proxy_pass http://backend_servers;
        # ... proxy_set_header 等配置
    }    # 甚至可以将API请求单独代理
    location /api/ {
        proxy_pass http://api_servers;
    }
}
2. 缓存优化Nginx 可以作为反向代理缓存,将后端应用的响应缓存起来,极大减轻后端压力。
http {
    # 在http上下文定义缓存路径和参数
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m 
                     max_size=10g inactive=60m use_temp_path=off;    server {
        location / {
            proxy_pass http://backend_servers;
            # 启用缓存,使用上面定义的keys_zone
            proxy_cache my_cache;
            # 对200和302响应码的请求缓存1小时
            proxy_cache_valid 200 302 1h;
            proxy_cache_valid 404 1m;
            # 定义缓存键(默认会忽略很多参数,这里根据业务调整)
            proxy_cache_key $scheme$proxy_host$uri$is_args$args;
            # 增加一个响应头,显示缓存命中状态(HIT, MISS, BYPASS)
            add_header X-Cache-Status $upstream_cache_status;
        }
    }
}
3. HTTPS 与 SSL 优化使用 SSL 证书加密通信是现代网站的标配。
server {
    listen 443 ssl http2; # 启用HTTP/2,性能更好
    server_name example.com;    # SSL证书和密钥路径
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;    # SSL会话缓存优化,减少握手开销
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_session_tickets off;    # 安全套件偏好,禁用不安全的协议和加密方式
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...;
    ssl_prefer_server_ciphers on;    # 启用OCSP装订,提高SSL验证性能
    ssl_stapling on;
    ssl_stapling_verify on;    # 强制HTTP跳转到HTTPS
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}
4. 安全加固隐藏 Nginx 版本号:
server_tokens off; # 在http或server块中配置
限制访问:
location /admin/ {
    allow 192.168.1.0/24; # 只允许内网IP段访问
    deny all;             # 拒绝所有其他IP
    auth_basic "Restricted Area"; # 基础认证
    auth_basic_user_file /etc/nginx/.htpasswd;
}
防 DDoS/暴力破解: 使用 limit_req_zone 和 limit_conn_zone 限制请求速率和连接数。
http {
    # 定义限制区域,$binary_remote_addr是客户端IP,zone=10m分配10MB内存存储状态,rate=10r/s每秒10个请求
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;    server {
        location /login {
            # 应用限制区域‘one’,突发请求不超过5个
            limit_req zone=one burst=5 nodelay;
            proxy_pass http://backend_servers;
        }
    }
}
第四部分:性能调优1. 系统与全局调优Worker 进程数:
worker_processes auto; # 通常设置为CPU核心数,auto会自动检测
每个 Worker 的最大连接数:
events {
    worker_connections 10240; # 根据系统最大打开文件数调整(ulimit -n)
}
高效事件模型:
events {
    use epoll; # 在Linux上使用epoll
}
启用 sendfile 和 tcp_nopush: 对于发送静态文件非常高效。
http {
    sendfile on;
    tcp_nopush on; # 需要sendfile为on时才有效
    tcp_nodelay on; # 在高延时网络上提高实时性
}
2. 日志优化访问日志记录会占用大量磁盘 I/O。对于高流量站点,可以考虑:缓冲日志: 不立即写入磁盘,而是先缓冲。
access_log /var/log/nginx/access.log combined buffer=64k flush=1m;
关闭不必要的日志: 如静态资源、健康检查请求。
location = /health {
    access_log off;
    proxy_pass http://backend_servers;
}
3. Gzip 压缩减少传输体积,提升加载速度。
http {
    gzip on;
    gzip_vary on;
    gzip_min_length 1024; # 小于1k不压缩
    gzip_proxied any;     # 对所有代理请求都压缩
    gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss;
    gzip_comp_level 6;    # 压缩级别(1-9),权衡CPU和压缩率
}
<br/>

本文最后更新时间 2025-10-01
文章链接地址:
https://xzlo.blog/index.php/archives/70/
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处

留言