我尝试使用Docker、Nginx和PHP-FPM来运行多个WordPress实例并实现负载均衡

我虽然不是通过Wordpress来写博客的人,但出于兴趣,我想尝试搭建一个稍微不同的环境。我听说在使用Wordpress网站运营时,如果安装插件或升级版本可能会导致不正常运行,所以我通过这种方式引入了虚拟环境,以确保本地验证的手段,并考虑将来将其部署到ECS或其他云容器管理服务中进行运营。最近我一直在思考这个问题。

由于找到的一些日本语网站的信息都已经过时,无法作为参考,因此我只参考了官方文件,并且只使用了2021年最新版本的信息进行了制作。我还考虑到了将来的版本升级,并将使用的版本也一并整理了出来。

如果您希望进行类似的事情,我希望这可以为您提供参考。

环境可以影响人们的生活和健康状况。

    Windows 10 (Docker Desktopインストール済)

目录结构

project/
  ├ .docker/
  │   ├ env_files/
  │   │   ├ mysql.env
  │   │   └ wordpress.env
  │   └ nginx/
  │       └ default.conf
  └ docker-compose.yml

用过的Docker镜像

为了避免在将来无法使用,建议使用指定到次要版本的图像,而不是指定到补丁版本。由于存在因版本不同而无法运行的情况,所以务必进行指定。

我保存了以下所使用的图像和特别注意事项。

Nginx:1.21-阿尔派纳

    特記事項なし

WordPress的版本为5.7,运行环境为php7.4-fpm-alpine。

    7.4-fpmを土台にしたphpイメージのため、9000番ポートがデフォルトでexportされている(参考ページ)

MySQL的版本是8.0。

    • デフォルトで3306番ポート、33060番ポートがexportされている

 

    MySQL8.0以上ではデフォルトの認証方式が5.7以前と異なるため注意

具體的實現方法 de

代码 (Code)

version: "3.9"

services:
  nginx:
    image: nginx:1.21-alpine
    ports:
      - "3000:80"
    volumes:
      - ./.docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./html:/var/www/html
    depends_on:
      - wp_first
      - wp_second
      - wp_third

  wp_first:
    image: wordpress:5.7-php7.4-fpm-alpine
    volumes:
      - ./html:/var/www/html
    env_file:
      - ./.docker/env_files/wordpress.env
    depends_on:
      - mysql

  wp_second:
    image: wordpress:5.7-php7.4-fpm-alpine
    volumes:
      - ./html:/var/www/html
    env_file:
      - ./.docker/env_files/wordpress.env
    depends_on:
      - mysql

  wp_third:
    image: wordpress:5.7-php7.4-fpm-alpine
    volumes:
      - ./html:/var/www/html
    env_file:
      - ./.docker/env_files/wordpress.env
    depends_on:
      - mysql

  mysql:
    image: mysql:8.0
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
    volumes:
      - ./.docker/mysql:/var/lib/mysql
    env_file:
      - ./.docker/env_files/mysql.env

upstream wp_fastcgi_passes {
    least_conn;
    server wp_first:9000;
    server wp_second:9000;
    server wp_third:9000;
}

server {
    listen 80;

    root /var/www/html/;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass wp_fastcgi_passes;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
}
MYSQL_ROOT_HOST=%
MYSQL_ROOT_USER=root
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=wordpress
WORDPRESS_DB_HOST=mysql
WORDPRESS_DB_USER=root
WORDPRESS_DB_PASSWORD=root
WORDPRESS_DB_NAME=wordpress

关于Docker的说明。

将WordPress文件的自动创建位置挂载起来。

一般情况下,启动WordPress容器后,大约1分钟后会在/var/www/html目录下生成文件。因此,我们需要在WordPress容器的卷中指定./html:/var/www/html。这样做后,原本不存在的“html”目录会在不知不觉中创建出来。

准备好提供静态文件的传输。

在nginx容器中的卷中也指定./html:/var/www/html。由于运行wordpress的fpm仅处理php,因此静态文件如css、javascript和图像等将由nginx进行传输。

请注意MySQL 8.0的启动方法

由于认证方法已经更改,因此在mysql命令中应指定–default-authentication-plugin=mysql_native_password。

nginx的相关说明

指定根目录和索引的php文件。

当收到对nginx的根目录“/”的请求时,请指定查找名为index.php而不是index.html的文件。如果不指定,nginx将不会寻找PHP文件。

指定如何处理接收到的php文件。

请把以下内容用中文进行本地化,只需一种选项:
对于请求路径以 \.php$ 结尾的情况,请指定将请求转发给 fastcgi 进行处理。通过这样做,可以将 php 处理交由 wordpress 容器负责,nginx 只需处理静态文件的传送和 php 请求的转发。

指定多台快速通用网关接口(fastcgi)的负载均衡

如果在上游指定多个容器名称和暴露的端口号,然后让nginx自动进行负载均衡。通过将其用作fastcgi_pass,可以将请求从一个nginx服务器传递到多个fpm服务器上。

实际尝试一下

MySQL 的初始化

请不要以后台运行的方式启动程序,因为一开始需要初始化数据库(大约1~2分钟),也可以作为进度确认的目的。当程序运行结束后,请按两次Ctrl+C来停止它。

$ docker-compose up mysql

生成WordPress文件

请先只启动一个WordPress实例,因为一旦同时启动多个实例,每个容器都会开始生成WordPress文件。由于此过程无法在命令中显示进度,所以在wp-admin、wp-content和wp-includes文件夹都已经生成完且一段时间没有文件生成时,请停止。

$ docker-compose up wp_first

让我们一口气全部启动吧

为了感受负载分散作用,这次我们没有使用docker-compose up -d命令。您可以确认请求的处理已分配给了wp_first、wp_second和wp_third。

$ docker-compose up

请在浏览器上确认

访问localhost:3000。就是这样!

请参考

    • wordpress – Docker Hub

 

    • wordpress/Dockerfile at 1d90641dc2075168fe59df2f02502df068cc5531 · docker-library/wordpress · GitHub

 

    • php/Dockerfile at 368453e2918b0a4a5ce488cc987c59c30e4ae4be · docker-library/php · GitHub

 

    Nginx upstream module – Nginx.org
广告
将在 10 秒后关闭
bannerAds