从零开始的 Typecho 博客安装教程(附泛域名证书配置)

缘起:

之前一直用的 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 之后最好运行一次安全配置向导,通过该向导可以:

  1. 使用插件检查 root 账户的密码的强度
  2. 移除匿名用户
  3. 禁止 MySQL 的远程访问
  4. 移除测试的数据表
$ 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

获取并配置泛域名证书

(配置证书-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 泛域名证书申请及配置
自动续期脚本仓库地址

最后修改:2019 年 03 月 17 日 02 : 51 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论