Actions

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

From Mahara Wiki

< Mahara日本語ドキュメント‎ | システム管理者ガイド
 
(36 intermediate revisions by the same user not shown)
Line 1: Line 1:
作成中です - [[User:Mits|mits]]
+
Maharaは極めて肥大化したapache/mod_php環境を必要としません。Maharaはfastcgi環境で動作するため、fastcgiをサポートしているウェブサーバでも動作します: 例) lighttpd および nginx
  
Maharaは極めて肥大化したapache/mod_php環境を必要とはしません。Maharaはfastcgi環境で動作するため、fastcgiをサポートしているウェブサーバでも動作します: 例) lighttpd および nginx
+
これはMaharaチームより公式に'''サポートされていない'''ことに留意してください。しかし、私たちは発生したバグの修正を試みます。また、パッチも受け入れます。あなたがMaharaのバグに遭遇した場合、fastcgi/nginxを使用してMaharaを稼動させていることに留意してください!
 
 
これはMaharaチームより公式に'''サポートされていない'''ことに留意してください。しかし、私たちは発生したバグの修正を試みます。また、パッチも受け入れます。Maharaのバグに遭遇した場合、あなたがfastcgi/nginxを使用してMaharaを稼動させていることに注目してください!
 
  
 
<div id="section_1">
 
<div id="section_1">
Line 9: Line 7:
 
===セットアップインストラクション===
 
===セットアップインストラクション===
  
セットアップはそれほど難しくありません。あなたはnginxのインストールおよび設定、fastcginのセットアップ、そして少しだけphp.iniの設定が必要です。
+
セットアップはそれほど難しくありません。あなたはnginxのインストールおよび設定、fastcginのセットアップ、そして少しだけphp.iniを設定する必要があります。
  
以下、Maharaが動作するUbuntu Lucidホストのnginx設定でテストされた内容です:
+
以下、Maharaが動作するUbuntu Lucidホストのnginx設定でテストした内容です:
  
 
  server {
 
  server {
Line 48: Line 46:
 
   }
 
   }
 
   
 
   
 
 
下記の点に留意してください:
 
下記の点に留意してください:
* この設定は多くの一般的なMaharaおよびnginx設定の潜在的な危険性を回避します。location regexは最初に適用される特定の.phpファイルに合致させて、 127.0.0.1:9000で動作しているfastcgiにすべてのPHPスクリプトを通します。当然、あなたがそこでfastcgiを走らせていることを意味します - このnginx設定だけではMaharaを動作させるのに十分ではありません。これに関する詳細情報は下記をお読みください。
+
* この設定では、多くの一般的なMaharaおよびnginx設定の潜在的な危険性を回避します。location regexは最初に適用される特定の.phpファイルに合致させて、 127.0.0.1:9000で動作しているfastcgiにすべてのPHPスクリプトを通します。当然、あなたがそこでfastcgiを走らせていることを意味します - このnginx設定だけではMaharaを動作させるのに十分ではありません。これに関する詳細情報は下記をお読みください。
* 設定ブロックではnginxが特別に考慮しない.htaccessおよび追加設定ファイルを必要とします。fastcgiサーバセットアップの一部として、あなたはphp.iniおよび追加設定ファイルにて、PHP全体を設定する必要があります。
+
* 設定ブロックでは、nginxが特別に考慮しない.htaccessおよび追加設定ファイルを必要とします。fastcgiサーバセットアップの一部として、あなたはphp.iniおよび追加設定ファイルにおいて、PHP全体を設定する必要があります。
 
* location / ブロックは最後に処理されるブロックです。「try_files」はnginxがファイルを静的に提供することを意味します。見つかった場合、ファイルは3日間の有効期限のヘッダと共にブラウザでサポートされるgzipされた形で提供されます。Maharaは静的ファイルのバージョンを全く管理しないため、あなたは有効期限を少なくすることができます。
 
* location / ブロックは最後に処理されるブロックです。「try_files」はnginxがファイルを静的に提供することを意味します。見つかった場合、ファイルは3日間の有効期限のヘッダと共にブラウザでサポートされるgzipされた形で提供されます。Maharaは静的ファイルのバージョンを全く管理しないため、あなたは有効期限を少なくすることができます。
* 2つのサーバブロックがありますが、2番目のブロックでは www.example.com を example.com にリダイレクトします。Doing it with two blocks is nice and clear, and works correctly with Mahara so you don't mess up Mahoodle integration.
+
* 2つのサーバブロックがありますが、2番目のブロックではwww.example.comをexample.comにリダイレクトします。2つのブロックは素晴らしく分かりやすく、Maharaで正しく動作するため、あなたがMahoodleインテグレーションで失敗することはありません。
  
