EC2のWindowsサーバーで、PHP (Laravel ) + Apache + RDS(MySQL) + SFTP の環境構築　②

#はじめに
題名の通り環境構築の続きになります。
PHPのインストールからです。
①はこちら↓

https://qiita.com/holdout0521/items/909f97cb0947bcec2eac


#流れ
1. EC2を起動設定
- Windowsサーバーにリモートデスクトップで接続する
- 日本語設定と時計合わせ
- Visual Studio Codeをインストール
- ApacheとVisual C++ ランタイムのインストール
- Apacheの起動`↑①ではここまで`
- PHPインストールし、Web上で確認
- RDSの起動
- composerとlaravelインストール
- プロジェクトを作成し、laravelページをWeb上で確認
- phpmyadminインストールし、Web上で確認`↑②ではここまで`
- OpenSSH を使用して Windows に SFTP サーバーをセットアップ


# PHPインストール
以下の URL より PHP をダウンロードします。

https://windows.php.net/download/
PHP 8.1 の `VS16 x64 Thread Safe `版をZIPでインストールします。
`Non Threat`は、apacheを動かす`php8apache2_4.dll`ファイル等がないため、インストールしないようにしましょう。
![スクリーンショット 2021-12-05 11.44.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/21e09570-7e57-c018-0a96-32c696557762.png)

解凍した中身を任意の場所に配置します。
今回は C ドライブ直下に `php8` フォルダを作成し、中身をすべて移動します。
![スクリーンショット 2021-12-05 11.49.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/f6a2b3a3-9a68-5828-07e1-ca3538ee4450.png)

次に PHP の設定ファイルであるphp.iniを編集します。
php8フォルダ配下に`php.ini-development`などのファイルがあるので、これをコピーしてphp.iniを作成します。
プログラムの内容にもよりますが、おおむね以下の部分を編集すれば良いかと思います。


```php:php.ini
# 拡張モジュールのロード（コメント外す）
extension=curl
extension=fileinfo
extension=gd2
extension=mbstring
extension=mysqli
extension=openssl
extension=pdo_mysql

# 追記
extension_dir = "c:\php8\ext" # 拡張モジュールの場所
date.timezone = Asia/Tokyo # タイムゾーンの設定
```

`mysqli` と `mbstring` と `openssl`は composerやlaravel で必要なため、拡張必須です。

必須というわけではありませんが、実行環境によっては設定変更が必要なパラメータをいくつか挙げてみます。
必要に応じて編集してください。

```php:php.ini
max_execution_time = 30 # 最大実行時間 [秒]、30秒過ぎると強制終了します
max_input_time = 60 # リクエストを受け付ける最大時間 [秒]、受信に60秒以上かかると強制終了します
memory_limit = 128M # スクリプトが確保できる最大メモリサイズ [byte]
error_reporting = E_ALL # エラー出力レベル、お勧めは"E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT"
display_errors = On # エラーを画面に出力（Offで出力しない）
log_errors = On # エラーをerror_logに出力（Offで出力しない）
post_max_size = 8M # POSTデータの最大サイズ [byte]
upload_max_filesize =2M # アップロードファイルの最大サイズ [byte]
session.gc_maxlifetime = 1440 # セッションデータが最短で破棄される時間 [秒]、お勧めは86400
```

php.iniのパラメータ詳細はこちら

https://www.php.net/manual/ja/errorfunc.configuration.php

##apacheのhttpd.confファイルの修正

Apache 側の設定も PHP の実行環境に合わせて編集が必要となります。
c:\Apache24\conf\httpd.confを編集します。

```conf:\Apache24\conf\httpd.conf
# 編集
<IfModule dir_module>
    DirectoryIndex index.html index.php # index.phpを追加
</IfModule>

# 追記
LoadModule php_module "C:/php8/php8apache2_4.dll"
AddHandler application/x-httpd-php .php
PHPIniDir "C:/php8"
```
###・IfModule
当該モジュールが存在するときに処理されるディレクティブを指定するために利用します。

###・DirectoryIndex
リクエストがファイル名を指定しなかった場合に表示するファイルを設定します。
デフォルトではindex.htmlのみ設定されているので、index.phpを追加します。

