用FrankenPHP+sidekick创建一个极高性能的WordPress站点

首先,我们需要准备一个服务器,腾讯云,阿里云等均可,建议选择支持试用或者 7 天无理由退款的,这里以雨云为例,优惠码填 wp-admin 并且绑定微信后会获得 WordPress 建站礼包

首先我们来到雨云官网,点击右上角的登陆/注册按钮

在新的页面中,点击“暂无账号?点击注册”

随后输入用户名和密码注册即可,如果你如下图显示“正在使用优惠通道注册,现在注册立享专属优惠!”,那么您大概率已经使用了一个优惠码,如果没有这行,会出现一个优惠码的输入框,输入wp-admin即可

注册完成后就可以购买服务器了,新手建议先试用一台服务器,可以选择香港3区【点击查看:雨云香港三区2h4g服务器测评】,如果预算不是很充足,可以选择便宜一些的美国2区优化线路【点击查看:雨云1h1g洛杉矶二区云服务器测评】,如果有大带宽的需求并且不是很在意线路延迟,可以选择美国1区的大带宽【点击查看:雨云2h4g洛杉矶一区云服务器测评

在购买服务器前,可以先点击试用,可以 1 元试用(其实是 0 元,因为试用结束后会退还 1 元)大部分产品(某些产品有 1 元,3 元,5 元试用,对应不同配置)

但是需要注意的是,试用机一定要确定好准备长久使用再续费,因为试用机一旦续费后是不能像直接购买那样子退订(全额退款)的

雨云默认提供了很多系统和预装APP的选项,但是系统中存在探针,如果不希望被探针监视可以自己把系统DD一遍

购买/试用完成后等待 1 分钟左右服务器就创建好了,对于 Linux 系统的连接方法是使用 SSH 客户端,当然,如果你不想下载任何程序,雨云提供了 WebSSH 的功能,只需要先进入服务器管理页

随后点击左上角的“远程连接(VNC)”,在弹出的选项中选择第一个 “Xtermjs 模式”

在新弹出的窗口中敲几下回车即可看到有提示让输入用户名

这时候我们输入“root”后回车,会让我们输入密码,如果你没有手动更改密码,直接从服务器管理面板的“远程连接”板块中复制即可

随后需要使用组合键“Ctrl Shift V”(先按 Ctrl,再按 Shift,最后按 V)把密码粘贴进去,因为 Linux 粘贴使用的是“Ctrl Shift V”而不是 Windows 的“Ctrl V”

粘贴密码后不会显示任何内容,因为 Linux 输入密码时一般是没有回显的,也就是输入了内容不会显示任何东西,包括星号“*”,所以粘贴密码后直接回车即可

出现“root@xxxxxxxxx”的提示就代表登陆成功了,接下来按照教程一行命令一行命令的复制粘贴即可

安装 Docker

由于本教程需要用到 Docker,而且一般来说系统是不自带的,所以我们需要先装一个,这里推荐使用 Linuxmirror 的一键安装脚本

bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

我们根据它的提示输入即可,例如这里让你输入Y还是n,也就是是还是否,我们要安装,所以输入Y

如果是国外服务器,这里输入13,如果是国内服务器,那么建议使用7或者9

由于某些特殊情况,目前大多数Docker源均已失效,包括各种大厂的,目前,如果是境外服务器,请选择官方源,如果是境内服务器,请选择1

等待脚本执行完毕,我们使用命令来看看Docker是否已经成功安装

docker version

如果有输出版本即代表安装成功,接下来就可以开始部署应用了

部署应用

