CentOS Stream 9 使用 LNMP 架构部署网站 ------ 语法详解与实战案例
一、了解 LNMP 架构
1.1 LNMP 是什么?
LNMP 是一套用于部署动态网站的开源 Web 服务架构组合,由以下组件组成:
| 组件 | 作用 |
|---|---|
| Linux | 操作系统(CentOS Stream 9) |
| Nginx | 高性能 Web 服务器 / 反向代理服务器 |
| MariaDB | 关系型数据库(MySQL 的开源分支) |
| PHP | 服务端脚本语言,用于动态网页处理 |
✅ 优势:
- 高并发、低内存占用(Nginx)
- 开源免费、社区活跃
- 支持 WordPress、Drupal、Laravel 等主流 CMS 和框架
1.2 Nginx 是什么?
Nginx 是轻量级、高性能的 HTTP 服务器和反向代理服务器,支持高并发连接。
- 默认端口:80(HTTP)、443(HTTPS)
- 配置文件路径:
/etc/nginx/nginx.conf - 站点配置目录:
/etc/nginx/conf.d/或/etc/nginx/sites-enabled/ - 服务管理命令:
systemctl start|stop|restart|status nginx
1.3 MySQL、MariaDB 是什么?
MariaDB 是 MySQL 的一个开源分支,完全兼容 MySQL 协议和语法,由原 MySQL 作者维护。
- 默认端口:3306
- 配置文件:
/etc/my.cnf或/etc/mysql/mariadb.conf.d/ - 管理工具:
mysql命令行客户端、phpMyAdmin(可选)
1.4 PHP 是什么?
PHP(Hypertext Preprocessor)是一种广泛用于 Web 开发的服务器端脚本语言。
- 通过 PHP-FPM(FastCGI Process Manager)与 Nginx 通信
- 配置文件:
/etc/php.ini、/etc/php-fpm.d/www.conf - 常用扩展:
php-mysqlnd、php-gd、php-mbstring、php-xml、php-curl
1.5 LNMP 架构工作原理
用户浏览器
↓ HTTP 请求
Nginx(Web服务器)
↓ .php 请求 → 通过 FastCGI 协议
PHP-FPM(处理PHP脚本)
↓ 数据库查询
MariaDB(存储数据)
↑ 返回结果
PHP-FPM → Nginx → 浏览器
✅ 流程说明:
- Nginx 接收用户请求
- 若请求的是
.php文件,Nginx 通过fastcgi_pass转发给 PHP-FPM- PHP-FPM 解析执行 PHP 脚本,如需数据库操作,则连接 MariaDB
- 最终结果返回给 Nginx,再返回给用户浏览器
1.6 LNMP 架构部署方式
三种主流部署方式:
| 方式 | 说明 | 适用场景 |
|---|---|---|
| YUM/DNF 安装 | 使用系统包管理器安装,简单稳定 | 生产环境推荐 |
| 源码编译安装 | 自定义模块、优化性能 | 高级用户、定制需求 |
| 一键安装脚本 | 如 LNMP.org 提供的脚本 | 快速部署、新手友好 |
✅ 本文采用 DNF 安装方式(CentOS Stream 9 默认包管理器)
二、安装与配置 Nginx 服务器
2.1 安装 Nginx 软件包
bash
# 更新系统
sudo dnf update -y
# 安装 EPEL 仓库(提供额外软件包)
sudo dnf install epel-release -y
# 安装 Nginx
sudo dnf install nginx -y
# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
# 防火墙放行 HTTP/HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
# 验证安装
curl http://localhost
# 应看到 "Welcome to nginx!" 页面
✅ 案例:检查 Nginx 状态和版本
bash
# 查看服务状态
systemctl status nginx
# 查看版本信息
nginx -v
# 输出示例:nginx version: nginx/1.20.1
# 测试配置文件语法
sudo nginx -t
# 成功输出:nginx: configuration file /etc/nginx/nginx.conf test is successful
2.2 熟悉 Nginx 的配置文件
主配置文件:
/etc/nginx/nginx.conf
nginx
# 全局块
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# 事件块
events {
worker_connections 1024;
}
# HTTP 块
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf; # 加载站点配置
}
✅ 关键配置说明:
| 配置项 | 说明 |
|---|---|
user nginx; |
Nginx 运行用户 |
worker_processes auto; |
自动设置工作进程数 |
include /etc/nginx/conf.d/*.conf; |
包含站点配置文件 |
✅ 站点配置文件模板(
/etc/nginx/conf.d/your_site.conf)
nginx
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/html;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
# PHP 支持(后续章节配置)
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 拒绝访问隐藏文件
location ~ /\. {
deny all;
}
}
✅ 案例:创建测试站点并验证
bash
# 创建网站根目录
sudo mkdir -p /var/www/html/test
# 创建测试页面
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/test/info.php
echo "Hello from Nginx!" | sudo tee /var/www/html/test/index.html
# 创建站点配置
sudo tee /etc/nginx/conf.d/test.conf << 'EOF'
server {
listen 80;
server_name localhost;
root /var/www/html/test;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
# 重载 Nginx
sudo nginx -t && sudo systemctl reload nginx
# 测试访问
curl http://localhost/index.html
curl http://localhost/info.php # 需要 PHP 支持(后续安装)
三、安装 MariaDB 数据库
3.1 安装并初始设置 MariaDB
bash
# 安装 MariaDB 服务器和客户端
sudo dnf install mariadb-server mariadb -y
# 启动并设置开机自启
sudo systemctl start mariadb
sudo systemctl enable mariadb
# 运行安全初始化脚本(设置 root 密码、移除匿名用户等)
sudo mysql_secure_installation
🎯 初始化过程交互示例:
Enter current password for root (enter for none): [直接回车]
Set root password? [Y/n] Y
New password: your_strong_password
Re-enter new password: your_strong_password
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
3.2 初始化并登录 MariaDB
bash
# 登录数据库(使用密码)
mysql -u root -p
# 或使用 socket 登录(无需密码,需 root 权限)
sudo mysql
✅ 案例:登录并查看数据库
bash
sudo mysql -e "SHOW DATABASES;"
# 输出:
# +--------------------+
# | Database |
# +--------------------+
# | information_schema |
# | mysql |
# | performance_schema |
# +--------------------+
3.3 管理 MariaDB
常用 SQL 命令:
sql
-- 创建数据库
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户并授权
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
-- 查看用户权限
SHOW GRANTS FOR 'wpuser'@'localhost';
-- 删除数据库(谨慎!)
DROP DATABASE wordpress;
-- 退出
EXIT;
✅ 案例:自动化创建 WordPress 数据库和用户
bash
#!/bin/bash
# 文件名:create_wp_db.sh
DB_NAME="wordpress"
DB_USER="wpuser"
DB_PASS="StrongPassword123!"
# 检查是否已存在
if sudo mysql -e "SHOW DATABASES LIKE '$DB_NAME';" | grep -q "$DB_NAME"; then
echo "❌ 数据库 $DB_NAME 已存在!"
exit 1
fi
# 创建数据库和用户
sudo mysql << EOF
CREATE DATABASE $DB_NAME DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';
GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost';
FLUSH PRIVILEGES;
EOF
if [ $? -eq 0 ]; then
echo "✅ 数据库 $DB_NAME 和用户 $DB_USER 创建成功!"
else
echo "❌ 创建失败!"
exit 1
fi
💡 使用:
bash
chmod +x create_wp_db.sh
sudo ./create_wp_db.sh
四、安装配置 PHP 环境
4.1 安装 PHP 环境
CentOS Stream 9 默认 PHP 版本较低,建议启用 Remi 仓库 安装新版 PHP(如 8.1/8.2)。
bash
# 安装 Remi 仓库
sudo dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-9.rpm -y
# 启用 PHP 8.2 模块
sudo dnf module reset php -y
sudo dnf module enable php:remi-8.2 -y
# 安装 PHP 及常用扩展
sudo dnf install php php-cli php-fpm php-mysqlnd php-gd php-mbstring php-xml php-curl php-zip -y
# 启动 PHP-FPM 并设置开机自启
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
# 验证安装
php -v
# 输出示例:PHP 8.2.12 (cli) ...
4.2 配置 PHP-FPM 服务
配置文件:
/etc/php-fpm.d/www.conf
ini
; 运行用户和组
user = nginx
group = nginx
; 监听方式(推荐 socket,性能更好)
listen = /run/php-fpm/www.sock
; 权限设置
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
; 进程管理
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
✅ 修改后重载服务:
bash
# 检查配置语法
sudo php-fpm -t
# 重载服务
sudo systemctl reload php-fpm
# 检查 socket 文件是否存在
ls -l /run/php-fpm/www.sock
# 应显示:srw-rw----. 1 nginx nginx ...
4.3 配置 Nginx 服务器对 PHP 程序的支持
在站点配置中添加 PHP 处理规则(前面已展示):
nginx
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
✅ 完整测试配置(
/etc/nginx/conf.d/php_test.conf)
nginx
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
✅ 测试 PHP 是否正常工作:
bash
# 创建测试文件
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
# 重载 Nginx
sudo nginx -t && sudo systemctl reload nginx
# 本地测试
curl -s http://localhost/info.php | grep "PHP Version"
# 应输出包含 PHP 版本的信息
# 浏览器访问:http://your_server_ip/info.php
五、部署基于 LNMP 的 WordPress 博客网站
5.1 安装 WordPress
bash
# 进入网站根目录
cd /var/www/html
# 下载最新版 WordPress(中文版)
sudo curl -O https://cn.wordpress.org/latest-zh_CN.tar.gz
# 解压
sudo tar -xzf latest-zh_CN.tar.gz
# 移动文件到当前目录
sudo mv wordpress/* ./
# 删除临时文件
sudo rm -rf wordpress latest-zh_CN.tar.gz
# 设置权限(Nginx 用户可读写)
sudo chown -R nginx:nginx /var/www/html
sudo chmod -R 755 /var/www/html
sudo mkdir -p /var/www/html/wp-content/uploads
sudo chmod -R 775 /var/www/html/wp-content/uploads
5.2 为 WordPress 创建 MariaDB 数据库环境
使用前面创建的数据库和用户(
wordpress/wpuser/StrongPassword123!)
✅ 若未创建,运行:
bash
sudo mysql -e "
CREATE DATABASE IF NOT EXISTS wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'wpuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
"
5.3 配置 WordPress
WordPress 会通过 Web 界面引导配置,但也可手动创建
wp-config.php:
bash
# 复制配置文件模板
sudo cp wp-config-sample.php wp-config.php
# 编辑配置文件
sudo nano wp-config.php
修改以下部分:
php
<?php
define('DB_NAME', 'wordpress'); // 数据库名
define('DB_USER', 'wpuser'); // 数据库用户
define('DB_PASSWORD', 'StrongPassword123!'); // 密码
define('DB_HOST', 'localhost'); // 数据库主机
// 生成唯一密钥(从 https://api.wordpress.org/secret-key/1.1/salt/ 获取)
define('AUTH_KEY', 'put your unique phrase here');
define('SECURE_AUTH_KEY', 'put your unique phrase here');
define('LOGGED_IN_KEY', 'put your unique phrase here');
define('NONCE_KEY', 'put your unique phrase here');
define('AUTH_SALT', 'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT', 'put your unique phrase here');
define('NONCE_SALT', 'put your unique phrase here');
$table_prefix = 'wp_'; // 表前缀(可自定义提高安全性)
define('WP_DEBUG', false); // 生产环境关闭调试
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');
require_once(ABSPATH . 'wp-settings.php');
✅ 自动生成密钥(命令行):
bash
curl -s https://api.wordpress.org/secret-key/1.1/salt/
# 复制输出内容,替换 wp-config.php 中的对应部分
5.4 配置基于 IP 地址的 Nginx 虚拟主机
若无域名,可直接使用服务器 IP 访问。
创建站点配置文件:/etc/nginx/conf.d/wordpress.conf
nginx
server {
listen 80;
server_name _; # 匹配任意主机名(或替换为你的服务器IP)
root /var/www/html;
index index.php index.html index.htm;
# 日志
access_log /var/log/nginx/wordpress_access.log;
error_log /var/log/nginx/wordpress_error.log;
# WordPress 伪静态规则(固定链接支持)
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP 处理
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静态文件缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# 禁止访问敏感文件
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
location ~ /\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
}
✅ 重载 Nginx:
bash
sudo nginx -t && sudo systemctl reload nginx
5.5 通过 Web 界面完成 WordPress 配置
浏览器访问:
http://your_server_ip
将看到 WordPress 安装向导:
- 选择语言 → 简体中文
- 填写站点信息:
- 站点标题:我的博客
- 用户名:admin(建议修改)
- 密码:自定义强密码
- 邮箱:your@email.com
- 点击"安装 WordPress"
- 安装成功 → 登录后台:
http://your_server_ip/wp-admin
✅ 安全建议:
- 修改默认用户名(不要用 admin)
- 安装安全插件(如 Wordfence)
- 定期备份数据库和文件
- 启用 HTTPS(见综合案例)
六、综合案例
🎯 综合案例 1:一键部署 WordPress 脚本(全自动)
功能:自动安装 LNMP + WordPress + 创建数据库 + 配置虚拟主机
bash
#!/bin/bash
# 文件名:deploy_wordpress.sh
# 用法:sudo ./deploy_wordpress.sh
# ===== 配置参数 =====
DOMAIN="_" # 使用 IP 访问,或替换为你的域名
WP_DB="wordpress"
WP_USER="wpuser"
WP_PASS="StrongPassword123!"
WP_TITLE="我的博客"
WP_ADMIN="admin"
WP_ADMIN_PASS="AdminPass123!"
WP_ADMIN_EMAIL="admin@example.com"
WP_PATH="/var/www/html"
# ===== 颜色定义 =====
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}"
}
error() {
echo -e "${RED}[ERROR] $1${NC}" >&2
exit 1
}
# ===== 1. 安装 Nginx =====
log "正在安装 Nginx..."
sudo dnf install epel-release -y
sudo dnf install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload
# ===== 2. 安装 MariaDB =====
log "正在安装 MariaDB..."
sudo dnf install mariadb-server -y
sudo systemctl start mariadb
sudo systemctl enable mariadb
# 安全初始化(非交互式)
log "正在初始化 MariaDB..."
sudo mysql_secure_installation <<EOF
y
$WP_ADMIN_PASS
$WP_ADMIN_PASS
y
y
y
y
EOF
# ===== 3. 安装 PHP 8.2 =====
log "正在安装 PHP 8.2..."
sudo dnf install dnf-utils -y
sudo dnf install http://rpms.remirepo.net/enterprise/remi-release-9.rpm -y
sudo dnf module reset php -y
sudo dnf module enable php:remi-8.2 -y
sudo dnf install php php-cli php-fpm php-mysqlnd php-gd php-mbstring php-xml php-curl php-zip -y
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
# 修改 PHP-FPM 用户为 nginx
sudo sed -i 's/user = apache/user = nginx/' /etc/php-fpm.d/www.conf
sudo sed -i 's/group = apache/group = nginx/' /etc/php-fpm.d/www.conf
sudo systemctl reload php-fpm
# ===== 4. 创建数据库 =====
log "正在创建 WordPress 数据库..."
sudo mysql -u root -p"$WP_ADMIN_PASS" <<EOF
CREATE DATABASE IF NOT EXISTS $WP_DB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS '$WP_USER'@'localhost' IDENTIFIED BY '$WP_PASS';
GRANT ALL PRIVILEGES ON $WP_DB.* TO '$WP_USER'@'localhost';
FLUSH PRIVILEGES;
EOF
# ===== 5. 下载并配置 WordPress =====
log "正在下载 WordPress..."
cd /tmp
curl -O https://cn.wordpress.org/latest-zh_CN.tar.gz
tar -xzf latest-zh_CN.tar.gz
log "正在部署 WordPress 文件..."
sudo rm -rf $WP_PATH/*
sudo mv wordpress/* $WP_PATH/
sudo chown -R nginx:nginx $WP_PATH
sudo chmod -R 755 $WP_PATH
sudo mkdir -p $WP_PATH/wp-content/uploads
sudo chmod -R 775 $WP_PATH/wp-content/uploads
# 生成 wp-config.php
log "正在生成 wp-config.php..."
cd $WP_PATH
sudo cp wp-config-sample.php wp-config.php
# 获取安全密钥
SECRET_KEYS=$(curl -s https://api.wordpress.org/secret-key/1.1/salt/)
# 替换配置
sudo sed -i "s/database_name_here/$WP_DB/" wp-config.php
sudo sed -i "s/username_here/$WP_USER/" wp-config.php
sudo sed -i "s/password_here/$WP_PASS/" wp-config.php
sudo sed -i "s/localhost/localhost/" wp-config.php
# 插入安全密钥(删除原有8行,插入新密钥)
sudo sed -i "/AUTH_KEY/,/NONCE_SALT/d" wp-config.php
LINE_NUM=$(grep -n "table_prefix" wp-config.php | cut -d: -f1)
sudo sed -i "${LINE_NUM}i $SECRET_KEYS" wp-config.php
# ===== 6. 配置 Nginx 虚拟主机 =====
log "正在配置 Nginx 虚拟主机..."
sudo tee /etc/nginx/conf.d/wordpress.conf > /dev/null <<EOF
server {
listen 80;
server_name $DOMAIN;
root $WP_PATH;
index index.php index.html index.htm;
access_log /var/log/nginx/wordpress_access.log;
error_log /var/log/nginx/wordpress_error.log;
location / {
try_files \$uri \$uri/ /index.php?\$args;
}
location ~ \\.php\$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
location ~* \\.(js|css|png|jpg|jpeg|gif|ico|svg)\$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
location ~* /(?:uploads|files)/.*\\.php\$ {
deny all;
}
location ~ /\\.ht {
deny all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
}
EOF
# 测试并重载 Nginx
sudo nginx -t && sudo systemctl reload nginx
# ===== 7. 通过 WP-CLI 完成安装(可选)=====
# 如果安装了 wp-cli,可自动完成安装
if command -v wp &> /dev/null; then
log "正在通过 WP-CLI 完成安装..."
cd $WP_PATH
sudo -u nginx wp core install \
--url="http://$DOMAIN" \
--title="$WP_TITLE" \
--admin_user="$WP_ADMIN" \
--admin_password="$WP_ADMIN_PASS" \
--admin_email="$WP_ADMIN_EMAIL" \
--skip-email
fi
log "🎉 WordPress 部署完成!"
echo -e "${YELLOW}请访问:http://$(hostname -I | awk '{print $1}')${NC}"
echo -e "${YELLOW}后台:http://$(hostname -I | awk '{print $1}')/wp-admin${NC}"
echo -e "${YELLOW}用户名:$WP_ADMIN${NC}"
echo -e "${YELLOW}密码:$WP_ADMIN_PASS${NC}"
💡 使用方法:
bash
chmod +x deploy_wordpress.sh
sudo ./deploy_wordpress.sh
⚠️ 注意:
- 此脚本为全自动部署,适合测试环境
- 生产环境请修改密码、域名、路径等参数
- 建议部署后立即修改默认用户名和密码
🎯 综合案例 2:为 WordPress 配置 HTTPS(Let's Encrypt 免费证书)
使用 Certbot 自动申请和配置 SSL 证书
bash
# 安装 Certbot 和 Nginx 插件
sudo dnf install certbot python3-certbot-nginx -y
# 申请证书(替换 yourdomain.com 为你的域名)
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
# 自动续期(Certbot 已自动配置 systemd 定时任务)
sudo systemctl list-timers | grep certbot
# 手动测试续期
sudo certbot renew --dry-run
# 修改 WordPress 配置强制 HTTPS
# 在 wp-config.php 中添加:
# define('FORCE_SSL_ADMIN', true);
# define('WP_HOME','https://yourdomain.com');
# define('WP_SITEURL','https://yourdomain.com');
✅ Nginx 配置将自动更新,包含 301 重定向和 SSL 设置。
🎯 综合案例 3:WordPress 安全加固脚本
bash
#!/bin/bash
# 文件名:harden_wordpress.sh
WP_PATH="/var/www/html"
log() {
echo -e "\033[32m[INFO] $1\033[0m"
}
# 1. 修改文件权限
log "设置安全文件权限..."
sudo find $WP_PATH -type f -exec chmod 644 {} \;
sudo find $WP_PATH -type d -exec chmod 755 {} \;
sudo chmod 600 $WP_PATH/wp-config.php
# 2. 禁用文件编辑
log "禁用 WordPress 文件编辑器..."
sudo tee -a $WP_PATH/wp-config.php > /dev/null << 'EOF'
/* 禁用主题和插件编辑器 */
define('DISALLOW_FILE_EDIT', true);
EOF
# 3. 隐藏 WordPress 版本
log "隐藏 WordPress 版本信息..."
sudo tee -a $WP_PATH/wp-config.php > /dev/null << 'EOF'
/* 隐藏版本号 */
remove_action('wp_head', 'wp_generator');
EOF
# 4. 限制登录尝试(需安装插件,此处为提示)
log "建议安装插件:Limit Login Attempts Reloaded"
# 5. 备份数据库(示例)
log "创建数据库备份..."
DB_NAME="wordpress"
BACKUP_FILE="/backup/wp_$(date +%Y%m%d_%H%M%S).sql"
sudo mysqldump -u root -p"$WP_ADMIN_PASS" $DB_NAME > $BACKUP_FILE
sudo gzip $BACKUP_FILE
log "备份完成:$BACKUP_FILE.gz"
echo "✅ WordPress 安全加固完成!"
✅ LNMP 部署最佳实践
- 最小权限原则 :Nginx、PHP-FPM 使用
nginx用户,非 root - 文件权限 :
wp-config.php设置为 600,其他文件 644,目录 755 - 定期备份:数据库 + 网站文件(可使用脚本自动化)
- 启用 HTTPS:使用 Let's Encrypt 免费证书
- 更新维护:定期更新系统、PHP、WordPress、插件
- 监控日志 :
/var/log/nginx/、/var/log/php-fpm/、/var/log/mariadb/ - 防火墙:仅开放 80、443、22 端口
- 禁用危险函数 :在
php.ini中禁用exec、system、shell_exec等
📚 附录:常用命令速查表
| 功能 | 命令 |
|---|---|
| 启动 Nginx | sudo systemctl start nginx |
| 重载 Nginx | sudo nginx -t && sudo systemctl reload nginx |
| 启动 MariaDB | sudo systemctl start mariadb |
| 登录数据库 | mysql -u root -p |
| 启动 PHP-FPM | sudo systemctl start php-fpm |
| 查看 PHP 版本 | php -v |
| 查看监听端口 | `ss -tuln |
| 查看进程 | `ps aux |
| 查看日志 | tail -f /var/log/nginx/access.log |
这份文档覆盖了 CentOS Stream 9 上 LNMP 架构部署的全部核心知识点 + 语法细节 + 实用案例 + 综合项目,所有代码均含详细注释,可直接用于教学、自学或生产环境参考。