###・AddHandler
拡張子とハンドラを紐づけます。
この記述により拡張子 “.php” のファイルは PHP プログラムとして扱われます。

####C:/php8/php8apache2_4.dllの確認
C:/php8/php8apache2_4.dllファイルがあることを確認しましょう。
なければ、インストールしたzipファイルが`Non Threat`のものになっている可能性があります。

参考記事

https://www.php.net/manual/ja/install.windows.apache2.php

##index.phpファイルを作成し、Web上で確認

`c:\Apache24\htdocs`配下にある`index.html`を削除し、index.phpを作成します。

```php:index.php
<?php
phpinfo();
?>
```

Apache を再起動します。
ここまでの設定で、PHP のスクリプトが動作する状態になっているかと思います。
windowsサーバーのIPアドレスをブラウザのURL欄に入れてアクセスすると、以下のようにphp情報ページが表示されます。
![スクリーンショット 2021-12-05 14.19.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/b658d53b-0923-4409-f49c-242b8513d409.png)


##PHPの環境変数設定
こちらの記事通りすると、コマンドプロンプトでphpコマンドが使用できます。
記事内で指定するパスは`C:\php8`とし、コマンドプロンプトは再起動しましょう。

https://www.javadrive.jp/php/install/index3.html

```terminal
C:\Users\Administrator> php --ini

Configuration File (php.ini) Path:
Loaded Configuration File:         C:\php8\php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)
```

phpコマンドが使え、自身で修正したphp.iniファイルが参照されていることが分かりました。


#RDSの起動
RDSのタイムゾーンを東京にしたいので、まず、クラスターパラメータグループを作成します。
RDSで指定するバージョンは、mysql8.0ですので、パラメータグループファミリーも同様に設定します。
![スクリーンショット 2021-12-05 15.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/59378931-b47e-d823-c9e3-8342f33cd40e.png)

以下の記事を参考に、タイムゾーンを東京に変更します。

https://qiita.com/C_HERO/items/4929502c2641b2406475#2-db%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E4%BD%9C%E6%88%90

そして、auroraを起動設定しましょう。
バージョンは、`Aurora MySQL 3.01.0 (Compatible with MySQL 8.0.23) `を設定します。
セキュリティーグループは、EC2に対して、ポートを開けるのを忘れずに。
データベースを一つ作ります。今回は`blog`というDB名としてます。
パラメータグループは、先程作成したものを設定します。
![スクリーンショット 2021-12-05 15.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/ff971e76-8937-0d4b-8a1d-6a3623d813e5.png)




auroraのクラスターのエンドポイント、ユーザ名、パスワードがlaravelの.envファイルで必要になりますので、メモしておきましょう。


#composerとlaravelインストール
以下の記事通りにすると、インストールできます。
パスは、`C:\php8\php.exe`になっていることを確認しましょう。
composerインストール完了後は、コマンドプロンプトを再起動してから、`composer`と入力すると、インストールできていることが確認できると思います。

https://blog.senseshare.jp/laravel-install.html

#プロジェクトを作成し、laravelページをWeb上で確認

コマンドプロンプトでhtdocsフォルダに移動して

```
cd c:\Apache24\htdocs
```

laravelコマンドで新規プロジェクトを作成します。

```
C:\Apache24\htdocs> laravel new blog
```

プロジェクト作成後、laravelのバージョンを確認してみます。
`php artisan`は、必ずプロジェクトディレクトリ内で行ってください。

```
C:\Apache24\htdocs>cd blog

C:\Apache24\htdocs\blog> php artisan -v
Laravel Framework 8.74.0
```

##laravelの.envファイル修正
`C:\Apache24\htdocs\blog\.env`ファイルを修正します。


```.env:.env
APP_URL=http://IPアドレス ←サーバーのIPにする

DB_CONNECTION=mysql
DB_HOST=←RDSのエンドポイント（auroraの場合、ライターインスタンス)
DB_DATABASE=データベース名
DB_USERNAME=RDS作成時のユーザ名
DB_PASSWORD=設定したパスワード
```


##laravelのindex.phpをWeb上で確認

apacheのhttpd.conf修正します。

