WordPress 5部署小记: Ubuntu18.04 + Nginx + Https

摘要: 本文介绍了在一台Ubuntu18.04上部署 Nginx + WordPress5 的方法

Motivation

最近业余时间调研了一些 headless CMS, 有两个挺有意思的, KeystoneJSponzu. 不过折腾了一圈还是因为懒, 还是觉得找个开箱即用的CMS作为个人博客比较舒服, 那自然上WordPress了.

虽然 WordPress 是一个php项目, 不过 根据 CMS排名 起码到2018年底 WordPress 依旧占据着59.7%的份额, 自带实用的管理后台和富文本方案, 对SEO友好(或者说现在搜索引擎实现的benchmark肯定包括WordPress站), 提供了大量插件用于评论/反垃圾/用户权鉴/多媒体支持, 甚至直接可以通过插件一键改成BBS/电商/社交网络, 生态的力量不得不服, ORZ.

开发上目前觉得前端能折腾的空间很大, WordPress提供了REST API方便撸袖子自己干, 参见Brad大哥 Exploring The WordPress REST API & React Integration, 还有更潮的 GraphQL支持, 见 Crash Course: Headless WordPress with WPGraphQL, ACF, and React.

综上, WordPress开箱即用, 有海量插件, 也支持折腾, 开搞~

Requirements

  • 有台公网IP的主机, 阿里云/腾讯云/Vultr/DigitalOcean/etc
  • 有域名, 若解析指向国内IP还需要目标IP的备案
  • 用过ssh

Step by step

下面就是配置的详细过程, 其实可以来一发docker-compose, 上docker还能方便开发和部署环境的统一, 等我真开始折腾WordPress开发了再写.

1. 安装 + 配置 MySQL

如果没有MySQL服务器, 就直接装一个:
$ sudo apt update && sudo apt install mysql-server
装好的是MySQL 5.7版本, 安装后请执行mysql_secure_installation来完成服务器的安全配置.
$ sudo mysql_secure_installation
其中VALIDATE PASSWORD PLUGIN开不开看自己有没有设置强密码的习惯.

有MySQL Server之后, 要创建一个给WordPress用的数据库:
$ mysql -u root -p
mysql > CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

然后给这个wordpress数据库单独创建一个用户:
mysql > GRANT ALL ON wordpress.* TO 'wordpressuser'@'localhost' IDENTIFIED BY 'SECRET_PASSWORD'
用户名wordpressuser和密码SECRET_PASSWORD请自行替换修改.

数据库用户能localhost就不要@'%'开放全域访问了( 当然默认mysql的bind address也是127.0.0.1 )
navicat支持通过ssh连接数据库, 建议大家数据库服务不要bind公网IP.

退出前可以刷新一下权限, 确保MySQL载入了新用户

mysql > FLUSH PRIVILEGES;
mysql > EXIT;

2. 安装 Nginx, PHP

安装标准版Nginx (在18.04下应该是 nginx 1.14):
sudo apt install nginx-full

Nginx没有内置的php处理器, 需要 php-fpm(“php fastCGI process manager”). 同时php需要连接mysql的驱动
$ sudo apt install php-fpm php-mysql
Ubuntu18.04的钦点php-fpm版本是php7.2, 装完之后配置文件在/etc/php/7.2/fpm

建议修改一下文件上传大小, 默认的2MB有点蛋疼
$ sudo cp /etc/php/7.2/fpm/php.ini /etc/php/7.2/fpm/php.ini.bak
$ sudo vim /etc/php/7.2/fpm/php.ini
找到对应行修改, 没有就添加

memory_limit = 256M
post_max_size = 100M
max_execution_time = 360
upload_max_filesize = 100M
date.timezone = Asia/Shanghai

WordPress有一些第三方插件除了php的MySQL驱动, 还依赖别的php插件, 我们也装一下:
$ sudo apt install php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip

php-fpm是作为service常驻的, 装完之后记得重启:
$ sudo systemctl restart php7.2-fpm

3. 安装 WordPress

避免后面切语言包的麻烦, 直接下载zh_CN版本:

$ cd /tmp && wget https://cn.wordpress.org/latest-zh_CN.tar.gz
$ tar -zxvf latest-zh_CN.tar.gz
$ sudo mv wordpress /var/www/html/wordpress