Along with the nginx configuration, you need PHP running as fastcgi. Thankfully, this is quite easy - PHP ships with a cgi binary that can run in fastcgi mode. Under ubuntu, install the <code>php5-cgi</code> package to get it. Then, put the following into <code>/etc/init.d/php</code> or similar:
+
nginxの設定と一緒に、PHPをfastcgiとして動作させてください。ありがたいことに、これは非常に簡単です - PHPにはfastcgiモードで動作するcgiバイナリが同梱されています。cgiバイナリを取得するため、Ubuntuでは<code>php5-cgi</code>パッケージをインストールしてください。そして、以下の内容を <code>/etc/init.d/php</code> または似たような場所に入れてください:
  
 
  <nowiki>#! /bin/sh
 
  <nowiki>#! /bin/sh
Line 113: Line 110:
 
<div> </div>
 
<div> </div>
  
Note some points about this file:
+
このファイルに関するメモです:
 
 
* You'll need to chmod +x it, and you probably want to rig it up to start on boot. (fixme: someone put instructions here for doing that)
 
* You seriously don't need as many children as you think. Nginx will handle all of the static files, so you only need enough to handle all the concurrent PHP requests you think you'll get. If you run PHP with eaccelerator or similar, you should be able to push through most pages in 250 milliseconds or less, meaning one child can handle four requests per second. Running too many children will actually cause more pain than it's worth, as the children will contend for CPU and hold RAM without actually speeding things up. If you have a single-CPU machine, it actually makes sense to just have one child. YMMV - benchmark on your hardware to work out the minimum number of children that get the best result for you.
 
  
Finally - remember to configure your php.ini. Check Mahara's .htaccess and configure the php.ini the way the .htaccess does. Also make sure you set <code>cgi.fix_pathinfo</code> to 0, else you'll potentially be vulnerable to arbitrary code injection attacks (Mahara should already protect you against these, but <code>cgi.fix_pathinfo</code> is unnecessary at best, and dangerous at worse).
+
* あなたはファイルを「chmod +x」して、恐らくブート時に開始するよう、設定しても良いでしょう (fixme: どなたか、ここにインストラクションを追加してください)。
 +
* 実際のところ、あなたが考えているほど多くの子プロセスは必要ではありません。あなたが必要なことは、Nginxはすべての静的ファイルを処理するために、 あなたが取得すると考える現在のPHPリクエストすべてを十分に処理できるようにしてください。eacceleratorまたは類似するPHPアクセラレータを動作させている場合、あなたはほとんどのページを250ミリ秒でプッシュすることができます。これは子プロセスが1秒当たり4リクエストを処理できることを意味します。多くの子プロセスを実行することにより、実際には良い点よりも悪い点が発生してしまいます。具体的には、子プロセスは競うようにCPUを使用して、スピードアップすることなしにRAMを保持してしまいます。あながシングルCPUのマシンを使用している場合、1つの子プロセスのみを持つことは意味を成します。YMMV (Your mileage may vary) - 最小の子プロセス数を実行して良い結果を生むよう、あなたのハードウェアをベンチマークしてください。
  
With the above setup on a VPS with 600MB of RAM, Mahara can push through 20 reqests per second. That's 20 PHP pages, so well more than 20 concurrent users, and that's just on a VPS. Dedicated hardware should easily handle far higher loads.
+
最後に - 忘れずにあなたのphp.iniを設定してください。Maharaの.htaccessファイルを確認して、そのようにphp.iniを設定してください。同様に<code>cgi.fix_pathinfo</code>をゼロに設定してください。そうでない場合、あなたは任意のコードに対するインジェクション攻撃を受けてしまう可能性があります (Maharaはそれらの攻撃に対して、あなたを保護することはできますが、<code>cgi.fix_pathinfo</code>を有効にすることは最良の選択とは言えず、逆に危険でさえあります)。
 +
上記の設定のVPS (600MB RAM) において、Maharaは1秒あたり20リクエストを処理することができます。これはVPS上の20PHPページであり、20名以上の同時ユーザにおいて上手く動作します。専用ハードウェアの場合、さらに高いロードを処理することができます。
  
 
</div><div id="section_2">
 
</div><div id="section_2">
Line 126: Line 122:
 
===SSL===
 
===SSL===
  
