Actions

Mahara日本語ドキュメント/システム管理者ガイド/fastcgi/nginxにMaharaをインストールする

From Mahara Wiki

< Mahara日本語ドキュメント‎ | システム管理者ガイド

Maharaは極めて肥大化したapache/mod_php環境を必要としません。Maharaはfastcgi環境で動作するため、fastcgiをサポートしているウェブサーバでも動作します: 例) lighttpd および nginx

これはMaharaチームより公式にサポートされていないことに留意してください。しかし、私たちは発生したバグの修正を試みます。また、パッチも受け入れます。あなたがMaharaのバグに遭遇した場合、fastcgi/nginxを使用してMaharaを稼動させていることに留意してください!

セットアップインストラクション

セットアップはそれほど難しくありません。あなたはnginxのインストールおよび設定、fastcginのセットアップ、そして少しだけphp.iniを設定する必要があります。

以下、Maharaが動作するUbuntu Lucidホストのnginx設定でテストした内容です:

server {
         listen   80 default;
         server_name  example.com;
         root   /var/www/example.com;
         index index.php;
         server_tokens off;

         access_log  /var/log/nginx/example.com.access.log;

         location / {
                 try_files $uri $uri/;
                 expires 3d;

                 gzip  on;
                 gzip_disable "MSIE [1-6]\.(?!.*SV1)";
                 gzip_types text/css application/x-javascript;
         }

         location ~ \.php$ {
                 include fastcgi_params;
                 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                 fastcgi_intercept_errors on;
                 fastcgi_pass 127.0.0.1:9000;
         }

         location ~ /\.ht {
                 deny  all;
         }
 }

 server {
         server_name www.example.com;
         rewrite ^ $scheme://example.com$request_uri? permanent;
 }

下記の点に留意してください:

  • この設定では、多くの一般的なMaharaおよびnginx設定の潜在的な危険性を回避します。location regexは最初に適用される特定の.phpファイルに合致させて、 127.0.0.1:9000で動作しているfastcgiにすべてのPHPスクリプトを通します。当然、あなたがそこでfastcgiを走らせていることを意味します - このnginx設定だけではMaharaを動作させるのに十分ではありません。これに関する詳細情報は下記をお読みください。
  • 設定ブロックでは、nginxが特別に考慮しない.htaccessおよび追加設定ファイルを必要とします。fastcgiサーバセットアップの一部として、あなたはphp.iniおよび追加設定ファイルにおいて、PHP全体を設定する必要があります。
  • location / ブロックは最後に処理されるブロックです。「try_files」はnginxがファイルを静的に提供することを意味します。見つかった場合、ファイルは3日間の有効期限のヘッダと共にブラウザでサポートされるgzipされた形で提供されます。Maharaは静的ファイルのバージョンを全く管理しないため、あなたは有効期限を少なくすることができます。
  • 2つのサーバブロックがありますが、2番目のブロックではwww.example.comをexample.comにリダイレクトします。2つのブロックは素晴らしく分かりやすく、Maharaで正しく動作するため、あなたがMahoodleインテグレーションで失敗することはありません。

nginxの設定と一緒に、PHPをfastcgiとして動作させてください。ありがたいことに、これは非常に簡単です - PHPにはfastcgiモードで動作するcgiバイナリが同梱されています。cgiバイナリを取得するため、Ubuntuではphp5-cgiパッケージをインストールしてください。そして、以下の内容を /etc/init.d/php または似たような場所に入れてください:

#! /bin/sh
 
  ### BEGIN INIT INFO
  # Provides:          php
  # Required-Start:    $local_fs $remote_fs $network $syslog
  # Required-Stop:     $local_fs $remote_fs $network $syslog
  # Default-Start:     2 3 4 5
  # Default-Stop:      0 1 6
  # Short-Description: starts the php fastcgi server
  # Description:       starts php using start-stop-daemon
  ### END INIT INFO
 
  BIND=127.0.0.1:9000
  USER=www-data
  PHP_FCGI_CHILDREN=5
  PHP_FCGI_MAX_REQUESTS=1000
 
  PHP_CGI=/usr/bin/php-cgi
  PHP_CGI_NAME=`basename $PHP_CGI`
  PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
  RETVAL=0
 
  start() {
        echo -n "Starting PHP FastCGI: "
        start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
        RETVAL=$?
        echo "$PHP_CGI_NAME."
  }
  stop() {
        echo -n "Stopping PHP FastCGI: "
        killall -q -w -u $USER $PHP_CGI
        RETVAL=$?
        echo "$PHP_CGI_NAME."
  }
 
  case "$1" in
      start)
        start
    ;;
      stop)
        stop
    ;;
      restart)
        stop
        start
    ;;
      *)
        echo "Usage: php-fastcgi {start|stop|restart}"
        exit 1
    ;;
  esac
  exit $RETVAL
  

