EC2インスタンスを立ち上げて、PHPを動かすまで　AWS/Laravel6.0連載(1)

# はじめに

インフラ初心者のエンジニアにEC2のインスタンスを立てる手順を教えることになりました。
私も専門領域外ですが、初心者がハマりそうなポイントとPHPを入れて動かすところまで書いてみます。

# EC2インスタンス立ち上げる

インスタンスを立てる手順は既に分かりやすい記事が多数あるので省略。
こちらの記事がシンプルで分かりやすかったので、オススメです。

AWS EC2でWebサーバーを構築してみる
https://qiita.com/Arashi/items/629aaed33401b8f2265c

上記記事の手順に沿って、無事にApache動作確認できたとします。
もし導入中にハマったら、最後のセクションでハマりやすいポイントを書いたので参考にしてみてください。

# PHPを入れる

```shell-session
$ sudo yum -y install php
```

実行すると以下の通り。

```shell-session
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies
--> Running transaction check
---> Package php.x86_64 0:5.4.16-45.amzn2.0.6 will be installed
--> Finished Dependency Resolution

...

Installed:
  php.x86_64 0:5.4.16-45.amzn2.0.6                                                                                                                                                                          

Complete!
```

yumの場合、デフォルトだとPHPは5.4です。
PHP7はちょっと一工夫しないといけないので、初心者がいきなり7を入れようと頑張るよりは、まず5.4を入れて動くところまで確認したほうが良いかと思います。

# index.phpを有効にする

```shell-session
# vi /etc/httpd/conf/httpd.conf
```

vimは使い慣れていないと使いづらいかもしれません。
サーバでサクッと設定いじったりする際に使えると便利なので、この期に覚えてしまいましょう。

```config
...
#
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

#
...
```

こう記述すると、ファイル名を指定せずアクセスした際にindex.phpが存在すれば表示し、存在しなければindex.htmlを表示します。

## vimの操作が分からない方

* vimは開いたときはコマンドモードで、文章の編集ができません。
* iキーでインサートモード（文字入力ができるモード）に切り替わります。
* インサートモード中にEscでコマンドモードに戻ります。基本的に、このインサートモードとコマンドモードを切り替えて使います。
* 最初は超絶使いづらいですが、慣れるとサクサクコーディングできるようになります。

### index.phpを追加し保存するには

* コマンドモードで /index[Enter]
  * スラッシュの後に入力した文字で検索ができる
* iキーでインサートモードに切り替え、index.phpの文字列をタイピングした後にEscでコマンドモードに戻る
* コマンドモードで　:w[Enter]　:q[Enter]と入力
  * :wで保存(write)、:qでファイルを閉じる(quit)
  * :wq[Enter]と入力すると、保存しファイルを閉じる処理を一度に実行できる

# 設定を反映する

設定ファイルを変更してアクセスしても、まだ反映されません。
基本的にミドルウェアの設定を変更した場合、反映するには再起動が必要です。

```shell-session
$ sudo service httpd configtest
```

まずはconfigでsyntax errorがないかテスト。
慣れてくるとついつい即再起動しがちですが、syntax errorが起きているとApache起動に失敗してサービスが止まるので、必ずconfigtestでエラーが起きないことを確認する癖を付けましょう。

```shell-session
$ sudo service httpd graceful
```

gracefulで再起動します。
ちなみに再起動はgracefulじゃなくrestartでもできますが、restartはWebサーバにアクセスしているユーザーがいて子プロセスがあってもkillします。
gracefulは子プロセス終了まで待って設定を反映するので安全です。
ただしgracefulだと反映されない設定もあったりするので、その場合はrestartしましょう。

# index.phpを配置する

```shell-session
$ vi /var/www/html/index.php
```

vimが開くので

```php
<?php echo 'hoge' ?>
```

で保存し終了。

Apacheの設定がうまくいっていれば、Webブラウザで開いた際のページに「hoge」と書かれたページが表示されます。

# ハマりやすいポイント

他にもあれば随時追加します。

## EC2インスタンスにsshで入れない

```shell-session
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0666 for 'xxxxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key 'xxxxx.pem': bad permissions
ec2-user@xx.xx.xx.xx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

ハマることが非常に多いです。
秘密鍵のパーミッションが緩いとエラーになります。

```shell-session
$ sudo chmod 400 xxxxx.pem
```

でいけるはず。

## Apacheの設定ファイルが見つからない／読み取り専用で編集できない

```vim
E45: 'readonly' オプションが設定されています (! を追加で上書き)
```

ミドルウェアのconfigいじったり起動／停止等を実行する際は一般ユーザーが簡単にいじれちゃうと困るので、基本的にrootユーザーで実行します。

```shell-session
$ sudo su -
```

## index.phpが真っ白な画面になる

ソースを表示すると、phpファイルがそのままテキストとして表示されていませんか？
その場合はApacheの

```config
...
#
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

#
...
```

が同じように記述されているか確認してください。

## index.phpが読み取り専用で保存できない

/var/www/html/ディレクトリのパーミッションがおかしい可能性があります。
雑ですが777にパーミッションを変えてしまいましょう。

```shell-session
$ sudo chmod 777 /var/www/html/
```

以上です。