VPS の OS が古くなってしまったので作り直した。
作りこんでいたサービスのほとんどはもはや使っていなかったので、とりあえずこの wordpress だけを持ってきた。
次回以降のことを考えて、docker で構築。
はじめに
外部 ↔ フロントエンドコンテナ(nginx) ↔ WordPress コンテナ群(nginx, php-fpm, mysql)という構成。
これだと、サーバ内にリバースプロキシが二つもあって無駄な処理をすることになるが、管理しやすさを考えてこうしてみた。問題があれば変更しよう。
コンテナ間通信ネットワークの作成
まずはコンテナ間通信のためのネットワークを作成し、
$ sudo docker network create --driver bridge shared
WordPress 用コンテナ群の作成
WordPress を提供するためのコンテナ群を作成。
これは nginx + php-fpm で動くようにした。
WordPress をサブディレクトリで動かすために working_dir:
を設定するのだが、これに気が付くのに時間を費やした。
version: '3.1'
services:
rproxy:
container_name: wp-rproxy
build:
context: ./mynginx
dockerfile: Dockerfile
restart: always
volumes:
- ./wordpress:/var/www/html/blog
- ./nginx-log:/var/log/nginx
depends_on:
- wordpress
wordpress:
image: wordpress:6.4.2-php8.3-fpm-alpine
restart: always
working_dir: /var/www/html/blog
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: mywordpress
WORDPRESS_DB_NAME: wp
volumes:
- ./wordpress:/var/www/html/blog
- ./wordpress-log:/var/log
depends_on:
- db
db:
image: mysql:8.0
restart: always
environment:
MYSQL_DATABASE: wp
MYSQL_USER: wp
MYSQL_PASSWORD: ***
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./db:/var/lib/mysql
- ./db-log:/var/log
この mynginx は以下の Dockerfile で作成。
FROM nginx:alpine
COPY <<EOF /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location /blog/ {
try_files \$uri \$uri/ /index.php?\$args;
}
location ~ \.php\$ {
include fastcgi_params;
fastcgi_pass wordpress:9000;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
fastcgi_param PATH_INFO \$fastcgi_path_info;
}
}
EOF
フロントエンドコンテナの作成
今後別のサービスを動かしたくなるかもしれないので、wordpress を提供しているコンテナ群とは独立に一つ nginx を立ててフロントエンドにする。
これは基本的には / にあるファイルの提供と、サブディレクトリに配置したサービスへのリバースプロキシにする。
なので、サービスを追加した際にはこのコンテナ(の default.conf)を適宜更新する。
version: '3.1'
services:
rproxy:
container_name: rfront
build:
context: ./mynginx
dockerfile: Dockerfile
ports:
- 80:80
restart: always
volumes:
- ./html:/var/www/html
- ./nginx-log:/var/log/nginx
networks:
default:
external:
name: shared
この mynginx は以下の Dockerfile で作ります。
FROM nginx:alpine
COPY <<EOF /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
log_format upstreamlog '[\$time_local] \$remote_addr \$host \$upstream_addr '
'\$upstream_cache_status \$upstream_status '
'\$upstream_http_location \$request';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
EOF
COPY <<EOF /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name www8281uo.sakura.ne.jp;
root /var/www/html;
index index.html index.htm;
access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/upstream.log upstreamlog;
error_log /var/log/nginx/error.log;
location /blog/ {
index index.php;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-Host \$host;
proxy_set_header X-Forwarded-Server \$host;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_pass http://wp-rproxy:80/blog/;
proxy_redirect default;
}
}
EOF
おわりに
WordPress くらい有名なサービスだとたくさん情報があるので調べればすぐにいろいろ出てくる。
Docker を使うことで、php-fpm を使った高速なサイト構築が簡単に出来るというのはすごいことだ。