将/var/www/html/wordpress文件夹下的文件owner和group都设置成www-data(默认Nginx的进程用户), 方便后续直接从WordPress的Admin面板装插件改代码;

$ sudo chown -R www-data:www-data /var/www/html/wordpress/
$ sudo chmod -R 755 /var/www/html/wordpress/

4. 配置 WordPress

复制WordPress的配置模板重命名成 wp-config.php
$ sudo mv /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php

从WordPress官网生成一个随机密钥:
$ curl -s https://api.wordpress.org/secret-key/1.1/salt/
返回样例如下, 请不要直接复制以下样例:

define('AUTH_KEY',         'S(4~/mLfag<R~<6eUNiUA/bPL0gilwqanj&}C68)NB%b4}xNlS,qVu`RoG$-;XM[');
define('SECURE_AUTH_KEY',  ' fhwoSs[D+.o9RxhD+E:0LW+GV-aBCRY7^F^@U$A,?+&EC& }c>5uGE=q;)13(n2');
define('LOGGED_IN_KEY',    '|zFq$#+=-;X3|y;I4Qj/^E=NjS$I`,6OKj9hi:S[q%-l20Jm@E*$McNPErGl%?J');
define('NONCE_KEY',        '|F-79t3F(AR/eD_w,-r7%U{<P$kC6D^+):g5Gwz64|X3+[0Aw+.O%xRnS=[|AahJ');
define('AUTH_SALT',        ',U`dOY%-/4K:X||=0xo zm]pF(%U+n_*)-gyhxm|w}uX?5@D):hTzV-PLsQx`3l|');
define('SECURE_AUTH_SALT', 'Xn]P,^>}dOyC=>7}Wb{oUR2D|:4hzyY(] hn[BMA?Q$L;=28jGm,`+Kl=;`}at+V');
define('LOGGED_IN_SALT',   'qEM.SG;Tx;aKr&UCy;+?S1]<dyY%@BL=$@rTe/IZ^p)t5uI;Q]?o~#d{0}v):Bqv');
define('NONCE_SALT',       '%VO4 |g8W/i-lrIZZe7=ZOVLE<T+-:ZyQO?x;J,EeLK_E9g(n+x*{L3|,X}]lR|~');

生成密钥后复制一下, 然后开始编辑wp-config.php:
$ sudo vim /var/www/html/wordpress/wp-config.php

配置数据库:

/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'wordpressuser');
/** MySQL database password */
define('DB_PASSWORD', 'SECRET_PASSWORD');
/** MySQL hostname */
define('DB_HOST', 'localhost');
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8mb4');
/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', 'utf8mb4_unicode_ci');

配置你的Secret Key:
请用生成的密钥串替换wp-config.php里默认的值.

部署需要的基本配置到这里就好了, 其它配置项请参考 官方文档 Editing wp-config.php

5. 配置Nginx

创建nginx的配置文件
$ sudo vim /etc/nginx/sites-available/aweffr.cn

server {
        listen 80;
        root /var/www/html/wordpress;
        index index.php index.html index.htm index.nginx-debian.html;
        
        # 此处请替换成你的域名
        server_name aweffr.cn www.aweffr.cn;

        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }

}

编辑完成后软链接到sites-enabled目录下:
sudo ln -s /etc/nginx/sites-available/aweffr.cn /etc/nginx/sites-enabled/

测试配置是否正确:
sudo nginx -t
配置无误的话应返回
nginx: configuration file /etc/nginx/nginx.conf test is successful
若配置成功, 发送reload信号给nginx重载配置
sudo nginx -s reload

到这里, 已经可以通过http访问你的wordpress站了.

安装完成后, 可以加一个拿来查看phpinfo的文件:
sudo vim /var/www/html/wordpress/dev-info.php

<?php
phpinfo();

保存后访问/dev-info.php己可看到php server的基本信息;

配置HTTPS

采用Let’s Encrypt的HTTPS证书, 先安装certbot

$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt install python-certbot-nginx

安装完成后, 通过指定domain, certbot来自动更新nginx配置
sudo certbot --nginx -d aweffr.cn -d www.aweffr.cn
命令行里certbot会要求输入邮箱, 并让你选择是否自动从http做redirect, 建议默认redirect.
完成certbot配置后记得再次
$ sudo nginx -s reload
来使得配置生效, 到这里就大功告成了.

Reference