Nginx 基本使用和高级用法详解

Nginx 基本使用和高级用法详解一、Nginx 简介Nginx 是一个高性能的 HTTP 和反向代理服务器,具有占用内存少、并发能力强等特点。它由 Igor Sysoev 开发,最初设计用于解决 C10K(单机处理一万并发连接)问题。如今,Nginx 不仅广泛应用于 Web 服务领域,还常被用作负载均衡器、API 网关、静态资源服务器以及安全防护层。

其事件驱动架构使得在高并发场景下仍能保持低资源消耗与高响应速度,因此成为现代 Web 架构中不可或缺的核心组件之一。

二、基本安装与使用1. 安装 Nginx根据操作系统不同,Nginx 的安装方式略有差异。以下为常见 Linux 发行版的安装方法。

Ubuntu/Debian代码语言:javascript复制sudo apt update

sudo apt install nginx 说明:apt 是 Debian 系列系统的包管理工具。执行上述命令会从官方源下载并安装最新稳定版本的 Nginx,并自动配置基础服务。

CentOS/RHEL代码语言:javascript复制sudo yum install nginx

# 或

sudo dnf install nginx 说明:在较老版本的 CentOS 中使用 yum,而在 RHEL 8+ 或 Fedora 等新系统中推荐使用 dnf。安装完成后,Nginx 通常不会自动启动,需要手动启用服务。

2. 基本操作命令代码语言:javascript复制# 启动

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. 主要配置文件目录结构代码语言:javascript复制/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)代码语言:javascript复制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. 基本虚拟主机配置代码语言:javascript复制# /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. 启用站点代码语言:javascript复制# 创建软链接启用站点

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. 反向代理配置代码语言:javascript复制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. 负载均衡代码语言:javascript复制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 配置代码语言:javascript复制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. 缓存配置代理缓存代码语言:javascript复制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 等。静态资源缓存代码语言:javascript复制location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {

expires 1y;

add_header Cache-Control "public, immutable";

} 说明:

对图片、样式表、脚本等静态资源设置长期过期时间(一年),利用浏览器本地缓存大幅提升重复访问体验。immutable 表示内容永不改变(通常配合内容哈希命名),允许浏览器完全跳过验证请求。注意:只有在资源真正不变时才应使用 immutable,否则可能导致用户无法获取更新。5. 安全配置代码语言:javascript复制# 隐藏版本号

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. 限流配置代码语言:javascript复制# 定义限流区域

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 重写和重定向代码语言:javascript复制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 压缩代码语言:javascript复制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. 连接优化代码语言:javascript复制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. 工作进程优化代码语言:javascript复制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. 自定义日志格式代码语言:javascript复制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)代码语言:javascript复制#!/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 每日凌晨执行此脚本,实现自动化运维:

代码语言:javascript复制0 0 * * * /path/to/rotate_nginx_logs.sh >> /var/log/nginx/rotate.log 2>&1八、监控和调试1. 状态页面配置代码语言:javascript复制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. 调试常用命令代码语言:javascript复制# 测试配置语法

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 中的 Nginx1. Dockerfile 示例代码语言:javascript复制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 示例代码语言:javascript复制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 功能强大且灵活,深入掌握其配置逻辑,不仅能提升系统稳定性,更能为后续架构演进打下坚实基础。

Back to top: