公開日:2023/12/25 最終更新日:2023/12/24

さくらのVPS(Docker環境)にNginx Proxy Managerを導入してSSL証明書(Let’s Encrypt)の発行・リバースプロキシ設定を行う

今回はさくらのVPS(Docker環境)にNginx Proxy Managerを導入する方法と、導入したNginx Proxy Managerを利用してSSL証明書(Let’s Encrypt)の発行、リバースプロキシを設定する方法を紹介します。

勉強を兼ね実際に私が作業した内容を基にこの記事を執筆しています。
誤字脱字、間違い等ありましたら私のTwitterまでお願いいたします。

前提

1. さくらのVPSにSSH接続を行える
2. さくらのVPSでDockerが利用できる状態になっている
3. さくらのVPS管理パネル「パケットフィルター設定」で「80」,「81」,「443」を開放している
4. リバースプロキシで利用したいドメインのDNSをさくらのVPS管理パネルに記載されているIPv4アドレスに向けている

構築環境

サーバー: さくらのVPS
OS: Ubuntu 22.04 amd64

Nginx Proxy Managerを導入

公式: https://nginxproxymanager.com/

1. Nginx Proxy Managerを設置するディレクトリを作成する

※今後を見据え、/home/<ユーザー名>ではなく/var/dockerディレクトリを作成して、そこにDockerプロジェクトを設置するようにする。

mkdir /var/docker/nginx-proxy-manager

2. docker-compose.ymlを作成

# /var/docker/nginx-proxy-manager
touch docker-compose.yml

3. docker-compose.ymlに内容を記述

公式ドキュメントに記載されている内容を記述する。
https://nginxproxymanager.com/guide/#hosting-your-home-network

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

Nginx Proxy Managerで利用するデータベースをMySQLやMariaDBに変更したい場合は以下の内容を記述する。
https://nginxproxymanager.com/setup/#running-the-app

データベース名やユーザー、パスワードなどは適宜修正してください。

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '443:443'
      - '81:81'

    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - db

  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./mysql:/var/lib/mysql

4. Dockerコンテナを作成、稼働する

# /var/docker/nginx-proxy-manager
docker compose up -d

これでNginx Proxy Managerにアクセスできるようになります。

http://<さくらのVPS管理パネルに記載されているIPv4アドレス>:81

5. Nginx Proxy Managerにログインを行い、メールアドレスとパスワードを変更する

URL: http://<さくらのVPS管理パネルに記載されているIPv4アドレス>:81/login
Email: admin@example.com
Password: changeme

画面に沿って設定を進めてください。推測されないパスワードを設定してください。

Nginx Proxy ManagerでSSL証明書(Let’s Encrypt)の発行を行う

1. ヘッダーの「SSL Certificates」からSSL証明書設定ページへ移動

2.「Add SSL Certificate」をクリック、今回は「Let’s Encrypt」を選択

表示されたポップアップに内容を記述します。

Domain Names: SSL証明書を発行したいドメイン
Email Address for Let's Encrypt: メールアドレス
Use a DNS Challenge: No
I Agree to the Let's Encrypt Terms of Service: Yes

内容を記述したら「Save」を押して少し待ちます。これでSSL証明書の発行が完了しました。

Dockerプロジェクトの設置・稼働

Dockerプロジェクトの設置・稼働を行います。

mkdir /var/docker/apache-php83

ディレクトリ構造は以下の通りです。

/var/docker/apache-php83
  - html
    - index.php
  - docker-compose.yml
# /var/docker/apache-php83/docker-compose.yml

version: '3.8'

services:
  web:
    image: php:8.3.0-apache
    volumes:
      - ./html:/var/www/html
    networks:
      - <Nginx Proxy Managerで利用しているDockerネットワーク名>

networks:
  <Nginx Proxy Managerで利用しているDockerネットワーク名>:
    external: true
# /var/docker/apache-php83/html/index.php

<?php phpinfo(); ?>

Nginx Proxy Managerで利用しているDockerネットワーク名は以下の手順で確認できます。

docker network ls

赤線部分がNginx Proxy Managerで利用しているDockerネットワーク名です。

最後にコンテナを起動します。

# /var/docker/apache-php83
docker compose up -d

Nginx Proxy Managerでリバースプロキシの設定を行う

やっとリバースプロキシ設定。

1. ヘッダーの「Hosts > Proxy Hosts」プロキシ設定一覧画面へ移動

2. プロキシ設定を行う

「Add Proxy Host」をクリックし、表示されたポップアップに内容を記述します。

Domain Names: 設定したいドメイン
Scheme: http
Forward Hostname / IP: Dockerプロジェクトのコンテナ名 => この記事の場合は'web'
Forward Port: 80
Cache Assets: No
Block Common Exploits: Yes
Websockets Support: No

ここではまだ「Save」をクリックしません。

3. SSL証明書を適用する

ポップアップのヘッダーにある「SSL」からSSL証明書を適用します。

「SSL Certificate」の選択項目から先ほど発行したSSL証明書を選択します。

Force SSL: Yes
HTTP/2 Support: Yes
HSTS Enabled: No
HSTS Subdomains: No

そして「Save」、リバースプロキシの設定が完了しました。

これで設定したドメインに対してアクセスを行うとDockerプロジェクトの「web」コンテナのコンテンツが表示されるようになります。

最後に

Firewalldの設定やNginx Proxy Managerへのアクセス権を絞るなど、セキュリティ対策はしっかりしましょう。

参考元