```conf:Apache24\conf\httpd.conf
#DocumentRoot "${SRVROOT}/htdocs"
DocumentRoot "${SRVROOT}/htdocs/blog/public"

#<Directory "${SRVROOT}/htdocs">
#    AllowOverride All
#</Directory>
<Directory "${SRVROOT}/htdocs/blog/public">
    AllowOverride All
</Directory>
```
httpdファイルを編集後、apacheを再起動します。

そして、configのキャッシュを作成し、アプリのキャッシュを削除します。

```
C:\Apache24\htdocs\automeasure>php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!

C:\Apache24\htdocs\automeasure>php artisan cache:clear
Application cache cleared!
```

`php artisan config:cache`を実行しないと、エラーになります。理由はわかりませんでした。。
しっかり、`php artisan cache:clear`でキャッシュは削除しておきましょう。

キャッシュコマンドのまとめ記事になります。

https://blog.maro.style/post-1365/

WindowsサーバーのIPアドレスをブラウザのURL欄に入れて、アクセスすると、laravelのindex.phpが表示されました。

![スクリーンショット 2021-12-05 15.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/a893f1bd-22af-fd58-19f1-5a1695c6526b.png)

#エラー対応
apacheが再起動できない場合、コマンドでapacheを起動すると、エラー内容を教えてくれます。

```
C:\Apache24\bin>httpd.exe -k start
AH00526: Syntax error on line 236 of C:/Apache24/conf/httpd.conf:
Require not allowed here
```
#phpmyadminインストール

下記サイトからphpmyadminをダウンロードします。現在の最新は5.1.1バージョンでした。

https://www.phpmyadmin.net/

![スクリーンショット 2021-12-05 20.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/a1706b36-501b-083a-d3b3-bc06cdb4ab7a.png)

ダウンロード後、ドキュメントルートである`C:/Apache24/htdocs/blog/public`内でphpmyadminディレクトリとして、展開します。
![スクリーンショット 2021-12-05 20.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/c7e3efff-57d2-346d-8720-8f5471d6e7da.png)

###php.iniファイルの修正

php.iniの中の891行目辺りを次のようにコメントが外れているか確認します。
なければ、追記します。
`C:\php8\ext`配下に`php_mysqli.dll`ファイルがあることも確認しましょう。

```ini:php.ini
;extension=php_mysqli.dll
extension=php_mysqli.dll

```

また、PHP ではエラーを出力するレベル（error_reporting）を設定することができます。
設定したエラー出力レベルによって、そのレベルのエラーや警告のメッセージが出力されます。
今回は、`注意通知と非推奨の警告`以外のエラーを表示するようにします。

詳しくはこちら

https://www.ritolab.com/entry/218

https://qiita.com/shotets/items/3c95aef631b2c5eadae5

`php.ini`もしくは、`httpd.conf`ファイルに書き込みましょう。


```ini:php.ini
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
```

```conf:httpd.conf
# E_ALL 等はPHPの定数で .htaccess では使えないため数字に変換する
# E_ALL & ~E_NOTICE & ~E_DEPRECATED は10進数で 6135
php_value "error_reporting" 6135
```

php.iniを保存して`Apacheを再起動します。`



###phpmyadminのconfig.inc.phpファイル修正
phpMyAdminフォルダの中にconfig.sample.inc.phpファイルがありますので、それをコピーして名前をconfig.inc.phpに変更します。
`config.inc.php`を修正します。

```php:C\Apache24\htdocs\blog\public\phpmyadmin\config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
```
↓

```php:C\Apache24\htdocs\blog\public\phpmyadmin\config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '【RDSエンドポイント(auroraの場合、ライターインスタンス)】';
```

`http://サーバーIP/phpmyadmin/`にアクセスすると、ログイン画面がでます。
RDSのユーザー名とパスワードを入力すると、ログイン成功します！

補足ですが、phpmyadminは、ip制限やBasic認証をかけ、セキュアな状態でアクセスを行えるようにしましょう。
![スクリーンショット 2021-12-05 20.44.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/51e295b0-9000-4a98-1b64-42a13a36afd8.png)


##phpmyadminパスフレーズ設定

