在 Docker 上搭建 OpenLiteSpeed + WordPress

内容纲要

安装 Docker

# 如果没有安装 curl 以使用 apt 安装为例:sudo apt install curl
curl -fsSL https://get.docker.com -o install-docker.sh
sudo sh install-docker.sh

通过 Docker 安装 OpenLiteSpeed

这里用到 https://github.com/litespeedtech/ols-docker-env

cd /opt
# 如果没有安装 git,以使用 apt 安装为例:sudo apt install git
sudo git clone https://github.com/litespeedtech/ols-docker-env.git

一般个人常用 /usr/local/etc 存放配置文件,但届时 WordPress 程序也将存放在该目录有点混杂,所以此处以存放到 /opt 下为例,你可以按照你的规划存放

进入项目,简单的介绍下目录结构:

cd ols-docker-env # 有需要也可以给目录改个名称
.
├── acme               # 包含来自 Lets Encrypt 的所有已应用证书
├── bin                # 包含多个 CLI 脚本用于添加或删除虚拟主机、安装应用程序、升级等
├── data               # 存储 MySQL 数据库
├── docker-compose.yml # Docker Compose 文件
├── .env               # Docker Compose 的环境变量文件
├── LICENSE
├── logs               # 包含所有 Web 服务器日志和虚拟主机访问日志
├── lsws               # 包含所有 Web 服务器配置文件
├── README.md
└── sites              # 包含网站文档根目录(WordPress 应用程序将安装在此处)

启动容器前需要先对 docker-compose.yml.env 进行配置,先来看下截至写稿时 docker-compose.yml 的文件内容:

version: '3'
services:
  mysql:
    image: mariadb:10.5.9
    logging:
      driver: none
    command: --max_allowed_packet=256M
    volumes:
      - "./data/db:/var/lib/mysql:delegated"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    restart: always
    networks:
      - default
  litespeed:
    image: litespeedtech/openlitespeed:${OLS_VERSION}-${PHP_VERSION}
    logging:
      driver: none
    env_file:
      - .env
    volumes:
      - ./lsws/conf:/usr/local/lsws/conf
      - ./lsws/admin-conf:/usr/local/lsws/admin/conf
      - ./bin/container:/usr/local/bin
      - ./sites:/var/www/vhosts/
      - ./acme:/root/.acme.sh/
      - ./logs:/usr/local/lsws/logs/
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
      - 7080:7080
    restart: always
    environment:
      TZ: ${TimeZone}
    networks:
      - default
  phpmyadmin:
    image: bitnami/phpmyadmin:5.2.0-debian-11-r43
    ports:
      - 8080:8080
      - 8443:8443
    environment:
        DATABASE_HOST: mysql
    restart: always
    networks:
      - default
networks:
  default:
    driver: bridge

docker-compose.yml 基本不用修改,大部分都已经配置好,比如 OpenLiteSpeed 服务器需要用到的 80、443 端口等,此处的 7080 端口是管理后台 LiteSpeed WebAdmin Console 的入口端口

而下面 8080 和 8443 是 phpmyadmin 的 HTTP 和 HTTPS 入口端口,这两个端口你可能已经有别的程序在跑了,所以如果被占用了可以将冒号前的端口改动下,以改成 8081 为例: 8081:8080

需要修改的是 .env 文件,来看其内容:

TimeZone=America/New_York
OLS_VERSION=1.7.16
PHP_VERSION=lsphp81
MYSQL_DATABASE=wordpress
MYSQL_ROOT_PASSWORD=password
MYSQL_USER=wordpress
MYSQL_PASSWORD=password
DOMAIN=localhost

注意:上述中的数据库密码,即 password 强烈建议自行修改成其他的,以免后续他人通过 phpMyAdmin 访问!

而其他如时区设置可以按需要修改,如 Asia/Shanghai

