
VPS x Docker x NginxのSSL化
Nginxのコンテナに入ったうえで、通常のNginxを同じようにコマンドを叩いて設定してあげることがポイント。
自分の環境だとコンテナに入るコマンドは、docker-compose exec web /bin/sh
となっている。
前提条件として、yamlファイルやnginxの設定ファイルをいい感じにカスタマイズしなければいけない。
今回の環境
- Larave8
- php8
- Conoha VPS(Dockerプリインストール)
- Docker
- Nginx
- ドメイン取得済み
- DNS設定済み
ローカル環境でファイルの設定
docker-compose.yml
version: "3.9"
services:
app:
build: ./infra/php
volumes:
- ./backend:/work
web:
image: nginx:latest #latestじゃないと使えないコマンドがある
ports:
- 80:80
- 443:443 #+
volumes:
- ./backend:/work
- ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
- /etc/letsencrypt:/etc/letsencrypt #+
working_dir: /work
db:
build: ./infra/mysql
volumes:
- db-store:/var/lib/mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
links:
- db #mysqlではなくdbと書く
ports:
- 8081:80 #URL末尾にポート番号をつけなくてよくしたければ80にする
volumes:
- /sessions
volumes:
db-store:
infra\nginx\default.conf
server {
listen 80;
listen [::]:80; +
server_name portfolio.ketukara.com;
root /work/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
3行目の listen [::]:80;
を追加する。
この2つの作業が完了したら、データをVPSサーバーにアップロードする。
gitを使ってもいいし、やり方は任せる。
VPSサーバー(クラウド)での操作
ここからはローカルのテスト環境ではなく本番のクラウドサーバーでコマンドを叩く。
まずは443番ポートの許可。
もともと許可になっているかもしれないが一応。
まだコンテナには入らなくていい。
どこにいる状態でもいいので、
ufw allow 443
を叩く。
ufw status
を叩いて許可できたか確認。
許可できていれば、
ここからはnginxのコンテナに入って設定する。
/root/プロジェクトディレクトリ
に移動して、
docker-compose exec web /bin/sh
を叩いて、nginxのコンテナに入る
ほかの人の記事では全くこの説明がされていなくて困った。
apt update
apt install certbot python3-certbot-nginx
certbot --nginx -d ドメイン
certbot --nginx -d hogehoge.com
みたいな感じ。
↑最終的にこんな画面になれば成功。
さらに、let’s encryptの証明書は3か月で有効期限が切れるので、
更新作業を自動化するコマンドを入力する(これも同じくnginxのコンテナ内{)
certbot renew --dry-run
https://ドメインでアクセスできるようになっているはず。
ちなみにこの状態でgit pullしてみたら、既に最新だよ!ってメッセージが出てきたから、
ローカル環境と差分が生まれてコンフリクトを起こすなんてことはなさそう。
参考にした記事