`設定ファイルに、暗号化 (blowfish_secret) 用の非公開パスフレーズの設定を必要とするようになりました。`というエラーが出ました。

![スクリーンショット 2021-12-05 20.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/e25fb8f4-955a-608f-546a-67f49e1ffff7.png)

`config.inc.php`内に`長さは 32 文字以上パスフレーズ`を設定します。
指定したパスフレーズは内部で使用されるだけです。あとでこのフレーズを入力するような画面が出てくるわけではありませんので、適当で良いです。

```php:C\Apache24\htdocs\blog\public\phpmyadmin\config.inc.php
/**
 * This is needed for cookie based authentication to encrypt password in
 * cookie. Needs to be 32 chars long.
 */
$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
```
↓

```php:C\Apache24\htdocs\blog\public\phpmyadmin\config.inc.php
/**
 * This is needed for cookie based authentication to encrypt password in
 * cookie. Needs to be 32 chars long.
 */
$cfg['blowfish_secret'] = 'hogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge';
```

phpmyadminページを更新すると、表示されなくなりました。

##phpmyadmin環境保管領域設定

また、以下のような表示が出ています。
`phpMyAdmin 環境保管領域が完全に設定されていないため、いくつかの拡張機能が無効になっています。理由についてはこちらをご覧ください。 代わりにデータベースの操作タブを使って設定することもできます。`

![スクリーンショット 2021-12-05 20.57.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/0b89cdd5-2933-3a5e-defb-b1a39c575067.png)

これは、下記の記事通り設定すると、環境保管領域が設定され、表示が消えます。

https://www.dbonline.jp/phpmyadmin/install/index3.html

#DB管理ツールがadminerの場合
今回は、phpmyadmin使用しましたが、adminerでもよいです。
下記のサイトから、adminerファイルをダウンロードし、ファイル名を`adminer.php`とします。
そのファイルを　`C:/Apache24/htdocs/blog/public`に設置するだけです。

https://www.adminer.org/

`http://サーバーIP/adminer.php`でアクセスできます。

phpmyadminに比べ、1つのファイルだけよいので、軽量です。

#logファイル関連

- apacheのログファイル：`C:\Apache24\logs`配下
- laravelのログファイル:`C:\Apache24\htdocs\blog\storage\logs/laravel.log`

#Laravel 502エラー

502エラーになった際、この記事通りにすると、解決できました

https://qiita.com/holdout0521/items/9856837cf015b61d398f

#エラー：PHP Warning: PHP Startup: Unable to load dynamic library 'curl' 
下記の通りに対処するとよいです。

https://qiita.com/holdout0521/items/20b97a46cda0475f6d7b

#apiが使用できないエラー

`App\Http\Middleware\TrustProxies`ファイルを修正します。

```php:app\Http\Middleware\TrustProxies.php
#/**
# * このアプリケーションで信用するプロキシ
# *
# * @var string|array
# */
protected $proxies;

protected $headers = [
    Request::HEADER_FORWARDED => 'FORWARDED',
    Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
    Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
    Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
    Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
    ];

↓↓

#/**
# * このアプリケーションで信用するプロキシ
# *
# * @var string|array
# */
protected $proxies = '*';

protected $headers = Request::HEADER_X_FORWARDED_ALL;
```

TLS／SSL証明書が入っているロードバランサ-を使用している場合、アプリケーションがときどきHTTPSリンクを生成しない場合があります。理由は、トラフィックがロードバランサにより８０番ポートへフォワーディングされるため、セキュアなリンクを生成すべきだと判断できないからです。

`TrustProxies.php`ファイルによって、ロードバランサやプロキシを簡単にカスタマイズできます

AWS　ELBや他の「クラウド」ロードバランサプロバイダを使用している場合は、実際のバランサのIPアドレスは分かりません。このような場合、全プロキシを信用するために、*を使います。

https://readouble.com/laravel/6.x/ja/requests.html#configuring-trusted-proxies

次回、OpenSSH を使用して ローカルPCからWindowsサーバーにSFTPを用いたファイル転送する設定を行います。
こちらの記事です↓。

https://qiita.com/holdout0521/items/edfcde5dbf8f8cd9df06

#参考記事
https://softwarenote.info/p2832/