前言
LNMP 是目前国内最主流的网站服务器环境架构,四个字母分别对应:
-
L:Linux 服务器操作系统(本文以国内云服务器主流的 CentOS 7.9 64 位为例,Ubuntu 用户会标注专属命令)
-
N:Nginx 高性能 Web 服务器,负责接收用户的浏览器访问请求,处理静态资源,转发动态请求
-
M:MySQL/MariaDB 数据库,用于存储网站的所有数据(比如用户账号、文章内容、商品信息)
-
P:PHP 后端脚本解释器,负责处理网站的动态业务逻辑,和数据库交互生成页面内容
工作流程:用户在浏览器输入地址 → Nginx 接收请求 → 静态图片 / 网页直接返回给用户;动态 PHP 请求转发给 PHP-FPM 处理 → PHP 调用 MySQL 读取 / 写入数据 → PHP 生成最终页面内容交给 Nginx → Nginx 返回给用户浏览器
第一部分:前置准备
1. 服务器与工具准备
(1)服务器选择
- 推荐新手直接用云服务器(阿里云、腾讯云、华为云均可),1 核 2G 配置起步,系统选择「CentOS 7.9 64 位」,自带公网 IP,搭建完成可直接访问验证,无需折腾本地网络。
- 若用本地虚拟机,VMware 安装 CentOS 7.9 即可,操作步骤完全一致。
(2)远程连接工具
推荐免费工具:FinalShell、Tabby、Xshell,安装后输入服务器的公网 IP、root 账号、密码,即可连接服务器,全程所有操作都在远程连接工具中执行。
(3)核心权限说明
本文全程使用root 超级管理员账号操作,新手无需用 sudo 切换,避免权限不足导致的安装失败。
2. 新手避坑 3 个关键操作(不做必翻车)
(1)关闭 SELinux(CentOS 专属,Ubuntu 跳过)
SELinux 是 Linux 的安全机制,新手配置不当会导致 Nginx 访问 403、PHP 文件无法解析,直接永久关闭即可(测试环境适用,生产环境可后续精细化配置)。
bash
运行
# 1. 临时关闭SELinux(立即生效,重启后失效)
setenforce 0
# 2. 永久关闭SELinux(重启服务器后永久生效)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 验证:执行后显示Permissive/Disabled即为成功
getenforce
(2)防火墙配置
新手测试环境可直接关闭防火墙,避免端口不通导致访问失败;生产环境建议仅开放所需端口。
bash
运行
# ========== CentOS用户执行 ==========
# 1. 临时关闭防火墙(立即生效,重启后失效)
systemctl stop firewalld
# 2. 永久关闭防火墙(禁止开机自启)
systemctl disable firewalld
# 验证:执行后显示inactive(dead)即为成功
systemctl status firewalld
# ========== Ubuntu用户执行 ==========
# 1. 关闭防火墙
ufw disable
# 验证:执行后显示Status: inactive即为成功
ufw status
重要补充:云服务器用户必须额外去控制台的「安全组」,放行 80(HTTP)、443(HTTPS)、3306(MySQL)端口,否则公网无法访问!
(3)更换国内 yum 源 + 更新系统
CentOS 默认的国外源下载速度极慢,甚至超时,更换为阿里云源,一键解决下载问题。
bash
运行
# ========== CentOS用户执行 ==========
# 1. 安装wget下载工具
yum install wget -y
# 2. 备份原有源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 3. 下载阿里云yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 4. 清除原有缓存,生成新缓存
yum clean all && yum makecache
# 5. 更新系统所有软件包(避免依赖缺失,耐心等待执行完成)
yum update -y
# ========== Ubuntu用户执行 ==========
# 1. 更换国内源并更新
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
apt update && apt upgrade -y
第二部分:分步搭建 LNMP 环境
搭建顺序:Nginx → MySQL/MariaDB → PHP-FPM,全程 yum/apt 一键安装,无需复杂的源码编译,新手零门槛。
第一步:安装并配置 Nginx Web 服务器
1. 安装 Nginx
CentOS 默认 yum 源的 Nginx 版本过老,我们配置 Nginx 官方源,安装稳定版。
bash
运行
# ========== CentOS用户执行 ==========
# 1. 配置Nginx官方yum源
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 2. 一键安装Nginx
yum install nginx -y
# ========== Ubuntu用户执行 ==========
apt install nginx -y
2. 启动 Nginx 并设置开机自启
bash
运行
# 1. 启动Nginx服务
systemctl start nginx
# 2. 设置开机自启(服务器重启后自动运行,无需手动启动)
systemctl enable nginx
# 3. 验证安装:执行后显示active(running)即为成功
systemctl status nginx
3. 访问验证
打开浏览器,输入你的服务器公网 IP,如果出现「Welcome to nginx!」的默认欢迎页,说明 Nginx 安装成功!
若访问失败:回头检查防火墙是否关闭、云服务器安全组是否放行 80 端口、SELinux 是否关闭。
第二步:安装并配置 MySQL/MariaDB 数据库
CentOS 7 默认 yum 源已将 MySQL 替换为 MariaDB,完全兼容 MySQL 的所有命令和功能,新手无需额外配置 MySQL 官方源,一键安装即可。
1. 安装 MariaDB
bash
运行
# ========== CentOS用户执行 ==========
# 一键安装MariaDB服务端+客户端
yum install mariadb-server mariadb -y
# ========== Ubuntu用户执行 ==========
apt install mysql-server mysql-client -y
2. 启动服务并设置开机自启
bash
运行
# ========== CentOS用户执行 ==========
# 1. 启动MariaDB服务
systemctl start mariadb
# 2. 设置开机自启
systemctl enable mariadb
# 3. 验证:执行后显示active(running)即为成功
systemctl status mariadb
# ========== Ubuntu用户执行 ==========
systemctl start mysql
systemctl enable mysql
systemctl status mysql
3. 数据库安全初始化(必做!)
刚安装的数据库有匿名用户、默认无 root 密码,存在安全风险,执行初始化命令,按提示一步步操作即可,全程我会告诉你怎么选。
bash
运行
# 执行安全初始化命令
mysql_secure_installation
执行后按以下步骤操作,新手直接照搬:
- 第一步提示
Enter current password for root (enter for none):刚安装无密码,直接按回车 - 第二步提示
Set root password? [Y/n]:设置数据库 root 密码,输入Y按回车,输入你要设置的密码(输入时屏幕不显示,正常现象,输完回车即可),再次确认密码回车 - 第三步提示
Remove anonymous users? [Y/n]:删除匿名用户,输入Y回车 - 第四步提示
Disallow root login remotely? [Y/n]:禁止 root 账号远程登录,新手测试环境可输入Y回车(生产环境必须选 Y) - 第五步提示
Remove test database and access to it? [Y/n]:删除测试数据库,输入Y回车 - 第六步提示
Reload privilege tables now? [Y/n]:刷新权限使配置生效,输入Y回车
4. 验证数据库登录
bash
运行
# 登录数据库,执行后输入你刚才设置的root密码,回车
mysql -u root -p
若出现MariaDB [(none)]> 或 mysql> 提示符,说明数据库安装配置成功!输入exit回车即可退出数据库。
第三步:安装并配置 PHP-FPM
重点说明:Nginx 本身不能直接处理 PHP 代码,需要通过PHP-FPM(PHP FastCGI 进程管理器) 来解析 PHP 动态请求,这是 LNMP 和 LAMP 环境的核心区别,新手必须记住。
CentOS 7 默认 yum 源的 PHP 版本是 5.4,过于老旧,目前主流网站程序(WordPress、Typecho 等)都要求 PHP7.4 及以上版本,我们通过国内稳定的 Remi 源安装 PHP7.4(兼容性最好,新手零踩坑)。
1. 配置 PHP 安装源
bash
运行
# ========== CentOS用户执行 ==========
# 1. 安装EPEL源(依赖包)
yum install epel-release -y
# 2. 安装Remi源
yum install https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm -y
# 3. 启用PHP7.4源(默认关闭,手动启用)
yum-config-manager --enable remi-php74
# ========== Ubuntu用户执行 ==========
# 1. 添加PHP源
apt install software-properties-common -y
add-apt-repository ppa:ondrej/php -y
apt update
2. 一键安装 PHP+PHP-FPM + 常用扩展
一次性安装网站必备的所有扩展,避免后续运行网站时提示缺失扩展。
bash
运行
# ========== CentOS用户执行 ==========
yum install php php-fpm php-mysqlnd php-gd php-curl php-mbstring php-xml php-zip php-json -y
# ========== Ubuntu用户执行 ==========
apt install php7.4 php7.4-fpm php7.4-mysql php7.4-gd php7.4-curl php7.4-mbstring php7.4-xml php7.4-zip -y
3. 启动 PHP-FPM 并设置开机自启
bash
运行
# ========== CentOS用户执行 ==========
# 1. 启动PHP-FPM服务
systemctl start php-fpm
# 2. 设置开机自启
systemctl enable php-fpm
# 3. 验证:执行后显示active(running)即为成功
systemctl status php-fpm
# ========== Ubuntu用户执行 ==========
systemctl start php7.4-fpm
systemctl enable php7.4-fpm
systemctl status php7.4-fpm
4. 关键配置:修正 PHP-FPM 运行用户
这一步是新手出现 502 Bad Gateway 错误的核心原因,必须保证 PHP-FPM 和 Nginx 的运行用户一致,否则会出现权限不足。
bash
运行
# ========== CentOS用户执行 ==========
# 1. 编辑PHP-FPM配置文件
vi /etc/php-fpm.d/www.conf
# 2. 找到以下两行,把默认的apache改成nginx(按i进入编辑模式,改完按ESC,输入:wq回车保存)
user = nginx
group = nginx
# 3. 重启PHP-FPM使配置生效
systemctl restart php-fpm
# ========== Ubuntu用户执行 ==========
# Ubuntu默认用户为www-data,Nginx默认也是www-data,无需修改,直接跳过即可
第三部分:核心配置:打通 Nginx 与 PHP
这一步是整个 LNMP 环境的核心,配置完成后,Nginx 就能正常转发 PHP 请求给 PHP-FPM 解析,实现动态网站的运行。
1. 新建 Nginx 站点配置文件
新手不要直接修改 Nginx 主配置文件,我们在专属目录新建站点配置,方便管理,出错也不影响主配置。
bash
运行
# ========== CentOS用户执行 ==========
# 新建站点配置文件
vi /etc/nginx/conf.d/default.conf
# ========== Ubuntu用户执行 ==========
vi /etc/nginx/sites-available/default
2. 写入完整的配置文件(注释拉满,小白能看懂)
按i进入编辑模式,把下面的内容完整复制进去,公网 IP / 域名记得替换成你自己的,改完按ESC,输入:wq回车保存。
nginx
server {
# 监听80端口(HTTP默认端口)
listen 80;
# 绑定你的服务器公网IP或域名,没有域名就填公网IP
server_name 你的公网IP;
# 网站根目录,所有网站文件都放在这个文件夹里
root /usr/share/nginx/html;
# 默认索引文件,优先加载index.php,其次index.html
index index.php index.html index.htm;
# 处理静态资源请求
location / {
try_files $uri $uri/ =404;
}
# 核心配置:处理所有.php结尾的PHP请求,转发给PHP-FPM处理
location ~ .php$ {
# 快速cgi参数,提升性能
fastcgi_pass 127.0.0.1:9000; # CentOS默认端口,Ubuntu用户改成:unix:/run/php/php7.4-fpm.sock
fastcgi_index index.php;
# 核心参数:指定PHP文件的路径,写错会出现File not found
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 引入Nginx默认的fastcgi参数
include fastcgi_params;
}
}
重点提醒:Ubuntu 用户必须把
fastcgi_pass的值改成unix:/run/php/php7.4-fpm.sock,否则会出现 502 错误!
3. 验证配置并重载 Nginx
新手改完配置必须先验证,再重载,避免配置错误导致 Nginx 服务崩溃。
bash
运行
# 1. 验证Nginx配置文件是否正确
nginx -t
执行后出现以下两行,说明配置完全正确:
plaintext
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
若报错,根据提示修改配置文件,直到验证通过。
bash
运行
# 2. 重载Nginx配置,使修改生效
systemctl reload nginx
第四部分:实战验证:确认 LNMP 环境全链路正常
我们分两步验证,确保 Nginx、PHP、MySQL 完全打通,环境搭建成功。
1. 验证 PHP 解析是否正常
在网站根目录新建一个 PHP 测试文件,验证 Nginx 能否正常解析 PHP 代码。
bash
运行
# 新建phpinfo.php测试文件
vi /usr/share/nginx/html/phpinfo.php
进入编辑模式,写入以下内容,保存退出:
php
运行
<?php
// 输出PHP的所有配置信息,验证解析功能
phpinfo();
?>
打开浏览器,输入http://你的公网IP/phpinfo.php,如果出现 PHP 的详细信息页面,说明Nginx 和 PHP-FPM 完全打通,PHP 解析正常!
安全提醒:验证完成后,务必执行以下命令删除这个测试文件,避免泄露服务器配置信息:
bash
运行
rm -rf /usr/share/nginx/html/phpinfo.php
2. 验证 PHP 与 MySQL 的连通性
新建测试文件,验证 PHP 能否正常连接数据库,确认整个 LNMP 环境全链路正常。
bash
运行
# 新建数据库连接测试文件
vi /usr/share/nginx/html/test_mysql.php
进入编辑模式,写入以下内容,把数据库 root 密码改成你自己设置的,保存退出:
php
运行
<?php
// 数据库连接信息
$servername = "127.0.0.1";
$username = "root";
$password = "你的数据库root密码";
// 创建连接
$conn = mysqli_connect($servername, $username, $password);
// 检测连接
if (!$conn) {
die("数据库连接失败:" . mysqli_connect_error());
}
echo "恭喜!LNMP环境全链路搭建成功,PHP与MySQL正常连通!";
// 关闭连接
mysqli_close($conn);
?>
打开浏览器,输入http://你的公网IP/test_mysql.php,如果页面显示「恭喜!LNMP 环境全链路搭建成功,PHP 与 MySQL 正常连通!」,说明你的 LNMP 环境已经 100% 搭建完成!
同样,验证完成后删除测试文件,避免安全风险:
bash
运行
rm -rf /usr/share/nginx/html/test_mysql.php
第五部分:小白必看:高频踩坑 & 排错指南
99% 的新手问题都在这里,按现象找原因,直接对应解决方案,无需到处搜教程。
表格
| 报错现象 | 核心原因 | 一键解决方案 |
|---|---|---|
| 公网 IP 访问不了 Nginx 欢迎页 | 1. 防火墙未关闭 / 端口未放行;2. 云服务器安全组未放通 80 端口;3. Nginx 未启动;4. SELinux 未关闭 | 1. 回头执行防火墙关闭命令;2. 去云控制台安全组放行 80 端口;3. 执行 systemctl start nginx 启动服务;4. 关闭 SELinux |
| 访问 PHP 文件出现 403 Forbidden | 1. 网站目录权限不足;2. Nginx 和 PHP-FPM 运行用户不一致;3. SELinux 未关闭 | 1. 执行 chown -R nginx:nginx /usr/share/nginx/html 修改目录权限;2. 确认 PHP-FPM 配置文件的用户和 Nginx 一致;3. 关闭 SELinux |
| 访问 PHP 文件出现 502 Bad Gateway | 1. PHP-FPM 服务未启动;2. fastcgi_pass 地址和 PHP-FPM 配置不一致;3. PHP-FPM 和 Nginx 用户不一致 | 1. 执行 systemctl restart php-fpm 重启服务;2. 核对 Nginx 配置里的 fastcgi_pass 地址,和 PHP-FPM 配置保持一致;3. 统一两者运行用户 |
| 访问 PHP 文件出现 File not found | 1. 网站根目录路径写错;2. fastcgi_param SCRIPT_FILENAME 参数配置错误 | 1. 核对 Nginx 配置里的 root 路径是否正确;2. 确保参数值为documentrootfastcgi_script_name,不要写错 |
| 数据库连接失败 | 1. MariaDB/MySQL 服务未启动;2. 数据库账号密码错误;3. 数据库权限配置错误 | 1. 执行 systemctl restart mariadb 重启服务;2. 核对代码里的账号密码,确认能正常登录数据库;3. 重新执行数据库安全初始化命令 |
第六部分:新手进阶可选操作
1. 绑定域名
- 去你的域名服务商控制台,添加 A 记录,把域名解析到你的服务器公网 IP;
- 修改 Nginx 配置文件里的
server_name,把公网 IP 换成你的域名; - 执行
nginx -t验证配置,systemctl reload nginx重载即可。
2. 搭建你的第一个网站
环境已经就绪,你可以直接安装主流的网站程序:
- 个人博客:WordPress、Typecho
- 企业官网:织梦 CMS、易优 CMS
- 论坛:Discuz! X只需把程序压缩包上传到网站根目录
/usr/share/nginx/html,解压后按程序的安装向导操作即可。
3. 配置 HTTPS
可以用 Let's Encrypt 免费 SSL 证书,通过 certbot 一键配置,实现 HTTPS 加密访问,提升网站安全性和搜索引擎收录。
结尾
恭喜你!跟着本文一步步操作,已经完成了从 0 到 1 的 LNMP 环境搭建,不仅实现了环境的正常运行,还搞懂了每个组件的作用和核心工作流程。
后续你可以继续深入学习 Nginx 的反向代理、负载均衡配置,MySQL 数据库的优化,PHP 的基础开发,逐步从 Linux 小白成长为运维入门选手。