文档目录
Nginx配置

简介

本文件面向部署DouPHP项目的运维与开发者,提供基于该代码库的Nginx服务器配置指南。内容覆盖server块与location块的语法与最佳实践、URL重写规则(含正则匹配与重定向)、SSL证书与HTTPS强制跳转、反向代理(API与静态资源)、性能优化(worker进程、缓冲区、gzip等),以及负载均衡与高可用性的配置思路。所有建议均结合本项目实际的路由入口与重写行为进行说明,确保落地可操作。

项目结构

该项目采用多入口架构:

  • 前台入口:根目录 index.php,通过路由分发处理页面请求
  • API入口:/api/index.php,用于前后端分离或小程序调用
  • 后台入口:/admin/index.php,管理端点
  • 静态资源:theme、images、plugin等资源目录
  • 小程序:miniprogram目录,运行时配置位于 site.ts
graph TB
Client["客户端"] --> Nginx["Nginx 反向代理"]
Nginx --> |静态资源| Static["静态目录<br/>theme/images/plugin"]
Nginx --> |前台页面| Front["/index.php"]
Nginx --> |API接口| Api["/api/index.php"]
Nginx --> |后台管理| Admin["/admin/index.php"]

图示来源

  • index.php:1-126
  • config/config.php:36-46

章节来源

  • index.php:1-126
  • config/config.php:36-46

核心组件

  • 入口与路由:前台入口 index.php 负责初始化并派发路由;API与后台分别有独立入口
  • 重写策略:项目同时提供Apache .htaccess重写规则,便于理解Nginx rewrite映射关系
  • 运行期开关:小程序侧 site.ts 暴露 rewrite_enable,指示是否启用“伪静态”风格URL生成
  • 常量定义:config/config.php 定义了ADMIN_DIR、API_DIR、MINIPROGRAM_DIR等关键路径常量

章节来源

  • index.php:1-126
  • .htaccess:1-45
  • config/config.php:36-46
  • miniprogram/default/config/site.ts:1-16

架构总览

Nginx在本项目中承担以下职责:

  • 作为反向代理将HTTP请求转发至PHP-FPM(FastCGI)
  • 对静态资源直接返回,减少后端压力
  • 根据URL模式执行重写,将美观URL映射到index.php或api/index.php
  • 可选地开启HTTPS强制跳转与安全头
  • 在高并发场景下通过worker与缓存提升吞吐
