一个网站的诞生

171次阅读
没有评论

先谈谈钱

用的腾讯云香港轻量服务器,在境外所以免备案,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。

正文完
 0
评论(没有评论)