大概阅读时间 24 分钟
简介
这份笔记记录了我使用LEMP堆栈部署WordPress网站的过程。开始之前,先简要了解一下LEMP和WordPress是什么。
LEMP是一个首字母缩写词(不是LNMP),代表Linux、Nginx(发音为"Engine-X")、MySQL/MariaDB以及PHP。它是一个强大且高效的软件堆栈,当然,另一种流行的是LAMP堆栈,它将Nginx替换为Apache,但我资源有限,直接使用Nginx了。
在这次部署中,我们使用 Ubuntu 20.04 作为服务器操作系统。通过搭建LEMP再安装WordPress来部署一个Blog网站。
WordPress是世界上最受欢迎的内容管理系统(CMS)。它允许用户在网上创建、管理和发布内容,而不需要高级的技术技能。WordPress以其简单性、灵活性和庞大的主题与插件生态系统而闻名,同样还有其他选择,例如Ghost,或者直接托管到Github上。
在这个指南中,我将通过我的部署过程,引导你完成在LEMP堆栈上设置WordPress网站并尽量避免遇到问题。
闲话少说,进入正题。
安装和配置LEMP堆栈
在我们安装WordPress之前,我们需要在我们的Linux服务器上设置LEMP堆栈。这里直接跳过了Ubuntu的安装和配置,相信你已经有一套Ubuntu 20.04服务器了。
安装和配置Nginx
要在Ubuntu 20.04上安装Nginx,直接参照以下步骤:
-
打开你的终端或通过SSH连接到你的服务器(这个肯定没问题吧)。
-
更新包列表以确保你获得软件的最新版本:
sudo apt update
-
运行以下命令安装Nginx,如果想要使用更多模块也可以安装extra/full:
sudo apt install nginx -y
-
安装完成后,你可以检查Nginx的状态以确保它正在运行:
sudo systemctl status nginx
如果Nginx没有运行,你可以用以下命令启动它:
sudo systemctl start nginx
并且不要忘记设置自动启动:
sudo systemctl is-enabled nginx
如果没有启用,使用以下命令设置:
sudo systemctl enable nginx
-
现在,你可以用浏览器中访问你的服务器的IP地址来测试Nginx是否正确安装和运行。你应该会看到默认的Nginx欢迎页面。
注意:不要忘记配置防火墙以确保进入流量可以正常访问你的服务器。虽然Ubuntu通常使用UFW(Uncomplicated Firewall),但我对 iptables 更熟悉,所以我将提供使用iptables作为示例的防火墙规则。要允许Nginx默认使用的端口80上的HTTP流量,你可以通过执行以下命令向iptables添加规则:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
这个会放行TCP端口80的流量,后续可以参照放行TCP 443端口,如果你想使用HTTPS的话。
-
配置Nginx以服务于你的WordPress网站。你需要进入 /etc/nginx/sites-available 目录并创建一个新的虚拟主机配置文件(也可以直接创建文件,记得路径正确)。
cd /etc/nginx/sites-available/
-
为你的WordPress网站创建一个新的配置文件。用你实际的域名替换 blog.your_domain(最好申请一个正式域名,如果测试也可以用IP或者修改hosts来访问):
sudo vim blog.your_domain.conf
在此之前你应该熟悉如何使用vim作为文本编辑器。当然你也可以使用一个更直接的编辑器,比如nano,不然的话先找一个基本的vim教程(我打算后面试着写一点vim的内容,vim这个编辑器用熟了真的很强大)。
-
在新文件中的 server 部分添加下面的内容。这个配置是为基本的WordPress网站准备的。确保用你实际的域名替换 blog.your_domain,并且用WordPress稍后将要安装的正确路径替换 /var/www/blog.your_domain 或 /var/www/html/blog.your_domain:
server {
listen 80;
server_name blog.your_domain;
# 指定你的WordPress的目录(待会儿需要安装在这个目录下)。
root /var/www/blog.your_domain;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP处理部分:配置.php文件的处理方式。
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 安全性配置:拒绝访问隐藏文件和目录(Linux里面隐藏文件以.开头)。
location ~ /\.ht {
deny all;
}
# 虽然Nginx不使用apache的.htacess这些文件,但如果这些文件存在,也可以防止敏感信息的意外泄露(多多益善)。当然你可以使用下面的规则。
# location ~ /\. {
# deny all;
# }
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
}
-
保存并关闭文件。通过 sites-available 到 sites-enabled 的软链接来启用该站点(相当于快捷方式,在nginx.conf中要确定有
include /etc/nginx/sites-enabled/*;
来读取到这里面的配置文件):sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
-
测试你的Nginx配置以确保语法正确,通常这样配置不会有报错,如果有的话再找找Nginx相关的资料吧,注意一下文件权限问题,配置里面的
{}
是否匹配,根据测试的报错应该可以很轻松知道问题所在。sudo nginx -t
-
如果测试成功,请重新加载Nginx并应用更改,否则检查输出报错,并重新测试直到配置正确:
sudo systemctl reload nginx
当你使用命令
sudo systemctl reload nginx
或sudo nginx -s reload
时,你的Nginx会重新加载其配置文件而不中断正在进行的连接(软重启)。他只会对新建立的连接应用更改而不影响当前建立连接的用户,对于生产环境十分有用。
如果你使用重启命令(如sudo systemctl restart nginx
)会完全停止然后再次启动Nginx服务。这种方法会短暂中断活动连接,测试的话随便选哪种了,生产就要祈祷没人发现了。
当然对于像修改配置文件这样的更新,建议使用reload
方法,因为它可以更新配置而不影响正在进行的业务或用户体验。
安装和配置 MySQL
MySQL 是一个流行的关系数据库管理系统(也可以用MariaDB),用于存储和管理数据。这里我们将介绍如何安装 MySQL 并执行基本的安全配置。
-
安装 MySQL 服务器:
sudo apt install mysql-server -y
-
安装完成后,检查 MySQL 是否正在运行,并确保它被设置为开机启动:
sudo systemctl status mysql sudo systemctl is-enabled mysql
如果没有开机启动,请运行以下命令以启动:
sudo systemctl start mysql sudo systemctl enable mysql
-
安装完成后你可以运行 MySQL 附带的预打包安全脚本(对于像我这样的小白建议跟着做一下)。这个脚本将帮助你提高 MySQL 安装的安全性:
sudo mysql_secure_installation
这个脚本将引导你通过几个安全注意事项,包括设置 root 密码(如果未设置)、删除匿名用户、禁用远程 root 登录以及删除测试数据库。建议接受默认设置,这些设置能够增加数据库服务器的安全性,这里就不列举具体步骤了,参照提示应该很容易完成。
现在 MySQL 已经安装并加固,下一步是为 WordPress 创建一个数据库和用户。WordPress 使用数据库来管理和存储站点及用户信息,因此在安装 WordPress 之前要设置好数据库。
-
通过输入以下命令登录 MySQL root 管理员账户:
sudo mysql -u root -p
输入之前设置的 root 密码登录进去。
-
登录后,为 WordPress 创建一个新的数据库。用你想给数据库起的名字替换 wordpressdb 字段:
CREATE DATABASE wordpressdb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
创建一个新的 MySQL 用户账户,这个账户将专门给 WordPress 使用。用你想使用的用户名替换 wordpressuser 字段,并用一个强密码替换 password字段:
CREATE USER 'wordpressuser'@'localhost' IDENTIFIED BY 'password';
-
授予新创建的 wordpressuser 用户对 WordPress 数据库的全部权限,然后刷新 MySQL 权限以确保它们被应用并保存:
GRANT ALL PRIVILEGES ON wordpressdb.* TO 'wordpressuser'@'localhost'; FLUSH PRIVILEGES; EXIT;
完成了这些步骤后,你应该已经成功创建了一个专用的数据库和用户给 WordPress 使用。这些凭据将在 WordPress 配置的时候使用,让 WordPress 能正确连接到数据库并存储网站的数据。
一定记住保存好数据库名、用户名和密码,否则后面设置 WordPress 就麻烦了。
安装和配置 PHP
WordPress 是用 PHP 编写的,并且需要它来执行其脚本。接下来,我们将安装 PHP 以及一些 WordPress 正常运行所需的常用模块。
-
安装 PHP 和必要的 PHP 扩展。你可以使用以下命令安装 PHP 以及 WordPress 所需的常用扩展:
sudo apt install php-fpm php-mysql php-gd php-xml php-mbstring php-curl php-xmlrpc php-imagick php-zip -y
-
检查 PHP 版本以确认它已正确安装:
php -v
你应该会看到 PHP 版本信息显示,确认 PHP 已成功安装在你的系统上。
WordPress 通常可以在默认的 PHP 设置下正确运行。如果需要,你可以在 php.ini 文件中调整 PHP 配置以提高性能和安全性。需要注意的是上传文件大小可以改一下,如果你需要上传比较大的内容,默认只有2MB。
常见的位置包括/etc/php/[version]/cli/php.ini
或者/etc/php/[version]/fpm/php.ini
。通过修改其中的 upload 和 post 字段来调整大小:upload_max_filesize = 50M post_max_size = 50M
-
确保 PHP-FPM(FastCGI Process Manager)是活跃的并且正在运行:
sudo systemctl status php{version}-fpm
将 {version} 替换为你的 PHP 版本。如果没有运行,你可以用以下命令启动它:
sudo systemctl start php{version}-fpm
-
现在,PHP 应该已经设置好并可以开始你的 WordPress 安装。最后确保 PHP-FPM 在服务器启动时也要自动启动。和前面一样,你可以使用以下命令来实现这一点:
sudo systemctl enable php{version}-fpm
安装和配置 WordPress
安装 WordPress
既然 LEMP 堆栈已经完全配置好了,现在只需要安装 WordPress 就可以轻松启动你的网站了。
- 下载 WordPress:
首先,进入到你网站的根目录(也可以放在临时目录/tmp
,记得解压时注意路径)。将 blog.your_domain 替换为你实际的域名或目录路径:cd /var/www/blog.your_domain
然后,使用 wget 命令下载最新的 WordPress 发布版本:
sudo wget https://wordpress.org/latest.tar.gz
如果你没有 wget,你可以直接使用 sudo apt install wget
来安装它,也可以用 curl 来完成:
sudo curl -O https://wordpress.org/latest.tar.gz
-
解压 WordPress:
将 WordPress 解压到当前目录,然后清理掉临时文件和目录,使用 rm 时需要多加注意。tar -xzvf latest.tar.gz mv wordpress/* ./ rmdir wordpress mv latest.tar.gz /tmp
-
调整所有权和权限:
调整文件的所有权和权限,以确保 WordPress 能够正常工作(默认情况应该是可以直接运行的)。如果不行,请检查权限,执行命令时将 www-data(默认用户) 替换为你的 Web 服务器用户:sudo chown -R www-data:www-data /var/www/blog.your_domain
配置 WordPress
- 设置 WordPress:
复制 WordPress 示例配置文件来创建一个新配置:cp wp-config-sample.php wp-config.php
然后编辑 wp-config.php 文件,添加你的数据库连接详细信息。
sudo vim wp-config.php
填写数据库信息,输入你在 MySQL 设置步骤中创建的名称、用户和密码。以下是一个示例,请根据实际情况修改:
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpressdb' ); // 将 'wordpressdb' 替换为你实际的数据库名称
/** Database username */
define( 'DB_USER', 'wordpressuser' ); // 将 'wordpressuser' 替换为你实际的数据库用户名
/** Database password */
define( 'DB_PASSWORD', 'password' ); // 将 'password' 替换为你实际的数据库密码
/** Database hostname */
define( 'DB_HOST', 'localhost' ); // 通常是 'localhost',但如果你的设置不同就需要修改
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' ); // 推荐保留为 'utf8'编码
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' ); // 不用改
- 欢迎开始 WordPress 之旅!
现在,在网页浏览器中访问你的网站 http://blog.your_domain。你应该会看到 WordPress 安装引导页面。按照屏幕上的指示选择语言,并填写站点信息和管理员详细信息(一定要记录好,站点的管理需要用到)。完成这些步骤后,你的 WordPress 网站应该已安装并可以使用,同时应该生成了一个 sample 页面。但在你开始发布内容之前,你应该启用HTTPS。
用 HTTPS 保护你的 WordPress 网站
在当今的网络环境中,确保你的网站使用 HTTPS 至关重要。HTTPS 加密了用户的客户端浏览器和你的服务器之间的数据,使攻击者更难拦截和篡改数据。这对于像 WordPress 博客这样的网站尤其重要,你一定会提交个人信息(账号、密码等等)。
在接下来的指南中,我们将使用 Let's Encrypt 提供的免费、自动化和开放的证书来配置 HTTPS。我们可以通过 Certbot 来轻松地从 Let's Encrypt 获取和更新证书。
安装和配置 Certbot
1a. 安装 Certbot 和 Nginx 插件自动化申请安装证书(说实话,我没测试过,但是看起来应该十分简单):
sudo apt install certbot python3-certbot-nginx
2a. 获取证书,你可以使用 --nginx 参数来自动获取并安装证书,并让它帮你配置 Nginx 并使用:
sudo certbot --nginx
按照提示输入你的电子邮件地址,同意服务条款,并决定是否要将 HTTP 流量重定向到 HTTPS(推荐这样做)。
如果这个方法不太顺利(或者最开始没发现这种方法...),你可以尝试手动申请证书并在 Nginx 上配置 HTTPS,只需要参考以下方法:
1b. 手动获取证书:
sudo certbot certonly
这个命令将会获取证书,但不会修改你的 Nginx 配置。输入此命令后,按照提示选择 2: Spin up a temporary webserver (standalone)
完成验证过程。大致是以下几步:
- 输入你的电子邮件地址。
- 同意服务条款。
- 输入你想要获取证书的域名。
- 等待验证通过签发证书。
注意:获得的证书默认会存储在 /etc/letsencrypt/live/your_domain/。记住这个路径,因为你将用它在后面配置 Nginx 使用 SSL 证书。
2b. 配置 Nginx 使用 SSL 证书
一旦你有了证书,你需要配置 Nginx 来使用它。首先,打开你域名的 Nginx 配置文件:
sudo vim /etc/nginx/sites-available/blog.your_domain
在 server 部分配置启用 HTTPS,将 blog.your_domain 替换为你的实际域名:
server {
listen 443 ssl http2; # 启用 HTTPS,通常监听443端口
server_name blog.your_domain;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem; # 刚才的证书保存位置
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem; #服务器的私钥
# ... (其他配置)
}
如果要保留 http 访问,建议将它重定向到 https,这样更加安全(也可以完全不使用http):
server {
listen 80;
server_name blog.your_domain;
return 301 https://$server_name$request_uri;
}
- 测试和重新加载 Nginx 配置
更新配置后,测试以确保没有语法错误:sudo nginx -t
如果测试成功,重新加载 Nginx 以应用更改:
sudo systemctl reload nginx
- SSL 证书的自动续期
Let's Encrypt 证书的有效期为 90 天。但是在安装了 Certbot 后,应该会自动设置一个 timer 在证书到期前自动续期(默认每天检查2次?)。
要验证自动续期过程,请运行以下命令:sudo systemctl list-timers | grep certbot
你应该会看到一个定时器条目,例如 certbot.timer。这表示已设置一个 systemd 定时器来处理续期。
要测试续期是否正常,你可以通过运行以下命令手动触发它:
sudo certbot renew --dry-run
--dry-run 选项只会模拟续期过程,而不会对你当前证书做任何实际更改。如果这个命令运行没有任何错误,你的自动续期设置应该配置正确,否则的话就只能等着收到续期失败的邮件去手动续期了。
总结
现在,你应该已经完成了这个 LEMP 堆栈部署 WordPress 的指南!到目前为止,你应该已经在自己的 LEMP 服务器上成功部署了一个正常运行的 WordPress 网站。希望这个文档清晰直观,没有让你遇到其他的困难。
一开始的时候部署 WordPress 网站看起来是一项艰巨的任务,因为我没什么经验,但现在看看似乎和组装玩具一样简单(吧?)。这个文档应该讲清楚了设置 Linux、Nginx、MySQL 和 PHP 的细节,如果有什么遗漏或者遇到什么问题,相信你已经用高超的技巧解决了(吧?)。
建立 WordPress Blog 的旅程其实才刚刚开始,接下来你还要和新 WordPress 网站共同冒险,尝试不同的主题、插件和设置,使你的网站更加美观,独一无二。最重要的是,继续学习和探索 未来广阔的可能性。
如果你遇到任何障碍,不要犹豫,回顾一遍过程,当然,你还可以寻找其他的丰富并且更实用,更细致的指导。包括 WordPress 和开发者社区都有相当多的资料,并且十分有用。
最后的最后,希望这篇文章能给你带来帮助,至少在完成了这样一件事之后,还是有不少的成就感和满足感,希望自己能够坚持下去,继续完善,并且分享更多的内容给需要的人。在这个世界留下一点存在的痕迹。
参考网站
https://developer.wordpress.org/advanced-administration/server/web-server/nginx/