第八章 —— WordPress部署 · 安装篇

现在我们来到了最激动人心的一章,我很高兴你能有耐心的看到这里,这意味着你很快就能拥有自己的网站了!

要部署一个可用且安全的 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

最后强调一下,在没有启用验证码插件之前,不要开启用户注册。防止机器人疯狂注册账号,导致往不存在的邮箱地址发邮件,这会使你的域名信誉下降。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注