参考官方给出的示例仓库(前往GitHub查看

services:
  wordpress:
    image: wpeverywhere/frankenwp:latest-php8.3
    restart: always
    ports:
      - "8100:80" # HTTP
    environment:
      SERVER_NAME: ${SERVER_NAME:-:80}
      WORDPRESS_DB_HOST: ${DB_HOST:-db}
      WORDPRESS_DB_USER: ${DB_USER:-exampleuser}
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD:-examplepass}
      WORDPRESS_DB_NAME: ${DB_NAME:-exampledb}
      WORDPRESS_DEBUG: ${WP_DEBUG:-true}
      WORDPRESS_TABLE_PREFIX: ${DB_TABLE_PREFIX:-wp_}
      CACHE_LOC: ${CACHE_LOC:-/var/www/html/wp-content/cache}
      TTL: ${TTL:-80000}
      PURGE_PATH: ${PURGE_PATH:-/__cache/purge}
      PURGE_KEY: ${PURGE_KEY:-}
      BYPASS_HOME: ${BYPASS_HOME:-false}
      BYPASS_PATH_PREFIXES: ${BYPASS_PATH_PREFIXES:-/wp-admin,/wp-content,/wp-includes,/wp-json,/feed}
      CACHE_RESPONSE_CODES: ${CACHE_RESPONSE_CODES:-000}
      CADDY_GLOBAL_OPTIONS: |
        email myemail@sample.com
        auto_https disable_redirects
        debug
      WORDPRESS_CONFIG_EXTRA: |
          define('WP_SITEURL', 'http://localhost:8100');
          define('WP_HOME', 'http://localhost:8100');
          
    volumes:
    #  - ./wp-content:/var/www/html/wp-content

    depends_on:
      - db
    tty: true

  db:
    image: mariadb:latest
    restart: always
    ports:
      - ${LOCAL_DB_PORT:-3311}:3306
    environment:
      MYSQL_DATABASE: ${DB_NAME:-exampledb}
      MYSQL_USER: ${DB_USER:-exampleuser}
      MYSQL_PASSWORD: ${DB_PASSWORD:-examplepass}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-examplepass}
    volumes:
      - dbwp:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    ports:
      - ${LOCAL_PHPMYADMIN_PORT:-8086}:80
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-examplepass}
    depends_on:
      - db

volumes:
  dbwp:

一般来说,你直接使用这个compose文件是可以直接运行起来的,但是这只是个例子,直接使用这个作为生产环境的话,会有安全问题,例如它默认的MySQL用户名和密码都是弱密码,更何况这个compose还将MySQL的端口映射到容器外部了,虽说默认的端口不再是3306,但仍然有很大的安全隐患

为此,我们可以在当前目录下创建一个.env文件来进行配置,这样在部署的时候就可以自定义很多参数

BYPASS_PATH_PREFIX=/wp-admin,/wp-includes,/wp-content
DB_NAME=mysitename
DB_USER=mysitename
DB_PASSWORD=soineoinxAsx
DB_PREFIX=mywp_

如果你一切都准备就绪,那么可以通过此命令部署应用

docker compose up -d

它会自动拉取镜像并启动容器,此时你只需要访问服务器IP:端口即可访问,例如123.1.1.1:8100

如果你只想运行这一个网站,那么可以这样修compose的第一段改节省反代的步骤

ports:
      - "80:80"   # HTTP

修改之后也建议修改一下WORDPRESS_CONFIG_EXTRA中的内容

当然,由于FrankenPHP是使用Caddy作为Web服务器的,所以你可以使用它的自动HTPPS功能

首先你需要同时映射出80和443两个端口

ports:
      - "80:80"   # HTTP
      - "443:443"  # HTTPS

并且在.env文件中新增一行写入以下内容

SERVER_NAME=你的域名

之后务必要修改WORDPRESS_CONFIG_EXTRA中的内容

自己编译镜像

如果要进一步优化性能,你可能会需要用到Redis,Mencached等,这时候就需要给PHP安装对应的扩展,但是直接exec进容器安装后不方便持久化,所以建议自己构建Docker镜像

首先如果你的目的是新建站点而不是将已有的站点换一个后端,那么使用官方的DockerFile做一些修改就好,如果你是给已有站点换一个后端,建议参考我的DockerFile

先放上我自己改了的DockerFile,由于我不需要数据库和phpmyadmin(已经部署过了),所以我注释掉了这些

ARG WORDPRESS_VERSION=latest
ARG PHP_VERSION=8.3
ARG USER=1000



FROM dunglas/frankenphp:latest-builder-php${PHP_VERSION} AS builder

# Copy xcaddy in the builder image
COPY --from=caddy:builder /usr/bin/xcaddy /usr/bin/xcaddy


# CGO must be enabled to build FrankenPHP
ENV CGO_ENABLED=1 XCADDY_SETCAP=1 XCADDY_GO_BUILD_FLAGS='-ldflags="-w -s" -trimpath'

COPY ./sidekick/middleware/cache ./cache

RUN xcaddy build \
    --output /usr/local/bin/frankenphp \
    --with github.com/dunglas/frankenphp=./ \
    --with github.com/dunglas/frankenphp/caddy=./caddy/ \
    --with github.com/dunglas/caddy-cbrotli \
    # Add extra Caddy modules here
    --with github.com/stephenmiracle/frankenwp/sidekick/middleware/cache=./cache


FROM wordpress:$WORDPRESS_VERSION AS wp
FROM dunglas/frankenphp:latest-php${PHP_VERSION} AS base

LABEL org.opencontainers.image.title=FrankenWP
LABEL org.opencontainers.image.description="Optimized WordPress containers to run everywhere. Built with FrankenPHP & Caddy."
LABEL org.opencontainers.image.url=https://wpeverywhere.com
LABEL org.opencontainers.image.source=https://github.com/StephenMiracle/frankenwp
LABEL org.opencontainers.image.licenses=MIT
LABEL org.opencontainers.image.vendor="Stephen Miracle"