然后可以指定 OpenLiteSpeed 和 PHP 的版本,可以在 https://hub.docker.com/r/litespeedtech/openlitespeed/tags 查看,例如截至写稿时 .env 指定的版本是 1.7.16,PHP 版本为 8.1,但在 Docker Hub 上可以看到当前最新版本为 1.7.18,PHP 版本提供了 7.4、8.0、8.1 三个版本,你所使用的某些插件可能并不支持高版本的 PHP,所以可以改为老版本 7.4 如 lsphp74

剩下的就是 MySQL 数据库等的设置,按需修改即可

在修改完成后,以此处为例在 /opt/ols-docker-env 使用命令:

sudo docker compose up -d

这样容器就在后台跑起来了

配置 OpenLiteSpeed

现在已经有了 OpenLiteSpeed 的容器,我们不需要进入容器进行操作,继续在 /opt/ols-docker-env 使用命令

设置 WebAdmin 密码

my_password 替换成你的密码:

sudo bash bin/webadmin.sh my_password

如果你的密码含有特殊字符可以先设置一个简单点的,一会在网页里的用户设置进行设置

创建虚拟主机与域名

在设置前可以先使用命令 bash bin/demosite.sh 让其创建一个 WordPress 演示站点,可以通过 IP 访问

也可以直接设置,例如你的域名为 example.com

# bash bin/domain.sh [-A, --add] example.com
sudo bash bin/domain.sh -A example.com

删除虚拟主机与域名

如果想要删除可以使用命令,例如要删除的虚拟主机的域名为 example.com

# bash bin/domain.sh [-D, --del] example.com
sudo bash bin/domain.sh -D example.com

创建数据库

可以为指定域名的虚拟主机自动或手动的创建数据库的用户、密码和数据库名称

# 自动创建
# bash bin/database.sh [-D, --domain] example.com
sudo bash bin/database.sh -D example.com

# 手动创建
# bash bin/database.sh [-D, --domain] example.com [-U, --user] USER_NAME [-P, --password] MY_PASS [-DB, --database] DATABASE_NAME
sudo bash bin/database.sh -D example.com -U USER_NAME -P MY_PASS -DB DATABASE_NAME

注意这里用的脚本是 bin/database.sh,虽然选项参数都是 -D

以自动创建为例,运行命令后会将创建数据库的用户、密码和数据库名称返回给你

Database: examplecom
Username: examplecom
Password: EA4LkbDDKRqUlD8D

安装 WordPress 网站

# ./bin/appinstall.sh [-A, --app] wordpress [-D, --domain] example.com
sudo ./bin/appinstall.sh -A wordpress -D example.com

接着前面自动创建数据库的步骤,此处的命令只修改最后的 example.com,程序会自动配置 wp-config.php 文件的数据库信息

然后在浏览器访问你的域名(假设你已经做好了 DNS 解析),就可以看到 WordPress 安装界面了

配置 SSL 证书

如果你访问了域名会发现这时候是自签证书,那么如何配置你的证书文件呢

手动配置

在 WebAdmin 的虚拟主机配置中,SSL 的配置路径为:

  • 密钥:/root/.acme.sh/certs/$VH_NAME_ecc/$VH_NAME.key
  • 证书:/root/.acme.sh/certs/$VH_NAME_ecc/fullchain.cer

以配置的虚拟主机域名 example.com 为例,实际上的路径为:
/opt/ols-docker-env/acme/certs/example.com_ecc

密钥和证书的文件名示例为:example.com.keyfullchain.cer

你可以将现有证书复制或链接到如此格式的路径和文件名,网站就可以自动对应生效了,或者在 WebAdmin 修改路径和文件名,如果自行修改路径不要改动到路径中的 /root/.acme.sh/ 因为这部分是容器内的路径

自动配置(ACME)

安装 ACME

# ./bin/acme.sh [-I, --install] [-E, --email] EMAIL_ADDR
# 将 [email protected] 修改成你的域名
sudo ./bin/acme.sh -I -E [email protected]

应用 Let's Encrypt 证书

