Nginx 完全指南:入门、核心功能与高阶运维全解析
第一章:引言(深度补全)
-
为什么是 Nginx? 除了高并发(C10K 问题解决者),它还是七层负载均衡和四层流代理(Stream 模块)的全能选手。内存占用极低(几 MB 可支撑上万连接)。
-
适用场景细化:
-
前端入口:SPA 应用路由分发(
try_files)。 -
API 网关:结合
proxy_pass将/api/转发至后端微服务。 -
静态资源 CDN 前置:利用
expires和add_header Cache-Control实现强缓存。 -
WebSocket 长连接:需要配置
proxy_http_version 1.1和Upgrade头。
-
-
环境准备建议:推荐 Ubuntu 22.04 LTS 或 CentOS 7+。需要掌握
vim/nano编辑、netstat -tlnp查看端口占用。
第二章:基础篇——安装与架构
-
架构补充说明:Master 进程以 root 运行(读取配置、绑定 80/443 端口),Worker 进程以普通用户(如
www-data)运行,极大增强安全性。 -
源码编译关键参数详解(这是面试高频):
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \ # 开启 HTTPS
--with-http_v2_module \ # 开启 HTTP/2
--with-http_realip_module \ # 获取真实 IP
--with-http_stub_status_module \ # 监控状态页
--with-stream \ # 开启 TCP/UDP 代理(四层负载)
--with-http_gzip_static_module # 预压缩静态文件
第三章:Nginx 目录结构及文件作用全解
这里以 Ubuntu/Debian 系(APT安装) 的典型结构为例,这是最通用的标准。源码编译安装路径会略有不同(通常在
/usr/local/nginx),但核心逻辑一致。
1. 根目录总览 (/etc/nginx/)
text
/etc/nginx/ ├── nginx.conf # 主配置文件(入口) ├── conf.d/ # 全局通用配置片段目录 ├── sites-available/ # 所有可用的虚拟主机(站点)配置 ├── sites-enabled/ # 当前激活的站点配置(软链接指向 sites-available) ├── modules-enabled/ # 动态加载的模块目录(软链接) ├── modules-available/ # 可用的动态模块目录 ├── snippets/ # 可复用的配置片段(如 SSL、限流、跨域等) ├── mime.types # MIME类型映射表(文件扩展名 -> Content-Type) ├── fastcgi_params # FastCGI 标准参数(用于 PHP 等) ├── uwsgi_params # uWSGI 标准参数(用于 Python 等) ├── scgi_params # SCGI 标准参数 ├── proxy_params # 反向代理标准头参数(如 X-Forwarded-For) └── koi-utf / koi-win / win-utf # 编码转换映射表(处理非UTF-8字符集)
2. 核心文件与目录的作用详解
| 文件/目录 | 核心作用 | 使用频率 |
|---|---|---|
nginx.conf |
总枢纽。定义全局运行参数(worker_processes)、事件模型(events)和顶层 HTTP 块。最后通过 include 指令加载 sites-enabled/* 和 conf.d/*。 |
⭐⭐⭐⭐⭐ |
sites-available/ |
配置仓库。存放所有业务站点的完整 server{} 配置块文件(如 example.com.conf)。文件通常按域名命名,方便管理。 |
⭐⭐⭐⭐⭐ |
sites-enabled/ |
激活开关。只包含指向 ../sites-available/ 的软链接。Nginx 默认只加载此目录下的文件。这种设计让你可以方便地“启用/禁用”站点(ln -s / rm),而无需删除原始配置。 |
⭐⭐⭐⭐⭐ |
conf.d/ |
通用补充。存放非虚拟主机类的全局配置片段,如 upstream 负载池定义、全局限流规则等。也可放独立站点,但官方更推荐 sites-*。 |
⭐⭐⭐⭐ |
snippets/ |
乐高积木。存放可复用的配置块。最典型的用法是存放 SSL 证书配置(ssl-cert.conf)或 安全头配置(security-headers.conf),然后在各个 server 中用 include snippets/ssl.conf; 一键引用。 |
⭐⭐⭐⭐ |
mime.types |
类型词典。将文件后缀(如 .html、.css、.js)映射为浏览器能识别的 MIME 类型。Nginx 通过它设置 Content-Type 响应头。 |
⭐⭐(一般不动) |
proxy_params |
代理头模板。通常包含 proxy_set_header Host $host、proxy_set_header X-Real-IP $remote_addr 等标准代理头。使用 proxy_pass 时顺手 include proxy_params; 可保证后端拿到真实 IP。 |
⭐⭐⭐⭐ |
fastcgi_params |
CGI 环境变量。传递 SCRIPT_FILENAME、QUERY_STRING 等给 PHP-FPM。通常配合 fastcgi_pass 使用。 |
⭐⭐⭐ |
3. 运行时关键目录(非 /etc 下)
| 路径 | 作用 |
|---|---|
/usr/sbin/nginx |
Nginx 二进制主程序(启动/重载命令来源) |
/var/log/nginx/ |
日志存放目录(access.log 和 error.log) |
/var/www/html/ |
默认的网页根目录(Debian/Ubuntu 默认) |
/etc/init.d/nginx |
System V 初始化脚本(service nginx start) |
/lib/systemd/system/nginx.service |
Systemd 服务单元文件(systemctl 管理) |
4.四个核心场景的配置片段
示例 1:基础静态页面 + 动静分离
# /etc/nginx/sites-available/my-static-site.conf
server {
# 监听 80 端口(IPv4 和 IPv6)
listen 80;
listen [::]:80;
# 域名绑定
server_name www.myblog.com myblog.com;
# 站点根目录
root /var/www/myblog/html;
# 默认首页优先顺序
index index.html index.htm;
# ----- 处理静态资源(图片/CSS/JS)并开启缓存 -----
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ {
expires 30d; # 设置浏览器缓存 30 天
add_header Cache-Control "public, immutable";
access_log off; # 关闭静态资源访问日志,减少磁盘 IO
log_not_found off; # 不记录 404 错误日志
}
# ----- 处理前端路由(SPA 历史模式) -----
location / {
try_files $uri $uri/ /index.html;
# 如果请求的文件不存在,则返回 index.html,交给前端路由处理
}
# ----- 动静分离:将 /api/ 请求转发到后端 Java/Go 服务 -----
location /api/ {
proxy_pass http://localhost:8080/api/;
# 注意:末尾带 / 表示替换掉 /api/,不带 / 则完整转发
include proxy_params; # 自动引入标准代理头(X-Real-IP等)
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# ----- 错误页面自定义 -----
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/myblog/html;
}
}
示例 2:负载均衡(Upstream) + HTTPS 强制跳转
# 定义上游服务器池(放在 /etc/nginx/conf.d/upstream.conf 更合适)
upstream backend_app {
# 负载均衡算法:加权轮询
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=30s;
# 健康检查(商业版支持主动探测,开源版依赖被动探测)
# keepalive 32; # 开启长连接池,减少握手开销(需搭配 proxy_http_version 1.1)
}
# ---- HTTP 服务(强制跳转 HTTPS) ----
server {
listen 80;
listen [::]:80;
server_name api.mycompany.com;
# 返回 301 永久重定向到 HTTPS
return 301 https://$server_name$request_uri;
}
# ---- HTTPS 服务(实际业务) ----
server {
listen 443 ssl http2; # 开启 SSL 和 HTTP/2 协议
listen [::]:443 ssl http2;
server_name api.mycompany.com;
# ---------- SSL 证书配置(强烈建议使用 sniper/全链证书) ----------
ssl_certificate /etc/ssl/certs/fullchain.pem; # 公钥 + 中间证书
ssl_certificate_key /etc/ssl/private/privkey.pem; # 私钥(权限设为 600)
# 安全加密套件(2024年主流标准)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
# 会话缓存优化(减少握手时间)
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off; # 为了更好的前向安全性,建议关闭
# ---------- 反向代理到后端 Upstream ----------
location / {
proxy_pass http://backend_app; # 引用上面定义的 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;
proxy_set_header X-Forwarded-Proto $scheme; # 告诉后端当前是 HTTP 还是 HTTPS
# 超时与缓冲
proxy_connect_timeout 75s;
proxy_send_timeout 75s;
proxy_read_timeout 75s;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# 错误时尝试下一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
}
# 健康检查状态页(可选,需编译 stub_status 模块)
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1; # 只允许本机查看
deny all;
}
}
示例 3:限流(防 CC 攻击)与访问控制
# 放置在 /etc/nginx/conf.d/security.conf
# 1. 定义限流区域(基于 $binary_remote_addr,内存 10M)
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
# 表示:每秒允许 10 个请求,超出后排队
# 2. 定义连接数限制(每个 IP 最多同时 20 个连接)
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
listen 80;
server_name myapi.com;
location /api/ {
# 应用限流:burst=20 允许突然爆发 20 个请求排队,nodelay 让队列不等待直接响应
limit_req zone=mylimit burst=20 nodelay;
limit_conn addr 20; # 同一 IP 仅允许 20 个并发连接
# 白名单放行(比如内部监控系统)
allow 192.168.1.100;
allow 10.0.0.0/8;
deny all; # 禁止其他 IP 访问敏感接口
proxy_pass http://backend;
}
}
示例 4:WebSocket 代理配置
server {
listen 443 ssl http2;
server_name ws.myapp.com;
location /ws/ {
proxy_pass http://websocket_backend;
proxy_http_version 1.1; # WebSocket 必须 1.1
proxy_set_header Upgrade $http_upgrade; # 升级协议
proxy_set_header Connection "upgrade"; # 保持连接升级
# 长连接必须加大超时(默认 60s 不够)
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
# 同样传递真实 IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
第四章:核心配置篇(语法精讲)
-
location 匹配优先级(重难点):
-
=精确匹配(最高,立即停止) -
^~前缀匹配(若匹配,不再检查正则) -
~(区分大小写正则)和~*(不区分) -
普通前缀匹配(最长匹配原则)
建议配图或写例子:location = /与location /的区别。
-
核心功能实战(配置逻辑拆解)
-
静态服务器优化:
-
sendfile on;充分利用 Linux 零拷贝。 -
tcp_nopush on;配合sendfile,在数据包达到最大时才发送,提升网络效率。 -
Gzip 必须开启:
gzip_types text/plain text/css application/json ...。
-
-
反向代理重点:
-
缓冲区:
proxy_buffering on;可将后端响应缓冲到磁盘/内存,避免慢客户端拖慢后端。 -
重定向处理:
proxy_redirect default;修复后端 302 跳转时的 Location 头。
-
-
负载均衡调度场景:
-
ip_hash有致命缺点:会导致负载严重不均(某 IP 段请求多就压垮某台机器),现代微服务推荐 Redis/Token 集中管理 Session,配合least_conn。 -
down和backup配合运维手动下线服务器。
-
-
HTTPS 安全配置(现代标准):
-
必须禁用弱加密:
ssl_ciphers HIGH:!aNULL:!MD5;。 -
开启
ssl_prefer_server_ciphers on;由服务端决定加密套件。 -
使用 全链证书 (
fullchain.pem) 避免中间证书缺失报错。
-
高阶应用
-
限流算法:
limit_req使用 Leaky Bucket(漏桶) 算法,burst参数代表瞬时突发队列长度,nodelay参数会让排队请求立即处理但消耗令牌。建议生产必须配置防 CC 攻击。 -
Rewrite 规则陷阱:
break和last的区别——last会重走一遍 location 匹配,容易死循环;break则只在当前上下文处理。 -
WebSocket 关键:后端若支持 WS,
proxy_read_timeout必须设大(如 300s),否则长连接会被 Nginx 强行断开。
第五章:运维实战速查
-
平滑重启:修改配置后,
nginx -t && nginx -s reload,零停机更新。 -
热升级(二进制替换):
kill -USR2 旧MasterPID和kill -WINCH 旧MasterPID,可实现不停服更换 Nginx 版本。 -
日志切割:配合
logrotate工具,防止日志撑爆磁盘。
# /etc/logrotate.d/nginx
# 这是 logrotate 工具的配置文件,用于管理 Nginx 日志的轮转(切割)、归档和清理。
# 将此文件放在 /etc/logrotate.d/ 目录下,logrotate 会自动加载并执行。
/var/log/nginx/*.log { # 定义需要轮转的日志文件路径(匹配该目录下所有 .log 结尾的文件)
daily # 日志轮转周期为每天(即每天凌晨检查并执行一次切割)
missingok # 如果待轮转的日志文件不存在,不报错,直接跳过(避免 cron 任务报错)
rotate 52 # 最多保留 52 个归档文件(由于是 daily,即保留最近 52 天的日志)
compress # 对轮转下来的旧日志文件启用 gzip 压缩,大幅节省磁盘空间
delaycompress # 延迟压缩:配合 compress 使用,最新轮转出的那个归档文件暂不压缩,
# 等到下次轮转时再压缩。这给了一些调试工具(如 less、tail)查看最新归档的时间,
# 也防止 postrotate 脚本还在写入时就压缩导致冲突。
notifempty # 如果日志文件为空(大小为 0),则不执行轮转操作,避免产生空归档
create 640 www-data adm
# 轮转完成后,新建一个空的日志文件以继续写入。
# 640 是文件权限(属主读写,属组只读,其他人无权限);
# www-data 是属主(Nginx 进程运行用户);
# adm 是属组(通常用于系统监控日志组)。
postrotate # 轮转操作完成后,执行以下自定义脚本(endscript 结束)
# 检查 Nginx 的 PID 文件是否存在(/var/run/nginx.pid 是默认存储路径)
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
# 如果 PID 文件存在,则向 Nginx 主进程发送 USR1 信号。
# 信号 USR1 是 Nginx 的专用信号,作用是“重新打开日志文件”。
# 这一步至关重要:轮转已经把原日志重命名(如 access.log.1),
# 如果不发此信号,Nginx 会继续往重命名后的旧文件里写日志;
# 发送 USR1 后,Nginx 会重新打开当前路径下的 access.log(即 create 创建的新文件),
# 从而实现“切割后无缝续写”,完全不需要重启 Nginx 服务。
endscript # 自定义脚本结束标记
}
第六章:nginx.conf 全功能示例文件
它将作为一个现代 Web 应用的统一入口,涵盖静态服务、反向代理、负载均衡、HTTPS、缓存、限流、重写、WebSocket、FastCGI(PHP)、状态监控、Gzip、访问控制等主流技术。每一行都带有详尽中文注释,说明其用途和适用场景。
配置要点速览(帮助你向读者解释)
| 功能分类 | 关键指令/模块 | 作用 |
|---|---|---|
| HTTPS/SSL | listen 443 ssl http2,ssl_certificate,ssl_protocols,ssl_ciphers |
提供加密传输和 HTTP/2 支持 |
| 静态缓存 | expires 30d,add_header Cache-Control |
减少客户端重复请求,加速加载 |
| 反向代理 | proxy_pass,proxy_set_header,proxy_cache |
隐藏后端细节,实现负载均衡与缓存 |
| 负载均衡 | upstream + server 权重/健康检查 |
流量分发,提高可用性 |
| WebSocket | proxy_http_version 1.1,Upgrade / Connection |
支持实时通信 |
| PHP 解析 | location ~ \.php$ + fastcgi_pass |
对接 PHP-FPM 运行动态脚本 |
| 限流限连 | limit_req,limit_conn |
保护后端免受 CC 攻击或突发流量 |
| 访问控制 | allow / deny |
基于 IP 的权限管理 |
| URL 重写 | rewrite,return |
规范化 URL 或重定向旧链接 |
| 状态监控 | stub_status |
实时查看连接数、请求状态等 |
| Gzip | gzip on,gzip_types |
压缩文本响应,节省带宽 |
| 日志管理 | access_log,error_log |
记录访问和错误信息,便于排障 |
| 安全头 | add_header(HSTS、X-Frame-Options 等) |
提升站点安全等级 |
# ============================================================
# nginx.conf — 全功能示例(注释版)
# 适用环境:Ubuntu/Debian(APT 安装),
# 也适用于大多数 Linux 发行版(路径可能微调)。
# ============================================================
# ------------------- 1. 全局配置(Main Context) -------------------
# 指定 Nginx 运行的用户和组(通常为 www-data 或 nginx)
user www-data;
# 工作进程数,通常设置为 CPU 核心数(auto 可自动检测)
worker_processes auto;
# 错误日志存放路径及级别(可选 debug/info/notice/warn/error/crit/alert/emerg)
error_log /var/log/nginx/error.log warn;
# 主进程 PID 文件位置(供管理命令使用)
pid /var/run/nginx.pid;
# 动态加载的模块(如需额外编译的模块,在此引入)
# include /usr/share/nginx/modules/*.conf;
# ------------------- 2. 事件驱动(Events Context) -------------------
events {
# 每个工作进程最大并发连接数(根据系统 ulimit -n 调整)
worker_connections 1024;
# 使用 epoll 事件模型(Linux 最高效,其它系统可换 kqueue 等)
use epoll;
# 一次系统调用可接受多个新连接(提升性能)
multi_accept on;
}
# ------------------- 3. HTTP 核心(HTTP Context) -------------------
http {
# ---------- 基础设置 ----------
# 引入 MIME 类型映射文件(将扩展名映射为 Content-Type)
include /etc/nginx/mime.types;
# 默认 MIME 类型(如果映射表未匹配)
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(零拷贝,高性能文件传输)
sendfile on;
# 与 sendfile 配合,在数据包达到最大时才发送(减少网络包数量)
tcp_nopush on;
# 保持长连接的超时时间(秒)
keepalive_timeout 65;
# 客户端请求头缓冲大小(防止大请求头丢失)
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# 客户端请求体最大大小(限制上传文件大小,默认 1M)
client_max_body_size 20M;
# ---------- Gzip 压缩 ----------
# 启用 gzip 压缩(文本类资源压缩比极高)
gzip on;
# 最低压缩阈值(小于此大小的文件不压缩,节省 CPU)
gzip_min_length 1k;
# 压缩缓冲区大小
gzip_buffers 4 16k;
# HTTP 协议版本(1.1 以上才支持压缩)
gzip_http_version 1.1;
# 压缩级别(1~9,级别越高压缩比越大,但耗 CPU,建议 6)
gzip_comp_level 6;
# 压缩的文件类型(文本类均需压缩)
gzip_types text/plain text/css text/xml application/javascript
application/json application/xml+rss image/svg+xml;
# 对 IE6 等旧浏览器禁用 gzip(它们不支持)
gzip_disable "msie6";
# 向前端代理添加 Vary: Accept-Encoding 头部,告知缓存服务器根据编码区分
gzip_vary on;
# ---------- 代理缓存全局设置 ----------
# 定义缓存路径、级别、最大大小和失效时间
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m
max_size=1g inactive=60m use_temp_path=off;
# ---------- 限流区域定义 ----------
# 基于客户端 IP 的请求频率限流(每秒 10 个请求)
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
# 基于客户端 IP 的并发连接数限制(每个 IP 最多 20 个)
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
# ---------- 上游服务池定义(负载均衡) ----------
# 后端 API 服务器池(轮询 + 权重)
upstream api_backend {
# 默认轮询算法,可指定权重
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=2 max_fails=3 fail_timeout=30s backup; # 备用节点
}
# WebSocket 后端服务池(长连接,开启 keepalive)
upstream ws_backend {
server 192.168.1.20:8081;
server 192.168.1.21:8081;
keepalive 32; # 每个 worker 保持的空闲长连接数
}
# ---------- 虚拟主机 Server 块 ----------
# ----------------------------------------------------------------
# Server 1:HTTP(80)强制跳转到 HTTPS
# ----------------------------------------------------------------
server {
listen 80;
listen [::]:80;
server_name www.myapp.com myapp.com;
# 将所有 HTTP 请求重定向到 HTTPS(永久重定向 301)
return 301 https://$server_name$request_uri;
}
# ----------------------------------------------------------------
# Server 2:HTTPS(443)主要业务服务
# ----------------------------------------------------------------
server {
listen 443 ssl http2; # 开启 SSL 和 HTTP/2 协议
listen [::]:443 ssl http2;
server_name www.myapp.com myapp.com;
# ---------- SSL/TLS 安全配置 ----------
# 证书路径(全链证书,包含中间证书)
ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/privkey.pem; # 私钥(权限 600)
# 支持的 TLS 协议版本(禁用过时的不安全协议)
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件(优先使用现代安全套件)
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
# 优先使用服务器端定义的套件顺序(而非客户端)
ssl_prefer_server_ciphers on;
# SSL 会话缓存(提升握手效率)
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off; # 禁用 session ticket(增强前向安全性)
# 启用 OCSP Stapling(减少浏览器验证证书的延迟)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/trusted-ca-bundle.crt;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 添加安全响应头(防范常见攻击)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
# ---------- 根目录与静态文件服务 ----------
# 设置网站根目录
root /var/www/myapp/html;
# 默认首页(按顺序查找)
index index.html index.htm index.php;
# 处理静态资源(CSS/JS/图片)——设置强缓存,减轻服务器压力
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2?|ttf|eot)$ {
expires 30d; # 浏览器缓存 30 天
add_header Cache-Control "public, immutable";
access_log off; # 关闭静态资源访问日志(减少 I/O)
log_not_found off; # 不记录 404 错误
}
# 处理前端路由(SPA 单页应用):所有不存在的路径回退到 index.html
location / {
try_files $uri $uri/ /index.html;
}
# ---------- 反向代理:API 服务(负载均衡) ----------
location /api/ {
# 代理到上游负载均衡池
proxy_pass http://api_backend/api/; # 末尾带 / 表示替换路径前缀
# 引入标准代理头设置(X-Real-IP, X-Forwarded-For 等)
include proxy_params;
# 额外自定义头部
proxy_set_header X-Forwarded-Proto $scheme; # 告知后端原始协议
proxy_set_header Host $host;
# 超时设置
proxy_connect_timeout 75s;
proxy_send_timeout 75s;
proxy_read_timeout 75s;
# 启用代理缓存(使用上面定义的缓存区)
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri"; # 缓存键
proxy_cache_valid 200 302 60m; # 正常响应缓存 60 分钟
proxy_cache_valid 404 1m; # 404 缓存 1 分钟(避免频繁回源)
proxy_cache_use_stale error timeout updating http_500 http_502 http_503;
proxy_cache_background_update on; # 后台异步更新过期缓存
proxy_cache_lock on; # 防止并发回源(缓存穿透)
# 缓冲区配置(提升性能)
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# 错误时尝试下一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
}
# ---------- WebSocket 代理(长连接) ----------
location /ws/ {
proxy_pass http://ws_backend/ws/; # 此处需与后端 WebSocket 路径一致
# WebSocket 必须 HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时时间加长(默认 60s 不够)
proxy_read_timeout 300s;
proxy_connect_timeout 75s;
# 传递真实客户端信息
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
# ---------- 动态 PHP 处理(FastCGI) ----------
# 匹配所有 .php 文件请求
location ~ \.php$ {
# 注意:此处若使用 try_files 会检查文件是否存在,防止空脚本攻击
try_files $uri =404;
# FastCGI 参数设置(引入标准参数)
include fastcgi_params;
# 将请求传递给 PHP-FPM(Unix Socket 或 TCP)
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 或 127.0.0.1:9000
# 指定脚本文件名
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 超时
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
# 缓冲
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
# 缓存 FastCGI 结果(可选)
# fastcgi_cache my_cache;
# fastcgi_cache_valid 200 60m;
}
# ---------- 访问控制与限流示例 ----------
# 管理后台(/admin)限制 IP 访问 + 限流
location /admin/ {
# 仅允许内网 IP 访问(示例)
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all; # 禁止其他所有 IP
# 应用限流:每秒 5 个请求,突发 10 个排队
limit_req zone=req_limit burst=10 nodelay;
limit_conn conn_limit 10; # 每个 IP 最多 10 个并发
# 代理到后端管理服务(或直接本地目录)
proxy_pass http://api_backend/admin/;
}
# ---------- 重写规则示例 ----------
# 将旧版 URL 永久重定向到新格式(SEO)
location /old-products/ {
rewrite ^/old-products/(.*)$ /new-products/$1 permanent;
}
# 简单跳转(如 /about -> /company/about)
location = /about {
return 301 /company/about;
}
# ---------- Nginx 状态监控(需编译 stub_status 模块) ----------
location /nginx_status {
stub_status on;
access_log off;
# 仅允许内网或本机查看
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
}
# ---------- 自定义错误页面 ----------
error_page 404 /404.html;
location = /404.html {
root /var/www/myapp/html/errors;
internal; # 只能内部访问
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/myapp/html/errors;
internal;
}
}
# ----------------------------------------------------------------
# 可选的其它 Server 块(如 API 子域名、静态 CDN 等)可继续添加
# ----------------------------------------------------------------
# ---------- 包含其它配置片段(方便管理) ----------
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*; # Debian/Ubuntu 风格
}
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)