前言
常规的wordprees搭建方式都是让你使用docker或本地化运行,通过端口转发,再用nginx或其他web服务实现反代理,最终达到保护源站,让wordpress实现HTTPS访问,但个人认为这样做的话是有两大风险。
- 转发端口到公网有一定的安全隐患,容易受到第三方通过暴露端口的攻击
- nginx等web服务上手难度较大,对于新手来说,使用nginx等相关web服务可能无法完全保护源站
所以笔者认为利用cloudflare的ZeroTrust来实现DNS服务器与源站之间的通讯是一个非常安全且对新手很友好的部署方式,其一我们可以完全不用暴露任何端口到公网上,这样就可以完美的杜绝第三方攻击者发现源站并且攻击源站,其二是不需要配置nginx,证书颁发,反代理等网络相关服务。源站与DNS服务器之间使用cloudfate的加密通讯,既保护了源站,又简化了配置流程。
此教程仅对搭建个人博客这种网络流量较小的web服务,对于其他类型的高负载网络的web服务不建议使用此方式进行配置
准备
- 一台VPS(最好选择国外的VPS,不需要备案域名,建议配置为1G左右内存)
- 一个可托管到cloudflare的域名
部署
先用ssh登录到VPS,下载必要的组件。这里使用的是docker来完成相关服务的搭建,相较于其他方式,docker可以少配置很多环境。
1 2 3 4 |
#安装docker与docker-compose sudo apt update && sudo apt install -y docker.io docker-compose #设置docker开机自启动 sudo systemctl enable docker |
因为不暴露到任何端口到公网,所以wordpress与ZeroTrust的通讯是在vps内的局域网内进行通讯,所以得新建一个docker的局域网网段,如192.168.1.0/24 “`
1 2 3 |
#新建局域网段 #最后参数为该网段的名称,后面配置安装wordpress相关服务的时候用的上 sudo docker network create --driver=bridge --subnet=192.168.1.0/24 -gateway=192.168.1.1 wordpress-network |
登录cloudflare,选择ZeroTrust–>Networks–>Tunnels
创建一个新隧道
保持默认
命名隧道,这里可随便取名,只要本人能分辨出即可
选择docker安装方式,并且把token复制下来,等会要用到
创建一个docker-compose.yml文件,往里面写入如下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
version: '3.1' services: wordpress: image: wordpress:latest container_name: wordpress restart: always depends_on: - mariadb environment: #设置wordpress数据库 WORDPRESS_DB_HOST: mariadb WORDPRESS_DB_USER: username WORDPRESS_DB_PASSWORD: passwd WORDPRESS_DB_NAME: wordpress volumes: - ./wordpress_data:/var/www/html networks: wordpress-network: #为wordpress分配一个局域网ip,则wordpress局域网地址为http://192.168.1.10:80 ipv4_address: 192.168.1.10 mariadb: image: mariadb:latest container_name: mariadb restart: always environment: #设置mariadb数据库 MYSQL_ROOT_PASSWORD: adminadmin MYSQL_DATABASE: wordpress MYSQL_USER: username MYSQL_PASSWORD: passwd volumes: - ./mariadb_data:/var/lib/mysql networks: wordpress-network: #为mariadb分配一个局域网地址 192.168.1.11 ipv4_address: 192.168.1.11 cloudflared: image: cloudflare/cloudflared:latest container_name: cloudflared #此处替换为上一步获取的token command: tunnel --no-autoupdate run --token xxxx-xxxx-xxxx-xxx restart: always networks: wordpress-network: ipv4_address: 192.168.1.12 networks: #此处引用上一步所创建的docker网段 wordpress-network: external: true |
运行下面命令创建三个容器
1 |
docker-compose up -d |
初始化wordpress
完成上述操作后只是创建了wordpress,mariadb,ZeroTrust的相关服务,对于wordpress还没初始化。由于设置了wordpress的端口为映射到内网环境的192.168.1.10:80上,在外网是无法通过http协议访问到wordpress进行初始化设置。(设置管理员,网站url等)
所以我们可以通过进入wordpress内部进行设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#进入容器 docker exec -it wordpress bash #在容器中安装 wp-cli curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar chmod +x wp-cli.phar mv wp-cli.phar /usr/local/bin/wp #测试 wp-cli wp --info # 安装 WordPress wp core install --url="example.com" --title="Example Site" --admin_user="admin" --admin_password="password" --admin_email="admin@example.com" # 更新网站 URL wp option update home 'http://example.com' wp option update siteurl 'http://example.com' |
如果遇到下面错误的话则需要在命令后加上参数--allow-root
来绕过这个警告
1 2 3 4 5 |
Error: YIKES! It looks like you're running this as root. You probably meant to run this as the user that your WordPress installation exists under. If you REALLY mean to run this as root, we won't stop you, but just bear in mind that any code on this site will then have full control of your server, making it quite DANGEROUS. If you'd like to continue as root, please run this again, adding this flag: --allow-root If you'd like to run it as the user that this site is under, you can run the following to become the respective user: sudo -u USER -i -- wp |
到目前为止你已经完成了vps上面的相关配置,现在只需要完成ZeroTrust相关配置就可以正常使用wordpress了
初始化ZeroTrust
进入隧道设置界面,选择Public Hostname
设置公网访问的域名,顶级域名第一项就不需要填写下方选择http,url填写wordpress的局域网地址,因为http的默认端口为80,在这可以不用填写端口,如果不是80端口则需要在ip后面加上端口,保存稍等几分钟就可以使用域名访问到wordpress的首页了
访问https://domain.com/wp-admin/则可以进入管理页面
优化wordpress(可选)
解除wordpress默认无法上传图片
1 2 3 4 5 |
#进入容器 docker exec -it wordpress bash #修改uploads目录权限 chmod -R 777 /var/www/html/wp-content/uploads |
更改wordpress显示2M文件上传限制,方便安装自定义主题
1 2 3 4 5 6 7 8 |
#进入容器执行如下命令 echo "upload_max_filesize = 64M" > /usr/local/etc/php/conf.d/uploads.ini echo "post_max_size = 64M" >> /usr/local/etc/php/conf.d/uploads.ini #在 /usr/local/etc/php/conf.d/ 目录下创建一个新的 .ini 文件,专门用于修改上传大小,相较于全局修改这种方式更加安全 #保存退出后重启容器 docker restart wordpress |