先谈谈钱
用的腾讯云香港轻量服务器,在境外所以免备案,24 每月,30M 带宽,1T 流量 1 核 1G,目前已绝版。
域名是 liux.pro, 130 一年。
平时多关注腾讯云的活动,能省几百块。
不算很贵,就当买玩♂具了。
整体架构
尽量都用 docker-compose 进行部署,以后换服务器会更简单。
- 主机环境为 U- buntu 22.04。
- 使用 Docker 容器化部署了一个包含 Nginx、雷池 WAF、WordPress 和 MySQL。
- Nginx 用作反向代理,将请求传递给雷池 WAF 进行安全检查和转发。
- WordPress 是主要的应用程序,与 MySQL 数据库交互。
- 另外开启一个 acme.sh 自动更新 https 证书。
nginx
为了尽量节省带宽,在 nginx 里开启相对先进的 brotli 压缩。
另外,生成一张自签名的证书,给 nginx 镜像内置一个证书,防止在首次启动时候找不到证书而启动失败。
FROM alpine:3.17 AS builder
# 设置默认域名 每个 FORM 都要设置,不存在全局有效的 ARG,不管写在哪
ARG DOMAIN=liux.pro
RUN apk --no-cache add openssl
WORKDIR /certs
# 创建目录
RUN mkdir -p "${DOMAIN}"
# 随便签一个证书
RUN openssl genpkey -algorithm RSA -out "${DOMAIN}/key.pem" && \
openssl req -new -key "${DOMAIN}/key.pem" -out "${DOMAIN}/csr.pem" \
-subj "/C=US/ST=State/L=City/O=Organization/OU=Unit/CN=${DOMAIN}" && \
openssl x509 -req -days 365 -in "${DOMAIN}/csr.pem" -signkey "${DOMAIN}/key.pem" -out "${DOMAIN}/cert.pem"
# 生成 Fullchain 文件
RUN cat "${DOMAIN}/cert.pem" "${DOMAIN}/key.pem" > "${DOMAIN}/full.pem"
FROM alpine:3.17
ARG DOMAIN=liux.pro
# 安装 brotli 压缩
RUN apk add --no-cache nginx nginx-mod-http-brotli
# 把自己签的证书复制到 nginx 目录,先让 nginx 启动
COPY --from=builder /certs/${DOMAIN}/cert.pem /etc/nginx/ssl/${DOMAIN}/cert.pem
COPY --from=builder /certs/${DOMAIN}/key.pem /etc/nginx/ssl/${DOMAIN}/key.pem
COPY --from=builder /certs/${DOMAIN}/full.pem /etc/nginx/ssl/${DOMAIN}/full.pem
EXPOSE 80
EXPOSE 443
CMD ["nginx", "-g", "daemon off;"]
https 证书
构建的 ngixn 镜像,启动它和一个域名证书申请工具
version: '3'
services:
nginx:
build:
context: nginx
dockerfile: Dockerfile
container_name: nginx
network_mode: host
labels:
- sh.acme.autoload.domain=liux.pro
volumes:
- './nginx/nginx.conf:/etc/nginx/nginx.conf:ro'
- './nginx/http.d:/etc/nginx/http.d:ro'
acme.sh:
image: neilpang/acme.sh
container_name: acme.sh
command: daemon
volumes:
- './acme.sh:/acme.sh'
- '/var/run/docker.sock:/var/run/docker.sock'
environment:
- DEPLOY_DOCKER_CONTAINER_LABEL=sh.acme.autoload.domain=liux.pro
- DEPLOY_DOCKER_CONTAINER_KEY_FILE=/etc/nginx/ssl/liux.pro/key.pem
- DEPLOY_DOCKER_CONTAINER_CERT_FILE="/etc/nginx/ssl/liux.pro/cert.pem"
- DEPLOY_DOCKER_CONTAINER_CA_FILE="/etc/nginx/ssl/liux.pro/ca.pem"
- DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE="/etc/nginx/ssl/liux.pro/full.pem"
- DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="nginx -s reload"
目前 ZeroSSL 这个服务商,如果用 acme 申请,可以签发出 90 天有效期的泛域名证书。
通过 acme.sh 容器,执行下面的指令申请证书。
# 申请账号
docker exec \
acme.sh --register-account -m xxx@xxx.com
# 申请签发证书, 这里采用 dns 验证,我的域名在 DNSPOD 解析,这里配置自己账号的秘钥,以便验证域名归属
docker exec \
-e DP_Id="12345" \
-e DP_Key="keykeykey" \
acme.sh --issue --dns dns_dp -d "liux.pro" -d "*.liux.pro" --server zerossl
# 向 nginx 容器部署证书
docker exec \
acme.sh --deploy -d liux.pro --deploy-hook docker
上面的申请账号和签发证书只需要在最开始执行一次,之后需要的秘钥等会存到配置文件里了。
理论上说,它会开启定时任务自动续期域名,不让域名有效期小于 30 天。
通过环境变量给 acme.sh 容器指示配置哪个站点,证书位置,nginx 重启指令,每当自动续期后,自动部署证书到 nginx 容器内。
WordPress
version: '3'
services:
wordpress:
image: wordpress:6.4.3
container_name: wordpress
restart: always
ports:
- 127.0.0.1:8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: user
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: wordpress
volumes:
- ./data/wordpress:/var/www/html
- ./wordpress/upload.ini:/usr/local/etc/php/conf.d/uploads.ini
mysql:
image: mysql:5.7
container_name: mysql
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./data/mysql:/var/lib/mysql
wordpress 使用的主题是 puock,在手动上传主题安装包时候,报错,提示上传文件太大,需要添加一个 php 的配置文件,解除上传限制。
# uploads.ini
file_uploads = On
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500M
max_execution_time = 600
备份
TODO
所有东西都在 data 目录下。
先关闭所有容器,然后打包传到某个 oss。
正文完