nginxでバーチャルホストを設定する時のメモ
前回の投稿の
VPS初心者がApacheをやめてnginxを導入してみた
の続きで、複数のドメインでアクセスできるようにする。
その他にも、色々管理しやすいように設定をする
今回はドメインで分ける方法のではなく、ポートで区切る方法で最終確認をし、
最終的にはPHPでHello Worldをする。
前回同様、
記載は忘れないようすごく細かいです。
前回の投稿で説明した操作方法などは今回は省略しています!
読みづらいかもしれません。何かの参考になれば嬉しいです。
初心者のため、間違いがある可能性が非常に高いです!!!!
間違いなどありましたらご指摘いただけると幸いです。
環境
- さくらVPS
- CentOS7
- PHP7.2
- nginx1.14.0
やったこと
- バーチャルホストの設定管理ディレクトリの作成
- バーチャルホストの設定ファイルを作成
- バーチャルホストを有効にする
- nginxの設定を変えてバーチャルホストの設定を読み込むようにする
- 公開用ディレクトリ作成
- ポートでわけるので、ポート解放を行う
- 仕上げ 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」と決めました。
管理サイト1つにつき、1つの設定ファイルを作るイメージ
今回は「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で書き込む内容は
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;
}
}
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
変更と追記の内容は
- server_tokens off; の追記
- include /etc/nginx/vhosts/sites-enabled/*.conf; の追記
- #gzip on; の先頭の#をとって有効にする
- server_names_hash_bucket_size 128; の追記
- keepalive_timeout 65; の65秒を3秒に変える
今回これらの設定は参考サイトを元に設定を行った。
それぞれ何しているか、一応残しておく
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; の65秒を3秒に変える
→キープアライブの設定 すきな時間にしたら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を作成した。
<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ならバーチャルホストの設定が間違っている可能性が高い。
拒否されたとかならポートの設定か、もしくはバーチャルホストの設定が悪い可能性が高い。
終わりに
いかがだったでしょうか?
2回にわたり、nginxの設定とドメイン(ポート)で表示先を分ける設定をしました。
私自身、初心者で実際に困ったので、これをアウトプットしたことで
誰かのお役に立てれば幸いです。さらにここから発展できたら最高です!
参考にさせていただいたサイト
https://qiita.com/Syo_pr/items/fdf35195ae8997ababfa
https://www.rem-system.com/centos-nginx-inst/