LAMP 環境構築 PHP 7 MySQL 5.7（前編）

## 概要
結構久しぶりにLAMP環境をゼロから作る事になったので環境構築の際のメモ。
少々投稿が長くなってしまうので前編と後編に記事を分割した。

[LAMP 環境構築 PHP 7 MySQL 5.7（後編）](http://qiita.com/keita-nishimoto/items/7d0a8d6e24c1861d799f) も参考にして欲しい。

## 環境
- CentOS 7(OS) ※[こちらのVagrantBox](https://atlas.hashicorp.com/centos/boxes/7) を利用
- Apache2.4.X
- PHP 7.0.X
- MySQL 5.7.X

本投稿はあくまで開発用の環境を想定している。
よって本番環境での運用等は考慮されていないので注意を。
※なお実行の際はrootユーザーで実行する事。

## OSの基本設定

### タイムゾーンの設定

```
# timedatectl set-timezone Asia/Tokyo
```

### ロケールの設定

```
# localectl set-locale LANG=ja_JP.utf8
```

### SELinux無効化

有効になっていると色々と問題になるので無効にしてしまう。

```
# setenforce 0
```
これで無効になったが、もう一度下記のコマンドを実行し無効になったか確認しておく。

```
[root@localhost vagrant]# getenforce
Permissive
```
Permissiveと表示されたら無効になっている。
だがこのままだとOSの再起動時に再び有効になってしまう、そこで設定ファイルを書き換えて、OSの起動時に無効化する処理を入れてあげる。

```
# vi /etc/sysconfig/selinux
```

下記のように変更する。
SELINUX=enforcing
↓
SELINUX=disabled

### ファイアウォールの停止

```
# systemctl stop firewalld
```

### ファイアウォール自動起動解除

```
# systemctl disable firewalld
```

## 各種コマンドのインストール（お好みで）

### Gitのインストール
※他はともかくこれは入れておいたほうが良い。

```
# yum install git
```

yumでインストールされるgitのバージョンはかなり古い。
（この記事を書いている2016-07-19の時点で1.8.3）

最新版を使いたい場合は[こちらの記事](http://qiita.com/ystg/items/e8b4271313e93bd9efa6) 等を参考にインストールを行う。

本投稿の本題とはズレるので詳しい手順については割愛させて頂く。

### locateコマンドのインストール

```
# yum install mlocate
```

↓locateコマンドのデータベースを更新。

```
# updatedb
```

### wgetのインストール

```
# yum install wget
```

## Apache2.4のインストール&設定

インストールと設定を行う。
なお本投稿ではインストールを行った後にVirtualHostの設定を行い下記のURLでアクセス出来るようにする。

https://domainname.com

```
# yum install httpd httpd-devel mod_ssl
```

※mod_sslはApacheでSSL通信を可能にする為のモジュール。
後で使うのでここでインストールしておく。

## Apacheの起動&自動起動設定

↓起動

```
# systemctl start httpd.service
```

↓自動起動設定

```
systemctl enable httpd.service
```

↓起動確認、下記のように表示されたら起動に成功している。

```
[root@localhost vagrant]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2016-07-20 00:08:45 JST; 22min ago
```

ちなみにこの時点でインストールが正常に終了しているかを確認する為に、以下のURLでアクセスしてテストページが表示されるか確認してみよう。

↓こんな感じのテストページが表示されたら成功。

http://192.168.33.11
※192.168.33.11は環境に合わせて適宜変更してね。

<img width="1091" alt="apachetestpage.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/89e19bea-289a-929f-dc75-396365073dcf.png">

なおこのテストページも確認時には便利だが、セキュリティ上よろしくない為、本番での運用時には表示しない設定にしておく事をオススメする。

※参考
[AWSのApache2.4の初期設定とセキュリティ設定](http://qiita.com/shojimotio/items/41a74f314f3e47c018a5)


### SSL通信に必要な鍵の生成

ここで紹介する方法は自己証明書（俗に言うオレオレ証明書）を利用してSSL通信を行う方法。

#### 秘密鍵の生成

```
# openssl genrsa -out /etc/pki/tls/private/domainname.key 4096
```

#### CSR情報の生成
```
# openssl req -new -key /etc/pki/tls/private/domainname.key -sha256 -out /etc/pki/tls/certs/domainname.csr
```

実行すると色々と入力を求められる。（Country NameとかState or Province Nameとか）
本番環境で実際に利用する際には正確な情報を入力する必要があるが今回は自己証明書なので適当に入力してOK。

入力内容の詳細は[こちらのページ](https://www.geotrust.co.jp/support/ssl/csr/apache_openssl_new.html) 等を参照。

#### 自己証明書の作成

本番環境ではちゃんとした証明書を取得する事を強く推奨する。

余談だが、[Let's Encrypt](https://letsencrypt.jp/usage/) のような無料で証明書を発行するサービスも存在する。

```
# openssl x509 -in /etc/pki/tls/certs/domainname.csr -days 365 -req -signkey /etc/pki/tls/private/domainname.key -sha256 -out /etc/pki/tls/certs/domainname.crt
```

### VirtualHostの設定

新規でdomainname.confを作成する。

```
# vi /etc/httpd/conf.d/domainname.conf
```

↓以下の内容で保存

```text:/etc/httpd/conf.d/domainname.conf
NameVirtualhost *:443

<VirtualHost *:443>
  DocumentRoot "/home/vagrant/wordpress"
  ServerName domainname.com

  ErrorLog logs/ssl_error_log
  TransferLog logs/ssl_access_log
  LogLevel warn

  SSLEngine on

  SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA

  SSLCertificateFile /etc/pki/tls/certs/domainname.crt
  SSLCertificateKeyFile /etc/pki/tls/private/domainname.key

  <Files ~ "\.(cgi|shtml|phtml|php3?)$">
      SSLOptions +StdEnvVars
  </Files>

  <Directory "/home/vagrant/wordpress/">
    Require all granted
  </Directory>

  BrowserMatch "MSIE [2-5]" \
           nokeepalive ssl-unclean-shutdown \
           downgrade-1.0 force-response-1.0

  CustomLog logs/ssl_request_log \
            "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
```

設定内容について少し説明する。

- DocumentRoot
    - Webサーバが初めに参照するディレクトリパス
- ServerName
    - Webサイトのドメイン名
- SSLProtocol
    - 利用を許可するSSLのバージョン、[こちらの記事](http://qiita.com/kuni-nakaji/items/5118b23bf2ea44fed96e)が詳しい。古いバージョンは非推奨なので利用しない事を強く推奨する。

### テスト用のHTMLファイルの配置

ドキュメントルートに設定した/home/vagrant/wordpress にindex.htmlを配置してHTTPSでアクセスが出来るか確認してみよう。

```html:/home/vagrant/wordpress/index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Hello World!</title>
    <meta charset="utf-8">
  </head>
  <body>
    <div>Hello World!</div>
  </body>
</html>
```

### ドキュメントルートのパーミッションの設定

以下のコマンドでドキュメントルートのパーミッションを設定する。

```
chmod 755 /home/vagrant/
chmod 755 /home/vagrant/wordpress/
```

### hosts設定
ServerNameに設定したdomainname.comというドメイン名は実際にはネームサーバに登録されていない。（もしかしたらされているかもしれないけど・・・）

https://domainname.com にブラウザでアクセスした際に構築したWebサーバにアクセスさせたいので、構築に利用しているPCのhostsにIPアドレスとdomainname.comを記載して上げる必要がある。

hosts設定の方法は詳しくは割愛させて頂く。

- [Macでhostsファイルを変更・反映](http://qiita.com/junker919/items/cc15653a681e2dcd79ea)
- [Windows10でhostsファイルを更新する方法](https://websetnet.com/ja/how-to-edit-hosts-file-in-windows-10-and-windows-8-1/)

Macにせよ、Windowsにせよ閲覧するには以下の記述をhostsファイルに追加する必要がある。

```text:/etc/hosts
192.168.33.11 domainname.com
```

### Apacheの再起動

設定ファイルを変更した場合、Apacheの再起動が必要。
以下のコマンドで再起動を行う。

```
systemctl restart httpd.service
```

### HTTPSでブラウザからアクセス

↓以下のURLでアクセス確認を行う。
https://domainname.com

GoogleChromeの場合以下のようなSSLのエラーページが表示されるかと思う。
これはSSLの証明書が自己証明なのでブラウザが警告を出してきている為である。

<img width="776" alt="googleSecurityerror.png" src="https://qiita-image-store.s3.amazonaws.com/0/71899/c4eb87c5-74cb-305d-2fe9-20b14c6cf194.png">

「詳細設定」から「domainname.com にアクセスする（安全ではありません）」をクリックする事で閲覧が可能になる。

「Hello World!」と表示されれば、HTTPSでの接続が上手くいっている。

## 後編の内容

本投稿でApacheのインストールと設定が完了。
後編ではPHP、MySQLのインストール設定を記載していく。

2016-08-04 追記
[LAMP 環境構築 PHP 7 MySQL 5.7（後編）](http://qiita.com/keita-nishimoto/items/7d0a8d6e24c1861d799f)を書きました。

それから後編の記事にも書いたが、環境構築をAnsibleとVagrantを使って自動化しておいた。

- [Vagrantfile](https://github.com/keita-nishimoto/lamp_vagrant_provisioning)
- [Ansibleのplaybook](https://github.com/keita-nishimoto/playbook_lamp)

[LAMP 環境構築 PHP 7 MySQL 5.7（後編）](http://qiita.com/keita-nishimoto/items/7d0a8d6e24c1861d799f)の内容も含めた環境構築が可能になっている。

使い方に関しては、[Vagrantfile](https://github.com/keita-nishimoto/lamp_vagrant_provisioning)のREADMEを参照して欲しい。