This example demonstrates a setup using both plain http as well as ssl in multiple domains. At the time of writing, mahara (1.13) works nicely with this kind of setup. Multi-Domain setups will however break the communication toward moodle.
+
ここでは、複数ドメインにおいて、プレインhttpおよびssl両方の設定を例示しています。このドキュメント執筆時、mahara (1.13) はこのセットアップで素晴らしく動作します。しかし、複数ドメインのセットアップにより、Moodleへの情報伝達が遮断されてしまいます。
  
 
<code>server {<br />        listen          443;<br />        listen          80;<br /><br />        server_name    www.example.de, www.example.net, www.example.org ;<br />        optimize_server_names on;</code>
 
<code>server {<br />        listen          443;<br />        listen          80;<br /><br />        server_name    www.example.de, www.example.net, www.example.org ;<br />        optimize_server_names on;</code>
Line 148: Line 144:
 
<code><br /> fastcgi_param  QUERY_STRING      $query_string;<br /> fastcgi_param  REQUEST_METHOD    $request_method;<br /> fastcgi_param  CONTENT_TYPE      $content_type;<br /> fastcgi_param  CONTENT_LENGTH    $content_length;<br /><br /> fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;<br /> fastcgi_param  REQUEST_URI        $request_uri;<br /> fastcgi_param  DOCUMENT_URI      $document_uri;<br /> fastcgi_param  DOCUMENT_ROOT      $document_root;<br /> fastcgi_param  SERVER_PROTOCOL    $server_protocol;<br /><br /> fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;<br /> fastcgi_param  SERVER_SOFTWARE    nginx;<br /><br /> fastcgi_param  REMOTE_ADDR        $remote_addr;<br /> fastcgi_param  REMOTE_PORT        $remote_port;<br /> fastcgi_param  SERVER_ADDR        $server_addr;<br /> fastcgi_param  SERVER_PORT        $server_port;<br /> fastcgi_param  SERVER_NAME        $server_name;<br /><br /> # PHP only, required if PHP was built with --enable-force-cgi-redirect<br /> fastcgi_param  REDIRECT_STATUS    200;<br /><br /> ## bea ++<br /> fastcgi_pass_header Authorization;<br /> fastcgi_intercept_errors off;</code><br />
 
<code><br /> fastcgi_param  QUERY_STRING      $query_string;<br /> fastcgi_param  REQUEST_METHOD    $request_method;<br /> fastcgi_param  CONTENT_TYPE      $content_type;<br /> fastcgi_param  CONTENT_LENGTH    $content_length;<br /><br /> fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;<br /> fastcgi_param  REQUEST_URI        $request_uri;<br /> fastcgi_param  DOCUMENT_URI      $document_uri;<br /> fastcgi_param  DOCUMENT_ROOT      $document_root;<br /> fastcgi_param  SERVER_PROTOCOL    $server_protocol;<br /><br /> fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;<br /> fastcgi_param  SERVER_SOFTWARE    nginx;<br /><br /> fastcgi_param  REMOTE_ADDR        $remote_addr;<br /> fastcgi_param  REMOTE_PORT        $remote_port;<br /> fastcgi_param  SERVER_ADDR        $server_addr;<br /> fastcgi_param  SERVER_PORT        $server_port;<br /> fastcgi_param  SERVER_NAME        $server_name;<br /><br /> # PHP only, required if PHP was built with --enable-force-cgi-redirect<br /> fastcgi_param  REDIRECT_STATUS    200;<br /><br /> ## bea ++<br /> fastcgi_pass_header Authorization;<br /> fastcgi_intercept_errors off;</code><br />
  
And finally the code snippet required in Mahara's config.php to enable multiple domains if desired:
+
そして最後に、必要に応じてマルチドメインを有効にするため、Maharaのconfig.phpにコードスニペットを貼り付けます:
  
 
<font face="courier new,courier">$cfg-&gt;wwwroot = 'http'<br /><nowiki>  . (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] == 'on' ? 's' : '' : '');</nowiki><br /> $cfg-&gt;wwwroot .= '://' .$_SERVER['HTTP_HOST'] .'/';</font>
 
<font face="courier new,courier">$cfg-&gt;wwwroot = 'http'<br /><nowiki>  . (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] == 'on' ? 's' : '' : '');</nowiki><br /> $cfg-&gt;wwwroot .= '://' .$_SERVER['HTTP_HOST'] .'/';</font>
  
 
</div>
 
</div>

Latest revision as of 05:36, 12 June 2013

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'] .'/';