#はじめに
前回の記事『VultrでKUSANAGI Runs on Dockerが動くまで(その3)』ではVPC環境であるVultrにKUSANAGI RoD環境を構築しWordpressが動くところまで確認しました。
今回はリバプロサーバとしてhttps-portal環境を作っていきます。
https-portal
https://github.com/SteveLTN/https-portal
#動作環境など
- Ubuntu 20.04
- docker 19.03.12
- docker-compose 1.26.2
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------
kusanagi01_config docker-entrypoint.sh wp -- ... Restarting
kusanagi01_db docker-entrypoint.sh mysqld Up
kusanagi01_ftp /bin/sh -c /docker-entrypo ... Up
kusanagi01_httpd /docker-entrypoint.sh /usr ... Up 0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp
kusanagi01_php /usr/local/bin/docker-entr ... Up
#https-portalとは
https-portalはLet's Encrypt対応のリバプロサーバDockerコンテナです。複数FQDNへの分散、Let's Encryptの自動更新などさくっとやってくれます。
Let's Encrypt
https://letsencrypt.org/ja/
#フォルダ構成
フォルダ構成は以下のようにしました。新たにhttps-portalフォルダを作成し、その中にdocker-compose.ymlを作成しています。
/home
└$USER
├https-portal ← リバプロサーバー(マルチサイト& Let’s Encrypt対応)
│ └docker-compose.yml
│
├kusanagi01 ← KUSANAGI Runs on Docker(WordPressサイト1つ目)
│ ├nginx
│ │ └nginx.conf
│ ├php
│ │ └ uploads.ini
│ └docker-compose.yml
│
└kusanagi02 ← KUSANAGI Runs on Docker(WordPressサイト2つ目)
└docker-compose.yml
#Kusanagi Rodのdocker-compose.ymlを修正する
https-portalとKusanagi Rod間で通信をできるように同一のネットワークに属するようにします。
docker-compose.ymlでnetworkにshared-networkを設定します。
version: '3'
networks:
default:
driver: bridge
driver_opts:
com.docker.network.driver.mtu: 9000
shared-network: ※追加
external: true ※追加
services:
httpd:
container_name: kusanagi01_httpd
image: primestrategy/kusanagi-nginx:1.17.9-r0
restart: always
env_file:
- .kusanagi
- .kusanagi.httpd
volumes:
- kusanagi:/home/kusanagi
#- kusanagi:/etc/letsencrypt
- kusanagi:/var/www/html/.well-known
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
ports:
- "8080:8080"
- "8443:8443"
extra_hosts:
- "example.com:127.0.0.1"
networks: ※追加
- shared-network ※追加
#certbot:
#container_name: kusanagi01_certbot
#image: certbot/certbot:v1.6.0
#restart: always
#network_mode: "service:httpd"
#env_file:
#- .kusanagi.httpd
#volumes:
#- kusanagi:/var/www/html/.well-known
#- kusanagi:/etc/letsencrypt
#command:
#- --version
## CONFIG
config:
container_name: kusanagi01_config
restart: always
build:
context: ./wpcli
user: "1000:1001"
env_file:
- .kusanagi
- .kusanagi.wp
- .kusanagi.db
volumes:
- database:/var/run/mysqld
- kusanagi:/home/kusanagi
command: wp --version
php:
container_name: kusanagi01_php
image: primestrategy/kusanagi-php:7.4.8-r0
restart: always
env_file:
- .kusanagi
- .kusanagi.php
- .kusanagi.mail
network_mode: "service:httpd"
volumes:
- database:/var/run/mysqld
- kusanagi:/home/kusanagi
- ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
## MYSQL
db:
container_name: kusanagi01_db
image: mariadb:10.5.4-focal
restart: always
user: "999:999"
env_file:
- .kusanagi.mysql
network_mode: "service:httpd"
volumes:
- database:/var/run/mysqld
- database:/var/lib/mysql
## FTPD
ftp:
container_name: kusanagi01_ftp
image: primestrategy/kusanagi-ftpd:1.0.2-r1
restart: always
network_mode: "service:httpd"
env_file:
- .kusanagi
- .kusanagi.wp
volumes:
- kusanagi:/home/kusanagi
volumes:
kusanagi:
database:
docker環境を再構築します。
$ docker-compose down
$ docker-compose up -d
#https-portalのdocker-compose.yml
networkをshared-networkにしてkusanagi01とkusanagi02と同一ネットワークにしています。
DOMAINS行で振り分け先のWebサーバを指定します。複数指定する場合はカンマで区切ればOKです。振り分け先をhttpではなくhttpsにしているのはうまくサイトが表示されないからです。(Wordpress側の設定を変えてあげればここをhttpにできるかもです。)
テスト中はSTAGE行をlocalにしておくことでオレオレ証明書で通信ができます。productionに変更すればLet's Encrypt証明書になります。
version: '3'
services:
https-portal:
container_name: https-portal
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
restart: always
environment:
DOMAINS: 'fqdn1 -> https://kusanagi01_httpd:8443, fqdn2 -> https://kusanagi02_httpd:8443'
#STAGE: 'production'
STAGE: 'local'
#FORCE_RENEW: "true"
ERROR_LOG: stderr
ACCESS_LOG: stdout
CLIENT_MAX_BODY_SIZE: 64M
networks:
- shared-network
networks:
shared-network:
external: true
docker環境を再構築します。
$ docker-compose down
$ docker-compose up -d
#動作確認
ブラウザでアクセスできることを確認します。今度は8080/TCPとか8443/TCPにする必要はないです。
http://FQDN/
https://FQDN/
ちゃんとログが出力されていることも確認しておきましょう。
https-portalのアクセスログ
$ docker logs https-portal
xxx.xxx.xxx.xxx - - [31/Jul/2020:15:18:45 +0000] "GET /wp-login.php HTTP/2.0" 200 2237 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.49" "-"
kusanagi01-httpdのアクセスログ
$ docker logs kusanagi01_httpd
0.126 - - 172.19.0.3 - - [01/Aug/2020:00:18:45 +0900] "GET /wp-login.php HTTP/1.0" 200 2237 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.49" "xxx.xxx.xxx.xxx"