# Replace the official binary by the one contained your custom modules
COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
ENV WP_DEBUG=${DEBUG:+1}
ENV FORCE_HTTPS=0
ENV PHP_INI_SCAN_DIR=$PHP_INI_DIR/conf.d


RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates \
    ghostscript \
    curl \
    libonig-dev \
    libxml2-dev \
    libcurl4-openssl-dev \
    libssl-dev \
    libzip-dev \
    unzip \
    git \
    libjpeg-dev \
    libwebp-dev \
    libzip-dev \
    libmemcached-dev \
    zlib1g-dev


# install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions)
RUN install-php-extensions \
    bcmath \
    redis \
    fileinfo \
    exif \
    gd \
    intl \
    mysqli \
    zip \
    curl \
    # See https://github.com/Imagick/imagick/issues/640#issuecomment-2077206945
    imagick/imagick@master \
    opcache


RUN cp $PHP_INI_DIR/php.ini-production $PHP_INI_DIR/php.ini
COPY php.ini $PHP_INI_DIR/conf.d/wp.ini

#COPY --from=wp /usr/src/wordpress /usr/src/wordpress
COPY --from=wp /usr/local/etc/php/conf.d /usr/local/etc/php/conf.d/
COPY --from=wp /usr/local/bin/docker-entrypoint.sh /usr/local/bin/


# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN set -eux; \
    { \
    echo 'opcache.memory_consumption=128'; \
    echo 'opcache.interned_strings_buffer=8'; \
    echo 'opcache.max_accelerated_files=4000'; \
    echo 'opcache.revalidate_freq=2'; \
    } > $PHP_INI_DIR/conf.d/opcache-recommended.ini
# https://wordpress.org/support/article/editing-wp-config-php/#configure-error-logging
RUN { \
    # https://www.php.net/manual/en/errorfunc.constants.php
    # https://github.com/docker-library/wordpress/issues/420#issuecomment-517839670
    echo 'error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR'; \
    echo 'display_errors = Off'; \
    echo 'display_startup_errors = Off'; \
    echo 'log_errors = On'; \
    echo 'error_log = /dev/stderr'; \
    echo 'log_errors_max_len = 1024'; \
    echo 'ignore_repeated_errors = On'; \
    echo 'ignore_repeated_source = Off'; \
    echo 'html_errors = Off'; \
    } > $PHP_INI_DIR/conf.d/error-logging.ini


WORKDIR /var/www/html

#VOLUME /var/www/html/wp-content


COPY wp-content/mu-plugins /var/www/html/wp-content/mu-plugins
RUN mkdir /var/www/html/wp-content/cache



RUN sed -i \
    -e 's/\[ "$1" = '\''php-fpm'\'' \]/\[\[ "$1" == frankenphp* \]\]/g' \
    -e 's/php-fpm/frankenphp/g' \
    /usr/local/bin/docker-entrypoint.sh



# Add $_SERVER['ssl'] = true; when env USE_SSL = true is set to the wp-config.php file here: /usr/local/bin/wp-config-docker.php
#RUN sed -i 's/<?php/<?php if (!!getenv("FORCE_HTTPS")) { \$_SERVER["HTTPS"] = "on"; } define( "FS_METHOD", "direct" ); set_time_limit(300); /g' /usr/src/wordpress/wp-config-docker.php

# Adding WordPress CLI
RUN 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

COPY Caddyfile /etc/caddy/Caddyfile

# Caddy requires an additional capability to bind to port 80 and 443
RUN useradd -D ${USER} && \
    setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/frankenphp

# Caddy requires write access to /data/caddy and /config/caddy
RUN chown -R ${USER}:${USER} /data/caddy && \
    chown -R ${USER}:${USER} /config/caddy && \
    chown -R ${USER}:${USER} /var/www/html && \
    #chown -R ${USER}:${USER} /usr/src/wordpress && \
    chown -R ${USER}:${USER} /usr/local/bin/docker-entrypoint.sh

USER $USER

ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
CMD ["frankenphp", "run", "--config", "/etc/caddy/Caddyfile"]

如果你只是想加几个扩展,那么直接修改RUN install-php-extensions下面的内容就可以,如果你想更多的自定义,可以参考我的来,这里不做过多的解释

© 版权声明
THE END
喜欢就支持一下吧
赞赏
评论 抢沙发
头像
欢迎您留下宝贵的见解!对于“评论可见”,请合理评论,否则将被系统视为垃圾评论。
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容