现在我们来到了最激动人心的一章,我很高兴你能有耐心的看到这里,这意味着你很快就能拥有自己的网站了!
要部署一个可用且安全的 WordPress 站点,通常需要完成以下几个步骤:
🌐 安装必要的软件包:包括 Nginx、PHP、MariaDB/MySQL 等,构建 LNMP 环境。
🛠️ 配置 Nginx:修改主配置或新建站点配置,使其支持 PHP 请求转发和 WordPress 的伪静态规则。
🗃️ 创建数据库:为 WordPress 准备好独立的数据库和访问用户。
🔐 权限调整:设置合适的文件权限与 SELinux 策略,确保服务正常运行又不影响安全性。
📥 安装 WordPress:下载官方程序,配置数据库连接,启动安装向导。
✨ 推荐插件与主题:安装如缓存、安全、SEO 等插件,搭配高性能主题,提升站点体验与管理效率。
安装必要的软件包
下面的软件包会被W3 Total Cache插件用到。这个插件实现了页面缓存、操作码缓存、数据库缓存、对象缓存、图片压缩等功能,极大提高WordPress的响应速度。
$ sudo dnf install php-pear php-devel httpd-devel gcc make zlib-devel pcre-devel
$ sudo dnf install memcached libevent libevent-devel
$ sudo systemctl enable --now memcached.service #顺便启动memcached服务
$ sudo dnf install php-redis php-memcache php-memcached php-opcache
Imagick是WordPress的高级图像处理器,功能更强,质量更高,特别是在启用WebP转换、处理大图或做图片优化插件(如ShortPixel、EWWW Image Optimizer)时非常有用。没装也可以用,但装了更好。
$ sudo dnf install ImageMagick-devel
$ sudo dnf install php-pecl-imagick
$ sudo systemctl restart php-fpm.service
$ php -m #检查imagick是否加载
下载WordPress,可以下载到本机再scp
到服务器上,或者直接在服务器上wget
。WordPress提供两种压缩包,一种是zip
,另一种是tar
。由于我们是Linux
服务器,直接下载tar
包,解压缩到html目录下备用。
$ wget https://cn.wordpress.org/wordpress-6.8.1-zh_CN.tar.gz
$ sudo tar -xzvf wordpress-6.8.1-zh_CN.tar.gz
$ cd wordpress-6.8.1-zh_CN
$ sudo cp -r wordpress /usr/share/nginx/html/ #注意wordpress目录后面不要带斜杠
修改nginx配置文件
编辑/etc/nginx/nginx.conf
,修改文档根目录路径。80和443 server块都要改。
root /usr/share/nginx/html/wordpress;
创建数据库
创建名为wordpress的数据库用户和同名的数据库,使wordpress用户对wordpress数据库有完全控制权限。
$ mysql -u root -p #这里的root不是Linux用户,是数据库的root用户,在第二章初始化数据库时会给root设置密码。
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'your_strong_password'; #这里创建wordpress数据库用户及设置密码。
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; #创建wordpress数据库,utf8mb4字符集支持emoji。
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost'; #wordpress用户对wordpress数据库具有full control权限。
FLUSH PRIVILEGES; #刷新权限
调整SELinux权限
调整httpd_unified的布尔值:
$ setsebool -P httpd_unified 1
为什么要做这一步?先说答案:不做这一步会导致某些WordPress目录不可写,引起主题或插件安装不了的问题。现在分析一下原因。先来看红帽官方对这个布尔值的解释:
启用后,此布尔值允许
httpd_t
完全访问所有httpd
类型(即执行、读取或写入 sys_content_t)。禁用后,将区分只读、可写入或可执行的 Web 内容。禁用此布尔值可确保额外的安全级别,但增加了管理开销,即必须根据每个布尔值应具有的文件访问权限单独标记脚本和其他 Web 内容。
这段话分析如下:
启用后,此布尔值允许 httpd_t 完全访问所有 httpd 类型(即执行、读取或写入 sys_content_t)。
httpd_t
:是SELinux中Apache(或任何被认为是httpd的Web服务器)运行时的安全上下文类型。sys_content_t
:代表系统中普通的Web内容(比如HTML文件、PHP文件、上传内容等)的SELinux标签。- 含义:当启用
httpd_unified
时,Apache(或其它Web服务器进程)拥有“统一”的权限,可以对这些Web内容执行读取、写入、执行等各种操作,不再区分这些操作是否被允许。
禁用后,将区分只读、可写入或可执行的 Web 内容。禁用此布尔值可确保额外的安全级别,但增加了管理开销,即必须根据每个布尔值应具有的文件访问权限单独标记脚本和其他 Web 内容。
- 当你禁用
httpd_unified
时,SELinux将严格区分哪些内容只能读、哪些能写、哪些能执行。 - 举例来说:
/var/www/html/index.php
可能只能被读和执行;/var/www/html/uploads/
目录需要设置成可以写入;- 每种用途都要为文件或目录设置正确的SELinux上下文,比如:
- 只读内容 →
httpd_sys_content_t
- 可写内容 →
httpd_sys_rw_content_t
- 可执行脚本 →
httpd_sys_script_exec_t
- 只读内容 →
- “额外安全级别”:意味着你可以更细粒度地控制Web服务器可以做什么,防止例如PHP文件被上传到可写目录然后被执行(常见的WebShell攻击方式)。
- “管理开销”:因为你得手动维护这些标签,正确标记每一类文件和目录。
这里就要求我们在安全与体验之间作出取舍。WordPress的安全性一部分取决于其本身代码的质量,我们要确保及时的更新WordPress,并且不要安装来路不明的插件或主题。
为wordpress目录打上合适的SELinux标签
$ sudo restorecon -Rv /usr/share/nginx/html/wordpress
restorecon
命令是根据目录默认的上下文来恢复SELinux的标签的。对于nginx来说,默认的上下文可以通过下面的命令查看
$ sudo semanage fcontext -l |grep html
#输出:
#/usr/share/nginx/html(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
这就意味着html目录下的所有子目录和文件都将恢复成httpd_sys_content_t
标签。我们来验证一下:
$ ls -alZ /usr/share/nginx/html/wordpress
#会看到所有目录及文件的标签是httpd_sys_content_t
调整Linux权限
调整wordpress目录的owner为nginx
$ cd /usr/share/nginx/html
$ sudo chown -R nginx:nginx wordpress
修改/etc/php-fpm.d/www.conf
user = nginx
group = nginx
修改php相关的目录权限
$ sudo chown nginx:root /var/log/php-fpm
$ sudo chgrp nginx /var/lib/php/wsdlcache
$ sudo chgrp nginx /var/lib/php/opcache
$ sudo chgrp nginx /var/lib/php/session
$ sudo find /var/lib/php/session -type f -user apache -exec chown nginx:nginx {} \;
重启nginx和php-fpm
$ sudo systemctl restart php-fpm
$ sudo systemctl restart nginx
安装WordPress
假设你的域名是example.com,那么在浏览器中访问example.com/wp-admin/install.php
。根据向导提示输入正确的数据库名,用户名和密码以及数据库主机,数据库主机填写localhost
。
创建wp.conf
创建/etc/nginx/default.d/wp.conf
index index.php index.html index.htm;
location = /favicon.ico { #这是显示在浏览器标签栏上的图片。
log_not_found off;
access_log off;
}
location = /robots.txt { #robots.txt文件是wordpress自动生成的,用于SEO。
allow all;
log_not_found off;
access_log off;
}
location = /wp-config.php { #拒绝访问wp-config.php。这个文件是wordpress的主配置文件,包含数据库的用户名和密码。
deny all;
}
location ~* /\. { #拒绝访问其他隐藏文件。
deny all;
}
location / {
try_files $uri $uri/ /index.php?$args; #这是 WordPress URL 重写机制的核心入口。
}
重启nginx
$ sudo systemctl restart nginx
推荐的插件和主题
访问example.com/wp-admin
进入后台管理页面。建议安装下列主题和插件:
主题:
- Astra,以后的页面设计教程是基于Astra主题的
插件:
- W3 Total Cache 优化WordPress性能
- Limit Login Attempts Reloaded 防止暴力破解用户密码
这里大致提一下W3 Total Cache的配置过程:
- 进入安装指南,按照向导启用缓存
- 插件会在
/usr/share/nginx/html/wordpress
目录下生成一个nginx.conf
的文件 - 将这个文件重命名并复制到
/etc/nginx/default.d/
目录下 - 重启nginx
最后强调一下,在没有启用验证码插件之前,不要开启用户注册。防止机器人疯狂注册账号,导致往不存在的邮箱地址发邮件,这会使你的域名信誉下降。