VPS初心者がnginxでバーチャルホストを設定する

#nginxでバーチャルホストを設定する時のメモ
前回の投稿の
[VPS初心者がApacheをやめてnginxを導入してみた](https://qiita.com/curacao/items/843708c44e79ab7d7ef6)
の続きで、複数のドメインでアクセスできるようにする。
その他にも、色々管理しやすいように設定をする
今回はドメインで分ける方法のではなく、ポートで区切る方法で最終確認をし、
最終的にはPHPでHello Worldをする。

前回同様、
記載は忘れないようすごく細かいです。
前回の投稿で説明した操作方法などは今回は省略しています！
読みづらいかもしれません。何かの参考になれば嬉しいです。
初心者のため、**間違いがある可能性が非常に高いです！！！！**
間違いなどありましたらご指摘いただけると幸いです。

#環境
- さくらVPS
- CentOS7
- PHP7.2
- nginx1.14.0

#やったこと
1. バーチャルホストの設定管理ディレクトリの作成
2. バーチャルホストの設定ファイルを作成
3. バーチャルホストを有効にする
4. nginxの設定を変えてバーチャルホストの設定を読み込むようにする
5. 公開用ディレクトリ作成
6. ポートでわけるので、ポート解放を行う
7. 仕上げ Hello Worldの確認

##1.バーチャルホストの設定管理用のディレクトリ作成
今回は、「/etc/nginx」の下に管理用の「vhosts」というディレクトリを作成。
さらにその中に、「sites-avilable」「sites-enabled」というディレクトリを作成した。
これはどういうことかというと、
基本はavilableの方に各設定を書いて、実際に公開したいサイトについては
enabledの方にシンボリックリンクを作成するというやり方をしたいため。
こうすることで、公開したいもの・非公開にしたいものを簡単に分けることができる。
後から設定するnginxの設定参照先はこのenabledに向けてやる。
まずは、ディレクトリ作成

```
cd /etc/nginx
mkdir vhosts
```

これで管理用のvhostsが完成
次に、設定の基本用と公開用のディレクトリを作成する。

```
cd vhosts
mkdir sites-avilable sites-enabled
```

最終的な構成としては

/etc/nginxの直下
|--..色々省略
|--vhosts
|  |--sites-avilable
|  |--sites-enabled

となっている。これで完了。

##2.バーチャルホストの設定ファイルを作る
私は管理しやすいように、独自ルールでファイル名は「ドメイン名.conf」と決めました。
管理サイト１つにつき、１つの設定ファイルを作るイメージ
今回は「testdomain1.com」「testdomain2.jp」のドメインを想定して作ることにします。
サーバーのIPアドレスは「123.45.678.910」として進めます。
ポートは30000番と30001番を使用します。
これらは、それぞれ自分の環境に合わせて変えていただければと思います。
早速作成！
公開ディレクトリは、「/var/www」の下にドメインごとに作るようにします。

```
cd vhosts/sites-avilable
vim testdomain1.com.conf
vim testdomain2.jp.conf
```

vimで書き込む内容は

```testdomain1.com.conf

server {
    listen 30000;
    server_name 123.45.678.910;
    access_log /var/log/nginx/testdomain1.com-access.log main;
    error_log /var/log/nginx/testdomain1.com-error.log;
    root    /var/www/testdomain1.com;

    location / {
        index   index.php index.html;
    }

    location ~ \.php$ {
        root           /var/www/testdomain1.com;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

```testdomain2.jp.conf

server {
    listen 30001;
    server_name 123.45.678.910;
    access_log /var/log/nginx/testdomain2.jp-access.log main;
    error_log /var/log/nginx/testdomain2.jp-error.log;
    root    /var/www/testdomain2.jp;

    location / {
        index   index.php index.html;
    }

    location ~ \.php$ {
        root           /var/www/testdomain2.jp;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

これは、何をしているか

|設定項目|内容|
|:-------------|:-------------|
|listen|アクセスされるポート番号 基本は80か443で、試験的に分けるときはここで分ける|
|server_name|基本はここにドメインを書く。 今回は試験なのでIP直書き。 複数書くこともできるので www つくのも書くと両方でアクセスできるようになる|
|access_log|アクセスログの作成場所。 ドメイン名で分ける|
|err_log|access_logのエラーバージョン|
|root|アクセスされたらどこのフォルダを参照するかの設定|
|location /|ドメイン(もしくはIP+Port)だけで来たときになにを表示するか .phpを優先するときは先に書いてあげるとOK|
|location ~\.php$|これはphpを表示するときにphp-fpmに投げるための設定。 rootなどの意味は他と一緒で、fastcgi_passはphp-fpm側の設定で決めたものと同じにする。設定はwww.confに書かれている|

ざっくりこんな感じ。
本当はSSL用の443ポートの設定も書かなきゃいけないけど、別で記載。
今回は、ポートで分けるのでlistenとserver_nameは上の書き方だが、
実際にドメインがある人は

```
    listen:80;
    server_name:testdomain1.com www.testdomain1.com;
```
とかいてあげれば良い。

##3.バーチャルホストを有効にする
作成した設定をsites-enabledにもシンボリックリンクを作成して有効にする。
シンボリックリンクは"ln -s"コマンドで作成する。
書き方としては、"ln -s 元の場所 作成先"となる。

```
ln -s /etc/nginx/vhosts/sites-available/testdomain1.com.conf /etc/nginx/vhosts/sites-enabled/testdomain1.com.conf
ln -s /etc/nginx/vhosts/sites-available/testdomain2.jp.conf /etc/nginx/vhosts/sites-enabled/testdomain2.jp.conf
```

これでシンボリックリンクを作成できる
きちんと作成できているかの確認は、enabledの中に移動して"ls -la"するとわかる。
成功していると青い文字でtestdomain1.com.confと出てくるけど、失敗してたら赤文字になる。
その場合は設定し直す。シンボリックリンクを消したい場合は

```
unlink /etc/nginx/vhots/sites-enabled/testdomain1.com.conf
```

のように"unlink"と使うと消すことができる。

##4.nginxの設定を変えてバーチャルホストの設定を読み込むようにする
ここまでで作成した設定ファイルを読みにいくようnginxのに設定を変更する。
ついでにセキュリティ対策と使いやすいように変更もする。
設定変える前に一応バックアップはとる。

```
cd /etc/nginx
cp -p nginx.conf nginx.conf.old
vim nginx.conf
```

変更と追記の内容は
1. server_tokens off; の追記
2. include /etc/nginx/vhosts/sites-enabled/*.conf; の追記
3. \#gzip  on; の先頭の＃をとって有効にする
4. server_names_hash_bucket_size 128; の追記
5. keepalive_timeout  65; の６５秒を３秒に変える

今回これらの設定は参考サイトを元に設定を行った。

それぞれ何しているか、一応残しておく
>1 server_tokens off; の追記

→これはセキュリティ対策で、nginxのバージョンがページで表示されないようにしている。

>2 include /etc/nginx/vhosts/sites-enabled/*.conf; の追記

→これは、公開するページの設定ファイルを読みにいくよう設定している。

>3 \#gzip  on; の先頭の＃をとって有効にする

→これはコンテンツを配信する時にgzipというの使って圧縮しサイズを小さくする機能を有効化。ちょっとだけサイトの表示が早くなるらしい。

>4 server_names_hash_bucket_size 128; の追記

→長いバーチャルホスト名を設定すると、エラーになることがあるみたいだからその対策。
>5 keepalive_timeout  65; の６５秒を３秒に変える

→キープアライブの設定 すきな時間にしたらOK。


##5.公開用ディレクトリ作成
公開用のディレクトリを作成する。
作成先は、vhostsで設定したrootの通りに作る。

```
cd /var/www
mkdir testdomain1.com　testdomain2.jp
```

次にFileZillaなどのFTPソフトでもファイルを転送できるようにするのと、
nginxからもアクセスできるように権限と所有者を変更する。

```
chown nginx:ユーザー名 testdomain1.com
chmod 775 testdomain1.com
chown nginx:ユーザー名 testdomain2.jp
chmod 775 testdomain2.jp
```
これでOK
実際にFTPソフトで転送してみる。
今回はこのようなPHPを作成した。

```PHP:index.php
<html>
  <body>
    <?php echo "Hello World. port:xxxxだよー" ?>
  </body>
</html>
```

送れなかったらパーミッションとかを確認する。

ここまできたら設定ファイルが合っているか確認する。
構文チェックは

```
nginx -t
```

これで確認できる
エラーがでてなかったら完了。
もしもエラーがでても何が悪いかしっかり書いてくれているので
よく読んで対処をする。


##6.ポートでわけるので、ポート解放を行う
今回はドメインがないのでポートで分ける
そのためにはポート解放をしてあげる必要があり、
ポート解放してないところにアクセスすると拒否されて表示されない。
ポート解放をするには、ファイヤーウォールコマンドで行う。
まずは、現状の状態を確認する

```
firewall-cmd --list-ports --zone=public
```

もしも、どこかのポートを解放しているとそれが表示される。
次にポートを解放してあげる
今回は30000番と30001番を解放する

```
firewall-cmd --add-port=30000/tcp --zone=public --permanent
firewall-cmd --add-port=30001/tcp --zone=public --permanent
```
これで解放される。
早速確認してみる。確認する時は先ほどのコマンドを使う。
そうすると、「30000/tcp」と「30001/tcp」表示されるはず！
逆に、削除したい場合は

```
firewall-cmd --remove-port=30000/tcp --zone=public --permanent
```
としてあげるとできる。

設定を変更したら

```
firewall-cmd --reload
```

を実行して完了。

##7.仕上げ Hello Worldの確認
ここまできたら、nginxを再起動して
ブラウザにアクセスすると見える。
nginxの再起動は

```
systemctl restart nginx
```

ブラウザでドメイン(もしくはIP+Port)でアクセスすると
PHPファイルが開かれHello Worldされるはず！
もし、開かれない場合、「IP+ポート/index.html」をやってみて
設定したrootが合っているかの確認をする。
もしこれで、HTMLはみれた場合、php-fpmとの設定が間違っている可能性が高い。
404ならバーチャルホストの設定が間違っている可能性が高い。
拒否されたとかならポートの設定か、もしくはバーチャルホストの設定が悪い可能性が高い。

#終わりに
いかがだったでしょうか？
２回にわたり、nginxの設定とドメイン（ポート）で表示先を分ける設定をしました。
私自身、初心者で実際に困ったので、これをアウトプットしたことで
誰かのお役に立てれば幸いです。さらにここから発展できたら最高です！

#参考にさせていただいたサイト
https://qiita.com/Syo_pr/items/fdf35195ae8997ababfa
https://www.rem-system.com/centos-nginx-inst/