web-dev-qa-db-ja.com

Windows Apache2.2はCGIの実行が非常に遅い

最近、Windowsの1つでApache2.2とgitをセットアップしましたXP PCでgitwebアクセス用に https://git.wiki.kernel.org/index)のセットアップを使用します.php/MSysGit:GitWeb wikiに記載されているように、コーディング方法でgitwebで動作するように見えるPerlの唯一のバージョンは、MSysGitに含まれているバージョンです。ActivePerlとStrawberryPerlは、特定の必要な機能を実装していません。別のインタープリターはオプションではありません。

C:\Program Files\Git\bin>Perl.exe --version
This is Perl, v5.8.8 built for msys

いずれの場合も、セットアップされて機能しますが、何らかの理由で、ページの読み込みごとに約10秒の遅延があります。これをトラブルシューティングするために、簡単なhelloworld.cgiを作成し、gitweb.cgiの隣のディレクトリに配置しました。 gitwebと同じPerlインタープリターを使用するように設定されています。

#!C:\Program Files\Git\bin\Perl.exe
print "Content-type: text/html\n\n";
print "Hello, world!\n";

このスクリプトもサーバーで実行するのに10秒以上かかります。コマンドプロンプトを起動し、同じPerl実行可能ファイルで直接実行すると、すぐに実行されます。

mod_cgiはApache構成にロードされ、システム用に変更されたgitwikiに示されている構成スタンザを使用しています。

# Config to make the gitweb CGI available through Apache.
Alias /git "C:/Program Files/Git/share/gitweb"
<Directory "C:/Program Files/Git/share/gitweb">
  AddHandler cgi-script .cgi
  <Files ~ "\.cgi$">
    Options +ExecCGI
  </Files>
  AllowOverride None
  Order allow,deny
  Allow from all
  DirectoryIndex gitweb.cgi
</Directory>

私が見逃している他の設定ディレクティブはありますか?別のPCからアクセスするか、マシン上で直接localhost経由でアクセスするかは問題ではないようですので、DNSは除外されていると思います。また、Apacheエラーログには何もダンプしていません。

4
JJS

Msysgitの代わりにcygwinのバージョンのPerlを使用してこれを修正しました。それは本当にあなたの応答時間をスピードアップします。

これを行うには、gitweb.cgiスクリプトを3か所で変更する必要があります。最初の行は次のようになっているはずです。

#!C:/cygwin/bin/Perl

Msysgitの代わりにcygwinのバージョンのgitを使用することも選択したので、projectrootがcygwinの形式であることを確認する必要があります。

our $GIT = "C:/cygwin/bin/git";
our $projectroot = "/cygdrive/c/temp/repos";
2
user64141

これは、Apacheがcgiプロセッサを実行する前に環境変数をサニタイズするためです。そのままにしておく変数は次のとおりです。

  • 促す
  • SystemRoot
  • COMSPEC
  • PATHEXT
  • WINDIR

また、Apache固有の変数(SCRIPT_NAMEなど)を多数追加します。

したがって、解決策は、msysShellまたはmsysPerlを実行する前にいくつかの変数を元に戻す何らかのラッパー(通常のW32Pythonを使用してPython cgiスクリプトを使用しています)を使用することです(外部からmsysのものを実行するのはc:/path/to/sh.exe --login -c "Perl /path/to/script.cgi")です。

設定する必要のある変数(Apacheが通過する変数またはApacheが単独で設定する変数に加えて)は次のとおりです。

  • LOGONSERVER = \\MACHINENAME
  • TMP = C:\Users\USERNAME\AppData\Local\Temp

TMPは必須ではありませんが、TMPが見つからない場合、msysは文句を言います。

もちろん、TMPには任意のディレクトリを使用できます。

なぜLOGONSERVERが必要なのかわかりません。ごめんなさい。

ラッパースクリプト/アプリケーションがstdoutをバイナリモードに設定していることを確認してください。設定していない場合、ApacheはPremature end of script headersエラーをスローします。

0
LRN