Primary About Development

VPS上でDockerを使用してNginx環境を構築する方法

2023-04-19

この記事では、VPS上でDockerを使用してNginxの環境を構築する方法について説明します。 この記事は前の記事の続きです。

目次

  1. はじめに
  2. Nginxの基本概念
  3. 既存のdocker-compose.ymlにNginxの設定を追加する
  4. Dockerfileの修正
  5. SSL設定を行いHTTPSでアクセスできるようにする
  6. Let's EncryptからSSL証明書を発行する方法
  7. まとめ

1. はじめに

本記事では、DockerとNginxを用いてVPS上に環境構築を行います。具体的には、既存のdocker-compose.ymlに設定を加えてNginxの環境を構築し、SSL設定を行いHTTPSでアクセスできるようにします。さらに、DockerファイルやDocker Composeの設定内容について説明し、FastAPIのポートを8000番に変更して設定を行います。

2. Nginxの基本概念

Nginxは、高性能かつ軽量なWebサーバー/リバースプロキシサーバーです。リバースプロキシは、クライアントからの要求をバックエンドのサーバーに中継し、そのレスポンスをクライアントに返す役割を担います。これにより、セキュリティやパフォーマンスの向上が期待できます。

今回はHTTPSでアクセスできるようにするためのSSLの設定をする際にNginxを利用しています。

3. 既存のdocker-compose.ymlに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証明書をマウントするためのボリューム設定も行います。

4. Dockerfileの修正

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番に変更しています。

5. SSL設定を行いHTTPSでアクセスできるようにする

まず、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は自分の利用するドメインに変更してください。

6. Let's EncryptからSSL証明書を発行する方法

Let's Encryptは、無料でSSL証明書を発行するためのサービスです。以下の手順でSSL証明書を取得できます。

  1. Certbotのインストール
  2. SSL証明書の取得
  3. SSL証明書の自動更新設定

6.1 Certbotのインストール

Certbotは、Let's EncryptのSSL証明書を簡単に取得・更新するためのツールです。まず、Certbotをインストールしましょう。以下は、Debian/Ubuntu系のOSでCertbotをインストールするコマンドです。

sudo apt-get update
sudo apt-get install certbot

6.2 SSL証明書の取得

次に、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/

6.3 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を再起動します。

7. まとめ

本記事では、Dockerを用いてVPS上にNginxの環境を構築する方法を紹介しました。具体的には、既存のdocker-compose.ymlにNginxの設定を追加し、SSL設定を行い、HTTPSでアクセスできるようにしました。これで、DockerとNginxを使った環境構築が完了しました。

プロフィール写真

Soraef

ソフトウェアエンジニア。趣味は競馬、写真、ゲーム。

お問い合わせはTwitterのDMでお願いします。