AWSにWordPressを立ててSSL化
はじめに
私の実家は自営業で機械屋さんみたいなことをしているのですが、 70才超えている父がホームページ作りたいということで作ってみました。
(もうそろそろ引退かなと思っていたけど、まだ気力があるから、販売だけ頑張りたいらしい、すごいね。。脱帽)
今のうちにできる親孝行とWEBエンジニアになる勉強になると思い、挑戦!!
技術要素
- Docker
- Nginx
- Let's Encrypt
AWSのインスタンスを作成したり、ElasticIPを作ったり、はたくさんいいサイトがあるので、確認してみて下さい。 この記事はとても参考になりました。
ディレクトリ構成
web_site -- docker-compose.yml |-nginx --- nginx.conf # このファイルに証明書の設定やらポートの設定やらを記載する | --- certs # このフォルダに証明書を置く
docker-compose.yml の作成
Nginx, WordPress, MySQLのコンテナを立ち上げるための、docker-compose.yml 以下の記事を参考にしながら作成しました。
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
保守性(証明書を次更新すること)を考えると、ホスト側に置くのが良いと考えました。
完成品
これが完成したホームページです。
まだこれから写真追記したり、言葉付け加えたりします! googleで検索しても、出てこないよ〜なんとかします。。
所感
Dockerの本を読みたい。 いい本あったら教えて下さい〜