LoginSignup
2
1

More than 3 years have passed since last update.

VultrでKUSANAGI Runs on Dockerが動くまで(その4)

Posted at

はじめに

前回の記事『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-portalLet'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を設定します。

$HOME/kusanagi01/docker-compose.yml
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証明書になります。

$HOME/https-portal/docker-compose.yml
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"
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1