AWSのインスタンスにLAMP環境を構築する

# 内容
AWSにインスタンスを作成したあと、SSHのキーを使ってインスタンスに入るところから、CakePHPを使えるようにするまで解説します。
主にコマンド作業の内容を細かく解説します。

# 対象
コマンドでLAMP環境を作ることができたけど、これって一体何をしてるの？と思った方向けです。
なので、コマンド１単語ずつ分解して説明してます。
なぜ、この設定が必要なのかはうまく説明できないけど、この設定がないとダメな理由は書いているので、そこは意味を反転して読んでいただきたいです。

## 使用するインスタンス
- 無料枠のEC2
- OSはAmazon Linux
- セキュリティグループはSSH

# インスタンスができたら
使用する端末がwinの場合はツール（RLoginとか）をインストールしてください。macの場合はターミナルを起動してください。
macのターミナルの場所：アプリケーション＞ユーティリティ＞ターミナル

# １インスタンスに入る
## ①SSHのキーの設定
インスタンス作成の際にダウンロードしたキーを使用します。
`chmod 600 ~/hoge/hoge.pem`
**⇨このキーの権限を設定するよ！**

【入力内容】
:sunny:*~/hoge/hoge.pem*　のところには
　ダウンロードしたキーのファイルパスを入力してください。

【コマンドの解説】
:cherry_blossom: chmod 
チェンジモードchange modeの意味でアクセス権を変更するときに使用します。

:cherry_blossom: 600 
３桁の数字はアクセス権を示します。

<font color="red">６</font>００：１桁目は所有者の権限です。
６<font color="red">０</font>０：２桁目はグループの権限です。
６０<font color="red">０</font>：３桁目はその他の権限です。

さらにそれぞれの数字に権限の意味があります。
<font color="red">６</font>：読み込み権限と書き込み権限
<font color="red">０</font>：権限なし

つまり６００というのは、
所有者の権限には読み込みと書き込みの権限を与え、
グループの権限とその他の権限には権限を何も与えない
ということになります:astonished:

:cherry_blossom: キーのファイルパス
権限を与える対象のファイルを指定することになります。

