Nginx 配置从入门到精通完全指南

Nginx 配置从入门到精通完全指南

Nginx(engine x)是一款高性能的 HTTP 和反向代理服务器,同时也是邮件代理服务器、TCP/UDP 代理服务器。它以高并发、低内存占用、稳定性强、配置灵活的特点,成为目前互联网行业 Web 服务、反向代理、负载均衡的首选方案,几乎是后端、运维、前端全栈开发者的必备技能。

本文从入门安装、核心配置结构,到企业级常用场景、性能优化、安全防护、排错实战,全面讲解 Nginx 配置的全链路知识,附完整可运行配置示例,新手可直接上手,老手可查漏补缺。


一、入门篇:Nginx 基础认知与安装

1. Nginx 核心优势与典型应用场景

核心优势

  • 高并发:单台服务器可轻松支撑数万并发连接,性能远超 Apache
  • 低资源占用:空载时内存占用仅几 MB,资源利用率极高
  • 高稳定性:生产环境可连续数月无故障运行,宕机概率极低
  • 热部署:不中断服务的情况下重载配置、升级版本
  • 模块化设计:丰富的第三方模块,可扩展功能(缓存、限流、安全防护等)

典型应用场景

  1. 静态资源服务:托管前端页面、图片、视频等静态文件,性能远超后端服务
  2. 反向代理:隐藏后端服务,转发请求到上游服务,实现请求分发
  3. 负载均衡:将请求分发到多台后端服务器,实现流量分摊、高可用
  4. HTTPS 网关:统一管理 SSL 证书,实现 HTTPS 加密传输
  5. 缓存服务:缓存后端静态资源/接口数据,减少后端服务压力
  6. 限流/安全防护:实现接口限流、IP 黑白名单、防 CC 攻击、防盗链等
  7. 动静分离:静态资源由 Nginx 处理,动态请求转发到后端服务

2. Nginx 安装(3种方式)

方式1:包管理器安装(新手首选,简单快捷)

适合测试/生产环境快速部署,自动处理依赖,自带基础模块。

1
2
3
4
5
6
7
8
# CentOS/RHEL/Fedora(YUM)
yum install nginx -y

# Ubuntu/Debian(APT)
apt update && apt install nginx -y

# 验证安装
nginx -v # 输出版本号即安装成功

方式2:源码编译安装(生产环境推荐,可自定义模块)

适合需要自定义模块、指定版本、开启高级功能的场景,和你之前的源码安装流程完全兼容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 1. 安装编译依赖
yum install gcc gcc-c++ automake autoconf libtool make -y
# 安装核心依赖库(rewrite依赖pcre、gzip依赖zlib、HTTPS依赖openssl)
yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel -y

# 2. 下载源码(可替换为最新稳定版)
cd /usr/local/src
wget http://nginx.org/download/nginx-1.26.1.tar.gz
tar -zxvf nginx-1.26.1.tar.gz
cd nginx-1.26.1

# 3. 编译配置(指定安装路径、启用模块)
./configure \
--prefix=/usr/local/nginx \ # 安装根目录
--sbin-path=/usr/local/nginx/sbin/nginx \ # 执行文件路径
--conf-path=/usr/local/nginx/conf/nginx.conf \ # 主配置文件路径
--pid-path=/usr/local/nginx/nginx.pid \ # PID文件路径
--with-http_ssl_module \ # 启用HTTPS模块
--with-http_gzip_static_module \ # 启用gzip压缩模块
--with-http_stub_status_module \ # 启用状态监控模块
--with-http_realip_module \ # 启用真实IP获取模块
--with-stream # 启用TCP/UDP代理模块

# 4. 编译&安装
make && make install

# 5. 配置环境变量(全局使用nginx命令)
echo "export PATH=\$PATH:/usr/local/nginx/sbin" >> /etc/profile
source /etc/profile

# 验证安装
nginx -v

方式3:Docker 安装(容器化场景)

1
2
3
4
5
# 拉取最新稳定版镜像
docker pull nginx:latest

# 启动容器
docker run -d --name nginx -p 80:80 -v /your/conf:/etc/nginx/conf.d nginx:latest

3. Nginx 基础命令(必背)

所有命令均需在服务器终端执行,源码安装需确保环境变量配置正确。

