Date: 2018-06-12

对于Caddy Web服务器的折腾,一直没有断过(传送门),之前搭建Caddy Web服务,用的是Supervisor让进程常驻(现在用系统自带的启动管理,和Caddy官方的脚本),而且现在看来,好多个文字逻辑有些不明确,再次整理记录一下。

image4219.png

前言

系统:

  • 系统计划用Ubuntu 14.04,或Ubuntu 18.04,两个都折腾一下;
  • Ubuntu 14.04方便安装不是太费资源的MySQL/MariaDB 5.5,毕竟目标主机内存只有512MB或1GB;
  • 深受LNMP.ORG作者的影响:安装MySQL 5.6或5.7及MariaDB 10必须1G以上内存!
  • 但是考虑到14.04官方支持到明年(2019)的4月份就结束了,所以本文也会写上18.04搭建的思路。

数据库:

  • 数据库上面写了,为了能在512MB或1GB内存的主机上,MySQL/MariaDB 5.5;
  • Ubuntu 14.04,官方源MySQL的版本是5.6,MariaDB的版本是5.5,我这里计划用MariaDB。
  • Ubuntu 18.04,这个系统上的数据库,额,PPA上的MySQL 5.5已经终止维护了;
  • 有个可以实现的想法,数据库用Docker容器(似乎不支持OpenVZ架构的主机);
  • 网络host,然后我在折腾的过程中也发现一个问题,phpMyAdmin连接的时候,需要修改配置文件,其中localhost修改为127.0.0.1,因为localhost连接的是mysql.sock,而咱们需要用tcp的方式连接到容器里的mysql

PHP:

  • 用PPA,Ubuntu 14.04/18.04都有PHP7.2的版本。

目录和文件规划

文件夹和文件

计划的是单独放在一个文件夹/data里,方便打包备份。

root@hello:/data# tree -L 3
.
|-- Caddyfile
|-- certs
|-- config
|   `-- default.conf
|-- db
|-- logs
`-- wwwroot
    `-- default
        `-- info.php

# Caddyfile - 文件
# certs - 目录,Caddy证书
# db - 目录,数据库文件,Docker创建容器的时候可以挂载这个目录
# logs - 目录,日志
# wwwroot - 目录,网站文件

然后丢行命令,方便快速创建:

mkdir /data && \
touch /data/Caddyfile && \
mkdir /data/config && \
touch /data/config/default.conf && \
mkdir /data/wwwroot && \
mkdir /data/wwwroot/default && \
touch /data/wwwroot/default/info.php && \
mkdir /data/logs && \
mkdir /data/db && \
mkdir /data/certs

/data/Caddyfile文件里填内容:

