AWS EC2 の Docker 上で nginx を使う

今更ながらという気もしますが、時々悩むので、備忘録に載せておきます。。。

AWS EC2 上で Docker 上に nginx + PHP + MariraDB を構築したい場合、以下のような docker-compose.yml を書くと思います。(イメージが若干古いですが、サンプルということでご容赦を。)

version: "3.9"
services:
  app:
    build: .
    volumes:
      - ./src:/var/www/html
      - ./nginx/php.ini:/usr/local/etc/php/conf.d/php.ini
  mysql:
    image: mariadb:10.9
    ports:
      - '3306:3306'
    volumes:
      - ./db:/var/lib/mysql
      - ./my.cnf:/etc/mysql/conf.d/my.cnf:ro
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: XXXXX
      MYSQL_PORT: 3306
      MYSQL_ROOT_PASSWORD: YYYYY
      TZ: Asia/Tokyo
  nginx:
    image: nginx:1.22
    ports:
      - '443:443'
      - '80:80'
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/php.ini:/usr/local/etc/php/conf.d/php.ini
      - ./nginx/log:/var/log/nginx
      - ./src:/var/www/html
      - ./etc/letsencrypt:/usr/local/etc/letsencrypt:ro
    environment:
      TZ: Asia/Tokyo
    depends_on:
      - app
      - mysql

nginx の default.conf は例えば、以下のように書くでしょう。

ssl_protocols TLSv1.2 TLSv1.3;
server {
        listen 443 ssl;
        ssl_certificate_key /usr/local/etc/letsencrypt/live/SERVER/privkey.pem;
        ssl_certificate /usr/local/etc/letsencrypt/live/SERVER/fullchain.pem;

        error_log /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
        root /var/www/html/SERVER/public;
        index index.php index.html;
        server_name _;
        client_max_body_size 1000M;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass app:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
        }
}

ここで鍵ペアは ./etc/letsencrypt 以下にコピーして使います。親 OS に certbot があれば、これを使ってSERVER の証明書を作成することができます。

ここでもやもやが起きるのは、鍵ペアの管理を docker 内に閉じ込めていない点です。と言って、鍵ペアを Read Only 属性に設定するには一定の説得力があり、どちらで管理するのが良いのか判断付きかねています。悩ましい。

投稿者について
みのしす

小さいときは科学者になろうとしたのに、その時にたまたま身に着けたプログラミングで未だに飯を食っているしがないおじさんです。(年齢的にはもうすぐおじいさん)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です