# ./bin/acme.sh [-D, --domain] example.com
sudo ./bin/acme.sh -D example.com

更新 OpenLiteSpeed

要将 Web 服务器升级到最新的稳定版本,可以使用命令:

# bash bin/webadmin.sh [-U, --upgrade]
sudo bash bin/webadmin.sh -U

应用 OWASP ModSecurity

值得一提的是 OpenLiteSpeed 还带有 OWASP,OWASP® ModSecurity 核心规则集 (CRS) 是一组与 ModSecurity 或兼容的 Web 应用程序防火墙一起使用的通用攻击检测规则。 CRS 旨在保护 Web 应用程序免受各种攻击(包括 OWASP 十大攻击),并尽量减少误报。

但先别急着开启,根据安装脚本可以得知 OWASP 的核心规则集来自官方项目:https://github.com/coreruleset/coreruleset/

截至写稿时的最新版本为 v3.3.5,你可以在查看最新版本后,修改以本文为例的路径:/opt/ols-docker-env/bin/container/owaspctl.sh,将文件中的第 8 行:

#!/bin/bash
LSDIR='/usr/local/lsws'
OWASP_DIR="${LSDIR}/conf/owasp"
RULE_FILE='modsec_includes.conf'
LS_HTTPD_CONF="${LSDIR}/conf/httpd_config.xml"
OLS_HTTPD_CONF="${LSDIR}/conf/httpd_config.conf"
EPACE='        '
OWASP_V='3.3.4'

修改成当前最新版本

然后使用命令开启 OWASP mod_secure

# bash bin/webadmin.sh [-M, --mod-secure] enable
sudo bash bin/webadmin.sh -M enable

如果你已经开启了,可以修改文件后使用命令禁用:

# bash bin/webadmin.sh [-M, --mod-secure] disable
sudo bash bin/webadmin.sh -M disable

然后再次开启即可生效

管理 OpenLiteSpeed WebAdmin Console

在 Docker 上搭建 OpenLiteSpeed + WordPress

首先登陆 OpenLiteSpeed WebAdmin Console,输入你的服务器地址加上端口号 7080,如 http://1.1.1.1:7080/,如果没有反应可能是你的系统防火墙或云服务商的防火墙或安全组没有放行 7080 端口,手动设置一下

在 Docker 上搭建 OpenLiteSpeed + WordPress

在右上角可以点击「English」将语言切换成「中文」

在 Docker 上搭建 OpenLiteSpeed + WordPress

如果你的密码含有特殊字符,那么在「管理控制台设置」的「用户」里可以编辑设置

管理虚拟主机与 WordPress

现在已经可以正常使用了,你可能关心 WordPress 装到了哪里,以本文为例,你的网站数据位于 /opt/ols-docker-env/sites,里面又一个以你域名为名的目录,其目录下还有个 html 目录,这里就是你的网站目录了,使用命令一键安装的 WordPress 程序就在这里

另外还有些杂项可能是你会关心的...

上传的文件大小超过 upload_max_filesize 值

在 WordPress 上传主题/插件时你可能会遇到提示:「上传的文件大小超过php.ini文件中定义的upload_max_filesize值。」

在 Docker 上搭建 OpenLiteSpeed + WordPress

在「虚拟主机模板」中找到「docker」并点击右侧的放大镜图标查看

在 Docker 上搭建 OpenLiteSpeed + WordPress

然后找到你网站域名,再次点击右侧的放大镜图标

在 Docker 上搭建 OpenLiteSpeed + WordPress

在「常规」选项的最底部「php.ini 覆盖」的右侧点击编辑按钮,添加如下内容:

php_value upload_max_filesize 200M
php_value post_max_size 200M

上述示例设置最大大小为 200 MB,你可以按照你的需求自定义

WordFence 扩展保护开启失败

