FastCGIを使ったZope

これはFastCGIを使ってZopeのためにNGINXをフロントエンドとして使うための例です。

location ~ /zope(/|$) {
  fastcgi_pass    unix:/var/run/plone-site.sock;
  include /etc/nginx/fastcgi_params;

  set $fixed_content_length $content_length;
  if ( $fixed_content_length = "" ) {
    set $fixed_content_length "0";
  }

  set $path_info "";
  if ( $document_uri ~ "^/zope/(.*)$" ) {
    set $path_info $1;
  }

  fastcgi_param   CONTENT_LENGTH  $fixed_content_length;
  fastcgi_param   PATH_INFO   $path_info;
  fastcgi_param   SCRIPT_NAME /zope;
}

location /zope(/|$) は、最後に/が無いhome URL (つまり http://yoursite.com/zope ) でもアクセス可能な場合にのみ必要とされます。そうでなければ、location /zope/で十分です。

それは少し簡単な形式ですることもできます:

location ~ /zope(?<path_info>/.*|$) {
  fastcgi_pass    unix:/var/run/plone-site.sock;
  include /etc/nginx/fastcgi_params;

  set $fixed_content_length $content_length;
  if ( $fixed_content_length = "" ) {
    set $fixed_content_length "0";
  }

  fastcgi_param   CONTENT_LENGTH  $fixed_content_length;
  fastcgi_param   PATH_INFO   $path_info;
  fastcgi_param   SCRIPT_NAME /zope;
}

Zope (少なくともバージョン 2.10) は CONTENT_LENGTHと一緒にatoi を呼びます。つまり、exceptions.ValueError は、CONTENT_LENGTH が存在するが空の文字列の場合に、投げられるでしょう。

非root webパス上にマウントされた場合 (この例では/zope)、 ZopeはApacheのやり方で SCRIPT_NAMEPATH_INFO を期待します。 (Zope rootとしてSCRIPT_NAME、オブジェクトのリファレンスとしてPATH_INFO)。