背景
本博客用typecho博客程序,caddy + php-fpm + SQLite
突发奇想把vps上所有服务都放在docker上,说干就干
拉取Caddy镜像
➜ docker pull abiosoft/caddy:php
移动博客相关文件
把Caddyfile、证书、日志、网站根目录放到一个文件夹,方便管理
➜ ls
Caddyfile cert logs www.zhlh6.cn
修改Caddyfile
移动文件后,网站根目录、TLS证书、日志文件路径改变,将Caddyfile修改如下:
https://www.zhlh6.cn {
root /srv
tls /cert/www.zhlh6.cn.crt /cert/www.zhlh6.cn.key
log /logs/www.zhlh6.cn.access.log
gzip
on startup php-fpm7 #一定要加这句,不然php-fpm不会启动!!
fastcgi / 127.0.0.1:9000 php {
ext .php
index index.php index.html
}
rewrite / {
if {path} not_match (/usr/|/admin/)
to /index.php{uri}
}
}
启动容器~~(开始跳坑)~~
➜ docker run -d -p 443:443 -p 80:80 -v /home/blog/Caddyfile:/etc/Caddyfile -v /home/blog/www.zhlh6.cn:/srv -v /home/blog/logs:/logs -v /home/blog/cert:/cert abiosoft/caddy:php
填坑
No input file specified.
搜了网上很多原因,有人说是网站目录权限问题,
有人说要在php.ini加上cgi.force_redirect = 0,cgi.fix_pathinfo=1等等
我尝试过均无效。
最后留意到网站根目录上有一个隐藏文件.user.ini
,打开修改里面的路径为/srv就好了
.user.ini为php防跨目录功能的配置文件,里面路径要与真实网站根目录路径一致。
Error establishing a database connection
很显然数据库连接错误,修改config.inc.ini中db->addServer参数
Database Query Error
首先打开typecho的调试信息,在config.inc.ini中添加如下代码
define('__TYPECHO_DEBUG__',true);
刷新可以看到报错:SQLSTATE[HY000]: General error: 8 attempt to write a readonly database
很显然是数据库没有写权限,docker容器内部使用www-data用户访问目录,而数据库是root用户的
➜ docker exec -it *** sh
# chown -R www-data:www-data /srv
重启容器,done.
2020年8月22日 更新:
vps到期,说一下迁移的坑
启动caddy提示目录没权限
/etc/caddy/Caddyfile:2 - Parse error: Unable to access root path '*': stat *: permission denied
如果你的网站根目录在/home, /root, and /run/user
里面,
需要在caddy的systemd配置文件caddy.service中,把ProtectHome=false给注释掉。
另外caddy默认是使用www-data用户运行的,请确保www-data用户有你的网站根目录以及网站根目录的父级目录有访问权限。
数据库驱动不存在
Adapter Typecho_Db_Adapter_Pdo_SQLite is not available
安装相关依赖:
sudo apt-get install php-sqlite3
然后把php.ini中的extension=pdo_sqlite
注释给去掉