**【参考サイト】**
chmodについて詳しく！
[chmod? chown? よくわからんって人のための、ファイル権限系まとめ](https://qiita.com/t-a-run/items/239ed690ece7a011804a)
権限の数字について詳しく！
[【 chmod 】 ファイルやディレクトリのアクセス権を変更する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230728/?rt=nocnt)
コマンド操作を楽ラクにしたい！
[ブクマ必至！Linuxコマンド一覧表【全33種】　2.2 覚えておくと便利なショートカットキー](https://www.sejuku.net/blog/5465#i)

## ②SSHのキーを使用してEC2に入る

今回使用するインスタンスをSSHで構築しました。
SSHにはキーがないとインスタンスにログインができない仕組みになっています。
キーを使うことで、ユーザーID&パスワードのログインよりも、より限定した人がログインできるようになります。

①で使用したキーをここでも使用して、インスタンスにログインします。
`ssh  ec2-user@hoge -i ~/hoge/hoge.pem`
**⇨このキーでインスタンスに入るよ！**

【入力内容】
:sunny:*ec2-user@hoge*　の*hoge*にはインスタンスのIPv4 パブリック IPを入力してください。
:sunny:*~/hoge/hoge.pem*　のところには①同様、
　ダウンロードしたキーのファイルパスを入力してください。

【コマンドの解説】
:cherry_blossom: ssh
インスタンス作成時のセキュリティグループでタイプSSHを選択しました。
それです。

:cherry_blossom: ec2-user@hoge
アクセス先を指定する。

:cherry_blossom: -i
informationのiです。付加情報がある際にはこのあとに記述します。

:cherry_blossom: ~/hoge/hoge.pem
今回の付加情報です。
「このキーでインスタンスに入るよ！」の「このキー」というのが付加情報になります。

**【参考サイト】**
SSHとキーの関係を詳しく！
[「よく分かる公開鍵認証」～初心者でもよくわかる！VPSによるWebサーバー運用講座(2)](https://knowledge.sakura.ad.jp/3543/)

## ③質問されるので答える
②を実行すると以下の文章が表示されます。
> Are you sure you want to continue connecting (yes/no)?

**⇨接続することは同意ですか？**

同意なので
`yes`
と入力してください。

## ④入れた！
以下のAAが表示されたらインスタンスに入れました！おめでとう:heart_eyes:
>       __|  __|_  )
>       _|  (     /   Amazon Linux AMI
>      ___|\___|___|

# ２環境を整える
## ①インスタンスを更新する
インスタンスを最新の状態にしたいので、アップロードするものがあればアップロードするようにします。
`sudo yum update -y`
**⇨管理者権限でアップデートするよ！**
これを実行するとズラズラ文章が流れていきます。

【コマンド解説】
:cherry_blossom: sudo
<font color="red">s</font>uper<font color="red">u</font>ser <font color="red">do</font> の略で、管理者権限で実行することを意味します。
これを入れ忘れると、データが保存されなかったり、
実行しても権限がないと言われてしまうので、入れ忘れに注意してください。
superuserはrootのことです。

:cherry_blossom: yum update
yumはパッケージを取得してそれをどうするかの指定です。
どうするかは今回はupdateなので更新します。
つまりupdateのところをinstallにすれば、パッケージのインストールができます。

:cherry_blossom: -y
何か質問されたらyesで答えるときに使用します。
毎回質問に対して返事するのが面倒なときに使うと便利です。

**【参考サイト】**
rootとは？
[【完全初心者向け】Linuxのrootユーザとは？](https://eng-entrance.com/linux-root)

## ②Apache,PHP,MySqlをインストールする
LAMP環境と言われるAMPの部分です。
ちなみにLはLinuxのLで、今回のインスタンスのOSです。
`sudo yum install -y httpd24 php70 mysql56-server php70-mysqlnd`
**⇨管理者権限でインストールするよ！
インストールするものは
・Apache
・PHP
・MySql
・PHPのMySql用ドライバー
だよ！**
これを実行するとズラズラ文章が流れていきます。
>Complete!

が表示すれば成功です。

【入力内容】
:sunny: 数字はバージョンを表しています。インストールするときによって
　使用するバージョンが異なるのでチェックしてください。

【コマンド解説】
:cherry_blossom: sudo yum install -y
詳細は前述済みです。
何をインストールするかの指定を-y以降に記述します。

:cherry_blossom: httpd24
Apache2.4をインストールします。
Apacheとはwebサーバーのことです。
webサーバーがないとPHPなどのプログラムが動かないので必要です。

:cherry_blossom: php70
今回の主役、PHPです。PHP7.0をインストールします。

:cherry_blossom: mysql56-server 
今回使用するデータベースはMySqlです。MySql5.6のサーバーの方をインストールします。
サーバーの方と言うだけあって、クライアント（端末）の方もあります。
今回はインスタンス（サーバー）に入れたいので、サーバーの方のMySqlをインストールします。

:cherry_blossom: php70-mysqlnd
PHPでMySqlを使うためのドライバーをインストールします。
これがないとPHPでMySqlを使うことができないです。

# ３インスタンスを起動する
ここまでインスタンスに対していろいろ設定をしてきたけど、
まさかのインスタンスはまだ起動していません:frowning2:
webサーバーの役割果たしていません。
朝、目が覚めて、布団から出れずにいるような状態です。

## ①ブートの設定をする
この設定をすると、インスタンスの電源が入ったときに、自動的にApacheが起動してwebサーバーとして
動き出します。
これを設定しないと、インスタンスの電源が入るたびに自分でApacheを起動させないといけません。
面倒なので、設定しましょう。
`sudo chkconfig httpd on`
**⇨管理者権限で、電源が入ったらApacheを起動させるよ！**

【コマンド解説】
:cherry_blossom: chkconfig httpd
システムの起動時の設定をする際に使用するコマンドです。
winで言えばスタートアップのときに起動するアプリを指定したりする感じです。
起動するアプリをこの後に記述します。
今回設定するのはApacheなので前述の通りApacheはhttpdなので、
chkconfig httpdとなります。

:cherry_blossom: on
スイッチオンのオンです。
これをoffにすれば、システム起動時にアプリを起動しているものを起動しないように設定できます。

**【参考サイト】**
chkconfigについてもっと！
[chkconfigまとめ](https://qiita.com/shell/items/30031862d91cedf9ceef)

## ②起動させる
ついにです。
これでやっとApacheが起動します。
起動することにより、やっとwebサーバーとして働きます。
`sudo service httpd start`
**⇨管理者権限で、Apacheを起動させるよ！**
これを実行すると
> OK

と表示されれば、起動されました:v:

【コマンド解説】
:cherry_blossom: service httpd
サービスをある状態にするときに使用するコマンドです。
serviceのあとに対象のサービスを指定します。
ここではhttpdなのでApacheのことです。
Apacheはサービスです。web serverだからです。
serverとserviceの英語の関係からみるとよくわかります。

:cherry_blossom: start
指定したサービスをどの状態にするかです。
startなので開始・起動です。
もちろんrestartで再起動です。
止めるときはstopです。
まんま英語です。

# ４PHPファイルを作る
## ①ドキュメントルートの所有者を変える
また権限の設定です。
インスタンス内のルートの所有者を変更します。
この変更をしないと、この後の作業ができなくなります。
原因は所有者以外の人の操作を拒否している状態だからです。
ということで、作業を進めるために所有者を自分にします。
`sudo chown ec2-user:ec2-user -R /var/www/html/`
**⇨管理者権限で、/var/www/html/のユーザー所有者をec2-user、グループ所有者をec2-userにするよ！**

:cherry_blossom: chown
あれ、さっき権限変えるのは`chmod`じゃなかった？
でもここでは`chown`なの？
chmodはアクセス権を変更するとき、
chownは所有者を変更するときに使います。
ownはownerなのでchange ownerであることから、
所有者を変えるということがわかります。

ところで、アクセス権と所有者の違いとはなんでしょうか。
１ー①で何をしたかを思い出すとわかりやすいです。
１ー①ではキーに対してアクセス権を設定しました。
設定したアクセス権は６００でした。
この「６」が１桁目なので所有者の権限の内容でした。
chownではこの１桁目の所有者を誰にするかを設定します。
ここで設定する対象はキーではなく、ルートです。
今回指定するのがルートなのでファイルでも可能です。
ファイルひとつひとつに所有者を設定するのは大変なので、
ルート全体の所有者を設定してしまおうということです。


:cherry_blossom: ec2-user:ec2-user
所有者を誰にするかの、「誰」の部分です。
「：」の左側がユーザー所有者、右側がグループ所有者です。
ユーザー所有者とグループ所有者の所有者を同じにします。
ユーザーはユーザーで、グループはユーザーが所属しているグループです。

:cherry_blossom: -R
再帰的に設定するという意味です。
再帰的というのは全部に対してひとつひとつ設定を行うという感じです。
これをいれることで、全部のフォルダに対して、所有者を設定することができます。
このファイルだけ変更したいということであれば、「-R」は不要です。

:cherry_blossom: /var/www/html/
所有者変更の対象のルートです。
１ー①での設定はキーに対して行いました。
今度は/var/www/html/に対して設定をします。
ちなみにこの場所をドキュメントルートと言います。
このドキュメントルートの所有者をEC2(今使っているインスタンス)にすることで、今後ファイルの読み書きが可能になります。
HTMLファイル、CSSファイル、JavaScriptファイルやPHPファイルを配置するのはこの場所以下です。
ここに配置したファイルが、いわゆるホームページやwebサイトとして公開されます。

**【参考サイト】**
ユーザー所有者とグループ所有者を詳しく！
[【Linux】ファイルのオーナーとグループを知ってみよう](http://www.kyoji-kuzunoha.com/2012/09/linux-group.html)
再帰的を詳しく！
[linuxコマンドでよく出てくる、【再帰的】とは、、、](https://qiita.com/OTAGRAMER/items/0feab9fbf02e07a44915)

## ②ファイルを作成する
とりあえずPHPのファイルを作ってみましょう。
ここではサンプルということで、単純にPHPのインフォメーションを表示させるページを作成します。
`sudo vim /var/www/html/index.php`
**⇨管理者権限で、/var/www/html/index.phpを開いて！ファイルが存在しなければ作って！**

【コマンド解説】
:cherry_blossom: vim
テキストファイルを編集するときに使用します。
これを実行すると、画面が変わります。
今まで打ってきたコマンドから指定したファイルの中身が表示されます。
画面のモードがコマンドからテキストエディタに変わった感じです。

:cherry_blossom: /var/www/html/index.php
編集したいテキストファイルのパスです。
これを実行したときに、ファイルが存在すればファイルの中身を表示します。
ファイルが存在しない場合は、ファイルを作成してからファイルの中身を表示します。

**【参考サイト】**
vimについて詳しく！
[Vimをメモ帳程度に使うために覚えておくべきコマンド](https://qiita.com/honeniq/items/201156650310c4968c3a)

# ５index.phpを編集する
４ー②を実行すると画面が変わります。
index.phpが開かれた状態になります。
vimのテキストエディタモードに変わっているので、少々操作がわかりにくくなります。

今回は新規作成なので画面がこんな感じだと思います。
> 
~
~
(中略)
~
~
"/var/www/html/index.php" [New File]

この状態から操作を始めます。

## ①編集可能モードに切り替える
今のままでは閲覧モードなので、編集モードに切り替えます。
`a`
または
`i`
**⇨編集可能な編集モードにして！**

【コマンド解説】
:cherry_blossom: a　または　i
閲覧モードから編集モードに切り替えるときに使用するコマンドです。
これをしないとテキストファイルの編集ができません。

## ②PHPのプログラムを書く
PHPのインフォメーションを表示させます。

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

**⇨PHPのインフォメーションを表示して！**

【PHP解説】
:cherry_blossom: <?PHP　コード記述　　?>
PHPのプログラムはこの中に書きます。
この中に書かないとPHPのプログラムコードだと認識されません。
PHPはC＃同様、行末に`;`が必要です。

:cherry_blossom: echo
画面に表示する内容をこの後に記述します。
画面に表示する時のコードに`print`があります。

echoとprintの違いです。
〜動作の違い〜
echo：ただ表示するだけ（戻り値なし）
print：表示するし、その表示が成功したか失敗したかの判定も取得できる（戻り値あり）
〜画面に表示する内容の違い〜
echo：カンマ区切りの表示ができる。下記の表示ができる。
`"今日の天気は",天気を取得するファンクション,"です。";`
print：カンマ区切りの表示ができない。上記の表示ができない。

:cherry_blossom: phpinfo()
PHPのインフォメーションを表示します。
ただのインフォメーションです。

**【参考サイト】**
echoとprintの違いを詳しく！
[あなたは『echo』派？それとも『print』派？](https://ht79.info/2012/11/29/echo_print/)

## ③閲覧モードに切り替える
PHPのインフォメーションを表示するだけのPHPプログラムなので、コードはこれだけです。
キーボードの「esc」キーを押してください。
これで編集モードから閲覧モードに切り替わりました。

## ④保存して閉じてコマンドに戻る
保存します。
`:wq`
**⇨保存してから閉じて！**
wとqで1文字ずつ意味を持っています。
このようにくっつけて連続での使用が可能です。

【コマンド解説】
:cherry_blossom: :
閲覧モードの操作で使用するときに使用します。
主にテキストファイルに対しての操作で使用します。
保存とか終了とか強制終了とか。

:cherry_blossom: w
writeのwです。
つまり書き込みや保存です。

:cherry_blossom: q
quitのqです。
つまり終了です。
`q!`で強制終了です。
強制の部分が「！」なの、すっごく命令してる感あるね。

# ６PHPのインフォメーションを見る
ブラウザのURLのところに、インスタンスのIPを入力してみてください。
紫のPHPのロゴがあったり、PHPのバージョンがいくつとかサーバーは何とかいろいろ書いてある画面が表示されます。
<img width="961" alt="phpinfo.png" src="https://qiita-image-store.s3.amazonaws.com/0/218491/2b7ed2e7-91d4-9747-7b33-859df50bb559.png">

おめでとう！PHPのプログラムが動いているよ:heart_eyes:

#７PHP7.iniを編集する
## ①インストールする
CakePHPを使用するのに必要なようです。
先人たちがたくさん躓いているようなので、先人の経験に感謝しながらインストールします。
`sudo yum install php70-intl`
**⇨管理者権限でPHP7のintlをインストールするよ！**
これを実行するとズラズラ文章が流れて行きます。

## ②編集する
インストールが完了したら、今インストールしたファイルのひとつを編集します。
`sudo vim /etc/php-7.0.ini`
**⇨管理者権限でphp-7.0.iniのファイルを編集するよ！**

テキストが開かれたら、編集箇所を探します。
以下の検索するコマンドを実行します。

`/hoge`
**⇨hogeを検索して**

【入力内容】
:sunny: *hoge* 検索したいテキストを入力してください。

検索するテキスト：intl

検索を実行すると、該当の文字に背景色がつくと思います。
検索結果で該当箇所が複数ある場合は「N」キーで次の検索結果に飛びます。

以下の箇所を編集したいので、「N」キーを押して該当箇所を探してください。

```ini:php-7.0.ini
[intl]
;intl.default.locale = 
; This directive allows you to produce PHP errors when some error
; happens within intl functions. The value is the level of the error produced.
; Default is 0, which does not produce any errors.
;intl.error_level = E_WARNING
```

ありましたか？
長々と何が書かれているか？
>
ここの指示で、なにかエラーがintlの機能で発生したとき、あなたはPHPのエラーを生成することができます。
値は生成されたエラーのレベルです。
初期値は０ですが、何もエラーを生成しません。

なんか、例外エラーをどうするか、みたいなことかな？
編集モードにします
`a`または`i`です。

このパラグラフの最終行に以下の文章を追加します。
`extension=intl.so`
**⇨intl.soで拡張します！**

これで例外エラーが発生したとき、intl.soの拡張機能によってどうにかこうにかできるようになるみたいです。
ちょっとここの点についてはよくわからなかったですが、これがないとCakePHPが動かないみたいなので、やりましょう。

入れるとこんな感じになります。

```ini:php-7.0.ini
[intl]
;intl.default.locale = 
; This directive allows you to produce PHP errors when some error
; happens within intl functions. The value is the level of the error produced.
; Default is 0, which does not produce any errors.
;intl.error_level = E_WARNING
extension=intl.so
```
入力が終わったら、コマンドモードに戻ります。
「esc」→`:wq`です。

# ８mbstringを編集する
## ①インストールする
コマンドモードに戻ってますか？
もうひとつインストールします。
`sudo yum -y install php70-mbstring`
**→管理者権限で、php70-mbstringをインストールして！**
これを実行するとズラズラと文章が流れて行きます。

【コマンド解説】
:cherry_blossom: php70-mbstring
私たちが日本語を使用しているので、言語設定が必要になります。
言語設定用のパッケージをここでインストールします。

## ②編集する
インストールが完了したら、編集します。
`sudo vim /etc/php-7.0.ini`
**→管理者権限で、php-7.0.iniを編集するよ！**

テキストが開かれたら編集箇所を探します。

検索するテキスト：mbstring

以下の箇所を編集したいので、「N」キーを押して該当箇所を探してください。

```ini:php-7.0.ini
[mbstring]
; language for internal character representation.
; This affects mb_send_mail() and mbstring.detect_order.
; http://php.net/mbstring.language
; mbstring.language = Japanese

; Use of this INI entry is deprecated, use global internal_encoding instead.
; internal/script encoding.
; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*)
; If empty, default_charset or input_encoding or iconv.internal_encoding is used.
; The precedence is : default_charset < internal_encoding < iconv.internal_encoding
; mbstring.internal_encoding = 

; Use of this INI entry is deprecated, use global input_encoding instead.
; http input encoding.
; mbstring.encoding_traslation = On is needed to use this setting.
; If empty, default_charset or input_encoding or mbstring.input is used.
; The precedence is : default_charset < input_encoding < mbsting.http_input
; http://php.net/mbstring.http-input
; mbstring.http_input = auto

; Use of this INI entry is deprecated, use global output_encoding instead.
; http output encoding.
; mb_output_handler must be registered as output buffer to function.
; If empty, default_charset or output_encoding or mbstring.output is used.
; The precedence is : default_charset < output_encoding < mbsting.http_output
; To use an output encoding conversion, mbstring's output handler must be set
; otherwise output encoding conversion cannot be performed.
; http://php.net/mbstring.http-output
; mbstring.http_output = 

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note : Do _not_ use automatic encoding translation for
;        portable libs/applications. 
; http://php.net/mbstring.encoding-translation
; mbstring.encoding_translation = Off

; automatic encoding detection order.
; "auto" detect order is changed according to mbstring.language
; http://php.net/mbstring.detect-order
; mbstring.detect_order = auto
```

また長い英語です。
内容としては、言語は何か、入力の文字コード、出力の文字コードなど、とにかく言語設定をします。
英訳すれば、言語設定の何をしているかわかると思います。

この箇所を以下のように編集します。

```ini:php-7.0.ini
[mbstring]
; language for internal character representation.
; This affects mb_send_mail() and mbstring.detect_order.
; http://php.net/mbstring.language
mbstring.language = Japanese
; 上の文頭の;を削除します

; Use of this INI entry is deprecated, use global internal_encoding instead.
; internal/script encoding.
; Some encoding cannot work as internal encoding. (e.g. SJIS, BIG5, ISO-2022-*)
; If empty, default_charset or input_encoding or iconv.internal_encoding is used.
; The precedence is : default_charset < internal_encoding < iconv.internal_encoding
mbstring.internal_encoding = UTF-8
; 上の文頭の;を削除して=のあとに「UTF-8」を追加します

; Use of this INI entry is deprecated, use global input_encoding instead.
; http input encoding.
; mbstring.encoding_traslation = On is needed to use this setting.
; If empty, default_charset or input_encoding or mbstring.input is used.
; The precedence is : default_charset < input_encoding < mbsting.http_input
; http://php.net/mbstring.http-input
mbstring.http_input = auto
; 上の文頭の;を削除します

; Use of this INI entry is deprecated, use global output_encoding instead.
; http output encoding.
; mb_output_handler must be registered as output buffer to function.
; If empty, default_charset or output_encoding or mbstring.output is used.
; The precedence is : default_charset < output_encoding < mbsting.http_output
; To use an output encoding conversion, mbstring's output handler must be set
; otherwise output encoding conversion cannot be performed.
; http://php.net/mbstring.http-output
mbstring.http_output = UTF-8
; 上の文頭の;を削除して=のあとに「UTF-8」を追加します

; enable automatic encoding translation according to
; mbstring.internal_encoding setting. Input chars are
; converted to internal encoding by setting this to On.
; Note : Do _not_ use automatic encoding translation for
;        portable libs/applications. 
; http://php.net/mbstring.encoding-translation
mbstring.encoding_translation = On
; 上の文頭の;を削除してOffをOnにします

; automatic encoding detection order.
; "auto" detect order is changed according to mbstring.language
; http://php.net/mbstring.detect-order
mbstring.detect_order = auto
; 上の文頭の;を削除します
```

基本、文頭の`;`を削除します。
どこを更新するかの説明はQiitaだとしにくいので参考サイトを見てください。

編集が終わったら、保存してコマンドモードに戻ります。
「esc」→`:wq`です。

【コード解説】
:cherry_blossom: ;
文頭に`;`をつけることで、文章をコメントすることができます。
HTMLでいうと`<!-- -->`やC＃の`//`と同じです。

**【参考サイト】**
編集箇所がわかりにくい！
[日本語環境の設定 - mbstring](https://webkaru.net/php/mbstring-php-ini/)

# ９インスタンスを再起動する

コマンドモードに戻っていますか？
設定をしたので、Apacheを再起動します。
`sudo service httpd restart`
**⇨管理者権限で、Apacheを再起動するよ！**

>OK

が表示されたら、再起動成功です。

余談だけど、`start`だと何も変わらないです、`restart`じゃないと再起動になりません。

# １０CakePHPをインスタンスに入れる
## ①CakePHPをダウンロードする
下記のGitHubからCakePHPをダウンロードします。
バージョンはお好きなのをどうぞ。
ダウンロードしたらフォルダ名はわかりやすいように「cake」とか「cakephp」とかにしておくといいかも。

https://github.com/cakephp/cakephp/releases/

## ②FTP通信環境を整える

ダウンロードできたら、FTP通信ツールを端末にインストールします。
FFFTPとかサイバーダックとか。

FTP通信ツールをインストールしたら、インスタンスにログインします。
ここでも、SSHのキーを使ってログインします。

サーバーはインスタンスのIP、ユーザー名は`ec2-user`、通信の種類はSFTPです。

**【参考サイト】**
[初心者でも使える！フリーのFTPクライアントソフト10選](https://techacademy.jp/magazine/1190)

## ③CakePHPをアップロードする
FTP通信で以下のディレクトリに解凍したCakePHPをアップロードします。
`var/www/html`
時間かかります。だいたい３０分〜６０分、待ちましょう。

# １１CakePHPの設定をする
## ①権限を変更する
何度目かの権限変更です。
CakePHPはログを生成する機能があります。
ログを生成するために、ログルートの所有者をApacheにします。
Apacheを所有者にしないと、ログを出力することができません。
以下２つのコマンドを実行します。

`sudo chown apache:apache -R /var/www/html/hoge/logs/`
**⇨管理者権限で、/var/www/html/hoge/logs/のユーザー所有者とグループ所有者をApacheにするよ！**

`sudo chown apache:apache -R /var/www/html/hoge/tmp/`
**⇨管理者権限で、/var/www/html/hoge/tmp/のユーザー所有者とグループ所有者をApacheにするよ！**


【入力内容】
:sunny: *hoge*　ここに１０ー①でダウンロードしたファイルの名前を入力します。

今までApacheはhttpdでしたが、今回はApacheはユーザーなので、`apache`で指定します。

## ②CakePHPを見てみる
アップロードができたら、CakePHPを見てみましょう。
ブラウザのURLのところに、以下のURLを入力してください。
`hogeIP/hoge/`

【入力内容】
:sunny: *hogeIP*　ここにインスタンスのIPを入力してください。６と同じです。
:sunny: *hoge*　ここに１０ー①でダウンロードしたファイルの名前を入力します。

ケーキの画像が表示されればOKです:heart_eyes:

<img width="972" alt="cake.png" src="https://qiita-image-store.s3.amazonaws.com/0/218491/e6589202-d615-71fe-063a-aceb37f1cbc1.png">


# おまけ：アクセスログを見てみよう

アクセスログがみれます。
`sudo tail -f /var/log/httpd/access_log`
**⇨管理者権限で、アクセスログを見せて！**

【コマンド解説】
:cherry_blossom: tail
指定したファイルの末尾の指定した行数分を表示するコマンドです。
ファイルの末尾にアクセスログが追記されていくので、末尾を見ると最新のアクセスログが見れるということになります。
指定の行数は何も設定しなかったら10行です。

:cherry_blossom: -f
ファイルを監視して常に最新の状態を表示するように設定します。
これを入れることで、新しいアクセスログが書き込まれたら、画面にズラズラ表示されていきます。

:cherry_blossom: /var/log/httpd/access_log
今回の監視表示対象のファイルです。
ここのファイルパスを変更すれば、ほかのファイルを見ることができます。

もう見ない！普通のコマンドモードに戻りたい！というときは
`ctl + c`でコマンドモードに戻れます。

**【参考サイト】**
tailについて詳しく！
[【 tail 】 ファイルの末尾を表示する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230894/?rt=nocnt)

# おまけ：家から接続しようと思ったらできない:scream:
インスタンス作成時にSSHの接続可能IPを作成時に使用していたIPで設定していました。
つまり、作成時と同じIP環境でないと、インスタンスに接続できないようになっています。
それだと不便なので、自宅や会社のIPを設定すると、自宅や会社からアクセス可能になります。
この設定をしないと、自宅や会社からFTP通信ツールからインスタンスにログインすることができないです。

自宅でこの記事を書くにあたり復習しようとしたら、この罠に引っかかって「接続できない:rage:」ってなったので一応、おまけとして書いておきます。

##SSHの変更をする
AWSにログインして、EC2のインスタンス一覧を開きます。
<img width="893" alt="１.png" src="https://qiita-image-store.s3.amazonaws.com/0/218491/33efb8af-cf1e-2c5d-ccc2-91382402bae1.png">

一覧にあるセキュリティグループをクリックします。
<img width="1412" alt="２.png" src="https://qiita-image-store.s3.amazonaws.com/0/218491/a6f70556-347d-18cd-9c2b-89874ac13f71.png">

インバウンドタブ内にある編集ボタンをクリックします。
<img width="1417" alt="３.png" src="https://qiita-image-store.s3.amazonaws.com/0/218491/615cc07b-34d6-6ae4-14cd-02b2b3162c2e.png">

SSHのIPをマイIPにして保存すればOK
<img width="1090" alt="４.png" src="https://qiita-image-store.s3.amazonaws.com/0/218491/1d697a8d-6935-45ff-c05d-a1d2663dcc78.png">

これで、１ー②を実行するとログインできます。
ログインできたらFTP通信ツールからもログインできます。

#おまけ：時刻設定
おまけのアクセスログをみると、時間が日本時間ではないことに気がつくと思います。
不便なので、日本時間にしましょう。

##①インスタンスの時間を変える
まずはインスタンスの時間から変更しましょう。
`sudo vim /etc/sysconfig/clock`
**⇨管理者権限で、clockを編集するよ！**

パスを見ればわかる通り、時刻設定用のコンフィグです。
編集モードにして以下を追加します。

```
ZONE="Asia/Tokyo"
UTC=false
```
**⇨タイムゾーンは東京
　　UTCの取得は不要**

保存してコマンドモードにします。

つづいて以下のコマンドで設定情報をコピーします
`sudo cp /usr/share/zoneinfo/Japan /etc/localtime`
**⇨管理者権限で、/usr/share/zoneinfo/Japanを/etc/localtimeにコピーして！**

:cherry_blossom: cp A B
コピーするときに使います。
Aはコピー元、Bはコピー先のパスを設定します。

つづいて時刻を司っているバッチを再起動します。
`sudo /etc/init.d/crond restart`
**⇨管理者権限で、crondを再起動するよ！**

設定した内容を反映させます。
再起動ができたら、インスタンスの時間を確認してみましょう。
`date`
現在時刻が表示されます。日本時刻になりました。

**【参考サイト】**
インスタンスの時刻設定について詳しく！
[AWS EC2にLAMP環境を構築するまで](https://qiita.com/michimani/items/06e4d625205b94d4c039#%E6%99%82%E5%88%BB%E8%A8%AD%E5%AE%9A)
cpについて詳しく！
[ファイルをコピーする](https://www.k-tanaka.net/cmd/copy.php)

##②CakePHPの時間を変える
`sudo vim /var/www/html/cakephp/config/app.php`
**⇨管理者権限で、app.phpを編集するよ！**

以下の箇所を編集します。

```php:app.php　編集前
'timezone' => 'UTC',
```

```php:app.php　編集後
'timezone' => 'Asia/Tokyo',
```
**⇨タイムゾーンは東京**

`sudo vim /var/www/html/cakephp/config/bootstrap.php`
**⇨管理者権限で、bootstrap.phpを編集するよ！**

以下の箇所を編集します。

```php:bootstrap.php　変更前
date_default_timezone_set('UTC');
```

```php:bootstrap.php　変更後
date_default_timezone_set('Asia/Tokyo');
```

**【参考サイト】**
CakePHPの時刻変更について詳しく！
[CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法](https://blog.s-giken.net/346.html)

以上で設定は終わりです。
再起動してアクセスログを確認してみると、日本時間のアクセスログになっています。
やったね:wink: