目录
安装 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.key
- 证书:
/root/.acme.sh/certs/$VH_NAME_ecc/fullchain.cer
以配置的虚拟主机域名 example.com
为例,实际上的路径为:
/opt/ols-docker-env/acme/certs/example.com_ecc
密钥和证书的文件名示例为:example.com.key
和 fullchain.cer
你可以将现有证书复制或链接到如此格式的路径和文件名,网站就可以自动对应生效了,或者在 WebAdmin 修改路径和文件名,如果自行修改路径不要改动到路径中的 /root/.acme.sh/
因为这部分是容器内的路径
自动配置(ACME)
安装 ACME
# ./bin/acme.sh [-I, --install] [-E, --email] EMAIL_ADDR
# 将 contact@example.com 修改成你的域名
sudo ./bin/acme.sh -I -E contact@example.com
应用 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
首先登陆 OpenLiteSpeed WebAdmin Console,输入你的服务器地址加上端口号 7080,如 http://1.1.1.1:7080/
,如果没有反应可能是你的系统防火墙或云服务商的防火墙或安全组没有放行 7080 端口,手动设置一下
在右上角可以点击「English」将语言切换成「中文」
如果你的密码含有特殊字符,那么在「管理控制台设置」的「用户」里可以编辑设置
管理虚拟主机与 WordPress
现在已经可以正常使用了,你可能关心 WordPress 装到了哪里,以本文为例,你的网站数据位于 /opt/ols-docker-env/sites
,里面又一个以你域名为名的目录,其目录下还有个 html
目录,这里就是你的网站目录了,使用命令一键安装的 WordPress 程序就在这里
另外还有些杂项可能是你会关心的…
上传的文件大小超过 upload_max_filesize 值
在 WordPress 上传主题/插件时你可能会遇到提示:「上传的文件大小超过 php.ini 文件中定义的 upload_max_filesize 值。」
在「虚拟主机模板」中找到「docker」并点击右侧的放大镜图标查看
然后找到你网站域名,再次点击右侧的放大镜图标
在「常规」选项的最底部「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 插件进行设置:
在「缓存规则」的「对象」中如上图设置:
- 主机:
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