LNMP 中 Nginx 如何设置:从虚拟主机到 PHP-FPM 联动的完整梳理

程一诺
程一诺
发布时间:2026-08-24| 56人浏览过
原创

前言

在 LNMP 架构里,Nginx 不只是一个 Web 服务器,它还负责把静态资源、PHP 请求和站点入口组织起来。很多部署问题看起来像是“网站打不开”,实际往往出在虚拟主机、PHP-FPM socket 路径、目录权限或重载流程上。下面按部署顺序把这套配置拆开讲清楚,方便你直接落地,也能知道每一步该检查什么。

在 LNMP 架构里,Nginx 不只是一个 Web 服务器,它还负责把静态资源、PHP 请求和站点入口组织起来。很多部署问题看起来像是“网站打不开”,实际往往出在虚拟主机、PHP-FPM socket 路径、目录权限或重载流程上。下面按部署顺序把这套配置拆开讲清楚,方便你直接落地,也能知道每一步该检查什么。

安装并启动 Nginx

不同 Linux 发行版的安装命令略有差异,但核心思路一致。Debian/Ubuntu 系通常使用 apt,CentOS/RHEL 系使用 yum。

Debian/Ubuntu 安装命令

sudo apt update && sudo apt install nginx -y
sudo yum install epel-release && sudo yum install nginx -y

安装完成后,先启动服务,再设置开机自启:

Nginx 与 PHP-FPM 联动检查图,展示请求转发、socket 一致性与服务重启顺序
PHP-FPM 联动检查要点动态页面访问异常时,最值得优先核对的是 PHP-FPM 安装状态、listen。
Nginx 虚拟主机配置结构图,展示 server_name、root、PHP 转发与配置生效流程
虚拟主机配置结构与生效路径用一张结构图看清虚拟主机配置里最容易出错的几个位置,以及配置文件从编写到启用、生效的关系。
sudo systemctl start nginx
sudo systemctl enable nginx

如果直接访问服务器 IP 能看到 Nginx 默认欢迎页,说明安装和服务启动基本正常。

配置虚拟主机,让域名指向站点目录

虚拟主机的作用,是让一台服务器同时承载多个域名或多个网站。常见做法是把配置文件放在 sites-available,再通过符号链接挂到 sites-enabled,由后者决定哪些站点真正生效。

创建站点配置文件

假设要为 example.com 建站,可以先创建配置文件:

LNMP 上线前检查清单图,展示防火墙、HTTPS、压缩缓存与结果验证
上线前安全与性能检查清单把公网访问、证书、压缩缓存和最终验证串起来,适合上线前做一次快速核对。
sudo nano /etc/nginx/sites-available/example.com

写入一份基础可用的 server 配置:

server {
    listen 80;
    server_name example.com www.example.com;  # 域名,多个用空格分隔
    root /var/www/example.com;                # 网站根目录,需手动创建
    index index.php index.html index.htm;     # 默认索引文件

    # 静态文件处理:尝试匹配文件,不存在则返回404
    location / {
        try_files $uri $uri/ =404;
    }

    # PHP处理:转发至PHP-FPM(关键配置)
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;  # PHP-FPM socket路径,需与版本匹配
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 禁止访问.htaccess等敏感文件
    location ~ /\.ht {
        deny all;
    }
}

这一步有三个地方最容易出错:

  • server_name 要和域名解析记录保持一致,域名也要先在 DNS 服务商处指向服务器 IP。
  • root 指向的网站目录必须真实存在,且 Nginx 运行用户通常需要具备读取权限;文中提到常见用户为 www-data。
  • fastcgi_pass 指向的 socket 路径必须和本机 PHP-FPM 实际监听路径一致。

如果不确定 socket 在哪里,可以直接查找:

sudo find / -name "*.sock"

启用虚拟主机配置

配置文件写好后,通过符号链接启用站点:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

测试配置并重载服务

不要直接重启,先做语法检查:

sudo nginx -t

如果输出里包含 syntax is ok,再执行重载:

sudo systemctl reload nginx

这一套顺序能避免因为单个配置错误把正在运行的网站一起带挂。

Nginx 本身不会执行 PHP 代码,它只负责把 .php 请求转交给 PHP-FPM。也就是说,站点能否正常跑动态页面,关键就在于两边的监听配置是否一致。