このファイルに関するメモです:

  • あなたはファイルを「chmod +x」して、恐らくブート時に開始するよう、設定しても良いでしょう (fixme: どなたか、ここにインストラクションを追加してください)。
  • 実際のところ、あなたが考えているほど多くの子プロセスは必要ではありません。あなたが必要なことは、Nginxはすべての静的ファイルを処理するために、 あなたが取得すると考える現在のPHPリクエストすべてを十分に処理できるようにしてください。eacceleratorまたは類似するPHPアクセラレータを動作させている場合、あなたはほとんどのページを250ミリ秒でプッシュすることができます。これは子プロセスが1秒当たり4リクエストを処理できることを意味します。多くの子プロセスを実行することにより、実際には良い点よりも悪い点が発生してしまいます。具体的には、子プロセスは競うようにCPUを使用して、スピードアップすることなしにRAMを保持してしまいます。あながシングルCPUのマシンを使用している場合、1つの子プロセスのみを持つことは意味を成します。YMMV (Your mileage may vary) - 最小の子プロセス数を実行して良い結果を生むよう、あなたのハードウェアをベンチマークしてください。

最後に - 忘れずにあなたのphp.iniを設定してください。Maharaの.htaccessファイルを確認して、そのようにphp.iniを設定してください。同様にcgi.fix_pathinfoをゼロに設定してください。そうでない場合、あなたは任意のコードに対するインジェクション攻撃を受けてしまう可能性があります (Maharaはそれらの攻撃に対して、あなたを保護することはできますが、cgi.fix_pathinfoを有効にすることは最良の選択とは言えず、逆に危険でさえあります)。 上記の設定のVPS (600MB RAM) において、Maharaは1秒あたり20リクエストを処理することができます。これはVPS上の20PHPページであり、20名以上の同時ユーザにおいて上手く動作します。専用ハードウェアの場合、さらに高いロードを処理することができます。

SSL

ここでは、複数ドメインにおいて、プレインhttpおよびssl両方の設定を例示しています。このドキュメント執筆時、mahara (1.13) はこのセットアップで素晴らしく動作します。しかし、複数ドメインのセットアップにより、Moodleへの情報伝達が遮断されてしまいます。

server {
listen 443;
listen 80;

server_name www.example.de, www.example.net, www.example.org ;
optimize_server_names on;

# Note: single domain setups obviously need only one listen directive
# and one single domain declaration in server_name

# ssl setup
ssl on;
ssl_certificate /etc/nginx/example.crt;
ssl_certificate_key /etc/nginx/example.key;
add_header Front-End-Https on;

# logging
access_log /var/log/nginx/example/access.log;
error_log /var/log/nginx/example/error.log;

# enable for debugging purpose
# error_log /var/log/nginx/example/error.log debug;

location / {
root /var/www/example;
index index.html index.php;
}

location ~ .php {
include /etc/nginx/fastcgi_params;
fastcgi_param HTTPS on;
fastcgi_param SCRIPT_FILENAME /var/www/example$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
if (-f $request_filename) {
break;
}
fastcgi_pass 127.0.0.1:9999;
}

#
# these declarations are taken from a similar setup for CMSIMPLE and have yet to be adopted
# mahara, which should be straightforward. Highly recommended for production sites.
#

#
# security: deny access to all places which only the mahara scripts may see

# location ~ /(classes|functions|misc|modules|includes|db|locale|lib)/ {
# deny all;
# }

#
# serve static files directly

# location ^/.*+.(jpg|jpeg|gif|css|png|js|ico|htm|html)$ {
# root /var/www/example;
# access_log off;
# expires 30d;
# }

}
}


In addition, the following settings have to be present /etc/nginx/fastcgi_params


fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

## bea ++
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;

そして最後に、必要に応じてマルチドメインを有効にするため、Maharaのconfig.phpにコードスニペットを貼り付けます:

$cfg->wwwroot = 'http'
. (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] == 'on' ? 's' : '' : '');
$cfg->wwwroot .= '://' .$_SERVER['HTTP_HOST'] .'/';