第一章:引言(深度补全)

  • 为什么是 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 $hostproxy_set_header X-Real-IP $remote_addr 等标准代理头。使用 proxy_pass 时顺手 include proxy_params; 可保证后端拿到真实 IP。 ⭐⭐⭐⭐
fastcgi_params CGI 环境变量。传递 SCRIPT_FILENAMEQUERY_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 匹配优先级(重难点)

    1. = 精确匹配(最高,立即停止)

    2. ^~ 前缀匹配(若匹配,不再检查正则)

    3. ~(区分大小写正则)和 ~*(不区分)

    4. 普通前缀匹配(最长匹配原则)
      建议配图或写例子: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 http2ssl_certificatessl_protocolsssl_ciphers 提供加密传输和 HTTP/2 支持
静态缓存 expires 30dadd_header Cache-Control 减少客户端重复请求,加速加载
反向代理 proxy_passproxy_set_headerproxy_cache 隐藏后端细节,实现负载均衡与缓存
负载均衡 upstream + server 权重/健康检查 流量分发,提高可用性
WebSocket proxy_http_version 1.1Upgrade / Connection 支持实时通信
PHP 解析 location ~ \.php$ + fastcgi_pass 对接 PHP-FPM 运行动态脚本
限流限连 limit_reqlimit_conn 保护后端免受 CC 攻击或突发流量
访问控制 allow / deny 基于 IP 的权限管理
URL 重写 rewritereturn 规范化 URL 或重定向旧链接
状态监控 stub_status 实时查看连接数、请求状态等
Gzip gzip ongzip_types 压缩文本响应,节省带宽
日志管理 access_logerror_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 风格
}

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