在配置 WordFence 防火墙的扩展保护时会看自动选择「LiteSpeed/lsapi」,但对于 Docker 部署的并不能直接使用该选项,正确做法是选择其他,然后在 WebAdmin Console 里设置,和上面设置上传文件大小一样,编辑「php.ini 覆盖」并填写内容:

php_value auto_prepend_file /var/www/vhosts/example.com/html/wordfence-waf.php

一般来说你只需要修改上面中的 example.com 部分,你会发现前面的路径不太一样因为这是容器内路径

💡 如果仍然不成功,可以在配置防火墙的时候仍然选择「LiteSpeed/lsapi」然后它会在 WordPress 目录生成一个名为 .user.ini 的文件,该文件并不能实际生效,但它能显示可用于「php.ini 覆盖」的 wordfence-waf.php 路径

Hide My WP Ghost Frontend Test 失败

在安装 Hide My WP Ghost 后的初始化设置,会有一个运行前端测试以检查新路径是否正常工作,你可能会遇到 Frontend Test 失败,这时候登录 WebAdmin Console 平滑重启后再次测试即可

使用 CDN 后获取真实客户端 IP 地址

如果你之前使用的是 NGINX 那么在使用 CDN 后可以通过在 http {} 里加上如下配置,以获取真实客户的 IP 地址:

http {
    ...
    set_real_ip_from 0.0.0.0/0;
    real_ip_header X-Forwarded-For;
    ...
}

那么在 OpenLiteSpped 中应该如何设置,首先进入 OpenLiteSpeed WebAdmin Console,然后在「服务器」 > 「常规」的「常规设置」,修改「使用报头中的客户端IP」为「是」即可

虚拟主机模板是否需要实例化

使用 bash bin/domain.sh -A 创建的虚拟主机默认都在「虚拟主机模板」下的「docker」模板中,在其中「虚拟主机成员」中的最右侧有一个方块按钮,也就是「实例化」

那么需不需要将创建的虚拟主机实例化呢?如果你只有一个网站或者并不需要对虚拟主机进行修改,那么可以不需要实例化,否则最好是实例化,不然会共用修改。

对象缓存扩展

在通过 OpenLiteSpeed 安装好并进入 WordPress 后你会发现已经自带并启用了 LiteSpeed Cache 插件,如果你之前有所了解会知道可以通过 Memcached 或 Redis 缓存来提高 WordPrss 的速度

但在通过 Docker 部署的 OpenLiteSpeed 里应该如何安装 Memcached 或 Redis 并进行配置呢?

Memcached

回到刚开始的 docker-compose.yml 文件,在 services 下新增一段:

  memcached:
    image: memcached:latest
    container_name: memcached
    ports:
      - 127.0.0.1:11211:11211
    restart: always
    networks:
      - default

保存后再次使用命令:

sudo docker compose up -d

这样 Memcached 就安装好了,然后在 LiteSpeed Cache 插件进行设置:

在 Docker 上搭建 OpenLiteSpeed + WordPress

在「缓存规则」的「对象」中如上图设置:

  • 主机:memcached (因为在 dcoker-compose.yml 文件中将改容器命名为 memcached 所以可以以此为主机名连接)
  • 端口:11211

Redis

如上图除了 Memcached 也可以使用 Redis,如果你更青睐 Redis 就如 Memcached 在 docker-compose.yml 文件的 services 下新增一段

  redis:
    image: redis:latest
    container_name: redis
    logging:
      driver: none
    # command: redis-server --requirepass 8b405f60665e48f795752e534d93b722
    volumes:
      - ./redis/data:/var/lib/redis
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
    environment:
      - REDIS_REPLICATION_MODE=master
    ports:
      - 127.0.0.1:6379:6379
    restart: always
    networks:
      - default

保存后再次使用命令:

sudo docker compose up -d

在「缓存规则」的「对象」中如 Memcached 设置:

  • 主机:redis (因为在 dcoker-compose.yml 文件中将改容器命名为 redis 所以可以以此为主机名连接)
  • 端口:6379