nginx 本身不能直接查询 mysql,必须通过后端服务(如 php)或 openresty+lua 等中间层实现:lnmp 架构中 nginx 转发 .php 请求至 php-fpm,由 php 执行 mysqli/pdo 查询并输出;openresty 则可在配置中嵌入 lua 脚本直连 mysql,但需注意连接复用与错误处理。

Nginx 本身不支持直接连接 MySQL 查询数据,它是一个高性能的 HTTP 服务器和反向代理,不具备数据库驱动能力。要实现“Nginx 对接 MySQL 实现动态网页内容查询”,必须引入中间层——通常是后端服务(如 PHP、Python)或扩展环境(如 OpenResty + Lua)。核心思路是:由 Nginx 接收请求,转发给能访问 MySQL 的程序,该程序查库、生成内容(HTML/JSON),再由 Nginx 将响应返回给用户。
方案一:LNMP 架构(推荐入门)
这是最成熟、文档丰富、运维友好的方式,适用于大多数动态网站场景(如 CMS、后台系统)。
- 安装并启动基础组件:Linux + Nginx + MySQL(或 MariaDB)+ PHP(含 php-mysql 扩展)+ php-fpm
- 配置 Nginx 将 .php 请求交给 php-fpm 处理:
在location ~ \.php$块中设置fastcgi_pass 127.0.0.1:9000,并确保include fastcgi.conf已启用 - 编写 PHP 脚本连接 MySQL:
使用mysqli_connect()或 PDO,执行 SQL 查询,用echo或模板输出 HTML - 示例片段:
$conn = new mysqli("localhost", "user", "pass", "db");<br> $result = $conn->query("SELECT title, content FROM articles WHERE id=1");<br> while($row = $result->fetch_assoc()) { echo "<h1>{$row['title']}</h1><p>{$row['content']}</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3427" title="Nginx Config Linter"><img src="https://img.php.cn/upload/skill/000/000/081/178955659937208.jpg" alt="Nginx Config Linter" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill3427" title="Nginx Config Linter" class="overflowclass">Nginx Config Linter</a> <p class="overflowclass">对 Nginx 配置文件进行语法检查、验证和安全、性能审计。</p> </div> <a rel="nofollow" href="/xiazai/skill3427" title="Nginx Config Linter" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>"; }
方案二:OpenResty + Lua(适合高并发、低延迟场景)
OpenResty 是基于 Nginx 的增强版,内置 Lua 运行时和 mysql/redis 客户端库,可直接在 Nginx 配置中嵌入 Lua 脚本查询数据库。
- 安装 OpenResty(非标准 Nginx),确保包含
lua-resty-mysql模块 - 在
nginx.conf的location块中使用content_by_lua_block: - 脚本内初始化 MySQL 连接、执行查询、调用
ngx.say()输出结果或ngx.print()渲染模板 - 注意连接复用与超时控制,避免每次请求新建连接;建议配合 connection pool 或 Redis 缓存查询结果
- 优势:减少进程间通信开销,单次请求路径更短;劣势:Lua 开发与调试门槛略高于 PHP
关键配置与避坑点
无论选哪种方案,以下细节决定成败:
- MySQL 权限:后端服务使用的数据库账号需有对应库表的 SELECT(或所需)权限,禁止 root 直连生产库
-
网络与 Socket:确认 MySQL 是否监听
127.0.0.1:3306(而非仅 socket 文件),防火墙放行端口 -
字符集统一:MySQL 连接、数据库、表、PHP/Lua 连接参数均设为
utf8mb4,避免中文乱码 -
错误处理:PHP 中开启
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);Lua 中务必检查db:connect()和db:query()的返回值 - 性能兜底:高频查询务必加索引;考虑用 Redis 缓存热数据,避免每次请求都穿透到 MySQL
为什么不建议“Nginx 直连 MySQL”?
原生 Nginx 没有数据库协议栈,强行通过第三方模块(如早期 ngx_mysql)接入不仅维护困难、功能残缺,且存在连接泄漏、事务缺失、无连接池等严重缺陷。现代实践已普遍采用“Nginx 做网关 + 后端服务做数据逻辑”的分层架构,既安全又可持续演进。