命令 作用 适用场景
nginx 启动 Nginx 服务 首次启动服务
nginx -s stop 强制停止 Nginx(立即终止进程) 服务异常需强制关闭
nginx -s quit 优雅停止 Nginx(处理完请求后退出) 正常停止服务
nginx -s reload 平滑重载配置(不中断服务) 修改配置后生效(生产环境首选)
nginx -s reopen 重新打开日志文件 日志切割/轮转
nginx -t 检查配置文件语法是否正确 修改配置后、重载前必执行
nginx -T 检查配置并打印完整加载的配置 排查配置加载问题
nginx -V 查看版本、编译参数、已启用模块 确认模块是否安装
nginx -c /path/to/nginx.conf 指定配置文件启动 多配置文件测试

二、核心篇:Nginx 配置结构与核心指令

Nginx 的配置由指令块(Block)指令(Directive)组成,采用层级嵌套结构,核心配置文件为 nginx.conf(包管理器安装默认在 /etc/nginx/nginx.conf,源码安装在 /usr/local/nginx/conf/nginx.conf)。

1. 配置文件整体结构

Nginx 配置分为6大核心块,层级关系从外到内为:全局块 → events块 → http块 → server块 → location块 → 嵌套子块,结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
########## 1. 全局块:Nginx 全局配置,作用于整个服务 ##########
user nginx; # 运行 Nginx 的用户/用户组
worker_processes auto; # 工作进程数,auto=CPU核心数(性能优化核心)
error_log /var/log/nginx/error.log warn; # 全局错误日志路径+级别
pid /var/run/nginx.pid; # Nginx 进程PID文件路径


########## 2. events块:Nginx 连接处理相关配置 ##########
events {
use epoll; # 事件模型,Linux推荐epoll(性能最优)
worker_connections 1024; # 每个工作进程的最大连接数
multi_accept on; # 一次性接收所有新连接
}


########## 3. http块:HTTP服务核心配置,可包含多个server块 ##########
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; # 禁用Nagle算法,降低延迟
keepalive_timeout 65; # 长连接超时时间

