目录
Nginx 基本使用和高级用法详解
一、Nginx 简介
Nginx 是一个高性能的 HTTP 和反向代理服务器,具有占用内存少、并发能力强等特点。它由 Igor Sysoev 开发,最初设计用于解决 C10K(单机处理一万并发连接)问题。如今,Nginx 不仅广泛应用于 Web 服务领域,还常被用作负载均衡器、API 网关、静态资源服务器以及安全防护层。
其事件驱动架构使得在高并发场景下仍能保持低资源消耗与高响应速度,因此成为现代 Web 架构中不可或缺的核心组件之一。
二、基本安装与使用
1. 安装 Nginx
根据操作系统不同,Nginx 的安装方式略有差异。以下为常见 Linux 发行版的安装方法。
Ubuntu/Debian
sudo apt update
sudo apt install nginx
说明:
apt是 Debian 系列系统的包管理工具。执行上述命令会从官方源下载并安装最新稳定版本的 Nginx,并自动配置基础服务。
CentOS/RHEL
sudo yum install nginx
# 或
sudo dnf install nginx
说明:在较老版本的 CentOS 中使用
yum,而在 RHEL 8+ 或 Fedora 等新系统中推荐使用dnf。安装完成后,Nginx 通常不会自动启动,需要手动启用服务。
2. 基本操作命令
# 启动
sudo systemctl start nginx
# 停止
sudo systemctl stop nginx
# 重启
sudo systemctl restart nginx
# 重新加载配置(不中断服务)
sudo systemctl reload nginx
# 查看状态
sudo systemctl status nginx
# 开机自启
sudo systemctl enable nginx
说明:这些命令基于
systemd服务管理系统。其中最常用的是reload,它可以在不停止服务的前提下应用新的配置文件,避免对用户造成访问中断。建议每次修改配置后先测试语法正确性再执行 reload。
三、配置文件结构
1. 主要配置文件目录结构
/etc/nginx/
├── nginx.conf # 主配置文件
├── conf.d/ # 额外配置文件目录
├── sites-available/ # 可用站点配置文件
└── sites-enabled/ # 已启用站点配置文件(软链接指向 sites-available)
说明:这是典型的 Debian/Ubuntu 风格布局。
nginx.conf是主入口配置,通过include指令引入其他模块化配置。sites-available存放所有可能使用的虚拟主机配置,而sites-enabled则通过符号链接选择性地激活某些站点,便于管理和切换。
2. 基本配置示例(/etc/nginx/nginx.conf)
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
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" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
说明:
user nginx;:指定运行 Nginx 工作进程的用户身份,增强安全性。worker_processes auto;:让 Nginx 自动根据 CPU 核心数创建工作进程,提升性能。events块定义了网络事件处理模型,epoll是 Linux 下高效的 I/O 多路复用机制,适合高并发环境。http块是核心部分,包含 MIME 类型映射、日志格式定义、性能优化参数及子配置引入。sendfile on;启用零拷贝技术,提高静态文件传输效率。tcp_nopush和tcp_nodelay分别优化 TCP 包发送策略,减少延迟或提升吞吐量。- 最后的
include指令实现了配置的模块化管理,便于维护多个站点和服务。
四、虚拟主机配置
1. 基本虚拟主机配置
# /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 静态资源缓存优化
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
说明:
listen 80;表示监听 80 端口,处理标准 HTTP 请求。server_name定义该虚拟主机绑定的域名,支持多个域名或泛解析。root指定网站根目录路径,index设置默认首页文件。location / { ... }处理根路径请求,try_files指令尝试按顺序查找文件:先找$uri(请求路径对应文件),若不存在则找$uri/(作为目录索引),否则返回 404。- 第二个
location使用正则匹配常见的静态资源扩展名,并设置一年的过期时间(expires 1y),同时添加不可变缓存头,极大提升浏览器缓存效率,减轻服务器压力。
2. 启用站点
# 创建软链接启用站点
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
# 测试配置是否正确
sudo nginx -t
# 重新加载配置
sudo systemctl reload nginx
说明:
- 在 Debian/Ubuntu 结构中,启用站点需在
sites-enabled目录创建指向sites-available的符号链接。nginx -t是关键步骤,用于检查语法错误和配置逻辑问题,防止因配置不当导致服务崩溃。- 成功测试后使用
reload平滑加载新配置,确保线上服务无感知更新。
五、高级配置技巧
1. 反向代理配置
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:3000;
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_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 缓冲设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
}
说明:
proxy_pass将请求转发到后端 Node.js、Python 或 Java 应用(如运行在 3000 端口的服务)。proxy_set_header设置一系列 HTTP 头信息,使后端应用能获取真实客户端 IP、协议类型等上下文数据。- 超时控制可防止后端响应缓慢拖垮整个网关;缓冲机制则允许 Nginx 先接收完整响应再返回给客户端,提升稳定性。
- 此配置常用于前后端分离项目,前端由 Nginx 提供,API 请求经由 Nginx 代理至后端微服务。
2. 负载均衡
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com;
server backend3.example.com;
server backup.example.com backup;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
说明:
upstream定义一组后端服务器池,实现负载分发。weight=3表示第一台服务器分配更多流量(加权轮询),适用于性能更强的节点。backup标记备用服务器,仅当主服务器全部宕机时才启用,提供高可用保障。- 默认采用轮询算法,还可配置
ip_hash实现会话粘滞,或least_conn按最少连接数调度。- 结合健康检查(需配合第三方模块或外部监控),可构建弹性伸缩的应用集群。
3. SSL/TLS 配置
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# SSL 安全设置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS 强制 HTTPS
add_header Strict-Transport-Security "max-age=63072000" always;
root /var/www/example.com;
index index.html;
}
说明:
listen 443 ssl http2;开启 HTTPS 并支持 HTTP/2 协议,显著提升页面加载速度。ssl_certificate和key分别指定证书公钥和私钥路径,应妥善保管私钥权限(如600)。- 明确禁用老旧且不安全的 SSLv3 和 TLSv1.0/1.1,仅保留 TLSv1.2+。
- 推荐使用强加密套件(如 ECDHE + AES-GCM),并关闭服务器优先密码以兼容旧客户端。
HSTS响应头告知浏览器未来必须使用 HTTPS 访问,防止中间人攻击和降级攻击。
4. 缓存配置
代理缓存
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_cache my_cache;
proxy_pass http://backend;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
}
}
说明:
proxy_cache_path定义磁盘缓存路径和元数据区域(keys_zone),levels控制目录层级避免单目录过多文件。max_size设定最大缓存空间,超出时按 LRU 清理;inactive表示多久未访问即删除。use_temp_path=off减少跨分区写入,提升性能。- 在
server块中启用缓存后,proxy_cache_valid指定不同状态码的缓存时间,例如成功响应缓存 10 分钟,404 缓存 1 分钟。- 添加
X-Cache-Status头便于调试,值可能是MISS,HIT,EXPIRED等。
静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
说明:
- 对图片、样式表、脚本等静态资源设置长期过期时间(一年),利用浏览器本地缓存大幅提升重复访问体验。
immutable表示内容永不改变(通常配合内容哈希命名),允许浏览器完全跳过验证请求。- 注意:只有在资源真正不变时才应使用
immutable,否则可能导致用户无法获取更新。
5. 安全配置
# 隐藏版本号
server_tokens off;
# 安全响应头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
# 上传大小限制
client_max_body_size 10m;
# 限制非法请求方法
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 405;
}
说明:
server_tokens off;隐藏 Nginx 版本信息,防止被针对性攻击。- 安全头字段增强客户端防护:
X-Frame-Options防止点击劫持;X-XSS-Protection启用浏览器 XSS 过滤;X-Content-Type-Options阻止 MIME 类型嗅探;Referrer-Policy控制 Referer 泄露范围;CSP是最强力的安全策略,限制脚本来源,防御 XSS。client_max_body_size限制 POST 请求体大小,防范大文件上传耗尽资源。if判断非允许的 HTTP 方法(如 PUT、DELETE)直接拒绝,提升接口安全性。
6. 限流配置
# 定义限流区域
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=2r/m;
server {
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend;
}
location /login {
limit_req zone=login burst=5;
proxy_pass http://backend;
}
}
说明:
limit_req_zone定义基于客户端 IP 的限流区:
api区域每秒最多 10 个请求(令牌桶算法);login更严格,每分钟仅 2 次,防暴力破解。zone=...:10m表示共享内存区大小,存储 IP 记录。burst允许突发请求数,nodelay表示立即处理突发而非排队等待。/api/接口允许短时高峰,但总体平均不超过速率;登录页则更保守,保护账户安全。- 限流是防止 DDoS 和滥用的重要手段。
7. URL 重写和重定向
server {
# 强制跳转 HTTPS
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
# 路径重定向
location /old-path {
return 301 /new-path;
}
# 去除 .html 扩展名
location / {
try_files $uri $uri.html $uri/ =404;
}
# RESTful URL 重写
location /api/v1/users {
rewrite ^/api/v1/users/(.*)$ /api/v1/users?id=$1 last;
}
}
说明:
- 第一条规则实现 HTTP → HTTPS 强制跳转,提升安全性。
return 301发送永久重定向,SEO 友好。try_files配合.html后缀隐藏,实现“伪静态”友好 URL。rewrite指令将路径参数转换为查询字符串,适配后端 API 接口。last表示内部重写后继续匹配新的 location,不影响流程。- 注意:尽量避免在
server级别使用if,但在判断$scheme时是安全且常见的做法。
8. Gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
说明:
gzip on;启用压缩功能,大幅减小文本类响应体积(通常节省 60%-80%)。gzip_vary添加Vary: Accept-Encoding头,帮助 CDN 正确缓存压缩版本。min_length 1024表示小于 1KB 的文件不压缩,避免小文件压缩得不偿失。proxied any表示无论后端是否压缩,Nginx 都进行压缩(适用于反向代理场景)。comp_level设为 6,在压缩比和 CPU 消耗之间取得平衡。gzip_types明确指定需压缩的 MIME 类型,特别是 JS、CSS、JSON 等文本数据。
六、性能优化配置
1. 连接优化
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
# 文件描述符缓存
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
说明:
worker_connections提高单个工作进程可处理的最大连接数,结合worker_processes可支撑数万并发。multi_accept on;允许一次接受多个新连接,提升吞吐。keepalive_timeout和keepalive_requests控制长连接存活时间和最大请求数,减少 TCP 握手开销。open_file_cache缓存频繁访问的文件元信息(如 inode、权限、存在性),极大加快静态资源读取速度,特别适合高并发静态站。
2. 工作进程优化
worker_processes auto;
worker_cpu_affinity auto;
# 提高文件描述符限制
worker_rlimit_nofile 65535;
说明:
worker_processes auto;自动匹配 CPU 核心数,充分利用多核优势。worker_cpu_affinity auto;自动绑定工作进程到特定 CPU 核心,减少上下文切换,提升缓存命中率。worker_rlimit_nofile设置每个工作进程可打开的最大文件描述符数,突破系统默认限制(通常是 1024),支持更高并发连接。- 此三项配合使用,可在高负载环境下显著提升整体性能。
七、日志配置
1. 自定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
说明:
log_format自定义日志字段,增加上游响应时间统计(upstream_*),便于分析后端性能瓶颈。rt是总请求时间,uct是连接建立时间,uht是头部接收时间,urt是完整响应时间。access_log指定日志路径和格式;error_log设置错误日志级别为warn,减少噪音,聚焦严重问题。- 精细化日志有助于运维排错、性能调优和安全审计。
2. 日志分割脚本(rotate_nginx_logs.sh)
#!/bin/bash
# rotate_nginx_logs.sh
LOG_DIR="/var/log/nginx"
DATE=$(date -d "yesterday" +%Y-%m-%d)
mv $LOG_DIR/access.log $LOG_DIR/access.$DATE.log
mv $LOG_DIR/error.log $LOG_DIR/error.$DATE.log
# 通知 Nginx 重新打开日志文件
kill -USR1 $(cat /var/run/nginx.pid)
# 压缩7天前的日志
find $LOG_DIR -name "*.log" -mtime +7 -exec gzip {} \;
说明:
- 日志持续增长会导致磁盘爆满,必须定期轮转。
- 脚本将当前日志重命名为带日期的归档文件。
kill -USR1向 Nginx 主进程发送信号,触发其关闭旧日志句柄并创建新文件(平滑切割)。- 使用
find命令自动压缩一周前的日志,节省存储空间。- 可通过
crontab每日凌晨执行此脚本,实现自动化运维:0 0 * * * /path/to/rotate_nginx_logs.sh >> /var/log/nginx/rotate.log 2>&1
八、监控和调试
1. 状态页面配置
server {
listen 8080;
server_name localhost;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
说明:
stub_status模块提供简易的状态页,显示当前连接数、请求速率等关键指标。- 绑定到内网或本地端口(8080),并通过
allow/deny限制仅本地访问,防止信息泄露。- 输出内容包括:
- Active connections: 当前活跃连接数
- Server accepts handled requests: 接受、处理、总请求数
- Reading/Writing/Waiting: 当前读写及空闲连接数
- 可结合 Prometheus + Grafana 实现可视化监控。
2. 调试常用命令
# 测试配置语法
sudo nginx -t
# 打印完整配置(含 include)
sudo nginx -T
# 查看 Nginx 编译参数和模块
nginx -V
# 实时查看日志
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
# 压力测试(Apache Bench)
ab -n 1000 -c 100 http://example.com/
说明:
nginx -t:验证配置文件语法,部署前必做。nginx -T:输出合并后的完整配置,排查include冲突非常有用。nginx -V:查看编译选项和已加载模块(如是否有http_ssl_module),确认功能支持。tail -f实时追踪日志流,快速定位 5xx 错误或异常访问。ab(Apache Bench)是最简单的压测工具,模拟并发请求评估性能表现。
九、Docker 中的 Nginx
1. Dockerfile 示例
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY sites/ /etc/nginx/sites-available/
COPY html/ /usr/share/nginx/html/
RUN ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
说明:
- 基于轻量级
nginx:alpine镜像构建,减小体积。- 将自定义配置、站点和网页内容复制进容器。
- 手动创建符号链接启用站点(Docker 中
sites-enabled不自动生效)。EXPOSE声明暴露端口(文档作用为主)。CMD以非守护模式运行 Nginx,保证容器前台运行,便于日志收集和生命周期管理。
2. Docker Compose 示例
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./sites:/etc/nginx/sites-available
- ./html:/usr/share/nginx/html
- ./ssl:/etc/ssl
networks:
- webnet
networks:
webnet:
driver: bridge
说明:
- 使用
docker-compose.yml简化多容器编排。ports将宿主机 80/443 映射到容器端口。volumes实现配置热更新:修改本地文件即可反映到容器内,无需重建镜像。- 支持挂载 SSL 证书目录,方便 HTTPS 部署。
webnet自定义桥接网络,便于与其他服务(如 backend)通信。
结语
本指南涵盖了 Nginx 的 基础安装、虚拟主机、反向代理、负载均衡、SSL 配置、缓存、安全加固、限流、URL 重写、Gzip 压缩、性能调优、日志管理、监控调试 以及 Docker 部署 等核心内容,适用于构建高可用、高性能、安全的 Web 服务架构。
建议在生产环境中结合具体业务场景进行配置优化,并定期审查安全策略和性能指标。Nginx 功能强大且灵活,深入掌握其配置逻辑,不仅能提升系统稳定性,更能为后续架构演进打下坚实基础。
1942





