Windows+nginx+PHPの環境でVirtualHostの設定をする
最近またプログラミング熱が出てきたので、趣味用のWebサーバーを構築しているのですが、どうせ作るなら最近爆発的にシェアを伸ばしているというnginxにしよう、と思いVirtualHostの設定もしたので備忘録も兼ねて記事にしてみました。
VirtualHost(仮想ホスト)とは
1つのWebサーバー上で複数のホスト(ドメイン)を運用する仕組みで、大抵のレンタルサーバーはこのVirtualHostを利用しています。
複数サイトを運営している人はもちろんのこと、1つしかサイトを管理していなくても、レンタルサーバーの変更のために2つの環境を用意してテストしたいとか普通にあると思います。例えばPHP5とPHP7の環境でテストするにもいちいち切り替えてテストするよりも2つのブラウザを立ち上げて同時にテストできたほうが便利ですよね。以前の記事でFastCGI環境も構築できていると思うのでそういうのもらくちんです。
この記事で使っているソフトのバージョン情報
- Windows 10 Pro (Version 1803)
- nginx 1.14.0
- PHP 7.2.11
nginx.confに追加のサーバー情報を記述する
以前、「Windowsのnginxでphpを使えるようにする」で編集した nginx.conf ですが、おおよそこんな感じだと思います。
nginx.conf内の server { ~ } で囲まれているところが設定で、この server の記述はいくつも追記することができます。
一見長ったらしいですが、VirtualHostとして必要な部分だけ書くとこんな感じ。
server {
listen 80;
server_name sub1.localhost;
root c:/virtual/sub1;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
localhostで開けるサイトはそのままにして、sub1.localhost というホストを追加します。
ドキュメントルート(htmlを置く場所)は c:\virtual\sub1 にするので root の部分はそのように。
PHPも使いたいので、location ~ \.php$ { ~ } (拡張子PHPのファイルの処理方法を書く部分)もlocalhostのサイトと同様の記述をコピーしてくるだけです。
sub2.localhostも追加するなら同じようにコピーして、server_nameとrootの二箇所を変更するだけ。
server {
listen 80;
server_name sub2.localhost;
root c:/virtual/sub2;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
VirtualHost用のディレクトリを作っておく
今回の例ではsub1とsub2の2つのホストを作るため、
c:\virtual\sub1
c:\virtual\sub2
というディレクトリを作り、index.html と phpinfo.php も作っておきます。
index.htmlはあくまでVirtualHostホストの動作確認用なので、Sub1/Sub2だよーというのがわかる記述があればOKです。
<!DOCTYPE html>
<html>
<body>
<h1>Sub1</h1>
</body>
</html>
※c:\virtual\sub2に保存するindex.htmlではbodyタグ内にSub2とでも書いておく。
phpinfo.phpは前に作ったのと変わらず、単純に <?php phpinfo(); ?> とだけ記述されているPHPで構いません。
hostsファイルを編集する
VirtualHostの設定自体はここまででもう完了しているのですが、ブラウザで開けなければテストが出来ないので、hostsファイルにIPアドレスとホスト名を追記します。
一応テキストでも書いておきます。
127.0.0.1 sub1.localhost
127.0.0.1 sub2.localhost
先述の設定で、sub1.localhost と sub2.localhost という2つのWebサーバーを作ったわけですが、インターネット上に公開するわけでもなく、LAN上でほかのPCから参照される必要もないため、ローカルPCだけが sub1.localhost は127.0.0.1だよーとわかっていれば良いという話です。
LAN環境でほかのPCからも参照したい、という場合はDNSサーバーを立ち上げるなり、数が少ないならもっと原始的にhostsファイルを配布するなりすれば良いです。インターネット上に公開したいならトップレベルドメインを取得してDynamic DNSを……ってそれはさすがに話が脱線しすぎですね。
hostsファイルの編集には管理者権限が必要
尚、hostsファイルは C:\Windows\System32\drivers\etc\ の下にあるのですが、普通にメモ帳で開くと管理者権限がないため保存できません。そのため、
- メモ帳を管理者権限で起動してからhostsファイルを開く
- hostsファイルをマイ ドキュメントにコピーしてから編集/保存し、あらためてC:\Windows\System32\drivers\etc\ へコピーする
- Notepad++で編集/保存する(保存時に管理者権限で開き直すか?と聞かれる)
と色々方法があるのでお好きな手段で編集すると良いです。
VirtualHostの動作確認をする
nginxを起動した後、適当なブラウザで http://sub1.localhost/ を開いて、c:\virtual\sub1\ に保存しておいた index.html が表示されればOKです。同様に http://sub2.localhost/ を開いて c:\virtual\sub2\index.html が参照されているかも確認。
PHPの確認もしておきたいので、php-cgi.exeを起動し、http://sub1.localhost/phpinfo.php を開いて下記のような表示がされればOKです。
尚、このとき $_SERVER['DOCUMENT_ROOT'] が c:/virtual/sub1 となっているハズですので、それも確認しておくと安心ですね。
トラブルシューティング
index.htmlが開けない/phpinfo.phpが開けない場合、下記のようなことをチェックすると良いかも。
- nginx.exeが起動していない。
- nginx.confの記述が間違っている。
- nginx.exeの起動中にnginx.confを編集したのに再起動していない。
- nginxは正常に動作していても、ブラウザにキャッシュが残っている。
特に http://sub1.localhost/phpinfo.php を開こうとしたらPHPの情報が表示されるのではなく、phpファイルをダウンロードしようとしちゃうような場合は location ~ \.php$ { ~ } の記述を忘れているか、間違っているか、合っているのにnginxの再起動を忘れているか、ちゃんと再起動できていない可能性があります。
これはぼくもよくやっちゃうのですが、nginx -s quit コマンドを送信して、nginxが終了したと思いこんですぐに nginx を起動している場合にトラブります。
nginx -s quit コマンドを発行した後はタスクマネージャーで nginx.exe がちゃんと終了していることを確認したほうが良いですよ。
最後のブラウザキャッシュなんて冗談みたいな話ですが、ホントにあったことで、Chromeで開くとちゃんとphpinfoが動くのに、Edgeだとphpinfo.phpをダウンロードしようとしちゃう、なんてことがありました。まさかなーと思いつつEdgeのキャッシュをクリアしたら解決しました。
まとめ
nginxでVirtualHostを構成するにはざっくり説明すると以下のとおりでした。
- nginx.confを編集し、server { ~ } の記述を必要な分だけ追記する (PHPも使う場合は location ~ \.php$ { ~ } の記述も忘れずに)
- VirtualHostで使うディレクトリを必要な分だけ作成する
- hostsファイルを編集しそれぞれのホスト名で開けるようにしておく
- nginxを確実に再起動する
特に最後のnginxの再起動はブラウザのキャッシュとの合わせ技で、一度トラブるとハマる可能性がるため、タスクマネージャーを見ながら、かつブラウザのキャッシュを消してから確認したほうが良いかも知れません。