この記事では、VPS上でDockerを使用してNginxの環境を構築する方法について説明します。 この記事は前の記事の続きです。
目次
本記事では、DockerとNginxを用いてVPS上に環境構築を行います。具体的には、既存のdocker-compose.ymlに設定を加えてNginxの環境を構築し、SSL設定を行いHTTPSでアクセスできるようにします。さらに、DockerファイルやDocker Composeの設定内容について説明し、FastAPIのポートを8000番に変更して設定を行います。
Nginxは、高性能かつ軽量なWebサーバー/リバースプロキシサーバーです。リバースプロキシは、クライアントからの要求をバックエンドのサーバーに中継し、そのレスポンスをクライアントに返す役割を担います。これにより、セキュリティやパフォーマンスの向上が期待できます。
今回はHTTPSでアクセスできるようにするためのSSLの設定をする際にNginxを利用しています。
以下のように、既存のdocker-compose.ymlにNginxの設定を追加しましょう。
version: '3.9'
services:
fastapi:
build: .
ports:
- "8000:8000"
volumes:
- .:/app
command: /bin/bash -c "uvicorn main:app --host 0.0.0.0 --port 8000 --reload"
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
これにより、Nginxコンテナが作成され、ポート80および443が開放されます。また、Nginxの設定ファイルとSSL証明書をマウントするためのボリューム設定も行います。
FastAPIのDockerfileを以下のように修正し、ポートを8000に変更します。
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
ここでは、FastAPIのポートを8000番に変更しています。
まず、nginxディレクトリを作成し、その中にdefault.confファイルを作成します。
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
location / {
proxy_pass http://fastapi:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
上記の設定では、httpでのアクセスをhttpsにリダイレクトし、SSL証明書を設定しています。また、NginxからFastAPIへのプロキシ設定も行っています。
SSL証明書は、./sslディレクトリにfullchain.pemとprivkey.pemのファイル名で配置してください。無料のSSL証明書を取得するには、Let's Encryptを利用することができます。
またexample.comは自分の利用するドメインに変更してください。
Let's Encryptは、無料でSSL証明書を発行するためのサービスです。以下の手順でSSL証明書を取得できます。
Certbotは、Let's EncryptのSSL証明書を簡単に取得・更新するためのツールです。まず、Certbotをインストールしましょう。以下は、Debian/Ubuntu系のOSでCertbotをインストールするコマンドです。
sudo apt-get update
sudo apt-get install certbot
次に、Certbotを使用してSSL証明書を取得します。以下のコマンドを実行してください。 example.comは自身のドメインに置き換えてください。
sudo certbot certonly --standalone -d example.com
上記コマンドを実行すると、/etc/letsencrypt/live/example.comディレクトリにSSL証明書が保存されます。これらの証明書をNginxの設定で使用するために、./sslディレクトリにコピーします。
sudo cp /etc/letsencrypt/live/example.com/fullchain.pem ./ssl/
sudo cp /etc/letsencrypt/live/example.com/privkey.pem ./ssl/
Let's EncryptのSSL証明書は、90日ごとに更新が必要です。Certbotを使って自動更新設定を行いましょう。以下のコマンドでCronジョブを設定します。
sudo crontab -e
エディタが開いたら、以下の行を追加して保存してください。
0 2 * * * /usr/bin/certbot renew --quiet --post-hook "docker compose -f /path/to/your/docker-compose.yml down && docker compose -f /path/to/your/docker-compose.yml up -d"
これにより、毎日2時にCertbotが証明書の更新を確認し、更新が必要な場合は証明書を更新して、Docker Composeを再起動します。
本記事では、Dockerを用いてVPS上にNginxの環境を構築する方法を紹介しました。具体的には、既存のdocker-compose.ymlにNginxの設定を追加し、SSL設定を行い、HTTPSでアクセスできるようにしました。これで、DockerとNginxを使った環境構築が完了しました。
ソフトウェアエンジニア。趣味は競馬、写真、ゲーム。
お問い合わせはTwitterのDMでお願いします。