Windows10でNginx+MariaDB+Wordpressをインストールする。その2

Windows10でNginx+MariaDB+Wordpressをインストールする。その1の続きです。

Nginxの設定

Nginx の設定は、c:\Apps\Nginx\conf\nginx.conf で行います。Windows 版の PHP は php-fpm を持っていないため、FastCGI で行うことになります。

余談ですが、Nginx の配布物には nginx.vim というシンタックスハイライタが含まれていますが、これは Mercurial で運用されている Nginx のリポジトリにあるので、dein.vim でインストールすることは無理っぽいです。GitHub にもリポジトリのミラー(?)はあるのですが、階層の中(https://github.com/nginx/nginx/tree/master/contrib/vim)にあるので多分無理なのかなと思います。(それとも repo="nginx/nginx/contrib/vim" とかできるのかな?)
またそれとは別に chr4/nginx.vim というのもあるようです。dein.vim で使うならこちらのほうがいいかもしれません。うちではこれを使うことにしました。

WordPress 用の Nginx の設定ですが、Nginx サイトの WordPress と、PHP FastCGI Example および PHP FastCGI on Windows のページを参考にします。

まずざっと Nginx の設定ファイルの構造をおさらいします。
設定ファイルはディレクティブとそのパラメータから成り立っていて、さらにいくつかのディレクティブはコンテナ('{}'で囲まれたもの、ブロックとも)構造を持ちます。
また特定の機能に関する設定のみを記載したものを取り込む include ディレクティブもあります。

トップレベルディレクティブには、events、http、mail および stream があって、トラフィックのタイプによってまとめられています。これらをコンテキストといいます。これらのコンテキスト以外の部分は main コンテキストと呼ばれます。
トラフィックを扱うコンテキストでは、仮想サーバを構成するために一つ以上の server ブロックを持ちます。server ブロックで使用するディレクティブはトラフィックのタイプによって異なります。
HTTP トラフィック(http コンテキスト)では、server ディレクティブはドメインあるいは IP アドレスに対して処理内容を定義するのに使用されます。server ブロックには1つ以上の location ブロックがあり、URI の処理方法を指定します。構造的には以下のようになります。
http {
        server {
            location {}
            location {}
        }
        server {
            location {}
            location {}
        }
    }
また、ドキュメントルートは location ブロックごとに指定できます。したがって、たとえば
http {
        server {
            server_name  www.foobar.com;
            location /wiki {
                root c:/srv/www/moinmoin;
            }
            location /blog {
                root c:/srv/www/wordpress;
            }
        }
    }
というような設定ができることになります。余談ですが、MoinMoin は Python で書かれた WikiEngine です。

それを踏まえた上で、Nginx の conf ディレクトリを眺めていきます。
まずは nginx.conf で、これが設定ファイルの本体になります。その他のファイルは機能ごとに設定をまとめたファイルで、この nginx.conf からインクルードします。

今回は FastCGI で動かしていくのですが、まず目につくのは fastcgi.conffastcgi_params という同じようなファイルが並んでいるところです。この2つの違いは、
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
という行が fastcgi.conf には追加されているというだけで、あとは全く同じです。

PHP-FastCGI on Windowsを見ると、
root c:/www;

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9123;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
となっていますので、これをベースにします。

SCRIPT_FILENAME のところは同じ構文なので、そのあとの include ディレクティブでは fastcgi.conf を読み込んでもよいことがわかります。

nginx.conf の中で、"Pass PHP scripts to FastCGI server listening..." のところを以下のようにします。
location ~ \.php$ {
        root           c:\srv\www;
        fastcgi_index  index.php;
        fastcgi_pass   127.0.0.1:9123;
        include        fastcgi.conf;
    }
これでファイルを保存して nginx.exe を起動します。


ちょっとここで問題発生。ポート80が使用中で Nginx がエラーを出します。
コマンドプロンプトから nginx.exe を実行すると、
[emerg] 6952#6692: bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)というエラーが出て、Nginx が 80 ポートを開くことができない状態でした。
そこで、netstat -ano | more してみると、
TCP         0.0.0.0:80             0.0.0.0:0              LISTENING       4
という行を見つけました。PID 4 のプロセスがポート 80 を使用中のようです。
この場合、回避策は二通りで、ポート 80 を開放させるか、Nginx のポートを(たとえば 88 などに)移動するか、です。
もうちょっと調べてみると、この PID 4 は "System" となっていて、System が開いているのはわかったけれどそれを利用している実態がわかりません。まさか IIS は動かしてないし…と思ってタスクマネージャーを開いてみると、
「World Wide Web 発行サービス」というのが見つかりました。こいつが犯人か。
「サービス」から探してみると、
自動起動で実行中。これを「サービス」から開いて、「停止」して「無効」にしておきます。この状態で試してみると Nginx が起動できるようになりました。
「タスクマネージャー」のほうには、「Windows プロセス アクティブ化サービス」というのもありますが、これは MSMQ や PIPE などの他のサービスにも影響するようなので、とりあえず放っておきます。

次に FastCGI で Nginx が接続するプログラムを起動します。これには PHP と一緒にインストールされている php-cgi.exe を使用します。
php-cgi.exe -b 127.0.0.1:9123
として、ポート 9123 で待ち受けます。

ここまでやったら、index.php ファイルを用意します。
この1行だけのファイルを作成して、c:\srv\www に index.php のファイル名で保存します。

そうしたらWEBブラウザを立ち上げ、http://localhost/index.php にアクセスします。
ちゃんと動いていれば、PHP に関する情報一覧が表示されます。

このとき、バックグラウンドでの動作は、次のようになっています。
  1. WEBブラウザがローカルホストのポート 80 に /index.php をリクエストする
  2. Nginx がポート 80 でリクエストを受け取る
  3. URL のエクステンションが php なので、fastcgi_pass で指定されたパスに c:\srv\www\index.php をリクエストとして転送する
  4. ポート 9123 で待ち受けていた php-cgi.exe が index.php を実行してその結果を Nginx に返す
  5. Nginx が WEBブラウザに応答する
ともあれこれで一応 Nginx から PHP を FastCGI 経由で動作させることができました。
Windows10でNginx+MariaDB+Wordpressをインストールする。その3に続きます。

0 件のコメント:

コメントを投稿

Windowsでシンボリックリンクを試してみる。

きっかけは、1つのファイルを別の名前で起動したら違う動きになるようなスクリプトを書く、でした。  busybox なんかでは、同じ実行形式ファイルの名前を、lsにすればlsと同じ、cpとすればcpと同じ動作をするようにしてますが、Pythonスクリプトでそれと同じように argv...