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

# はじめに
AWS EC2のWindowsサーバーでlaravelを使用したアプリ開発の案件があり、Windowsの環境構築をしましたので、その方法をまとめます。

今まで、Amazon Linuxしか使っていなかったため、windowsサーバーの癖に苦戦しながらも構築しましたので、参考になればと思います。
例えば、サーバーへの接続は、SSH接続ではなくリモートデスクトップ（以後、RDP）からアクセスするなどなど。。




# 環境構築
- windows version
    - windows server 2022
- インストール情報
    - apache:2.4.51
    - php:8.1.0
    - phpmyadmin
    - composer: 2.1.14
    - laravel
- ルートディレクトリ
    - C:\Apache24\htdocs
- RDS aurora
    - MYSQL：8.0.23
- IDE
    - Visual Studio Code
- SFTP
    - OpenSSH

# 簡易環境構築図

![スクリーンショット 2021-12-05 0.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/24234ac4-9efa-5d6b-28fe-1e46eb8fd979.png)

# ゴール
1. 外部公開し、WindowsサーバーのIPアドレスをブラウザのURL欄に入れて、Laravelのindex.phpが表示される。

2. SFTPでローカルのPCからWindowsサーバーにファイル転送が容易にできる。


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




# EC2を起動設定

EC2は、Windows Server 2022の最新のサーバーを選択しました。

![スクリーンショット 2021-12-04 11.09.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/d4ff6c22-be66-1287-8eec-3a41fd0d73a4.png)


スペックは、nanoだとwindows内での作業に支障をきたすほど動きが遅いです。
microもしくは、smallにしましょう。

自動割り当てパブリック IPは、有効にしています。

ストレージは30GBだと足りませんので、60GBにします。

![スクリーンショット 2021-12-04 11.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/771d1295-fa3b-1d7e-e8bf-53c39e88111c.png)

一応、後でEBSのボリューム変更は可能です。
コンソール上でEBSのボリュームを変更し、Windowサーバーに接続後、Power Shellで以下の記事通りに進めると、変更できます。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/recognize-expanded-volume-windows.html#recognize-expanded-volume-windows-powershell

セキュリティーグループは、SFTP接続でローカルから簡単にファイル転送したいため、SSHを開けています。
RDPは、Windowsであればデフォルトで設定されており、リモートデスクトップで接続する際に必要です。

![スクリーンショット 2021-12-04 11.19.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/2210bf3b-5901-4ff2-2b22-706feaab081f.png)

他の設定は、特にありません。EC2を起動しましょう。

# Windowsサーバーにリモートデスクトップで接続する
EC2に対してリモートデスクトップで接続します。
以下のaws記事(`RDP を使用した Windows インスタンスへの接続`)通り行うと、うまくいきます。

:::note warn
ElasticIPをEC2に関連付ける場合、RDPファイルをダウンロードする前に、関連付けてください。
サーバーのIPが変わると、RDPを再ダウンロードする必要があります。
:::

https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.html?icmpid=docs_ec2_console

こちらでもよいですね

https://a1-style.net/aws/howto-ec2-remote-desktop/

