Ubuntu16.04/Nginx/PHP7.1の環境構築と画像アップロードの設定

## 概要
- Ubuntu上にNginxとPHPの環境を構築する
- PHPを使って画像アップロードを行う


## 動作環境
Ubuntu Server 16.04 LTS 

##インストールの手順
- Nginx/PHPのインストール
- 設定ファイルの変更
- 画像アップロード


### **Nginxのインストール**
諸々アップデート/インストール

```shell-session:~
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install net-tools ssh git
```

nginxサイトが配布するPGPキーを追加するとともに、リポジトリを一覧に追加し、アップデートした後に、nginxをインストールする。

```shell-session:~
$ curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
$ VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"
$ VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb-src http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"
$ sudo apt-get update
$ sudo apt-get install nginx
```
インストールができたか、バージョンを確認を行う。

```shell-session:~
$ nginx -v
nginx version: nginx/1.14.0
```

### **php7.1のインストール**

```shell-session:~
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
$ sudo apt-get install php7.1-fpm php7.1-pdo php7.1-pgsql
```

同じくバージョンを確認する。

```shell-session:~
$ php -v
PHP 7.1.19-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Jul  9 2018 13:12:24) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.19-1+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
```

## 設定ファイルの変更
PHPの設定ファイルのユーザー関係を変更する。

```ini:/etc/php/7.1/fpm/pool.d/www.conf
user = nginx
group = nginx

listen.owner = nginx
listen.group = nginx
```
4個所書き換えることに注意する。

**Nginxの設定ファイルを変更する**

```nginx:/etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /var/www/;     #ドキュメントディレクトリの設定（任意の場所）
        index  index.html index.htm index.php; #index.phpを追加
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }


    location ~ \.php$ {
        root           /var/www;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; #defaultから変更
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #defaultから変更
        include        fastcgi_params;
    }
}
```
変更が完了したら、再起動してPHPとNginxの設定ファイルを忘れずに読み込む。
**再起動**

```shell-session:~
$ sudo systemctl restart nginx.service
$ sudo systemctl restart php7.1-fpm.service
```
以上で、ubuntu上でNginxとPHPを使える環境が整った。

## 画像アップロード
ドキュメントルートフォルダの生成を行う。

```shell-session:~
$ sudo mkdir -p /var/www/
```
/var/www/のフォルダにfilesフォルダ、form.htmlファイル、upload.phpファイルを作成する。アップロードした画像は、filesフォルダに格納されることになる。

参考：フォルダ構成
www
├── files  
├── form.html
└── upload.php

それぞれのファイルは以下のように記述する。

```form.html
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>sample</title>
 </head>
 <body>
  <form action="upload.php" method="post" enctype="multipart/form-data">
    ファイル：<br />
    <input type="file" name="upfile" /><br />
    <br />
    <input type="submit" value="アップロード" />
  </form>
 </body>
</html>
```

```upload.php
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>sample</title>
 </head>
 <body>
  <p><?php
  if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
    if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "/var/www/files/" . 
  $_FILES["upfile"]["name"])) {
      chmod("files/" . $_FILES["upfile"]["name"], 0644);
      echo $_FILES["upfile"]["name"] . "をアップロードしました。";
    } else {
      echo "ファイルをアップロードできません。";
    }
  } else {
    echo "ファイルが選択されていません。";
  }
  ?></p>
 </body>
</html>
```

このままでは、ドキュメントルートのファイル権限がrootのみなので、nginxを追加する必要がある。

```shell-session:/var
$ sudo chown -R nginx:nginx www
```

きちんと反映されたかファイル権限を確認する。

```shell-session:/var/www
$ ls -la
drwxr-xr-x  3 nginx nginx   4096 Jul 17 14:57 .
drwxr-xr-x 14 root  root    4096 Jul 17 13:46 ..
drwxr-xr-x  2 nginx nginx   4096 Jul 17 14:56 files
-rw-r--r--  1 nginx nginx    346 Jul 17 14:56 form.html
-rw-r--r--  1 nginx nginx    594 Jul 17 14:16 upload.php
```

ブラウザで、画像アップロードができるか確認する。