今更ながらという気もしますが、時々悩むので、備忘録に載せておきます。。。
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 属性に設定するには一定の説得力があり、どちらで管理するのが良いのか判断付きかねています。悩ましい。
コメントを残す