在互联网的世界里,几乎所有的流量都要经过一个“守门人”——Web 服务器。而在众多选择中,Nginx 已成为无可争议的主角:高性能、轻量级、配置灵活、社区生态强大。无论是小型个人博客,还是大型企业的负载均衡集群,Nginx 都在背后默默支撑着亿级访问量的网站。
很多人第一次接触 Nginx,可能是为了“反向代理”、“静态资源托管”或者“做 HTTPS”。但当你真正理解它的配置哲学后,会发现它远不止于此——Nginx 的配置本身就是一门“艺术”,它决定了一个网站能否稳定、高效、安全地运行。
本文将带你从零出发,系统梳理 Nginx 的配置逻辑、文件结构、核心模块和高性能优化方案。最终,我们将完成一个可直接上线的高性能网站配置方案,并深入理解每一行配置背后的原理。
Nginx 的配置文件看似简单,实则极具层次感。整个配置体系是模块化 + 层级化的组合。
1. 全局配置与上下文结构
Nginx 的主配置文件一般是 /etc/nginx/nginx.conf,其层级结构大致如下:
main {
# 全局配置
events {
# 事件驱动模块
}
http {
# HTTP 服务配置
server {
# 虚拟主机配置
location {
# 请求匹配规则
}
}
}
}
这层嵌套结构是理解 Nginx 的关键。每一级都控制着不同粒度的行为:
- main:影响整个 Nginx 服务,如工作进程数、日志路径、PID 文件等;
- events:定义事件模型(如 epoll)与连接处理方式;
- location:URL 路由匹配与请求分发规则。
Nginx 的这种结构使得配置具备强大的局部覆盖能力,即:下级可以覆盖上级的定义。这也是它灵活性的来源。
我们从一份最小可用的配置入手,逐行拆解其意义。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 10240;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_types text/plain text/css application/json application/javascript;
include /etc/nginx/conf.d/*.conf;
}
1. 全局段(main)
user nginx;指定运行 Nginx 进程的用户,推荐使用非 root 用户运行,提升安全性。
worker_processes auto;表示自动根据 CPU 核心数分配工作进程。每个 worker 是单线程事件驱动的,合理分配能最大化性能。
error_log 与 pid分别指定错误日志路径和进程 ID 文件,便于监控与维护。
2. events 段:事件模型的灵魂
Nginx 的高性能核心之一是它的事件驱动机制。
worker_connections 10240;定义单个 worker 能同时处理的最大连接数。 若服务器有 4 个 worker,则理论上最大可处理 4×10240=40960 个并发连接。
use epoll;明确启用 Linux 下高效的 IO 多路复用模型 epoll,适合高并发场景。
3. http 段:一切 Web 功能的起点
http 段定义了 Nginx 处理 HTTP 请求的全局逻辑。
include mime.types;让 Nginx 根据扩展名返回正确的 Content-Type,比如 .html 为 text/html。
sendfile on;使用零拷贝机制发送文件,大幅降低 CPU 消耗。
tcp_nopush 与 tcp_nodelay这两个参数控制 TCP 包发送策略,前者适合批量传输静态文件,后者适合实时响应。
gzip on;启用压缩以减少带宽消耗。配合 gzip_types 指定压缩的 MIME 类型。
网站的可访问核心在于 server 块。让我们来创建一个基本的站点配置。
server {
listen 80;
server_name www.example.com;
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
1. 监听端口与域名绑定
listen 80;:监听 HTTP 默认端口。若需 HTTPS,则改为 listen 443 ssl;。server_name:定义域名或 IP,可用通配符支持多域名。
2. 静态资源托管
root 定义了网站根目录,Nginx 会直接从该目录读取文件返回。try_files $uri $uri/ =404; 是一个关键语句,用于防止目录遍历漏洞。
3. 反向代理与负载均衡
网站往往不是直接返回静态文件,而是通过 Nginx 转发到后端服务(如 Spring Boot)。
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
这段配置实现了典型的反向代理逻辑。 前端请求 /api/* 时,会被转发到本地后端应用端口。通过 proxy_set_header,可让后端知道真实客户端 IP 与域名信息。
现代网站必须启用 HTTPS,不仅是安全问题,也是 SEO 与用户信任的基本要求。
1. 启用 SSL/TLS
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
2. 强制跳转 HTTPS
server {
listen 80;
server_name www.example.com;
return 301 https://$server_name$request_uri;
}
3. 常见安全配置
location ~ /\. {
deny all;
}
add_header Cache-Control "no-store, no-cache, must-revalidate";
Nginx 被称为高性能服务器,不仅因为事件驱动模型,还因为它提供了众多优化参数。
1. 连接与缓冲优化
client_max_body_size 20M;
client_body_buffer_size 128k;
send_timeout 60;
keepalive_timeout 75;
这些参数直接决定了上传、下载与长连接的表现。
2. 缓存与静态加速
location ~* \.(jpg|png|gif|ico|css|js)$ {
expires 30d;
access_log off;
}
静态文件可长期缓存,减少服务器负载与用户延迟。
3. Gzip 与 Brotli 双压缩
若系统支持,可安装 Brotli 模块,比 Gzip 效率更高。
brotli on;
brotli_types text/html text/css application/javascript;
4. 使用负载均衡分发流量
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
location /api/ {
proxy_pass http://backend;
}
}
这实现了简单的轮询负载均衡。 Nginx 还支持权重、IP 哈希、最少连接等高级策略。
1. 访问日志配置
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;
这份日志是分析访问量、错误率、SEO 效果的重要依据。
2. 日志切割与监控方案
可结合 Linux logrotate 进行日志轮转,或接入 ELK、Prometheus 实时分析。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 10240;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 75;
gzip on;
gzip_types text/plain text/css application/json application/javascript;
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
root /usr/share/nginx/html;
index index.html;
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
try_files $uri $uri/ =404;
}
}
}
将这份配置部署在一台 Linux 服务器上,再配合 Certbot 申请免费 SSL 证书,就能快速上线一个稳定的生产级网站。
真正理解 Nginx 的人,往往会把它当作一个“调度系统”而非单纯的服务器。它既能分流请求、加速静态文件、保障安全,也能成为微服务架构的核心入口。
在生产环境中,优秀的 Nginx 配置既像一道防火墙,也像一台精密的交通灯。它决定了每一条请求的命运:是被拒绝、被转发、被缓存,还是被静态响应。
Nginx 的伟大之处不在于复杂的功能,而在于它让复杂的事情变得清晰、有序、可控。 当你真正能读懂 nginx.conf 时,你也在读懂一套互联网系统的底层运行逻辑。
该文章在 2025/12/5 17:33:53 编辑过