前言
WordPress是一个基于PHP和MySQL技术栈,并且存在很多插件的系统。本教程机遇LEMP技术栈来搭建,版本:
- L版本Amazon Linux 2
- E版本为nginx 1.22
- M版本5.5.60 MariaDB
- P版本PHP7.2
首先你需要
- 一个域名,我的域名是zhwebsite.com (域名可以从namesilo.com购买)
- 一台VPS或者云主机(国内需要备案,我的是海外版AWS)
- 拥有sudo权限
- 了解防火墙设置(AWS需要在console上配置),并开启http的80端口和https的443端口
安装Nginx
- 执行sudo yum install nginx
- 启动nginx进程
- sudo systemctl start nginx
- sudo systemctl enable nginx
安装MariaDB
- sudo yum install mariadb-server -y
- 启动Mariadb进程
- sudo systemctl start mariadb
- sudo systemctl enable mariadb
- sudo mysql_secure_installation来加固Mariadb,你会被要求设置root密码,移除匿名用户,限制root用户使用localhost登陆和移除公有test数据库。可以全部选择Yes
- 执行netstat -lntp查看本地监控,默认3306端口会被MariaDB监控
- 为WordPress创建数据库,使用mysql -uroot -p,并使用root密码登陆
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 创建数据库 GRANT ALL ON wordpress.* TO 'wordpress'@'localhost' IDENTIFIED BY '你的密码'; # 创建用户 FLUSH PRIVILEGES; # 刷新数据库权限 EXIT;
安装PHP
在Amazon linux,直接使用yum install php-cli php-fpm php-mysql php-json php-opcache php-mbstring php-xml php-gd php-curl。默认PHP版本是5.4。由于版本比较老旧,会无法安装6.1.1新版本的WordPress,所以需要一些额外的准备工作。
- which amazon-linux-extras
/usr/bin/amazon-linux-extras
- sudo amazon-linux=extras | grep php
php7.2 php7.3 ...
- sudo amazon-linux-extras enable php7.2
- sudo yum install yum-utils
- sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm (如果运行失败,可以查看log,并安装缺少的依赖)
- sudo yum-config-manager --enable remi-php72
- sudo yum install php-cli php-fpm php-mysql php-json php-opcache php-mbstring php-xml php-gd php-curl
我们安装php-fpm是作为真正的web server。php-fpm默认以apache用户,监控端口会是一个unix sock。我们需要:
- 打开/etc/php-fpm.d/www.conf,并修改如下地方
... user = nginx ... group = nginx ... listen = /run/php-fpm/www.sock ...
- 用命令sudo chown -R nginx:nginx /var/lib/php确保目录的所有组权限为nginx
- 重启并允许php-fpm开机自启动
- sudo systemctl reload php-fpm
- sudo systemctl enable php-fpm
申请免费TLS证书
我们可以使用免费的证书,Let's Encrypt提供免费的证书,虽然每90天需要重置,但可以依靠脚本配置crontab定期更新
- curl https://get.acme.sh | sh -s email=${your email}
- sudo service httpd stop (请务必保证80端口没有额外的服务监听,否则代码运行会报错)
- sudo ~/.acme.sh/acme.sh --issue -d ${your domain} --standalone -k ec-256
- sudo ~/.acme.sh/acme.sh --installcert -d ${your domain} --fullchainpath ${key}/domain.crt --keypath ${key}/domain.key --ecc
- 每90天可以利用:sudo ~/.acme.sh/acme.sh --renew -d ${your domain} --force --ecc刷新
下载WordPress并配置Nginx
- 将WordPress下载到/shared/目录下wget https://wordpress.org/latest.tar.gz
- tar zxvf latest.tar.gz解压WordPress文件
- chown -R nginx:nginx wordpress将wordpress目录的所有者改为wordpress用户
- sudo vim /etc/nginx/nginx.conf将nginx。由于在nginx上,对同一域名我还有别的服务,所以就不拆分文件了。
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
ssl on;
ssl_certificate ${key}/domain.crt;
ssl_certificate_key ${key}/domain.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
server_name ${your domain};
# log files
access_log /shared/log/${domain}.com.access.log;
error_log /shared/log/${domain}.com.error.log;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location / {
root /shared/wordpress;
index index.html index.htm index.php;
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}
location ~ \.php$ {
try_files $uri =404;
root /shared/wordpress;
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)$ {
root /shared/wordpress;
expires max;
log_not_found off;
}
}
- 进入/shared/wordpress目录
- mv wp-config-sample.php wp-config.php
- vim wp-config.php。数据库的密码是之前设置的,填入相应位置。最后WordPress salt生成所有额外信息
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
/** Database username */
define( 'DB_USER', 'wordpress' );
/** Database password */
define( 'DB_PASSWORD', '${your database password}' );
/** Database hostname */
define( 'DB_HOST', 'localhost' );
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
/**#@+
* Authentication unique keys and salts.
*
* Change these to different unique phrases! You can generate these using
* the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}.
*
* You can change these at any point in time to invalidate all existing cookies.
* This will force all users to have to log in again.
*
* @since 2.6.0
*/
define('AUTH_KEY', '...');
define('SECURE_AUTH_KEY', '...');
define('LOGGED_IN_KEY', '...');
define('NONCE_KEY', '...');
define('AUTH_SALT', '...');
define('SECURE_AUTH_SALT', '...');
define('LOGGED_IN_SALT', '...');
define('NONCE_SALT', '...');
- nginx -t查看语法是否正常,如果一切正常,则sudo systemctl reload nginx重载服务。
- 如果能看到WordPress页面就一切大功告成。
一些碰到的坑
- 获取TLS证书失败:这个在上文提到了。AWS需要认真查看80端口是否有额外的服务阻碍证书服务开启
- WordPress启动之后,各种404错误:这个需要查看文件是否存在读取问题,比如Nginx的.js .css文件的root路径配置。也可以看看Nginx和PHP- FPM的用户是否有权限读取修改wordpress的路径(或者你指定的用户是否拥有权限)
- 服务莫名宕机:这套服务加上基础的Linux,内存开销在500MB左右,开始我用了乞丐版的LightSail,单核500MB内存,会存在一些内存问题。建议升级到1GB以上内存版本。
- HTTPS的服务,可能会导致一些图片加载出现问题。上线之后,建议安装Really Simple SSL来快速支持HTTPS