echo import config/*.conf >> /data/Caddyfile
# 导入 config 文件夹下所有 *.conf 配置文件

往默认主机配置/data/config/default.conf里填内容:

cat > /data/config/default.conf <<EOL
:1093 {
    root /data/wwwroot/default
    tls off
    gzip
    browse
    fastcgi / 127.0.0.1:9000 php
    log /data/logs/1-default.log
    errors /data/logs/0-default.log
}
EOL

# 端口号也可以更改,也可以直接用来建网站,本文接下来应该会有个 WordPress 站点的创建
# 更多配置参照 Caddy 官方文档:caddyserver.com/docs
# 同级目录下可以创建其他配置文件

/data/wwwroot/default/info.php里填内容:

echo "<?php phpinfo(); ?>" >> /data/wwwroot/default/info.php
# PHP INFO

文件权限

root@hello:/data# tree -gp -L 2
.
|-- [-r--r--r-- www-data]  Caddyfile
|-- [drwxrwx--- root    ]  certs
|-- [drwxr-xr-x www-data]  config
|   `-- [-r--r--r-- www-data]  default.conf
|-- [drwxr-xr-x root    ]  db
|-- [drwxrwx--- root    ]  logs
|   |-- [-rw-r--r-- root    ]  0-default.log
|   `-- [-rw-r--r-- root    ]  1-default.log
`-- [dr-xr-xr-x www-data]  wwwroot
    `-- [drwxr-xr-x www-data]  default

同样丢一行命令方便快速:

chown www-data:www-data /data/Caddyfile && \
chown -R www-data:www-data /data/config && \
chmod 444 /data/Caddyfile && \
chmod 444 /data/config/*.conf && \
chown www-data:www-data /data/wwwroot && \
chmod 555 /data/wwwroot && \
chown -R www-data:www-data /data/wwwroot/default && \
chown -R www-data:root /data/certs /data/logs && \
chmod 0770 /data/certs /data/logs

# 添加一个 Caddy 配置文件之后,需要修改用户、用户组、权限
# chown -R www-data:www-data /data/config && chmod 444 /data/config/*.conf
# 添加一个虚拟主机站点,文件夹需要修改用户、用户组(不然会碰到PHP程序无法上传等问题)
# chown -R www-data:www-data /data/wwwroot/domain-name.com

用户和用户组

为Caddy创建用户和用户组:

groupadd -g 33 www-data && \
useradd \
  -g www-data --no-user-group \
  --home-dir /data/wwwroot --no-create-home \
  --shell /usr/sbin/nologin \
  --system --uid 33 www-data

MySQL/MariaDB 5.5

Ubuntu 14.04

Ubuntu 14.04系统上安装5.5版本的数据库非常简单,官方源里就有了,所以:

apt-get update
apt-get install -y mariadb-server-5.5

安装过程中需要输入两遍root账户的密码;apt-get命令之后,再运行命令mysql_secure_installation进行安全配置。

Ubuntu 18.04

Ubuntu 18.04系统上使用5.5版本的数据库,这里曲线一下,用的是Docker。

首先一键安装Docker的命令:

curl -sSL https://get.docker.com/ | sh

然后例如运行MySQL 5.5的容器:

docker run -d \
  --name=mysql \
  --net=host \
  --restart=always \
  -v /data/db:/var/lib/mysql
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  mysql:5.5

# MYSQL_ROOT_PASSWORD 数据库 root 账户的密码,务必自定义
  • 管理容器里数据库,需要小小注意下,
  • 可以使用phpMyAdmin,可以下载解压放入/data/wwwroot/default目录;
  • 修改libraries/config.default.php,查找localhost(查找结果只有1个)为127.0.0.1
  • chown -R www-data:www-data /data/wwwroot/default
  • 就可以用root账户登陆了。

PHP

Ubuntu 14.04

添加PPA源:

apt-get update && \
apt-get install -y software-properties-common python-software-properties language-pack-en-base && \
echo -e "\n" | LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C && \
apt-get update

安装PHP及其扩展:

apt-get install -y php7.2-fpm php7.2-mysql \
  php7.2-bcmath php7.2-bz2 php7.2-curl php7.2-gd php7.2-intl \
  php7.2-fileinfo php7.2-iconv \
  php7.2-mbstring php7.2-xml php7.2-xmlrpc php7.2-zip

PHP配置:

sed -i "s/^listen\s*=.*$/listen = 127.0.0.1:9000/" /etc/php/7.2/fpm/pool.d/www.conf && \
sed -i "s/^;cgi.fix_pathinfo=.*/cgi.fix_pathinfo=0/" /etc/php/7.2/fpm/php.ini && \
sed -i "s/^memory_limit =.*/memory_limit = 256M/" /etc/php/7.2/fpm/php.ini && \
sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 128M/" /etc/php/7.2/fpm/php.ini && \
sed -i "s/^post_max_size =.*/post_max_size = 128M/" /etc/php/7.2/fpm/php.ini && \
service php7.2-fpm restart

# 可根据实际自行修改参数

Ubuntu 18.04

添加PPA源:

apt-get update && \
apt-get install -y software-properties-common && \
echo -e "\n" | LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php && \
apt-get update

安装PHP及其扩展:

apt-get install -y php7.2-fpm php7.2-mysql \
  php7.2-bcmath php7.2-bz2 php7.2-curl php7.2-gd php7.2-intl \
  php7.2-fileinfo php7.2-iconv \
  php7.2-mbstring php7.2-xml php7.2-xmlrpc php7.2-zip

PHP配置:

sed -i "s/^listen\s*=.*$/listen = 127.0.0.1:9000/" /etc/php/7.2/fpm/pool.d/www.conf && \
sed -i "s/^;cgi.fix_pathinfo=.*/cgi.fix_pathinfo=0/" /etc/php/7.2/fpm/php.ini && \
sed -i "s/^memory_limit =.*/memory_limit = 256M/" /etc/php/7.2/fpm/php.ini && \
sed -i "s/^upload_max_filesize =.*/upload_max_filesize = 128M/" /etc/php/7.2/fpm/php.ini && \
sed -i "s/^post_max_size =.*/post_max_size = 128M/" /etc/php/7.2/fpm/php.ini && \
service php7.2-fpm restart

# 可根据实际自行修改参数

Caddy

Ubuntu 14.04

安装Caddy和必需:

