[nginx] Amazon Linux + nginx + php-fpmでPHPスクリプトを実行する (ベーシック認証付き)

Amazon Linux 2015.09環境にnginx + php-fpmでPHPスクリプトが動作する環境を構築します。


# 1. 事前作業

## 1.1. Amazon Linux環境の構築

* Amazon Linux環境の構築
   * キーペアの作成 (新規): http://qiita.com/tcsh/items/59303d9506ca7d13f744
   * インスタンスの作成 (Public): http://qiita.com/tcsh/items/ae8f1f0d706237327c5a


## 1.2. PHP環境の構築

```bash:インストール(yumパッケージの場合):
sudo yum install php54 -y
```

```bash:コマンド:
which php
```

```text:結果(例/AmazonLinux):
/usr/bin/php
```

```bash:コマンド(バージョン確認)
 php -v
```

```text:結果(例/AmazonLinux):
PHP 5.4.45 (cli) (built: Sep 11 2015 21:23:18) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
```



## 1.3. nginxのインストール

* (参考) Amazon Linuxにnginxをインストールする (yumパッケージ): http://qiita.com/tcsh/items/001c05ce9b0e5a34abc7

```bash:コマンド:
which nginx
```

```bash:結果(例/AmazonLinux):
/usr/sbin/nginx
```


# 1.4. (任意) htpasswdコマンド

nginxでベーシック認証する場合に必要です。
Amazon Linuxの場合、最初からはいっているようです。

```bash:コマンド:
which htpasswd
```

```text:結果(例/AmazonLinux):
/usr/bin/htpasswd
```

存在しない場合はインストールしておきます。

```bash:コマンド:
sudo yum install httpd-tools
```


# 2. php-fpmのインストール

## 2.1. インストール

```bash:コマンド:
sudo yum install php54-fpm -y
```

```bash:結果(例/AmazonLinux):
(略)

インストール:
  php54-fpm.x86_64 0:5.4.45-1.75.amzn1

完了しました!
```

## 2.2. 確認

```bash:コマンド:
which php-fpm
```

```bash:結果(例/AmazonLinux):
/usr/sbin/php-fpm
```


# 3. php-fpmの設定

設定ファイルのうち、apacheと記述されているところをnginxに書き換えます。

```/etc/php-fpm.d/www.conf:
;39行目付近
;user = apache
user = nginx

;41行目付近
;group = apache
group = nginx
```

# 4. php-fpmの起動

```bash:コマンド:
sudo service php-fpm start
```

```bash:結果(例/AmazonLinux):
Starting php-fpm:                                          [  OK  ]
```

```bash:コマンド:
sudo chkconfig php-fpm on \
  && chkconfig --list php-fpm
```

```bash:結果(例/AmazonLinux):
php-fpm        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

# 5. nginxの設定変更

## 5.1 nginxの設定変更

```/etc/nginx/nginx.conf:
    # 44行目付近
    # index   index.html index.htm;
    index   index.php index.html;

        # 78行目付近
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
        }
```

設定変更をしたら設定ファイルが正しい文法に従っているかチェックをします。

```bash:コマンド:
sudo nginx -t
```

```bash:結果(例/AmazonLinux):
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

## 5.2 nginxの再起動

一旦、nginxを再起動し、正常に起動するか確認します。

```bash:コマンド:
sudo service nginx restart
```

```bash:結果(例/AmazonLinux):
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
```



# 6. (任意) ベーシック認証の設定

ここでは、'sysadm'というディレクトリに対してベーシック認証することにします。


# 6.1. 認証ファイル用ディレクトリの作成

認証ファイルは、公開ディレクトリ(/usr/share/nginx/html)直下ではないところに置きましょう。

```bash:コマンド:
sudo mkdir /usr/share/nginx/credentials
```


# 6.2. 認証ファイルの作成

```bash:変数の設定:
AUTH_USER='sysadm'
```

```bash:コマンド:
htpasswd -c htpasswd ${AUTH_USER}
```

```text:入力:
New password: 
Re-type new password:
```

```text:結果(例): 
Adding password for user sysadm
```

作成した認証ファイルを配置します。

```bash:コマンド:
sudo mv htpasswd /usr/share/nginx/credentials/ \
  && ls /usr/share/nginx/credentials/htpasswd
```

# 6.3. ベーシック認証するディレクトリの作成

```bash:コマンド:
sudo mkdir /usr/share/nginx/html/sysadm
```


# 6.4. nginxの設定変更

sysadmディレクトリの設定をnginxに追加します。
'/sysadm'以下でPHPスクリプトを実行する場合は、php-fpmの設定も個別で必要なようです。

```/etc/nginx/nginx.conf:
        # 57行目付近に追加
        location ~ ^/sysadm/* {
          auth_basic "Welcome sysadm.";
          auth_basic_user_file /usr/share/nginx/credentials/htpasswd;

          location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php; 
            fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
            include        fastcgi_params;
          }
        }
```

設定変更をしたら設定ファイルが正しい文法に従っているかチェックをします。

```bash:コマンド:
sudo nginx -t
```

```bash:結果(例/AmazonLinux):
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```



## 6.5 nginxの再起動

```bash:コマンド:
sudo service nginx restart
```

```bash:結果(例/AmazonLinux):
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
```



# 7. PHPスクリプトの動作確認

## 7.1. PHPスクリプトの作成

```bash:コマンド:
cat << EOF > ~/info.php 
<?php
phpinfo();
EOF
```

作成したPHPスクリプトを公開ディレクトリに配置します。

```bash:コマンド(ベーシック認証の設定をした場合):
sudo cp ~/info.php /usr/share/nginx/html/sysadm/ \
  && cat /usr/share/nginx/html/sysadm/info.php
```

```bash:コマンド(ベーシック認証の設定をしなかった場合):
sudo cp ~/info.php /usr/share/nginx/html/ \
  && cat /usr/share/nginx/html/info.php
```


## 7.2. PHPスクリプトの動作確認

ブラウザからPHPスクリプトにアクセスしてみます。

- ベーシック認証の設定をした場合: http://<ホスト>/sysadm/info.php
 
ベーシック認証のダイアログが表示され、ユーザ名とパスワードを入力すると以下の画面が表示されるはずです。


- ベーシック認証の設定をしなかった場合: http://<ホスト>/info.php

以下の画面が表示されるはずです。


![スクリーンショット 2015-10-08 17.39.23.png](https://qiita-image-store.s3.amazonaws.com/0/48158/288ed1d8-a5ea-a2f7-0576-ea9dfb1c0325.png)


ベーシック認証の設定をしなかった場合は、動作確認後にかならず削除しておきましょう。

```bash:コマンド:
sudo rm /usr/share/nginx/html/info.php
  && cat /usr/share/nginx/html/info.php
```

```text:結果(例):
cat: /usr/share/nginx/html/info.php: そのようなファイルやディレクトリはありません
```


# 完了