在 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
CentOS/RHEL 安装命令
sudo yum install epel-release && sudo yum install nginx -y
安装完成后,先启动服务,再设置开机自启:


sudo systemctl start nginx
sudo systemctl enable nginx
如果直接访问服务器 IP 能看到 Nginx 默认欢迎页,说明安装和服务启动基本正常。
配置虚拟主机,让域名指向站点目录
虚拟主机的作用,是让一台服务器同时承载多个域名或多个网站。常见做法是把配置文件放在 sites-available,再通过符号链接挂到 sites-enabled,由后者决定哪些站点真正生效。
创建站点配置文件
假设要为 example.com 建站,可以先创建配置文件:

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-FPM 正常联动
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 初始部署问题都能比较快定位。