sequenceDiagram
participant C as "客户端"
participant N as "Nginx"
participant F as "PHP-FPM"
participant I as "index.php"
participant A as "api/index.php"
C->>N : GET /product/123
N->>N : 匹配location / (非静态)
N->>F : fastcgi_pass 转发
F->>I : 解析路由并响应
Note over N,I : 若为 /api/* 则转发至 api/index.php
C-->>N : 200 OK + HTML/JSON

图示来源

  • index.php:26-44
  • .htaccess:20-27

详细组件分析

server块与location块的最佳实践

  • server块
    • 监听端口:默认80与443(HTTPS)
    • 域名:建议使用server_name绑定主域名与www子域
    • 根目录:指向项目public或根目录(取决于部署方式)
    • 错误页:自定义404/502/503等错误页,提升用户体验
  • location块
    • 静态资源:使用location ~* .(jpg|jpeg|png|gif|ico|css|js)$ 直接返回,并设置缓存头
    • PHP入口:location ~ .php$ 使用fastcgi_pass到PHP-FPM
    • 前端路由:location / 捕获所有未命中静态文件的请求,并重写到index.php
    • API路由:location /api/ 重写到/api/index.php
    • 后台路由:location /admin/ 重写到/admin/index.php
    • 安全:拒绝访问隐藏文件、敏感扩展名(如.pem、tpl、dwt等)

章节来源

  • .htaccess:1-45
  • config/config.php:36-46

URL重写规则与正则匹配

  • 项目提供的.htaccess展示了典型重写逻辑:
    • 静态入口:index.html -> index.php
    • API入口:/api/(.*) -> /api/index.php?route=$1
    • 后台入口:/admin/(.*) -> /admin/index.php?route=$1
    • 前台入口:/([^?]*) -> /index.php?route=$1
  • Nginx等价实现要点:
    • 使用if或rewrite指令匹配路径
    • 使用正则表达式捕获参数,例如 (.+)
    • 使用last或break控制重写流程
    • 避免循环重写,注意顺序与优先级
flowchart TD
Start(["请求进入"]) --> CheckStatic{"是否静态资源?"}
CheckStatic --> |是| ServeStatic["直接返回静态文件"]
CheckStatic --> |否| CheckApi{"是否 /api/* ?"}
CheckApi --> |是| ToApi["重写到 /api/index.php"]
CheckApi --> |否| CheckAdmin{"是否 /admin/* ?"}
CheckAdmin --> |是| ToAdmin["重写到 /admin/index.php"]
CheckAdmin --> |否| ToFront["重写到 /index.php"]
ToApi --> End(["结束"])
ToAdmin --> End
ToFront --> End
ServeStatic --> End

图示来源

  • .htaccess:17-45

章节来源

  • .htaccess:17-45

SSL证书与HTTPS强制重定向

  • 在server块中启用ssl,指定证书与私钥路径
  • 配置HTTP到HTTPS的301重定向,保证全站加密
  • 推荐启用HSTS、安全头(X-Frame-Options、X-Content-Type-Options等)
  • 对于API与后台,同样适用HTTPS强制策略

章节来源

  • config/config.php:36-46

反向代理配置(API与静态资源)

  • API反向代理:将/api/*转发到后端服务(如Node/Java/Python),或直接交由PHP-FPM处理
  • 静态资源:优先由Nginx直接返回,减少后端负载
  • 跨域与CORS:如需跨域,配置Access-Control-Allow-Origin等头
  • 超时与缓冲:针对大文件或长连接调整proxy_read_timeout、proxy_buffer_size等

章节来源

  • index.php:26-44
  • .htaccess:20-27

性能优化配置

  • worker进程:根据CPU核数设置worker_processes与worker_connections
  • 缓冲区:合理设置client_body_buffer_size、proxy_buffer_size、proxy_buffers
  • gzip压缩:启用gzip_types包含text/html、application/json、text/css、application/javascript
  • 缓存:对静态资源设置expires与Cache-Control,提高命中率
  • 日志:按模块拆分access_log与error_log,便于监控与分析

章节来源

  • config/config.php:36-46

负载均衡与高可用性

  • upstream:定义多个后端节点,使用轮询、权重、ip_hash等策略
  • keepalive:保持与后端的长连接,降低握手开销
  • 健康检查:结合外部工具或Nginx Plus进行主动健康检查
  • 故障转移:配置backup节点,在主节点不可用时自动切换

章节来源

  • index.php:26-44

依赖关系分析

  • 入口依赖:index.php依赖core/bootstrap.php进行框架初始化
  • 路由依赖:front路由层读取config/route.php与site.rewrite开关决定URL风格
  • 小程序依赖:miniprogram/site.ts中的rewrite_enable镜像站点重写开关,影响前端URL生成
  • 常量依赖:config/config.php中的ADMIN_DIR、API_DIR、MINIPROGRAM_DIR影响location与重写规则
graph LR
Index["index.php"] --> Bootstrap["core/bootstrap.php"]
Index --> Route["front路由层"]
Route --> ConfigRoute["config/route.php"]
Route --> SiteRewrite["site.rewrite"]
Miniprogram["miniprogram/site.ts"] --> RewriteFlag["rewrite_enable"]
Config["config/config.php"] --> Paths["ADMIN/API/MINIPROGRAM_DIR"]

图示来源

  • index.php:16-44
  • config/config.php:36-46
  • miniprogram/default/config/site.ts:12-16

章节来源

  • index.php:16-44
  • config/config.php:36-46
  • miniprogram/default/config/site.ts:12-16

性能优化建议

  • 启用HTTP/2与TLS会话复用,提升首屏速度
  • 对静态资源启用CDN缓存,减轻源站压力
  • 使用Gzip/Brotli压缩,减少传输体积
  • 调整PHP-FPM池大小与请求队列,避免瓶颈
  • 监控关键指标:QPS、延迟、错误率、缓存命中率

故障排查指南

  • 404问题:检查location / 的重写是否正确,确认index.php存在且可执行
  • 502/504问题:检查PHP-FPM状态与超时配置,确认后端服务正常
  • 权限问题:确保Nginx用户对静态资源有读权限,对上传目录有写权限
  • HTTPS问题:检查证书路径与权限,确认HTTP->HTTPS重定向生效
  • 路由异常:核对config/route.php与site.rewrite开关,确保URL风格一致

章节来源

  • .htaccess:17-45
  • index.php:26-44

结论

通过合理的Nginx配置,可以显著提升DouPHP项目的安全性、性能与可维护性。建议在生产环境启用HTTPS、静态资源缓存、gzip压缩,并根据业务流量调整worker与缓冲区参数。对于API与后台,应单独配置location与重写规则,确保路由清晰、易于扩展。

附录:Nginx站点配置示例

以下为基于本项目结构的Nginx配置要点(示意性,需结合实际部署调整):

  • server块
    • listen 80; server_name example.com www.example.com;
    • return 301 https://$host$request_uri; (HTTP->HTTPS重定向)
    • listen 443 ssl; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem;
  • location块
    • location ~* .(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public, immutable"; }
    • location /api/ { rewrite ^/api/(.*)$ /api/index.php?route=$1 last; }
    • location /admin/ { rewrite ^/admin/(.*)$ /admin/index.php?route=$1 last; }
    • location / { rewrite ^(.*)$ /index.php?route=$1 last; }
    • location ~ .php$ { fastcgi_pass unix:/run/php/php-fpm.sock; include fastcgi_params; }
  • 安全与性能
    • 禁用敏感扩展访问:deny all for .pem/.tpl/.dwt等
    • 启用gzip:gzip on; gzip_types text/plain application/json text/css application/javascript;
    • 设置超时:proxy_read_timeout 60s; client_max_body_size 50m;
添加日期:2026-10-05