Typecho

Typecho 在 Linux 下的安装和折腾过程

GitHub 和 GitHub pages 的访问越来越慢,前阵子国内还出现了中间人攻击,所以决定把博客搬到 VPS 上,不过毕竟是海外服务器,国内访问估计也够慢,希望能够苟住不被墙掉。

至于为什么选择 Typecho,可能只是单纯想折腾。如果 Typecho 不够好用,未来也可能换至 WordPress。

因为对 PHP 相关完全不熟,第一次不用别人的一键脚本、自己部署有点心累...不像 Java 直接 java -jar 就好,在这里做点 PHP 部署相关的记录,方便日后查阅。说到底我又在写二手知识了。

Typecho 稳定版虽说很久没更新,但主题和插件还是蛮多的。这次决定放飞自我整个二次元主题 xD。

Update: 好吧还是没整二次元主题,VOID 这个主题的衬线字体很对我胃口。

安装

  • 安装 php5.6
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt install php5.6 php5.6-fpm php5.6-cgi php5.6-cli php5.6-pgsql php5.6-mysql php5.6-sqlite3 php5.6-xml php5.6-mbstring
  • 安装 Nginx
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt install nginx
  • 安装 MySQL
sudo apt install mysql-server
sudo mysql_secure_installation

MySQL 用户相关的配置可以见我这篇博文:Ubuntu 安装的一些记录

  • 安装 Typecho
mkdir ~/typecho
wget https://typecho.org/downloads/1.1-17.10.30-release.tar.gz
tar xvf 1.1-17.10.30-release.tar.gz
mv build app # typecho path: /home/username/typecho/app

这里就不执行 sudo chown -R www-data.www-data 了,我 nginx user 就是 bolitao 这个账户

配置

配置 Nginx

sudo nano /etc/nginx/sites-enabled/typecho

配置文件内容:

server {
    listen 10086;
    listen [::]:10086;

    server_name bolitao.xyz;

    root   /home/bolitao/typecho/app;
    index  index.html index.htm index.php;

    location ~ .*\.php(\/.*)*$ {
            include fastcgi.conf;
            fastcgi_pass unix:/run/php/php5.6-fpm.sock;
    }
}

测试 Nginx

➜  app sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

无误后重启 nginx:

sudo systemctl restart nginx

通过 IP:端口 访问 typecho 进行安装。安装过程中如果不能自动创数据库那么就手动创一个 typecho 数据库:

CREATE DATABASE typecho

站点配置步骤完成后可能会要在站点根目录手动创建 config.inc.php 文件,vim ~/typecho/config.inc.php 并添加前端给出的内容即可。

证书

certbot 一把梭。

问题解决

502 错误

查看 nginx error.log

2020/04/02 09:46:37 [crit] 15494#15494: *34 connect() to unix:/run/php/php5.6-fpm.sock failed (13: Permission denied)

发现是权限相关错误,修改 fpm 相关配置:

sudo vim /etc/php/5.6/fpm/pool.d/www.conf

listen.owner = listen.group = 修改成自己的用户名和组

重启 fpm:

sudo systemctl restart php5.6-fpm.service

连接数据库时无数据库适配器可选

(我没来得及截图,借用一张 segmentfault 的图) https://image-static.segmentfault.com/989/349/9893498-574cf6032e3a8 php - Typecho 数据库适配器无法选择 - SegmentFault 思否

安装 php5.6-mysql

sudo apt install php5.6-mysql

安装后会自动启用该拓展

Typecho 提示无法连接/无法创建数据库

手动创建一个叫 typecho 的数据库,mysql -u username -p

CREATE DATABASE typecho

文章和后台 404

  1. nginx 的站点配置:location ~ .*\.php$ 修改为 location ~ .*\.php(\/.*)*$

  2. cgi.fix_pathinfo 设置为 enable:修改 php 配置:sudo vim /etc/php/5.6/fpm/php.ini,将 cgi.fix_pathinfo = 1 取消注释

500 错误

查看 nginx error 日志,发现错误:PHP Fatal error: Call to undefined function utf8_decode(),解决:安装 php-xml:

sudo apt install php5.6-xml

emoji 支持

在发表带有 emoji 表情的文章时,前端会提示错误:Database Query Error。后端错误:

"PHP message: Incorrect string value: '\xF0\x9F\x90\x8B A...' for column 'text' at row 1" while reading response header from upstream

原因是数据库或 PHP 程序 charset 是 utf-8,我们要换成 utf8mb4。解决办法如下:

  1. 修改数据库编码

    ALTER DATABASE typecho CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    
  2. 修改表编码

    USE typecho;
    alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_unicode_ci;
    alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_unicode_ci;
    alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_unicode_ci;
    alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_unicode_ci;
    alter table typecho_options convert to character set utf8mb4 collate utf8mb4_unicode_ci;
    alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_unicode_ci;
    alter table typecho_users convert to character set utf8mb4 collate utf8mb4_unicode_ci;
    
  3. 修改 PHP 程序连接参数

    vim config.inc.php,修改 charsetutf8mb4:

    'charset' => 'utf8mb4',
    

设置证书后无法加载 CSS 和 JavaScript

进入后台,把站点地址ip:port 修改为自己的域名。

升级 PHP 至 7.4

添加 PPA 然后 APT 安装相应模块即可。

升级后注意修改 Nginx 配置文件中 fastcgi_pass 的路径,以及 /etc/php/7.4/fpm/pool.d/www.conf 这个文件内的相关权限。

在升级 Typecho 后可能会无法访问数据库,这是因为高版本 MySQL 驱动换了,修改 config.inc.php 文件中 Typecho_Db 的第一个参数如下:

$db = new Typecho_Db('Pdo_Mysql', 'typecho_');

参考

加载评论