前言
由于Ubuntu官方的源(Repository)至今都没有WordPress的直接安装包,且我用的IaaS服务也一段时间了、重新安装带WordPress的系统镜像太麻烦,又懒得用Docker(要知道IaaS已经是虚拟化,再Docker虚拟化一次是浪费),所以还是自己手动安装一下。
安装的内容是Nginx、PHP7、MySQL、WordPress和LetsEncrypt,Ubuntu 16.10是一直在使用的,在IaaS上又用不着自己安装。这次安装Nginx要配置HTTP/2.0,因为HTTP/2.0已经正式公布两年多了,将会极快地普及,而且它能优雅地向前兼容HTTP/1.1,为什么不用呢。在LetsEncrypt的辅助下,任何HTTP服务器都可以方便地开启SSL了,对于HTTP/2.0强制要求加密已经不是难处。PHP7也极好地做到了向前兼容,而且性能有极大的提升,虽然这里未必用得着,但往后我会详细学习一下PHP7。
其实网络上安装这些东西的文章一大堆,这里再写一遍纯粹是为了免得自己到处找。什么有道、印象笔记之类的不是不好用,但是就是不想把内容放在别人的平台上,而且自己写一遍记得更牢,那些笔记一般都是mark下一大堆之后,基本没回头看,所以没意义。
下面的安装过程,全程以root权限进行,如果你的Ubuntu没有启用root用户,那么就直接:
#!/bin/bash
sudo -i
* 建议先执行一次apt-get update
,以确保你的系统环境使用的是最新的库。
可从Ubuntu官方源直接安装的
安装PHP7
WordPress可以无缝地迁移到PHP7,这有赖PHP7对兼容性的努力。WordPress额外使用的PHP模块不多,主要是数据库、加密和图像处理的GD库。
#!/bin/bash
# 安装php7及WordPress所需的库
apt install php7.0 php7.0-mysql php7.0-gd php7.0-mcrypt php7.0-mbstring libmcrypt-dev mcrypt
传统的安装WordPress文章一般PHP就安装上面的内容就够了,但是由于这里使用Nginx作为HTTP前端服务器,所以PHP要选用一个链接前端服务器的模块。以前Apache2有mod_php,但是Nginx没有类似mod_php的模块,所以PHP便需要CGI/FastCGI之类的管理器,以便Nginx反向代理请求至PHP处理器。现在流行的是php-fpm(FastCGI Process Manager),它不单可以通过FastCGI暴露PHP服务,还可以直接自己监听服务器端口直接作为HTTP服务器,以便内网或者本地快速假设、访问PHP服务器。
#!/bin/bash
# 安装php7.0-fpm
apt install php7.0-fpm
# 查看fpm的状态,一般是active(running)
service php7.0-fpm status
# 查看fpm的unix socket是否存在
cat /etc/php/7.0/fpm/pool.d/www.conf | grep listen
ls -l /run/php/php7.0-fpm.sock
php7.0-fpm默认是监听Unix Socket而不是TCP Socket,这个Unix Socket地址要记下来,等到后面配置Nginx的时候还有用。如果需要使用TCP Socket,可以修改/etc/php/7.0/fpm/pool.d/www.conf
的listen
配置;如果要调优fpm,可以修改/etc/php/7.0/fpm/php-fpm.conf
。
安装MySQL
MySQL经过被Oracle收购之后的动荡期,社区搞出了MariaDB来向Oracle的统治表示抗议,所以不少文章的Linux的MySQL安装教程已经变成了MariaDB。但是WordPress真的只是一个很简单的应用,用不了那么多新特性,所以为求方便我还是继续用MySQL。MariaDB我还没详细接触过,但是社区还有不少文章都介绍它是与MySQL完全兼容的,所以想用MariaDB的同志我鼓励他们去试试,我就还在MySQL上继续玩耍。
#!/bin/bash
# 安装MySQL,过程中会提示你设置MySQL的root用户密码,强烈建议你设置一个强密码,以免被拖库
apt install mysql-server
# 查看MySQL的状态,一般是active(running)
service mysql status
# 这是官方建议你再执行一次的安装过程,其中要你选择密码强度(新的低于强度的密码将不允许设置)、root用户是否可以远程访问(强烈建议只允许本地访问)
mysql_secure_installation
# 进入MySQL,创建WordPress的数据库和授权用户
mysql -u root -p
在mysql>
里面执行:
-- 创建数据库
CREATE DATABASE wordpressdb;
-- 创建用户,密码强度要超过你设定的强度,否则无法创建用户
CREATE USER wordpressuser IDENTIFIED BY '[email protected]';
-- 授权用户全权访问wordpressdb
GRANT ALL PRIVILEGES ON wordpressdb.* TO wordpressuser;
FLUSH PRIVILEGES;
EXIT;
安装Nginx
Nginx从1.9.5
开始支持HTTP/2.0,Ubuntu 16.10官方源上的Nginx版本已经是1.10.1
以上了,所以推荐直接安装:
#!/bin/bash
# 安装nginx
apt install nginx
# 查看nginx服务的状态,安装好后一般都是active (running)的
service nginx status
# 查看其版本是不是已经达到1.10.1或以上,且带有“--with-http_v2_module”配置
nginx -V
# 查看一下是否有“Welcome to nginx!”字眼
wget -qO- 127.0.0.1 | grep Welcome
手动安装的
安装WordPress
WordPress的发行包可以选择官网的英文版又或者中文版,不过中文版版本会相对滞后一点,但是没所谓,安装后可以在管理后台直接更新到最新版,所以这里直接选用中文版。
#!/bin/bash
# 如果下载zip包,就需要先安装unzip
apt install unzip
# 下载
wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.zip
# 解压
unzip -o -d /var/www wordpress-4.7.4-zh_CN.zip
# 查看wordpress目录
ls -l /var/www/wordpress
# 可选的,创建info.php,以便查看安装情况
echo "<?php phpinfo(); ?>" > /var/www/wordpress/info.php
# 更改wordpress目录的权限归属为www-data,以防止恶意脚本提权
chown -R www-data:www-data /var/www/wordpress
执行到这里,需要先配置好普通HTTP/1.1协议的Nginx,以便CertBot能正常运作。Nginx的配置文件主要参考WordPress的官方文档而来,里面有很多东西可以学习,这里暂时只需要一部分。
#!/bin/bash
vim /etc/nginx/sites-available/wordpress
#/etc/nginx/sites-available/wordpress
# PHP解析器后端定义
upstream php {
server unix:/run/php/php7.0-fpm.sock;
# 如果你的网站有必要使用多个后端的话,可以在这里增加服务器列表和负载均衡规则
}
server {
# 监听80端口
listen 80;
listen [::]:80;
server_name yourdomain.com;
root /var/www/wordpress;
index index.html index.htm index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# 禁止上传php文件,防止webshell攻击
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
# 允许访问ACME-protocol的.well-known文件夹
location ~ /.well-known {
allow all;
}
# WordPress的永久链接地址配置
location / {
try_files $uri $uri/ /index.php?$args;
}
# php文件的解析以FastCGI方式传给php上游
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
# 允许浏览器尽可能缓存静态文件
location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
expires max;
log_not_found off;
}
}
保存好该配置文件,然后执行以下命令:
#!/bin/bash
# 启用wordpress的配置文件
ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress
# 关闭默认服务器配置
rm /etc/nginx/sites-enabled/default
# 测试Nginx配置,如无问题,将会返回[OK]
nginx -t
# 重启Nginx
service nginx restart
可从第三方源安装的
LetsEncrypt:安装 CertBot
LetsEncrypt是一个免费的SSL证书CA,它允许所有遵循自动化证书管理环境协议(ACME protocol)的客户端申请/更新经过CA签名的SSL证书。CertBot是一个ACME protocol命令行客户端,它能够为市面上绝大多数的HTTP服务器申请LetsEncrypt的证书、密钥对。
* 如果你的域名能够正常解析到你的服务器IP,才继续执行以下操作;如果你的域名迟迟无法通过DNS解析到你的服务器IP,建议你先联系你的域名商,解决解析问题才继续。
#!/bin/bash
# 安装公共的CA证书、Python3环境、OpenSSL
apt install software-properties-common openssl
# 添加CertBot的第三方源
add-apt-repository ppa:certbot/certbot
# 更新环境
apt-get update
# 安装CertBot
apt install python-certbot-nginx
# 为Nginx生成证书密钥对,将ACME的.well-known目录部署至WordPress安装目录
# 只需要它生成证书,不需要它自动配置Nginx文件
certbot --nginx certonly --webroot-path=/var/www/wordpress -d yourdomain.com
# 查看安装情况
ls -l /etc/letsencrypt/live/yourdomain.com
ls -l /var/www/wordpress/.well-known
# 通过OpenSSL创建一个“迪菲-赫尔曼密钥交换”参数
# 这是HTTP/2.0在建立可靠的SSL链接前强制要求的密钥交换算法,2048位
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
执行到这里你便已经准备好所有开启Nginx HTTP/2.0的材料了。
* CertBot在申请证书的时候,你需要填入Email地址,以便LetsEncrypt通知你证书更新等事宜;第一次成功申请证书,需要到你的Email里收取一封eff.org发过来的确认邮件,里面有确认绑定的链接,不要忘记确认。
修改Nginx配置,启用HTTPS和HTTP/2.0
当CertBot完成申请LetsEncrypt的SSL证书,便需要修改Nginx的配置,并且重新加载配置:
#!/bin/bash
vim /etc/nginx/sites-available/wordpress
#/etc/nginx/sites-available/wordpress
# PHP解析器后端定义
upstream php {
server unix:/run/php/php7.0-fpm.sock;
# 如果你的网站有必要使用多个后端的话,可以在这里增加服务器列表和负载均衡规则
}
server {
# 监听443端口,开启SSL和HTTP/2.0
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com;
# 证书、密钥、密钥交换参数
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# SSL协议实现版本为三个主要TLS版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 优先倾向采用服务器端定义的加密模块,而不是浏览器端的
ssl_prefer_server_ciphers on;
# SSL使用的加密模块,这些加密模块是加密强度从强到弱排列的,“+”号前的是密钥交换算法,后面的才是加密算法
# 密钥交换算法:
# ECDH:椭圆曲线-迪菲-赫尔曼密钥交换,可防止中间人攻击
# DH:单纯的迪菲-赫尔曼密钥交换
# 对称加密算法:
# AESGCM:使用Counter模式的AES加密,且附带GMAC消息验证码
# AES256:256位高级加密标准
# AES128:128位高级加密标准
# 3DES:三重加密算法
# 带“!”的模块表示禁用/拒绝使用的模块:
# ADH:匿名迪菲-赫尔曼密钥交换,已经被OpenSSL建议不要使用,因为会受到中间人攻击
# AECDH:匿名椭圆曲线-迪菲-赫尔曼密钥交换,同样也被OpenSSL建议不要使用,也会受到攻击
# MD5:MD5不能保证安全已经是业界共识
ssl_ciphers 'ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5';
# secp384r1:在384位素数字段上的NIST(美国标准和技术国家研究院)或SECG(标准高效加密组)的椭圆曲线
ssl_ecdh_curve secp384r1;
# SSL链路会话:20分钟内共享。减少加解密对服务器的性能开销
ssl_session_cache shared:SSL:20m;
# 不允许SSL链路会话通过tickets凭证进行恢复,防止reset攻击
ssl_session_tickets off;
# 开启在线证书状态协议(OCSP)装订,预先查询好本服务器的证书状态,以便客户端第一次建立链接时一次性返回证书状态,缩短SSL握手的时间
ssl_stapling on;
ssl_stapling_verify on;
# Nginx查询自己状态时所用到的DNS服务器配置
resolver 223.5.5.5 223.6.6.6 valid=300s;
resolver_timeout 5s;
# 服务器响应时添加额外HTTP报头
# Strict-Transport-Security:告诉浏览器当前资源只允许HTTPS方式访问
# X-Content-Type-Options nosniff:不允许浏览器进行MIME类型嗅探
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
add_header X-Content-Type-Options nosniff;
root /var/www/wordpress;
index index.html index.htm index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# 禁止上传php文件,防止webshell攻击
location ~* /(?:uploads|files)/.*\.php$ {
deny all;
}
# 允许访问ACME-protocol的.well-known文件夹
location ~ /.well-known {
allow all;
}
# WordPress的永久链接地址配置
location / {
try_files $uri $uri/ /index.php?$args;
}
# php文件的解析以FastCGI方式传给php上游
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_intercept_errors on;
fastcgi_pass php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
# 允许浏览器尽可能缓存静态文件
location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
expires max;
log_not_found off;
}
}
server {
# 监听80端口
listen 80;
listen [::]:80;
server_name yourdomain.com;
# 告诉浏览器,所有资源都永久重定向至HTTPS协议下
return 301 https://$server_name$request_uri;
}
修改好该配置文件,然后执行以下命令:
#!/bin/bash
# 测试Nginx配置,如无问题,将会返回[OK]
nginx -t
# 重新加载
service nginx reload
然后在浏览器访问https://yourdomain.com
,WordPress的安装向导将会引导你填入网站的信息、数据库(wordpressdb)及其用户(wordpressuser)。
至此,一个运行在Nginx、PHP7和HTTP/2.0的WordPress便基本完成安装了,剩下就是上去WordPress寻找你所需要的主题、插件和其他优化工作。
如何确认是HTTP/2.0?
如果前面创建了info.php,浏览器访问https://yourdomain.com/info.php
,查找$_SERVER['SERVER_PROTOCOL']
,便可以看到HTTP的版本;如果没有,直接在浏览器的调试窗口(F12
),选择打开Protocol
一栏,如可看到h2、spdy
之类的协议名,便说明已经成功启用HTTP/2.0。
CertBot自动更新SSL证书
LetsEncrypt颁发的证书有效期只有90天,所以需要定期更新证书。执行certbot renew --dry-run
测试是否能正常更新证书,一般它会告诉你还没能够更新证书。如果你的.well-known
目录无法通过网络访问,又或者有文件权限问题,便会有错误信息。证书最多可在到期前30天进行更新,所以也没必要太频繁进行更新。利用cron,大概一周尝试更新一次就足够了:
#!/bin/bash
crontab -e
# root's crontab
# 每周日凌晨4时进行证书更新,更新完就重新加载nginx的配置
0 4 * * 7 /usr/bin/certbot renew --quiet --renew-hook "/bin/systemctl reload nginx"
打赏作者接下来便自豪地用WordPress写文章吧!😁
由 bruce 于 2017-07-14 1:10 更新
精彩!