aws記事の前提条件に記載してありますが、ご自身のPCに、RDPクライアントをインストールする必要があります。
Macであれば、[Microsoft Remote Desktop](https://apps.apple.com/us/app/microsoft-remote-desktop/id1295203466?mt=12)ですね。

このwindows画面が出ると接続成功です。
![スクリーンショット 2021-12-04 11.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/f64a22e0-054a-a602-3415-461c28ccd0d1.png)

今後は、rdpファイルを起動するとwindowsサーバーに入れます。

# 日本語設定と時計合わせと地域設定

## 日本語設定と時計合わせ
windowを日本語設定にしましょう。
こちらの記事通りするとよいです。

https://zenn.dev/supersatton/articles/807635bdb0a85b

追加の作業として、keyboardのlayoutも日本語設定にしてもよいですね。
設定が完了したら再起動しましょう。RDP接続が切れますが、rdpファイルから起動できます。

また、ファイル名の拡張子と隠しファイルの表示方法はこちらを参考にするとできます。


https://pc-karuma.net/windows-10-show-explorer-file-name-extension/

## 地域設定
下記の記事の17から進めてください。

https://www.dell.com/support/kbdoc/ja-jp/000111205/windows-server-2019-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%A9%E3%82%A4%E3%82%BA-%E6%89%8B%E9%A0%86


# Visual Studio Codeをインストール
下記の記事通り行うとよいです。

https://sukkiri.jp/technologies/devtools/vscode_win.html


## VSCダウンロードページからダウンロードができない場合

- `Internet Explorer`を使用している場合、下記の記事通りにすると、VSCをダウンロードできるかもしれません。
ダウンロードできない時、私の場合chromeはダウンロードできましたので、`ブラウザはchromeを使用し、VSCをダウンロード`しましょう。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-windows-file-download-ie/

記事内容を図を合わせて説明しますと、サーバーマネージャーのローカルサーバーから、`セキュリティー強化の構成の有効`をクリックします。
![スクリーンショット 2021-12-04 12.40.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/a9e6c583-1500-6964-a73c-0f7c29baf458.png)

両方のグループをオフにすると、VSCがダウンロードできる記事では説明がありました。
私の場合、できませんでしたが、chromeはインストールできましたので、chromeからVSCをダウンロードしました。
![スクリーンショット 2021-12-04 12.40.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/1eaf3c61-5621-d91c-e56b-728d2e652301.png)


# ApacheとVisual C++ ランタイムのインストール

### Apacheのインストール

以下のページから最新版の`Apache 2.4.51 Win64`のZipファイルをインストールします。

https://www.apachelounge.com/download/

![スクリーンショット 2021-12-04 13.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/3a0c5e45-b669-db0e-be02-a6b490119d14.png)


解凍したフォルダ（Apache24）を任意の場所に移動します。
今回は C ドライブ直下に配置します。
![スクリーンショット 2021-12-04 13.12.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/b9b64db8-82aa-6f16-25fc-a3d267770844.png)


### ApacheのVisual C++ ランタイムのインストール

Windows 用 Apache のバイナリは Visual C++ でビルドされているので、VC のランタイムが必要になります。
※すでにインストールされている場合は必要ありません。

以下の URL よりダウンロードします。

https://docs.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170


64bit の場合は vc_redist.x64.exe になります。

![スクリーンショット 2021-12-04 13.15.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/2466cab9-9058-dda7-6e8d-b67a014ca4d9.png)

ダウンロードしたファイルを実行することでランタイムがインストールされます。




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

`C:\Apache24\conf\httpd.conf`の設定ファイルを変更します。

### ServerRoot　(確認は必須)
Apache サーバーが存在するディレクトリを設定します。
すでに設定されておりましたので、特に変更しません。

```conf:Apache24\conf\httpd.conf
Define SRVROOT "c:/Apache24"
ServerRoot "${SRVROOT}"
```
上記の設定によって、
httpd.conf内で`${SRVROOT}`と記載すると`c:/Apache24`という意味に置き換えられます。

### Listen (必要に応じて設定)
サーバが listen するIP アドレスとポート番号を設定します。
httpとhttpsを受け入れます

```conf:Apache24\conf\httpd.conf
Listen 80
Listen 443 #追加
```
### LoadModule （必須）

ロードするモジュールを設定します。
使用可能なものは概ねすでに記述されていますので、必要となるモジュールのコメントを外します。
laravelを使うに当たり、`LaravelProject/public/.htaccess`ファイルをApacheに認識させるため、`rewrite_module`が必要です。

```conf:Apache24\conf\httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so # コメント外す
```


### ServerName （必要に応じて設定）
アクセスされるドメイン名があれば設定します。
ポート番号との組み合わせも可能です。
今回は、サーバーのIPアドレスでアクセスしますので、変えません。

```conf:Apache24\conf\httpd.conf
# ServerName www.example.com:80
ServerName mydomain.com
```

### DocumentRoot (確認は必須)
公開ディレクトリを設定します。
デフォルトは、`C:\Apache24\htdocs`配下に設定されていますので、変更しません。
後で、laravelインストール時に、laravelのパスに合わせて、変更します。

```conf:Apache24\conf\httpd.conf
DocumentRoot "${SRVROOT}/htdocs"
```
ちなみに`${SRVROOT}/htdocs`というのは、`c:/Apache24/htdocs`と同義です。

### ドキュメントルートのディレクトリ設定 (修正必須)
ドキュメントルートのディレクトリ内で適用するディレクティブを以下のように設定します。

```conf:Apache24\conf\httpd.conf
<Directory "${SRVROOT}/htdocs">
	#Options Indexes FollowSymLinks
	Options FollowSymLinks

	#AllowOverride None
	AllowOverride All

	Require all granted
</Directory>
```
以下、各詳細説明です。

#### ・Directory
ディレクティブの適用をディレクトリ単位に指定できます。

#### ・Options
特定のディレクトリに対してどの機能が使用可能かを制御します。
デフォルトでは以下の２つがOptionsで設定されています。

・Indexes
ディレクトリ配下の構造がweb上で確認できてしまいます。
ディレクトリの中身が見えてしまう可能性があり、`セキュリティの観点から通常設定しません`ので、コメントアウトします。
・FollowSymLinks
サーバがこのディレクトリ内でシンボリックリンクをたどれるようにします。

#### ・AllowOverride
`None`が指定された場合、.htaccessは完全に無視されます。
.htaccessを有効にしたい場合は`All`を指定します。
`LaravelProject/public/.htaccess`をApacheに認識させるため、修正必須です。

#### ・Require
アクセスの許可を設定します
all grantedではすべてのアクセスを許可します。
<Directory>ディレクティブや<Files>ディレクティブ内で使用できます。
ちなみに以下のような指定が可能です。

```conf:Apache24\conf\httpd.conf
Require all granted # すべて許可
Require all denied # すべて拒否
Require ip 192.168.10.1 # 指定のIPアドレスからのアクセスのみ許可
Require ip 192.168.10.1/24 # 指定のIPアドレスの範囲からのアクセスのみ許可
Require host example.com # 指定のドメインからのアクセスのみ許可
```

### .htaccess の有効の有無 （必要に応じて修正）
デフォルトでは、`.htaccess`は`<Files>ディレクティブ`を用いて使用禁止にされています。
`.htaccess`を利用したい場合は、これを編集します。

```conf:Apache24\conf\httpd.conf
<Files ".ht*">
    #Require all denied
    Require all granted
</Files>
```

### Location （必要に応じて設定）
.htaccessを使用せず、Basic認証したい場合に設定します。
\<Location> ディレクティブは、 URL により中に書かれたディレクティブの適用範囲を制限します。 
こちらを参考通りにするとBasic認証できます。

https://qiita.com/holdout0521/items/c76b6890a65866905663#apacheelb%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%A7%E4%B8%8A%E8%A8%98%E3%81%AE%E6%96%B9%E6%B3%95%E3%81%8C%E4%BD%BF%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84windows%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%AD%89%E3%81%AE%E5%A0%B4%E5%90%88

httpd.confファイルの詳細を知りたい方はこちら

https://httpd.apache.org/docs/2.4/ja/mod/core.html


## Apacheの起動
apacheを起動します。

コマンドプロンプトを起動後、2つのコマンドを実行し、
`The 'Apache2.4' service is successfully installed.`と表示されていれば、インストール完了と判断してよいです。

1. `cd \Apache24\bin`
2. `httpd.exe -k install`

```
C:\Users\Administrator>cd \Apache24\bin

C:\Apache24\bin>httpd.exe -k install
Installing the 'Apache2.4' service
The 'Apache2.4' service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service can be started.
Port must be specified

C:\Apache24\bin>
```
apahceの起動停止等のコマンドはこちらです。

```
>cd \Apache24\bin
>httpd.exe -k start # Apacheの起動
>httpd.exe -k stop # Apacheの停止
>httpd.exe -k restart # Apacheの再起動
>httpd.exe -k uninstall # サービス解除
```

## コマンド以外からのapacheの起動方法

`C:\Apache24\bin`の`Apache Monitor`を起動すると、右下の常駐アイコンに表示されます。

![スクリーンショット 2021-12-04 13.31.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/b78f0dc8-6c63-70e7-6585-8e2f2b5e9c53.png)
下記のapacheのアイコンをクリックすると、startが表示されますので、クリックすると、起動できます。
![スクリーンショット 2021-12-04 23.46.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/9e1d41fb-7381-beff-65ac-a67865d8ab18.png)
![スクリーンショット 2021-12-04 23.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/6b1676b1-7b47-66a9-611f-fdb06e2432e5.png)

赤は停止、緑は起動中です。

# apacheのindex.htmlをweb上で表示させる
Windowsサーバーのセキュリティーグループは、httpを開けておりますが、Windowsサーバー内で、ポートの開放をが必要なのでやっていきましょう。

以下の参考記事の`外部のWEB公開`を参考にするとうまくいきます。

https://pentan.net/windows-apache-koukai

これで、外部に公開できましたので、WindowsサーバーのIPアドレスをブラウザのURL欄に入れて、アクセスしましょう。
`It works!`と表示されればOKです。

次回、PHPをインストールします。記事はこちらです。↓

https://qiita.com/holdout0521/items/74064fe956534fe5a8a5