まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:nginx

Node.js サーバーのリバースプロキシとして、高性能な Nginx を利用する方法を紹介します。以下では CentOS 環境を前提とした方法を紹介します。

まずは Node.js + アプリケーションの環境を構築します。特に今回は Node.js 上で StrongLoop LoopBack アプリケーションを動かすという前提としてます(独自のアプリケーションでも構いません)。この環境を整えるための手順はこちらを参照ください:
CentOS に StrongLoop をインストールする

アプリケーションが準備できたら Node.js を起動しておきます。実際には forever を使って Node.js をデーモン化しておくと便利だと思います。この辺りの手順はこちらを参照ください:
Forever で Node.js をデーモン化する

(↓ 3000 番ポートで Node.js アプリが動いている様子)
2016061601



この環境にリバースプロキシとして利用する Nginx を導入します。Nginx の導入手順はここの内容を参考にしています:
CentOS に Nginx をインストールして PHP を使う
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum install nginx

Nginx の設定ファイル(/etc/nginx/conf.d/default.conf)を以下のように編集します(青字が追加部分、赤字がコメントです):
# backend_node に LoopBack サーバー(localhost:3000)を追加
upstream backend_node { ip_hash; server 127.0.0.1:3000; } server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm;

# 存在するファイルパスが指定された場合はそのまま Nginx で処理 if ( -f $request_filename ) { break; }
# 存在しないファイルパスが指定された場合は backend_node で処理 if ( !-f $request_filename ) { proxy_pass http://backend_node; break; } } : :

これで準備完了です。この状態で Nginx を起動します:
# /etc/init.d/nginx start

改めて同サーバーにウェブブラウザでアクセスします。まずドキュメントルートにアクセスすると、これは Nginx が処理できるパスなので、Nginx のウェルカムページが表示されます:
2016061603


次に /explorer というパスを指定してアクセスしてみます。すると、このファイルやディレクトリは存在しないので Nginx は処理せず、backend_node で指定した 3000 番ポートのサーバー(つまり Node.js)に内部転送して、その結果が表示されます:
2016061602


これで 3000 番ポートを指定しなくても(Node.js 上で動いている)LoopBack サーバーにアクセスできるようになっただけでなく、HTML や画像、CSS、JavaScript といった静的ファイルは Node.js ではなく(高速な)Nginx に任せる、ということもできるようになります。


 

高速な HTTP サーバーである Nginx を使って cakePHP を利用する場合の設定をまとめました。注意点としてはリライトの扱いとファイルパーミッションです:


前提として cakePHP は(Apache HTTPd で使う前提の内容でいいので)設定ができているものとします。cakePHP の導入先は /var/www/html/cakephp/ であると仮定します。Apache HTTPd は導入しないか、サービスを止めておきます。cakePHP の導入手順についてはこちらを参照ください:
cakePHP を CentOS にインストールする


また PHP-FPM や Nginx の導入自体はできているものとします。これらの手順はこちらを参照ください:
CentOS に Nginx をインストールして PHP を使う


では Nginx を cakePHP の環境に合わせて設定していきます。まずは /etc/nginx/conf.d/default.conf を以下の内容に変更します(特に赤字部分は各自の環境に合わせて編集するよう、注意してください):
server {
    listen       80;
    server_name  localhost;
 
    root   /var/www/html/cakephp/app/webroot;
    index  index.php index.html;
 
    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
 
    location / {
        try_files $uri $uri?$args $uri/ /index.php?$uri&$args /index.php?$args;
    }
 
    #error_page  404              /404.html;
 
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
 
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        try_files       $uri =404;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }
 
    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

※追記1
index 節に index.html を追加。webroot/sub/index.html に /sub/ でアクセスできるようにするため

※追記2
try_files 節に /index.php?$args を追加。/controller/view?key=value を正しくハンドルできるようにするため



次に cakePHP 内の app/tmp フォルダに(Apache HTTPd ではなく) nginx が書き込めるような権限を与えます:
# chown -R nginx.nginx /var/www/html/cakephp/app/tmp
# chmod -R 700 /var/www/html/cakephp/app/tmp

また、/etc/php.ini に以下の内容を加えて、セッションデータを保存するディレクトリを設定しておきます:
session.save_path = "/var/lib/php/session"

これで Nginx を起動して、ブラウザで http://(サーバー名)/ にアクセスすると Nginx 環境下で動いている cakePHP のホーム画面が表示されるはずです:
# /etc/init.d/nginx start (Nginx サービス起動)
# chkconfig nginx on (自動起動設定)

2014051701




心なしか速くなった・・・のかな?



WordPress.com でも使われていて、Apache HTTPD, IIS に次ぐシェアを持つ HTTPD サーバー、それが Nginx(「エンジンエックス」)です。リバースプロキシとしての機能も併せ持ち、並行処理性能と省メモリ性能を重視して開発が続けられているオープンソースサーバーです。

この Nginx を CentOS にインストールする手順を紹介します。

インストール方法はソースからビルドする方法もありますが、簡単なのは yum リポジトリを作ってダウンロード&インストールが楽だと思います。

というわけで、まずは yum リポジトリを作成します:
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

これで /etc/yum.repos.d/nginx.repo が作成されて準備完了。あとは yum でインストールです:
# yum install nginx

インストール自体はこれだけです(ちなみにデフォルト状態でのドキュメントルートは /usr/share/nginx/html/ です)。 この段階で一度動作確認してみます。まずはサーバーを起動:
# /etc/init.d/nginx start

そしてウェブブラウザでサーバーにアクセスします。"Welcome to nginx" と表示されれば Nginx のインストールは成功しています:
2014021301


Nginx のインストールはこれだけでもできていますが、実際には PHP などと合わせたアプリケーションサーバーとして使いたいですよね。そのための追加設定も紹介しておきます。

Nginx で PHP を使うためのインターフェースにはいくつか選択肢がありますが、今回は PHP-FPM を使う方法を紹介します。まずは yum で php-fpm をインストールします:
# yum install php-fpm

PHP-FPM はデフォルトでは Apache HTTPD 用の設定になっています。これを nginx ユーザー/ nginx グループで動作するように設定ファイルを変更します:
# vi /etc/php-fpm.d/www.conf

  :
user = nginx   # user = apache から変更
  :
group = nginx   # group = apache から変更
  :

最後に nginx の設定を変更して、ドキュメントルート上で PHP(-FPM) が動作するようにします。記述箇所はファイルの下の方にはじめから記載されているのでコメントアウトしてドキュメントルートディレクトリを指定するのが簡単だと思います:
# vi /etc/nginx/conf.d/default.conf

  :
location ~ \.php$ {
#    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
    include        fastcgi_params;
}
  :

この後に php-fpm を起動してから、nginx を再起動します:
# /etc/init.d/php-fpm start
# /etc/init.d/nginx restart

動作確認用に、ドキュメントルートに PHP 情報を出力するスクリプトファイル(phpinfo.php)を用意します:
# echo '<?php phpinfo(); ?>' > /usr/share/nginx/html/phpinfo.php

この状態でこのファイルにウェブブラウザからアクセスして、以下の様な PHP 情報が出力されれば成功です:
2014021302


これで Nginx を導入し、PHP 連携までが可能になりました!

 

このページのトップヘ