apt-get install -y libcap2-bin sysv-rc-conf curl && \
curl https://getcaddy.com | bash -s personal

设置开机自启动:

curl -o /etc/init.d/caddy https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-sysvinit/caddy && \
sed -i "s|CONFIGFILE=.*|CONFIGFILE=/data/Caddyfile|i" /etc/init.d/caddy && \
sed -i "s|CADDYPATH=.*|CADDYPATH=/data/certs|i" /etc/init.d/caddy && \
chmod +x /etc/init.d/caddy && \
service caddy start && \
sysv-rc-conf caddy on

# 用命令 service caddy status 查看 Caddy 是否正常运行
# 如果没有,那就要检查了,看看 /etc/init.d/caddy,看看 Caddyfile 等配置文件

此时,Caddy启动,打开http://domain.com:1093,会看到Caddy自带的目录索引,有个info.php的文件,打开这个文件能看到PHP的信息。

Ubuntu 18.04

安装Caddy和必需:

apt-get install -y curl && \
curl https://getcaddy.com | bash -s personal && \
setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy

设置开机自启动:

curl -o /etc/systemd/system/caddy.service \
  https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service && \
sed -i "s|Environment=CADDYPATH=.*|Environment=CADDYPATH=/data/certs|i" \
  /etc/systemd/system/caddy.service && \
sed -i "s|-conf=/etc/caddy/Caddyfile|-conf=/data/Caddyfile|i" \
  /etc/systemd/system/caddy.service && \
sed -i "s|ReadWriteDirectories=.*|ReadWriteDirectories=/data/certs|i" \
  /etc/systemd/system/caddy.service && \
chown root:root /etc/systemd/system/caddy.service && \
chmod 644 /etc/systemd/system/caddy.service && \
systemctl daemon-reload && \
systemctl start caddy.service && \
systemctl enable caddy.service

# 调试命令:journalctl -f -u caddy.service

此时,Caddy启动,打开http://domain.com:1093,会看到Caddy自带的目录索引,有个info.php的文件,打开这个文件能看到PHP的信息。

OK,搞定!洗洗睡! - - 还有一部分。

搭建 WordPress

先用phpMyAdmin等各种,新建一个数据库。

之后,例如有个域名(e.g. www.hello.com)搭建WordPress,如果要使用HTTPS,域名先指向这个主机并生效。

新建一个目录用于存放网站文件:

mkdir /data/wwwroot/hello.com

各种方法把WordPress放到该目录下,例如:

cd /data/wwwroot/hello.com && \
apt-get install -y unzip && \
wget http://cn.wordpress.org/latest-zh_CN.zip && \
unzip latest-zh_CN.zip && \
mv wordpress/* ./ && \
rm -rf latest-zh_CN.zip wordpress

新建一个配置文件,并写入配置:

touch /data/config/hello.com.conf && \
cat > /data/config/hello.com.conf <<EOL
http://www.hello.com {
    root /data/wwwroot/hello.com
    tls off
    gzip
    fastcgi / 127.0.0.1:9000 php
    rewrite {
        if {path} not_match ^\/wp-admin
        to {path} {path}/ /index.php?{query}
    }
    log /data/logs/1-hello.com.log {
        rotate_age 90
    }
    errors /data/logs/0-hello.com.log {
        rotate_age 90
    }
}
EOL

# 演示,没有开启HTTPS
# 如需,则替换上面内容 http://www.hello.com 为 www.hello.com,还有下一行;
# 替换上面内容 tls off 为 tls yourname@mail.com 你的邮箱地址

然后修正一下权限、用户组啥的:

chown -R www-data:www-data /data/wwwroot/hello.com && \
chown -R www-data:www-data /data/config && \
chmod 444 /data/config/*.conf

重启Caddy

# Ubuntu 14.04 # service caddy status
service caddy reload

# Ubuntu 18.04 # systemctl stats caddy.service
systemctl reload caddy.service

浏览器打开域名http://www.hello.com,就进入WordPress安装页面:

20180613184653.png

20180613185405.png

20180613185528.png

WordPress的固定链接,Caddyfile配置文件中已经有WordPress伪静态链接的重写,在WordPress后台设置即可。

20180613185908.png

结束

本文基本结束。

PS. 小内存,512MB的主机安装MySQL 5.6、MariaDB 10及其以上的版本,似乎可以。查了不少资料,最简单的解决方法好像是,把performance_schema = off写入到my.cnf里的[mysqld]下,随后重启后,占用的内存也许没有想象中的那么大。