localhost で https://リクエストを受け取れる環境を作る

## 環境
- wsl
- docker
- php
- apache

## ディレクトリ構成
```sh
/project
├── docker
│   ├── apache
│   │   └── custom.conf
│   └── php
│       ├── php.ini
│       └── Dockerfile
├── src
│   ├── index.php
│   └── .htaccess
└── docker-compose.yml

```
## 前準備(httpでのサーバー立ち上げまで)

### 1. docker-compose.ymlの作成
```docker-compose.yml
services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    ports:
      - "8266:80"
    volumes:
      - ./src:/var/www/html
      - ./docker/apache/custom.conf:/etc/apache2/sites-available/000-default.conf
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
    working_dir: /var/www/html
```

### 2. php.iniの作成
```php.ini
display_errors = On
memory_limit = 512M
upload_max_filesize = 20M
post_max_size = 30M
```

### 3. Dockerfile の作成
```Dockerfile
FROM php:8.4.7-apache

RUN a2enmod rewrite

COPY docker/php/php.ini /usr/local/etc/php/
COPY docker/apache/custom.conf /etc/apache2/sites-available/000-default.conf

WORKDIR /var/www/html

COPY ./ /var/www/html
```

### 4. custom.conf の作成
```custom.conf
<VirtualHost *:80>
    DocumentRoot /var/www/html

    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

### index.php(確認用)の作成
```index.php
<?php
phpinfo();
```

上記ファイルが用意できたら
`docker compose up -d` をターミナルで実行してコンテナが立ちあげる。
[localhost:8266](http://localhost:8266)にアクセスしてphpinfoが表示されていれば完了。

## SSL化
今回はopenSSLを使用して取得していく。

### 1. まず/apacheディレクトリ配下に sslディレクトリを作成する
```sh
mkdir ./docker/apache/ssl
```
 ### 2. ssl証明証を発行する
 ```sh
 openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout docker/apache/ssl/server.key \
  -out docker/apache/ssl/server.crt \
  -subj "/C=JP/ST=Tokyo/L=Shibuya/O=Dev/OU=Dev/CN=localhost"
```
`docker/apache/ssl/`ディレクトリ内に server.key 及び server.crt が生成されているか確認する。

### 3. `custom.conf` を編集、更新する

```diff_custom.conf
<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
    DocumentRoot /var/www/html

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /etc/apache2/ssl/server.key

    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```
### 4. docker-compose.yml を編集、更新する
```docker-compose.yml
services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    ports:
      - "8266:80"
      - "8443:443"  # ← 追加
    volumes:
      - ./src:/var/www/html
      - ./docker/apache/custom.conf:/etc/apache2/sites-available/000-default.conf
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - ./docker/apache/ssl:/etc/apache2/ssl  # ← 追加
    working_dir: /var/www/html
```

### 5. Dockerfile を編集、更新する
```Dockerfile
FROM php:8.4.7-apache

RUN a2enmod rewrite ssl

COPY docker/php/php.ini /usr/local/etc/php/

COPY docker/apache/custom.conf /etc/apache2/sites-available/000-default.conf

WORKDIR /var/www/html
COPY ./ /var/www/html
```

### 6. 起動
```sh
docker compose down
docker compose build --no-cache
docker compose up -d
```

ttps://localhost:8443 にアクセスして phpindoが表示されれば完了