缘起:
之前一直用的 Wordpress, 一直感觉过于臃肿,主题也不好看,偶然发现 Typecho 一款付费主题 handsome 很和我胃口,便开始了折腾 Typecho 的路程。
准备工作
重装Ubuntu 16.04 镜像
略
MySQL 和 Nginx 环境配置:
安装 MySQL 数据库
# 文中所有命令均以 root 账户运行
$ sudo su
$ apt-get update
$ apt-get install mysql-server mysql-client nginx
# 安装时建议设置一个复杂的root账户密码
安装完 MySQL 之后最好运行一次安全配置向导,通过该向导可以:
- 使用插件检查 root 账户的密码的强度
- 移除匿名用户
- 禁止 MySQL 的远程访问
- 移除测试的数据表
$ mysql_secure_installation
最后,你需要在 MySQL 中创建一个数据库用与站点数据保存。
数据库编码方式最好选择 uft8mb4 ,这样才能保证 emoij 表情能够正常显示。
$ mysql -uroot -pxxx
mysql> CREATE DATABASE typecho_ny CHARACTER SET utf8;
# 查看数据库是否设为 utf8 编码
mysql> USE typecho_ny
mysql> SHOW VARIABLES LIKE 'character_set_database';
MySQL的操作命令最好使用大写,便于区分变量和数据库语句,提高可读性。
删除数据库的指令为 DROP DATABASE <数据库名>;
PHP环境配置
安装 PHP 7.0
$ apt-get install php7.0 php7.0-fpm phpmyadmin
# 安装phpmyadmin过程中会出现选择 Apache 和 Lighttpd 的选项,直接[TAB]跳过即可
# 指令`sudo dpkg-reconfigure phpmyadmin`可对其重新配置
检查 nginx 和 PHP 服务的运行情况
$ systemctl status nginx
$ systemctl status php7.0-fpm
如无异常它应该会出现绿色的 active (running) 的提示。
接下来我们修改 php.ini 中默认的上传附件大小限制
$ vi /etc/php/7.0/fpm/php.ini
配合 vim 查找命令找到下面几个参数并按需修改
Vim 查找下一个:在normal模式下按下 / 即可进入查找模式。输入要查找的字符串并按下回车。
Vim 会跳转到第一个匹配。 按下 n 查找下一个,按下 N 查找上一个。
upload_max_filesize = 20M;
post_max_size = 40M;
max_execution_time=300;
保存配置后我们需要重启 php-fpm 服务
$ service php7.0-fpm restart
获取并配置泛域名证书
- 访问 Certbot官网
(配置证书-1.PNG)
选择对应服务器和 Linux 版本,这里以Nginx + Ubuntu 16.04 为例
安装 Certbot
$ apt-get update
$ apt-get install software-properties-common
$ add-apt-repository universe
$ add-apt-repository ppa:certbot/certbot
$ apt-get update
$ apt-get install python-certbot-nginx
申请证书
$ certbot certonly -d *.nyaasu.top --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
# [*.nyaasu.top] 改为你自己的域名
--manual
交互式获取,--preferred-challenges dns
使用DNS验证的方式(泛域名只能使用DNS验证),--server
指明支持acme-v02的Server地址,默认是acme-v01的地址。
按照要求输入邮箱,同意协议,
当出现下面内容时
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.nyaasu.top with the following value:
kw1eKl4uRFstWd3Oq10mwdcs5hNNElxnKeYZ3CoaW0A
Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# 请在域名 _acme-challenge.nyaasu.top 下部署一个 DNS TXT 记录,具有以下值:
kw1eKl4uRFstWd3Oq10mwdcs5hNNElxnKeYZ3CoaW0A
# 在继续之前,请验证是否已部署记录。
暂停操作,进入你的域名服务商网站,配置域名解析,按以上要求添加一条TXT类型的解析。
等待3-5分钟,敲回车,成功会有以下提示
IMPORTANT NOTES:
- "Congratulations!" Your certificate and chain have been saved at:
/etc/letsencrypt/live/nyaasu.top/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/nyaasu.top/privkey.pem
Your cert will expire on 2019-03-23. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
证书的存放路径
生成证书中会创建 /etc/letsencrypt
文件夹,
证书文件默认存放在 /etc/letsencrypt/live/example.com
文件夹中,
其中 example.com
取自第一个域名。在 example.com
文件夹中包含 4 个文件 :
- cert.pem 域名证书
- chain.pem 根证书及中间证书
- fullchain.pem 由 cert.pem 和 chain.pem 合并而成
- privkey.pem 证书私钥
- 创建一个 2048 位的 Diffie-Hellman 文件
(nginx 默认使用 1024 位的 Diffie–Hellman 进行密钥交换, 安全性太低)
openssl dhparam -out /etc/letsencrypt/live/dhparams.pem 2048
配置 Nginx
server {
# 重定向到https协议
listen 80;
server_name ny.nyaasu.top;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name ny.nyaasu.top;
# 配置站点证书文件地址
ssl_certificate /etc/letsencrypt/live/nyaasu.top/fullchain.pem;
# 配置证书私钥
ssl_certificate_key /etc/letsencrypt/live/nyaasu.top/privkey.pem;
# 配置 Diffie-Hellman 交换算法文件地址
ssl_dhparam /etc/letsencrypt/live/dhparams.pem;
# 配置服务器可使用的加密算法
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
# 指定服务器密码算法在优先于客户端密码算法时,使用 SSLv3 和 TLS 协议
ssl_prefer_server_ciphers on;
# ssl 版本 可用 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2
# ie6 只支持 SSLv2,SSLv3 但是存在安全问题, 故不支持
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 配置 TLS 握手后生成的 session 缓存空间大小 1m 大约能存储 4000 个 session
ssl_session_cache shared:SSL:50m;
# session 超时时间
ssl_session_timeout 1d;
# 负载均衡时使用 此处暂时关闭 详情见 https://imququ.com/post/optimize-tls-handshake.html
# 1.5.9 及以上支持
ssl_session_tickets off;
# 浏览器可能会在建立 TLS 连接时在线验证证书有效性,从而阻塞 TLS 握手,拖慢整体速度。OCSP stapling 是一种优化措施,服务端通过它可以在证书链中封装证书颁发机构的 OCSP(Online Certificate Status Protocol)响应,从而让浏览器跳过在线查询。服务端获取 OCSP 一方面更快(因为服务端一般有更好的网络环境),另一方面可以更好地缓存 以上内容来自 https://imququ.com/post/my-nginx-conf-for-wpo.html
# 1.3.7 及以上支持
ssl_stapling on;
ssl_stapling_verify on;
# 根证书 + 中间证书
ssl_trusted_certificate /etc/letsencrypt/live/nyaasu.top/fullchain.pem;
# HSTS 可以告诉浏览器,在指定的 max-age 内,始终通过 HTTPS 访问该域名。即使用户自己输入 HTTP 的地址,或者点击了 HTTP 链接,浏览器也会在本地替换为 HTTPS 再发送请求 相关配置见 https://imququ.com/post/sth-about-switch-to-https.html
add_header Strict-Transport-Security max-age=60;
root /app/blog_ny;
gzip on;
gzip_min_length 1k;
gzip_buffers 16 64k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
location / {
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(\/.*)*$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
- 重启 Ngninx 服务 (Don't add extra space to beautify your conf,it may cause lots of problems)
$ service nginx restart
Typecho 安装
- clone Typecho 仓库至服务器
$ cd /
$ mkdir /app
$ git clone https://github.com/typecho/typecho.git
- 修改权限,避免未知bug。
$ chmod -R 777 /app
- 访问网站,开始使用
- 配置完成后将权限改回755
$ chmod -R 755 /app
访问 https:// domin.com/install.php ,完成 Typecho 安装配置。
如果不出意外,你的站点已经可以通过域名访问并且支持 HTTPS 协议。
自动续期证书脚本(使用阿里云API自动更改DNS解析)
下载
$ git clone https://github.com/ywdblog/certbot-letencrypt-wildcardcertificates-alydns-au
$ cd certbot-letencrypt-wildcardcertificates-alydns-au
$ chmod 0777 au.sh autxy.sh augodaddy.sh python-version/au.sh
配置
目前该工具支持四种运行环境和场景:
au.sh:操作阿里云 DNS hook shell(PHP 环境)。
autxy.sh:操作腾讯云 DNS hook shell(PHP 环境)。
python-version/au.py:操作阿里云 DNS hook shell(兼容Python 2/3)
augodaddy.sh:操作 GoDaddy DNS hook shell(PHP 环境)
这里使用 python-version/alydns.py,修改 ACCESS_KEY_ID、ACCESS_KEY_SECRET,阿里云 API key 和 Secrec 官方申请文档。
续期证书、加入 crontab
certbot renew --cert-name nyaasu.top --manual-auth-hook /root/certbot-letencrypt-wildcardcertificates-alydns-au/python-version/au.sh
简书 - 申请 Let’s Encrypt 泛域名证书 及 Nginx/Apache 证书配置
思否 - Let's Encrypt 泛域名证书申请及配置
自动续期脚本仓库地址