最近更新时间:2026-06-16 17:51:51
本教程主要介绍如何在CentOS8系统中部署LNMP环境。
本案例围绕中小企业与个人用户的网站部署需求展开,核心解决公有云服务器裸机无法运行网站的问题。通过搭建 LNMP(Linux + Nginx + MySQL + PHP)环境,实现企业官网、个人博客等 Web 应用的快速上线与稳定运行。案例结合实际应用场景,梳理了从环境搭建、配置优化到网站部署的全流程,突出 LNMP 环境免费开源、轻量高效、易操作的优势,为同类用户提供可复制、可落地的实践参考。
方案架构:
KEC 实例内存不低于 2 GiB。
云服务器需配置公网 IP 与安全组,确保 KEC 实例可被外部访问。
在 KEC 实例关联的安全组中添加入方向规则,放行 TCP 协议的 80 端口(用于 HTTP 访问)。具体操作请参见添加安全组规则。
登录KEC控制台,在左侧导航栏选择实例,在页面左侧顶部选择目标资源所在的资源组和地域。
连接KEC实例,执行如下命令,将系统已有的软件包列表和软件更新到最新版本。
sudo dnf update -y用户浏览器通过公网向 KEC 实例 80 端口发起 HTTP 请求。
Nginx 作为 Web 服务器负责接收并分发请求。如果是静态资源(如 HTML、CSS、图片),直接读取并返回;如果是 PHP 脚本请求(如 .php 文件),则通过 FastCGI 协议将其转发给 PHP-FPM 处理。
PHP-FPM(FastCGI Process Manager)接收并执行 PHP 代码。如果需要与数据库交互,会连接到 MySQL 数据库。
MySQL 负责存储和管理数据,执行 PHP 脚本发来的 SQL 查询,并将结果返回给 PHP-FPM。
PHP-FPM 将执行结果生成 HTML 内容,返回给 Nginx,最终由 Nginx 发送给用户浏览器。
连接KEC实例,添加 Nginx 官方源并安装。
sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
sudo dnf -y install nginx启动并设置开机自启。
enable --now 参数会同时完成启动服务和设置开机自启两个操作。
sudo systemctl enable --now nginx验证 Nginx 服务。
执行 curl http://127.0.0.1,如果终端输出了 Nginx 的欢迎页 HTML 代码,说明安装成功。
添加 MySQL 8.4 YUM 仓库并安装。
sudo rpm -Uvh https://repo.mysql.com/mysql84-community-release-el8-1.noarch.rpm
sudo dnf install -y mysql-server启动并设置开机自启。
sudo systemctl enable --now mysqld获取初始 root 密码。获取的密码用于后续步骤重置密码。
sudo grep 'temporary password' /var/log/mysqld.log执行 sudo mysql_secure_installation,运行加固脚本,根据提示完成以下配置:
重置 root 账号密码:使用上一步获取的临时密码登录并设置新密码。
建议设置包含大小写字母、数字和特殊符号,且长度不低于 12 位的强密码。
移除匿名用户:输入 Y。
禁止 root 远程登录:输入 Y。
删除测试库:输入 Y。
重载权限表:输入 Y。
添加 PHP 源并安装。
cat > /etc/yum.repos.d/remi.repo << 'EOF'
[remi]
name=Remi\'s RPM Repository for Enterprise Linux 8 - x86_64
baseurl=https://rpms.remirepo.net/enterprise/8/remi/x86_64/
enabled=1
gpgcheck=1
gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
[remi-safe]
name=Remi Safe Repository
baseurl=https://rpms.remirepo.net/enterprise/8/safe/x86_64/
enabled=1
gpgcheck=1
gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
EOF
rpm --import https://rpms.remirepo.net/RPM-GPG-KEY-remi2024
dnf install -y php php-fpm php-mysqlnd启动并设置 PHP-FPM 开机自启。
sudo systemctl enable --now php-fpm默认情况下,Nginx 仅能处理静态网页(如 HTML、图片)。为支持动态网站(如 WordPress),需配置 Nginx 将 .php 文件的请求转发至 PHP-FPM 进行处理。否则,访问 PHP 页面时会出现文件被直接下载或无法显示的问题。
备份 Nginx 配置文件。
sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak获取 PHP 服务的通信地址。Nginx 通过该通信地址将 PHP 请求转发至 PHP-FPM 进行处理。
PHP_FPM_LISTEN=$(sudo sed -n 's/^\s*listen\s*=\s*//p' /etc/php-fpm.d/www.conf | head -n 1)
echo "$PHP_FPM_LISTEN"配置 Nginx 转发规则。根据上一步的输出结果,将 <PHP通信地址> 替换为实际通信地址后执行。
若输出为文件路径(如 /run/php-fpm/www.sock):通信方式为 Unix Socket,仅限本地通信,性能更好且更安全。PHP 通信地址格式为 unix:文件路径,例如 unix:/run/php-fpm/www.sock。
若输出为 IP:端口(如 127.0.0.1:9000):通信方式为 TCP,支持跨主机通信,适用于 PHP-FPM 与 Nginx 分离部署的场景,可以直接作为 PHP 通信地址。
sudo tee /etc/nginx/conf.d/default.conf <<-'EOF'
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass <PHP通信地址>;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
EOF执行 sudo nginx -t 检查配置文件。
如果返回结果中包含关键字 successful,表示配置正确。
如果返回结果中包含 failed,表示配置错误。请检查命令中的路径是否替换正确,或执行以下命令从备份中恢复:
sudo mv /etc/nginx/conf.d/default.conf.bak /etc/nginx/conf.d/default.conf重启 Nginx 使配置生效。
sudo systemctl restart nginx创建测试文件,验证 Nginx 能否解析 PHP,以及 PHP 能否连接到 MySQL 数据库,确保 LNMP 各组件协同工作正常。
创建测试文件,生成包含 phpinfo() 函数的文件,用于输出当前 PHP 环境的详细配置。
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.php浏览器验证:访问 http://<KEC公网IP>/phpinfo.php。
成功标志:页面正常渲染并展示 PHP 环境配置信息。
失败标志:显示 File not found 或直接下载了文件。
清理测试文件。
验证成功后必须删除该文件。phpinfo 页面包含敏感信息,暴露于公网会带来安全风险。
sudo rm -f /usr/share/nginx/html/phpinfo.php创建数据库和用户。
使用 root 账户登录 MySQL:
sudo mysql -u root -p在 mysql> 提示符下执行以下命令,创建名为 webapp 的库和 webuser 用户,并授予其对该数据库的所有权限:
请将 <YourPassword> 替换为一个强密码。
CREATE DATABASE webapp;
CREATE USER 'webuser'@'localhost' IDENTIFIED BY '<YourPassword>';
GRANT ALL PRIVILEGES ON webapp.* TO 'webuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;创建数据库连接测试文件。将 <YourPassword> 替换为上一步设置的用户密码后执行:
sudo tee /usr/share/nginx/html/test.php <<-'EOF'
<?php
$servername = "localhost";
$username = "webuser";
$password = "<YourPassword>";
$dbname = "webapp";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("数据库连接失败: " . $conn->connect_error);
}
echo "数据库连接成功!";
?>
EOF浏览器验证:访问 http://<KEC公网IP>/test.php。当页面显示 数据库连接成功! 表示测试通过。
清理测试文件:该脚本内包含明文的数据库账号密码,测试通过后必须立即删除,防止凭据泄露。
sudo rm -f /usr/share/nginx/html/test.php纯净模式
