麺を食べればご機嫌

仕事、プログラミング、映画とやら

AWSにWordPressを立ててSSL化

はじめに

私の実家は自営業で機械屋さんみたいなことをしているのですが、 70才超えている父がホームページ作りたいということで作ってみました。

(もうそろそろ引退かなと思っていたけど、まだ気力があるから、販売だけ頑張りたいらしい、すごいね。。脱帽)

今のうちにできる親孝行とWEBエンジニアになる勉強になると思い、挑戦!!

技術要素

  • Docker
  • Nginx
  • Let's Encrypt

AWSインスタンスを作成したり、ElasticIPを作ったり、はたくさんいいサイトがあるので、確認してみて下さい。 この記事はとても参考になりました。

qiita.com

ディレクトリ構成

web_site -- docker-compose.yml
       |-nginx --- nginx.conf # このファイルに証明書の設定やらポートの設定やらを記載する
             | --- certs # このフォルダに証明書を置く

docker-compose.yml の作成

Nginx, WordPress, MySQLのコンテナを立ち上げるための、docker-compose.yml 以下の記事を参考にしながら作成しました。

www.ukeyslabo.com

SSL通信するため、nginxのポート番号は443に変更しています。

version: "3"
services:
  wp-db:
    image: mysql:5.7

    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

    volumes:
      - storage-mysql:/var/lib/mysql

    ports:
      - "3306:3306"

    environment:
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
      MYSQL_USER: ${DB_USER_NAME} 
      MYSQL_PASSWORD: ${DB_USER_PASS} 
      TZ: "Asia/Tokyo"
    env_file:
      - ./.env

  wp:
    image: wordpress:php7.3-fpm

    volumes:
      - ./wp:/var/www/html

    expose:
      - "9000"

    environment:
      WORDPRESS_DB_HOST: wp-db 
      WORDPRESS_DB_USER: ${DB_USER_NAME}
      WORDPRESS_DB_PASSWORD: ${DB_USER_PASS} 
      WORDPRESS_DB_NAME: ${DB_NAME}
      WORDPRESS_TABLE_PREFIX: basis

    links:
      - wp-db

  wp-nginx:
    image: nginx:1.17
    ports:
      # - "80:80"
      - "443:443"

    volumes:
      - ./nginx/certs:/etc/nginx/ssl
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./wp:/var/www/html

    links:
      - wp

volumes:
  storage-mysql:

Let's Encryptで証明書作成

https-portal, mkcertも試してみましたが、SSL化するなら、Let's Encryptかなと思います。

docker-compose.yml上に追記するだけで、https-portalが立ち上がり、自動で証明書の発行更新を行ってくれるのですが、 証明書の有効期限が長いということで、証明書エラーが起こります。 証明書の期限は最近の情勢的には短くなる傾向にあるようだったので、諦めました。

  • mkcert

インストールしたら一瞬で証明書を発行してくれます。ただ自己証明書なので、これもブラウザで証明書エラーが起きます。

無料で証明書エラーが起きない、Let's Encrypt一択ですね(他にもあったら教えて下さい!) certbotをインストールして、standaloneで証明書発行。

# nginxのコンテナは停止させた後に証明書発行
sudo certbot certonly --standalone -t
# certsフォルダに移動
mv /etc/letsencrypt/archive/[your_domain]/fullchain.pem ./nginx/fullchain.pem
mv /etc/letsencrypt/archive/[your_domain]/privkey.pem ./nginx/privkey.pem
# 読み込みの権限付加
chmod 755 ./nginx/fullchain.pem
chmod 755 ./nginx/privkey.pem

nginx.confを作成し、証明書を読みこませる

events {
    worker_connections 1024;
}
http {
    include /etc/nginx/mime.types;
    charset UTF-8;

    server {
        listen 443 ssl;
        server_name your_domain;
        ssl_certificate /etc/nginx/ssl/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/privkey.pem;

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

        access_log /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;

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

        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(\.+)$;
            fastcgi_pass wp:9000; # wordpressコンテナを指定する
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
}

証明書を読み込んでいるのは、以下の部分です。

ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

certsフォルダ配下じゃないの?と思う方もいるかもしれませんが、 docker-compose.ymlでホストにあるcertsフォルダとnginxコンテナ内にのsslフォルダをマウント(同期)させています。

volumes:
      - ./nginx/certs:/etc/nginx/ssl
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./wp:/var/www/html

保守性(証明書を次更新すること)を考えると、ホスト側に置くのが良いと考えました。

完成品

これが完成したホームページです。

boutaro.work

まだこれから写真追記したり、言葉付け加えたりします! googleで検索しても、出てこないよ〜なんとかします。。

所感

Dockerの本を読みたい。 いい本あったら教えて下さい〜