安装 PHP-FPM 和数据库扩展

  • Debian/Ubuntu:
sudo apt install php-fpm php-mysql -y
  • CentOS/RHEL:
sudo yum install php php-fpm php-mysqlnd -y

检查 PHP-FPM 的监听配置

PHP-FPM 的 pool 配置文件通常位于:

sudo nano /etc/php/8.2/fpm/pool.d/www.conf

重点查看其中的 listen 指令,确认它和 Nginx 配置里的 fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; 完全一致。这里哪怕只差一个版本号,Nginx 转发也会失败。

重启并启用 PHP-FPM

sudo systemctl restart php8.2-fpm
sudo systemctl enable php8.2-fpm

完成后,Nginx 和 PHP-FPM 的请求链路才算真正打通。

为动态站点准备 MySQL 数据库

如果部署的是 WordPress、Laravel 等动态应用,除了 Web 服务和 PHP 解析,数据库也要提前准备好。这里的重点不是 Nginx 本身,而是 LNMP 整体运行所依赖的数据层。

安装 MySQL 或 MariaDB

  • Debian/Ubuntu:
sudo apt install mysql-server -y
  • CentOS/RHEL:
sudo yum install mariadb-server -y

执行安全初始化

sudo mysql_secure_installation

这个脚本会引导完成 root 密码设置、匿名用户移除、禁止 root 远程登录等基础加固,是数据库上线前的常规步骤。

创建数据库和业务用户

先登录 MySQL:

sudo mysql -u root -p

然后执行以下 SQL:

CREATE DATABASE example_db;  -- 创建数据库
CREATE USER 'example_user'@'localhost' IDENTIFIED BY 'StrongPassword123';  -- 创建用户
GRANT ALL PRIVILEGES ON example_db.* TO 'example_user'@'localhost';  -- 授权
FLUSH PRIVILEGES;  -- 刷新权限
EXIT;

后续应用只需要使用这个普通业务账号连接数据库,不必直接使用 root。

补上 HTTPS、缓存和防火墙等关键配置

基础可用不代表适合直接上线。真正面向公网时,至少还应把防火墙、HTTPS 和静态资源优化补齐。

放行 HTTP 和 HTTPS 端口

以 UFW 为例:

sudo ufw allow 'Nginx Full'
sudo ufw enable

如果防火墙未放通 80 和 443,Nginx 本身配置正确,站点也可能依然无法从外网访问。

使用 Certbot 配置 HTTPS

Let’s Encrypt 是当前最常见的免费证书方案。Debian/Ubuntu 下可直接安装:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com

按提示完成后,Certbot 通常会自动安装证书,并改写 Nginx 配置实现 HTTPS 跳转。

启用 Gzip 与静态缓存

压缩和缓存是最直接的性能优化手段,尤其适合 CSS、JS、图片等静态资源。

在 http 块中启用 Gzip:

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

在对应的 location 块中设置静态资源缓存:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public";
}

另外,还可以在 nginx.conf 的 events 块中调整 worker_connections。文中给出的常见参考值是 1024,实际仍要结合服务器内存和并发情况评估。

上线前怎么验证配置是否真的生效

部署完成后,建议分别验证静态资源和 PHP 动态解析,这样更容易定位问题到底出在 Nginx 还是 PHP-FPM。

验证静态文件服务

在 /var/www/example.com 下放一个 index.html,然后访问 http://example.com。如果页面可以正常显示,说明站点目录映射和静态文件服务已打通。

验证 PHP 解析链路

在同一目录下创建 info.php,内容如下:

<?php phpinfo(); ?>

访问 http://example.com/info.php。如果能看到 PHP 信息页面,说明 Nginx 到 PHP-FPM 的转发已经生效。

遇到问题优先排查什么

如果页面打不开或 PHP 无法执行,优先回头检查这几项:

  • Nginx 配置是否已经通过 sudo nginx -t。
  • sites-enabled 中是否已正确建立符号链接。
  • fastcgi_pass 与 PHP-FPM 的 listen 是否完全一致。
  • 站点根目录是否存在,以及 Nginx 用户是否具备访问权限。

把这些基础项核对清楚,大多数 LNMP 初始部署问题都能比较快定位。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。