########## 引入子配置文件:规范管理多站点配置 ##########
include /etc/nginx/conf.d/*.conf; # 引入conf.d下所有.conf文件
# include /etc/nginx/sites-enabled/*; # Debian/Ubuntu默认的站点配置目录


########## 4. server块:虚拟主机配置,一个server对应一个站点 ##########
server {
listen 80; # 监听端口
server_name localhost; # 站点域名/主机名
root /usr/share/nginx/html; # 站点根目录

########## 5. location块:URI匹配配置,核心中的核心 ##########
location / {
index index.html index.htm; # 默认首页文件
}

# 错误页配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}

2. 核心块详解

(1)全局块

作用于 Nginx 服务全局,核心配置项:

  • user:运行 Nginx 的用户,建议使用专用的 nginx 用户,避免 root 权限带来的安全风险
  • worker_processes:工作进程数,最佳实践设为 auto,自动匹配 CPU 核心数,最大化利用多核性能
  • error_log:错误日志配置,日志级别从低到高:debug → info → notice → warn → error → crit,生产环境建议 warn 级别
  • daemon on:是否以守护进程方式运行,默认开启,生产环境无需修改

(2)events块

控制 Nginx 与客户端的连接处理,核心配置项:

  • use epoll:事件驱动模型,Linux 系统强制推荐 epoll,FreeBSD 用 kqueue,是高并发的核心
  • worker_connections:单个工作进程的最大连接数,默认1024,生产环境可设为 20480,最大不能超过系统的最大文件打开数
  • worker_rlimit_nofile:单个工作进程的最大文件打开数,需配合系统配置,建议设为 65535
  • multi_accept on:允许进程一次性接收所有新的连接,提升并发处理能力

(3)http块

所有 HTTP 服务的全局配置,可包含多个 server 块,核心配置项:

  • include mime.types:引入文件类型映射,让 Nginx 识别不同后缀的文件
  • log_format:自定义访问日志格式,可按需添加字段(如请求耗时、响应时间、真实IP等)
  • access_log:访问日志路径,可关闭 access_log off; 提升静态资源性能
  • sendfile on:开启零拷贝传输,静态资源传输性能提升数倍,必须开启
  • keepalive_timeout:长连接保持时间,网站建议65s,接口服务可适当缩短
  • include:引入子配置文件,生产环境最佳实践:每个站点单独写一个 .conf 文件,通过 include 引入,避免主配置文件过于臃肿

(4)server块(虚拟主机)

一个 server 块对应一个站点/服务,核心配置项:

  • listen:监听端口,默认80,HTTPS默认443,可指定IP listen 192.168.1.100:80;
  • server_name:站点域名,支持精确匹配、通配符匹配、正则匹配:
    • 精确匹配:server_name www.example.com;
    • 通配符匹配:server_name *.example.com;server_name www.example.*;
    • 正则匹配:server_name ~^(?<user>.+)\.example\.com$;
  • root:站点根目录,对应站点文件存放的系统路径
  • index:默认首页文件,优先级从左到右
  • error_page:自定义错误页,如404、500错误的跳转页面

(5)location块(URI匹配)

Nginx 配置的灵魂,用于匹配客户端请求的 URI,执行对应的处理逻辑,是最常用、最灵活的配置块。

① location 匹配语法
1
2
3
location [匹配模式] 匹配规则 {
# 处理逻辑
}
② 匹配模式优先级(从高到低)
匹配模式 含义 示例 优先级
= 精确匹配,完全相等才命中 location = /login 1(最高)
^~ 前缀匹配,匹配成功后不再进行正则匹配 location ^~ /static/ 2
~ 正则匹配(区分大小写) `location ~ .(jpg png)$`
~* 正则匹配(不区分大小写) `location ~* .(jpg png)$`
无修饰符 普通前缀匹配,优先级低于正则 location /api/ 4
/ 通用匹配,所有未命中的请求都会匹配 location / 5(最低)
③ 匹配示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 1. 精确匹配:仅当URI完全等于/login时命中
location = /login {
return 200 "登录页面";
}

# 2. 前缀匹配:所有以/static/开头的URI,命中后不检查正则
location ^~ /static/ {
root /data/website;
expires 30d; # 缓存30天
}

# 3. 正则匹配:所有以.jpg/.png/.gif结尾的URI(不区分大小写)
location ~* \.(jpg|png|gif)$ {
root /data/website/images;
expires 7d;
}

# 4. 普通前缀匹配:所有以/api/开头的URI
location /api/ {
proxy_pass http://127.0.0.1:3000; # 反向代理到后端服务
}

# 5. 通用匹配:所有未命中的请求都走这里
location / {
root /data/website/html;
index index.html;
}
④ 高频踩坑:root 与 alias 的区别

这是新手最容易踩坑的点,两者都是用于指定文件路径,但逻辑完全不同:

指令 作用逻辑 示例 最终访问路径
root 根路径拼接:root路径 + location匹配的URI location /static/ { root /data/; },访问 /static/logo.png /data/static/logo.png
alias 别名替换:alias路径 替换 location匹配的URI location /static/ { alias /data/; },访问 /static/logo.png /data/logo.png

最佳实践:

  1. 站点根目录用 root,location 子路径匹配优先用 alias
  2. alias 路径结尾必须加 /root 可加可不加
  3. alias 只能在 location 块中使用,root 可在 server、location、http 块中使用

三、入门实战:3个必学基础场景配置

场景1:静态资源服务(前端站点/文件托管)

这是 Nginx 最基础的用法,托管前端打包后的页面、图片、视频等静态文件,性能远超 Tomcat、Node.js 等后端服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
server {
listen 80;
server_name www.example.com; # 你的域名
root /data/website/dist; # 前端打包后的dist目录绝对路径
index index.html index.htm; # 默认首页

# 静态资源缓存配置
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 30d; # 缓存30天
add_header Cache-Control "public, max-age=2592000, immutable";
access_log off; # 关闭静态资源日志,减少IO
}

# 单页应用(SPA)路由兼容:Vue/React 项目history模式必备
location / {
try_files $uri $uri/ /index.html;
}

# 开启目录浏览(可选,用于文件下载站)
location /download/ {
root /data/;
autoindex on; # 开启目录列表
autoindex_exact_size off; # 友好显示文件大小
autoindex_localtime on; # 显示本地时间
}
}

场景2:虚拟主机配置(一台服务器部署多个站点)

通过 server_name 区分不同站点,一台服务器可部署多个域名的网站,无需额外端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 站点1:www.example.com
server {
listen 80;
server_name www.example.com;
root /data/website/example;
index index.html;
}

# 站点2:www.test.com
server {
listen 80;
server_name www.test.com;
root /data/website/test;
index index.html;
}

# 站点3:基于端口的虚拟主机,访问8080端口进入该站点
server {
listen 8080;
server_name localhost;
root /data/website/port8080;
index index.html;
}

场景3:反向代理(隐藏后端服务,请求转发)

反向代理是 Nginx 最核心的用法之一,隐藏后端服务地址,统一入口,同时可实现负载均衡、缓存、HTTPS 统一管理。

最经典的场景:Nginx 监听80端口,将 /api 开头的请求转发到后端 Node.js/Java/Python 服务,和你之前的需求完全匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
listen 80;
server_name www.example.com;

# 前端静态资源由Nginx处理
location / {
root /data/website/dist;
index index.html;
}

# 接口请求反向代理到后端Node服务(127.0.0.1:3000)
location /api/ {
# 核心:反向代理地址
proxy_pass http://127.0.0.1:3000/;
# 传递客户端真实IP给后端
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_read_timeout 60s;
proxy_send_timeout 60s;
# 缓冲区配置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
}
}

高频踩坑:proxy_pass 结尾加不加 / 的区别

  • proxy_pass http://127.0.0.1:3000/;(结尾加/):访问 /api/user 会转发到 http://127.0.0.1:3000/user
  • proxy_pass http://127.0.0.1:3000;(结尾不加/):访问 /api/user 会转发到 http://127.0.0.1:3000/api/user
    核心逻辑:结尾加 / 会把 location 匹配的路径替换掉,不加则完整拼接。

四、进阶实战:企业级核心场景配置

场景1:负载均衡(多台后端服务流量分摊)

通过 upstream 块定义后端服务池,将请求分发到多台服务器,实现高可用、水平扩容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1. 定义上游服务池(后端服务列表)
upstream backend_server {
# 轮询(默认):按顺序依次分发
server 192.168.1.101:8080 weight=2; # weight=权重,权重越高,分发的请求越多
server 192.168.1.102:8080 weight=1;
server 192.168.1.103:8080 backup; # backup=备用节点,其他节点故障时启用
server 192.168.1.104:8080 down; # down=节点下线,不参与分发

# 调度算法(可选,选其一)
# ip_hash; # 按客户端IP哈希,同一个IP始终访问同一台后端,解决session共享问题
# least_conn; # 最少连接数,优先分发到连接数最少的后端
# fair; # 按响应时间分发,需第三方模块支持
}

# 2. 反向代理到负载均衡池
server {
listen 80;
server_name www.example.com;

location /api/ {
proxy_pass http://backend_server/; # 直接引用upstream的名称
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# 健康检查(基础版,需第三方模块ngx_http_healthcheck_module实现高级健康检查)
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3; # 失败重试次数
}

场景2:HTTPS 配置(SSL证书部署+HTTP强制跳转HTTPS)

生产环境必备,实现 HTTPS 加密传输,提升网站安全性和SEO排名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# HTTP 80端口:强制跳转到HTTPS
server {
listen 80;
server_name www.example.com example.com;
# 301永久重定向到HTTPS
return 301 https://$server_name$request_uri;
}

# HTTPS 443端口:核心配置
server {
listen 443 ssl http2; # 开启SSL和HTTP2
server_name www.example.com;

# 1. SSL证书配置(从证书服务商下载,推荐pem格式)
ssl_certificate /etc/nginx/ssl/www.example.com.pem; # 证书公钥
ssl_certificate_key /etc/nginx/ssl/www.example.com.key; # 证书私钥

# 2. SSL安全优化
ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的SSLv3、TLSv1.0/1.1
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on; # 优先使用服务端的加密套件
ssl_session_cache shared:SSL:10m; # SSL会话缓存,提升握手性能
ssl_session_timeout 1d;
ssl_session_tickets off;

# 3. HSTS配置:强制浏览器使用HTTPS访问,防止降级攻击
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

# 4. 站点配置
root /data/website/dist;
index index.html;

location / {
try_files $uri $uri/ /index.html;
}

location /api/ {
proxy_pass http://backend_server/;
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;
}
}

场景3:URL重写(rewrite):伪静态/跳转/路径重写

rewrite 指令用于修改请求的 URI,实现伪静态、域名跳转、路径重写、SEO优化等需求。

语法

1
rewrite 正则表达式 替换内容 [flag标记];

flag标记(核心)

标记 作用 适用场景
last 停止当前rewrite,用新的URI重新匹配location 内部路径重写,伪静态
break 停止rewrite,不再匹配location 路径替换,不改变浏览器地址
redirect 302临时重定向,地址栏显示新地址 临时页面跳转
permanent 301永久重定向,地址栏显示新地址 永久域名/路径变更,SEO优化

常用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
listen 80;
server_name example.com;

# 1. 域名跳转:旧域名跳转到新域名(301)
rewrite ^/(.*)$ https://www.example.com/$1 permanent;

# 2. 伪静态:动态地址转静态地址,SEO优化
# 访问 /article/123.html 实际转发到 /article.php?id=123
rewrite ^/article/(\d+)\.html$ /article.php?id=$1 last;

# 3. 强制www域名:不带www跳转到带www
if ($host = 'example.com') {
rewrite ^/(.*)$ https://www.example.com/$1 permanent;
}

# 4. 移动端适配:手机访问跳转到m.example.com
if ($http_user_agent ~* (mobile|android|iphone|ipad)) {
rewrite ^/(.*)$ https://m.example.com/$1 redirect;
}

# 5. 防盗链:禁止其他网站引用本站图片
location ~* \.(jpg|png|gif)$ {
valid_referers none blocked www.example.com;
if ($invalid_referer) {
rewrite ^/ https://www.example.com/403.jpg break;
# 或直接返回403:return 403;
}
}
}

五、高级篇:性能优化与高级功能

1. 缓存配置:proxy_cache 反向代理缓存

缓存后端服务的静态资源/接口数据,减少后端请求压力,提升响应速度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# http块中配置缓存全局参数
http {
# 定义缓存规则
# proxy_cache_path:缓存文件存放路径
# levels:缓存目录层级
# keys_zone:缓存内存区域名称+大小,1M大约可存储8000个key
# max_size:缓存最大磁盘空间
# inactive:缓存过期时间,60分钟未访问则删除
# use_temp_path:关闭临时文件,避免IO浪费
proxy_cache_path /var/cache/nginx/proxy_cache
levels=1:2
keys_zone=api_cache:100m
max_size=10g
inactive=60m
use_temp_path=off;

# 缓存不缓存的响应头
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pragma $http_authorization;
proxy_cache_min_uses 3; # 请求3次后再缓存
proxy_cache_valid 200 304 1h; # 200/304响应缓存1小时
proxy_cache_valid 404 1m; # 404缓存1分钟
}

# server块中使用缓存
server {
listen 80;
server_name www.example.com;

location /api/ {
proxy_pass http://backend_server/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;

# 启用缓存,引用keys_zone的名称
proxy_cache api_cache;
# 缓存key:用请求地址+参数作为唯一key
proxy_cache_key $host$uri$is_args$args;
# 给响应头添加缓存状态,方便调试(HIT=命中,MISS=未命中)
add_header X-Cache-Status $upstream_cache_status always;
}
}

2. 限流配置:防CC攻击/接口限流

通过 limit_req(请求限流)和 limit_conn(连接限流),实现对客户端的访问频率控制,防止恶意攻击、接口刷取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# http块中配置限流规则
http {
# 1. 请求限流:漏桶算法
# limit_req_zone:定义限流区域
# $binary_remote_addr:按客户端IP限流
# zone=req_limit:10m:限流区域名称+内存大小
# rate=10r/s:每秒最多10个请求
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

# 2. 连接限流:限制单个IP的最大连接数
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}

# server块中启用限流
server {
listen 80;
server_name www.example.com;

# 全局限流
limit_req zone=req_limit burst=20 nodelay; # burst=突发请求数,nodelay=不延迟处理
limit_conn conn_limit 20; # 单个IP最多20个连接

# 登录接口严格限流:防止暴力破解
location /api/login {
proxy_pass http://backend_server/login;
limit_req zone=req_limit burst=3 nodelay; # 每秒最多10个请求,突发3个
limit_conn conn_limit 5;
}
}

3. 动静分离

静态资源(CSS/JS/图片/视频)由 Nginx 直接处理,动态请求转发到后端服务,最大化利用 Nginx 的高性能,减少后端服务压力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
server_name www.example.com;
root /data/website;

# 动态接口请求:转发到后端Java服务
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}

# 静态资源:Nginx直接处理,开启缓存
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff2|mp4)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
access_log off;
}

# 首页HTML
location / {
index index.html;
}
}

4. Gzip/Brotli 压缩

开启压缩,减少传输文件体积,提升页面加载速度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http {
# Gzip压缩配置
gzip on; # 开启gzip
gzip_min_length 1k; # 小于1k的文件不压缩
gzip_buffers 16 64k; # 压缩缓冲区
gzip_http_version 1.1; # 压缩HTTP版本
gzip_comp_level 6; # 压缩级别(1-9,6是性能和压缩率的平衡)
# 需要压缩的文件类型
gzip_types text/plain text/css application/javascript text/xml application/xml application/xml+rss application/json;
gzip_vary on; # 给响应头添加Vary: Accept-Encoding
gzip_disable "MSIE [1-6]\."; # 禁用IE6以下的gzip

# Brotli压缩(比gzip压缩率更高,需第三方ngx_brotli模块)
# brotli on;
# brotli_comp_level 6;
# brotli_types text/plain text/css application/javascript application/json;
}

六、安全篇:Nginx 安全防护配置

1. 基础安全加固

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 全局块:禁止使用root用户运行Nginx
user nginx;

# http块:基础安全配置
http {
# 隐藏Nginx版本号(防止针对特定版本的漏洞攻击)
server_tokens off;

# 防XSS攻击
add_header X-XSS-Protection "1; mode=block" always;
# 防iframe嵌套点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;
# 防MIME类型嗅探
add_header X-Content-Type-Options "nosniff" always;
# 内容安全策略(按需配置)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'" always;

# 禁止访问敏感文件
location ~* \.(env|git|svn|bak|sql|conf|sh)$ {
return 403;
access_log off;
}

# 禁止目录遍历
location ~ \.\.\/ {
return 403;
}
}

2. IP黑白名单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80;
server_name www.example.com;

# 1. 黑名单:禁止指定IP访问
deny 192.168.1.100;
deny 10.0.0.0/8; # 禁止整个网段
# 2. 白名单:仅允许指定IP访问(后台管理系统推荐)
allow 192.168.1.0/24;
deny all;

# 针对特定路径设置黑白名单
location /admin/ {
allow 192.168.1.100;
deny all;
proxy_pass http://backend_server/admin/;
}
}

3. 防盗链配置

防止其他网站盗用本站的图片、视频等静态资源,节省服务器带宽。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name www.example.com;

# 图片/视频防盗链
location ~* \.(jpg|png|gif|jpeg|mp4|flv|avi)$ {
# 允许的域名:本站、搜索引擎、空referer
valid_referers none blocked server_names *.example.com *.baidu.com *.google.com;
# 非法referer返回403或占位图
if ($invalid_referer) {
return 403;
# 或返回防盗链图片:rewrite ^/ /static/forbid.jpg break;
}
expires 30d;
access_log off;
}
}

七、排错篇:日志管理与常见错误排查

1. 日志管理

Nginx 有两个核心日志:访问日志(access_log)错误日志(error_log),是排查问题的核心依据。

(1)访问日志

记录所有客户端的请求信息,用于统计、分析、排查访问问题,可自定义格式。

1
2
3
4
5
6
7
8
# 自定义日志格式(http块中)
log_format main '$remote_addr [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time $upstream_response_time';
# 引用日志格式(server块中)
access_log /var/log/nginx/www.example.com.access.log main;
# 关闭日志
access_log off;

核心字段说明:

  • $remote_addr:客户端IP
  • $time_local:请求时间
  • $request:请求方法+URI+HTTP版本
  • $status:响应状态码
  • $request_time:Nginx处理请求的总耗时
  • $upstream_response_time:后端服务响应耗时

(2)错误日志

记录 Nginx 启动、运行、请求处理过程中的错误,是排查500/502/504等错误的核心,日志级别从低到高:debug → info → notice → warn → error → crit

1
2
3
4
# 全局块中配置
error_log /var/log/nginx/error.log error; # 生产环境推荐error级别
# 调试时可设为debug级别
# error_log /var/log/nginx/debug.log debug;

2. 常见错误排查

错误码 核心原因 排查方向
403 Forbidden 权限不足/访问被禁止 1. 站点目录权限(Nginx运行用户是否有读权限)
2. index文件不存在
3. IP黑名单/防盗链拦截
4. SELinux开启导致权限限制
404 Not Found 资源不存在 1. 请求的URI对应的文件/路径不存在
2. root/alias路径配置错误
3. try_files配置错误
4. 反向代理地址错误
502 Bad Gateway 后端服务不可达 1. 后端服务宕机/端口未监听
2. proxy_pass地址错误
3. 后端服务端口被防火墙拦截
4. upstream中所有节点都下线
504 Gateway Timeout 后端服务响应超时 1. 后端服务执行时间过长,超过proxy_read_timeout
2. 后端服务死锁/数据库查询超时
3. 服务器CPU/内存满载,无法处理请求
4. 网络不通,Nginx无法连接后端
500 Internal Server Error Nginx内部错误/后端服务错误 1. Nginx配置语法错误(重载前用nginx -t检查)
2. rewrite规则死循环
3. 后端服务返回500
4. 文件权限错误
5. 内存不足

3. 配置排查必备命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 检查配置文件语法是否正确(修改配置后必执行)
nginx -t

# 2. 查看完整加载的配置(排查include的子配置是否生效)
nginx -T

# 3. 查看Nginx编译参数和已启用的模块
nginx -V

# 4. 平滑重载配置(不中断服务,生产环境禁止用restart)
nginx -s reload

# 5. 实时查看错误日志
tail -f /var/log/nginx/error.log

# 6. 实时查看访问日志
tail -f /var/log/nginx/access.log

八、生产环境最佳实践

  1. 配置规范:每个站点单独创建一个 .conf 配置文件,通过 include 引入,禁止所有配置都写在 nginx.conf 主文件中,便于管理和排查。
  2. 权限安全:禁止用 root 用户运行 Nginx,创建专用的 nginx 用户,站点目录权限设置为 755,文件权限 644,避免过高权限。
  3. 版本管理:生产环境使用 Nginx 稳定版(偶数版本,如1.24.x、1.26.x),禁止使用开发版,定期更新修复安全漏洞。
  4. 重载规范:修改配置后必须先执行 nginx -t 检查语法,确认无误后用 nginx -s reload 平滑重载,禁止用 restart 重启服务,避免中断业务。
  5. 日志管理:配置日志轮转(logrotate),避免日志文件过大占满磁盘,定期归档访问日志,错误日志长期保留用于排查问题。
  6. 性能优化:开启 sendfiletcp_nopushtcp_nodelay,配置合理的 worker_processesworker_connections,开启 gzip 压缩和静态资源缓存。
  7. 安全加固:隐藏版本号,开启 HTTPS 和 HSTS,配置 IP 黑白名单、防盗链、限流,定期扫描安全漏洞。
  8. 高可用:生产环境用 Keepalived + Nginx 实现主备高可用,避免单点故障,负载均衡配置健康检查和故障重试。

总结

Nginx 的核心能力在于灵活的配置、极致的性能、丰富的模块化扩展,从入门的静态资源服务、反向代理,到进阶的负载均衡、HTTPS配置,再到高级的缓存、限流、安全防护,几乎覆盖了 Web 服务的全场景需求。

本文的配置示例均为生产环境可直接复用的标准配置,新手建议先从静态服务、反向代理入手,逐步掌握 location 匹配、rewrite 重写、负载均衡等进阶内容,最终结合性能优化和安全防护,实现企业级的 Nginx 配置。


Nginx 配置从入门到精通完全指南
https://cszy.top/2017-07-27 Nginx 配置从入门到精通完全指南/
作者
csorz
发布于
2017年7月27日
许可协议