虽然WordPress部署教程有很多,本篇部署方案的重点在于在单个服务器上,docker 部署,使用长亭Safeline 雷池 Web应用防火墙( WAF )进行代替常用的Nginx 保证 WordPress 安全。适合使用单服务器的个人博客网站,建议配置至少2h4g。
入手了自己的云服务器,总不能闲着不用叭,用其来部署一个个人博客站,记录成长、分享生活是一个好的选择。博客框架有很多,我想更多的专注于内容创作(主要是菜,所以选择了老牌成熟的 WordPress 。
然而,WordPress的巨大市场份额也使其成为黑客与自动化攻击脚本的重点关注对象。因此,如何为其筑起坚固的防线保证 WordPress 安全?(其实是我喜欢瞎折腾啦
通过Docker容器化技术,我们将构建一个由Safeline WAF作为安全网关,内部集成MariaDB数据库与Redis缓存的高效、安全的WordPress站点。
实际部署成果:https://www.paddysun.top/ 欢迎来我的个人博客玩呀
核心组件简介
- WordPress
- 是什么:一款全球最流行的开源内容管理系统(CMS),以其强大的功能、灵活的可扩展性(海量主题与插件)和友好的用户体验而闻名。无论是个人博客、企业官网还是电商平台,它都能胜任。
- 在本文中的角色:我们网站的核心应用,提供内容创作和管理的所有功能。
- 长亭 Safeline WAF
- 是什么:一款业界领先的、开箱即用的Web应用防火墙产品。它像一位忠诚的卫士,守候在网站的最前沿,对所有外来访问请求进行检测和过滤,能有效防御SQL注入、跨站脚本(XSS)、恶意爬虫等常见的Web攻击。
- 在本文中的角色:我们的“安全网关”。所有公网流量都必须先经过它的审查,确认安全无害后,才会被转发给内网的WordPress容器。WordPress本身则不直接暴露在公网上,提升了安全性。
实现 “既享受WordPress的便捷与强大,又拥有可靠的安全防护”
本部署方案关键优势
- 单服务器:虽然长亭官方不建议单服务器部署,奈何钱包空空。成本低
- 安全防护:所有流量经过 Safeline WAF 防护
- 网络隔离:WordPress 不直接暴露在公网
- 详细得不行(大概叭:我折腾了1个月,稳定运行1个月的实际部署方案
这种架构既保证了安全性,又保持了完整功能。
具体部署方案 (个人博客实战检验稳定运行)
购买并登云服务器(建议配置至少2h4g)
- 选择 Linux 系统镜像
- 确保云和系统安全组开放端口:80, 443
- 通过 SSH 登录服务器:
ssh ubuntu@your-server-ip
0.服务器准备&docker安装
# 更新系统 sudo apt update && sudo apt upgrade -y # 安装 Docker sudo apt install docker.io -y # 安装 Docker Compose sudo apt install docker-compose-plugin -y # 验证安装 docker --version docker compose version # 确保云防火墙和服务器系统放行80和443端口
1.safeline docker安装
safeline docker安装教程摘录自官方文档 长亭官方安装教程
1.1.创建雷池目录
mkdir -p "/data/safeline"
该命令会创建 /data/safeline 目录作为雷池的安装目录(你可以根据你的实际情况选择安装目录)
请确保该目录至少有 5GB 的存储空间(如果日常流量较大,请保证充足的磁盘容量)
1.2.下载 compose 编排脚本
使用下方的命令进入雷池安装目录,并下载 docker compose 编排脚本
cd "/data/safeline" wget "https://waf-ce.chaitin.cn/release/latest/compose.yaml"
1.3.配置 compose 环境变量
使用下方的命令进入雷池安装目录,并创建 .env 配置文件
cd "/data/safeline" touch ".env"
使用文本编辑器打开 .env 文件,写入下方的内容,POSTGRES的密码需自定义
具体参数请参考官方文档 长亭官方安装教程
SAFELINE_DIR=/data/safeline IMAGE_TAG=latest MGT_PORT=9443 POSTGRES_PASSWORD=yourpassword #(自定义密码使用数字+英文大小写组合,勿使用特殊字符) SUBNET_PREFIX=172.22.222 IMAGE_PREFIX=swr.cn-east-3.myhuaweicloud.com/chaitin-safeline ARCH_SUFFIX= RELEASE= REGION= MGT_PROXY=0
1.4.启动雷池
现在万事具备,使用以下命令启动雷池服务
cd "/data/safeline" docker compose up -d
2.Wordpress 安装
WordPress部署方案参考 Docker部署Wordpress (Nginx+Mariadb+redis+Wordpress)
选择合适的目录,创建项目结构
# 创建项目目录
mkdir wordpress && cd wordpress
# 创建必要的目录结构
mkdir -p data/mariadb/{conf,logs}
mkdir -p data/redis/{conf,log,data}
mkdir -p data/wordpress/{html,php}
# 设置目录权限
sudo chmod -R 755 data/
3. 创建配置文件
3.1 修改后的 docker-compose.yml(关键修改)
# docker-compose.yml
services:
mariadb:
image: mariadb:10
container_name: mariadb
restart: always
volumes:
- ./data/mariadb/conf:/etc/mysql/conf.d
- ./data/mariadb/logs:/logs
- wordpress-db-data:/var/lib/mysql
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: ${DB_USER:-wordpress_user}
MARIADB_PASSWORD: ${DB_PASSWORD:-secure_password_123}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-very_secure_root_password_123}
TZ: Asia/Shanghai
networks:
- wordpress_network
redis:
image: redis:alpine
container_name: redis
restart: always
volumes:
- ./data/redis/log/redis.log:/etc/redis.log
- ./data/redis/conf/redis.conf:/etc/redis/redis.conf
- ./data/redis/data:/data
networks:
- wordpress_network
wordpress:
depends_on:
- mariadb
- redis
image: wordpress:latest
container_name: wordpress
restart: always
volumes:
- ./data/wordpress/html:/var/www/html
- ./data/wordpress/php/upload.ini:/usr/local/etc/php/conf.d/upload.ini
environment:
WORDPRESS_DB_HOST: mariadb
WORDPRESS_DB_USER: ${DB_USER:-wordpress_user}
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD:-secure_password_123}
WORDPRESS_DB_NAME: wordpress
TZ: Asia/Shanghai
# 重要!:不可以设置 WordPress 站点 URL 和主页地址 要不然之后无法修改
# WORDPRESS_CONFIG_EXTRA: |
# define('WP_HOME', 'https://${DOMAIN}');
# define('WP_SITEURL', 'https://${DOMAIN}');
networks:
- wordpress_network
# 重要:不直接暴露端口到宿主机,只在Docker内网访问
expose:
- "80"
networks:
wordpress_network:
volumes:
wordpress-db-data:
3.2 创建环境变量文件
# 创建 .env 文件存储敏感信息 cat > .env << EOF # 数据库配置 DB_USER= #(你的数据库用户名称) DB_PASSWORD= #(你的安全密码) DB_ROOT_PASSWORD= #(你的安全密码) # 域名配置 DOMAIN= #你的域名 SERVER_IP= #你的IP # WordPress 容器配置 WORDPRESS_PORT=80 WORDPRESS_CONTAINER_NAME=wordpress EOF # 保护环境文件权限,若要以非root启动,则暂时不必配置权限 chmod 600 .env
3.3 创建 Redis 配置
# 下载 Redis 配置文件 wget -O ./data/redis/conf/redis.conf http://download.redis.io/redis-stable/redis.conf # 修改 Redis 配置 sed -i 's/^bind 127.0.0.1/bind 0.0.0.0/' ./data/redis/conf/redis.conf sed -i 's/^protected-mode yes/protected-mode no/' ./data/redis/conf/redis.conf sed -i 's/^daemonize yes/daemonize no/' ./data/redis/conf/redis.conf echo 'logfile "/etc/redis.log"' >> ./data/redis/conf/redis.conf echo 'maxmemory 1gb' >> ./data/redis/conf/redis.conf echo 'maxmemory-policy allkeys-lru' >> ./data/redis/conf/redis.conf # 创建日志文件 touch ./data/redis/log/redis.log chmod 666 ./data/redis/log/redis.log
3.4 创建 PHP 上传配置
# 创建 PHP 配置目录 mkdir -p ./data/wordpress/php/ # 创建 upload.ini 文件 cat > ./data/wordpress/php/upload.ini << EOF file_uploads = On memory_limit = 256M upload_max_filesize = 100M post_max_size = 100M max_execution_time = 300 EOF
4. 启动 WordPress 服务
# 启动所有服务 docker compose --env-file .env up -d # 查看服务状态 docker compose ps # 查看 WordPress 日志 docker compose logs -f wordpress
5. 配置 Safeline 反向代理
因为WordPress和safeline处于不同的docker和网络, 现在需要在 Safeline 管理界面添加 WordPress 站点, 这样safeline才能与WordPres通讯.
5.1 获取 WordPress 容器网络IP
# 将 WordPress 相关容器连接到 Safeline 网络 sudo docker network connect safeline-ce wordpress # 查看 safeline-ce 网络中 wordpress 容器的 IP 地址 sudo docker inspect safeline-ce # 将"Name": "wordpress"块的IP地址记录下来
5.2 在 Safeline 中添加站点
- 登录 Safeline 管理界面:
https://您的服务器IP:9443
添加防护站点
- 站点名称:
wordpress或者你喜欢的名称 - 上游服务器:WordPress 容器的实际 IP地址
- 访问域名:
your-domain.com(没有域名一定要填写 * 才能使用IP访问(建议在开启CDN之后去除 * 避免IP扫描发现原站IP与匹配的站点) - 协议:HTTP(如果配置了 HTTPS 证书则选择 HTTPS)
配置监听端口:
- 监听端口:80 和 443(若要开启HTTPS则必须监听443端口)
- 确保 Safeline 监听的端口在防火墙中开放
5.3 配置 DNS 解析
将您的域名 your-domain.com 解析到服务器 IP: 您的服务器IP地址
6. 完成 WordPress 安装
- 通过 Safeline 访问您的网站:
https://your-domain.com或者公网IP - 按照 WordPress 安装向导完成安装
- 选择语言、设置站点标题、管理员账号等信息
7. WordPress 安全加固
7.1 修改默认设置
# WordPress 初始化完成后操作
# 进入2.中选择的Wordpress对应根目录下
cd /你的/目录/地址
# 修改默认数据库表前缀
if [ -f "./data/wordpress/html/wp-config.php" ]; then
sed -i "s/\$table_prefix = 'wp_';/\$table_prefix = 'wp_$(openssl rand -hex 3)_';/" ./data/wordpress/html/wp-config.php
echo "数据库表前缀已修改"
fi
7.2 设置文件权限
# 设置正确的文件权限
sudo chown -R www-data:www-data ./data/wordpress/html/
sudo find ./data/wordpress/html/ -type d -exec chmod 755 {} \;
sudo find ./data/wordpress/html/ -type f -exec chmod 644 {} \;
8. 验证配置
8.1 检查 Safeline 防护
访问您的网站,确认:
- 网站正常访问
- Safeline 的防护功能正常工作
- 如果需要强制重定向到HTTPS 重定向正常(如果配置了 SSL),可以在wordpress后台配置站点名URL
# 进入WordPress /wp-admin/ 后台-设置-常规命令页面 进行配置 # https://你的网址/wp-admin/options-general.php WordPress 地址(URL) https://www.paddysun.top 站点地址(URL) https://www.paddysun.top
8.2 测试 WordPress 功能
测试以下功能确保正常工作:
- 文章发布
- 图片上传
- 插件安装
- 主题切换
9. 管理命令
# 停止服务 docker compose down # 重启服务 docker compose restart # 查看服务状态 docker compose ps # 查看日志 docker compose logs wordpress # 备份数据库 docker compose exec mariadb mysqldump -u root -p wordpress > backup.sql
10.建议(经验之谈
- 对于个人博客不建议开启safeline Bot防护,开启bot防护也记得将RSS等路径排除。否则博客聚合站点和友站bot机器人无法抓取你的最新文章,别人也无法通过RSS订阅你的文章。
- 建议开启CC防护这个没影响。
- 记得定期维护,更新系统、WordPress 核心、主题和插件等。
- 建议部署完成后创建系统镜像。定期备份。
本文最早发布于 https://www.paddysun.top/,采用 共享-署名-非商用-相同方式共享 4.0 国际许可协议 进行许可。投稿至长亭内容创作者计划,希望能够获得雷池专业版授权体验一下 QaQ。