日記帳
本ページはプロモーションが含まれています
カテゴリー
Links
blog(ブログ)マスター
アンドロイドの巣
ゼロから始めるベランダ菜園
タイトル
2024年11月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

Search Results

AddHandler, RemoveHandler が動作しない

執筆:2021.03.01
編集:2021.03.01



Apache2.4
.htaccessの
AddHandler, RemoveHandler が動作しない
SetHandlerは動作する

Apacheを2.4.46にアップグレードしてみたが直っていない。
ネットで調べると2017/03頃にはすでに報告されているバグ。
2010年ごろに報告されたバグとは別物っぽい。

http.conf
 Options All
 AllowOverride All

mime_moduleはロード済み。
ロードされていなかったら、.htaccessに記述した時点で落ちますしね。

Apacheのソースコード調べてもいいけど面倒。

このフォルダだけバージョンを切り替えて動作確認したいという用途につかうのでちょっと不便。

Windowsだと問題は発生しないので、Unixでの複数動作確認はスキップしよかなぁ

» 続きを読む

2021.03.01

Django CGI(5.x / 1.x 2.x)

執筆:2019.07.08
編集:2019.07.08
編集:2024.08.04



(2024-08-04)
PythonのバージョンとDjango を最新の5.0をインストールするとDjango 2.xのコードは そのまま動きました!

相変わらずオーバーヘッドが大きい

CGI版での速度 (調査日 2024年8月4日)

サーバー
(apache2.4)

django(CGI)
django 5.0
Python 3.12

ディフェンダーの設定
C:\Program Files\Python
を除外設定

/admin/
hello
Windows11
(ローカルホスト)
2.10~2.70秒 約1.5秒
★ C:\Program Files\Python\3.12\Lib\site-packages\django の除外設定だけでも効果がありました。


(2024-07-18)
しばらく使っていない間に、The latest official version is 5.0.7.になっていますね
https://www.djangoproject.com/download/

https://docs.python.org/ja/3.12/library/cgi.html
Python cgiモジュールは、バージョン 3.11 で非推奨、バージョン 3.13 で削除予定とありますね
上記ページで3.13以降のマニュアルにするとなくなっています。

ということで、Django をCGIとして動作させる裏技は将来的に封殺されるかもしれないです。

CGIアプリケーションを作りたい場合は、Pythonは候補からはずれるということです。

格安運用でdjangoがいい場合は、共有サーバーではなく、安いVPS(仮想専用サーバー)を借りないといけないのかもしれないですね~。400円/月くらいですか?
VPSは自己管理なので面倒ですよね~

django1.x と2.xの両方で動作可能な django.cgiを作ったので速度を比較してみた。
前回とは違うアプローチをしてみたので、1個のファイルに小さく収まりました。

ベンチマークをすると CGI起動だとdjangoは 応答速度的に使えないコと判明しました。
ただし、CGIではなく常駐で運用するとレスポンスはとても速いです。

結論
djangoをCGIで動かすと何もなくても 0.5~0.6秒 レスポンスまでに時間がかかります。
djangoをCGIで運用することはお勧めできません。
mod_wsgiが使えない場合は、mod_phpなら導入されているサーバーは多いので、phpのフレームワークを検討したほうが賢明です。

原因
djangoは多数のファイルに分散されて、起動時にそれを読み込むため、CGIで動作させると とても時間がかかります。

速度比較いろいろ

django1とdjango2の速度差はそれほどなく、若干django2のほうがレスポンスが速い傾向にありました。

django

サーバー CGI

manage.py
runserver

mod_wsgi
localhost 1.11秒 0.01秒 0.03秒
さくらインター
ネット ライト
1.23秒 - -

※ 応答速度が1秒を超えると閲覧者に遅いとストレスを感じさせてしまいます。

CGI版での速度比較 (調査日 2019年7月7,8日)

サーバー
(apache2.4)
django1(CGI) hello.cgi
/admin/ hello python php C言語 GO
Windows10
(ローカルホスト)
5.86秒 2.64秒 0.30秒 0.25秒 0.02秒 0.06秒
FreeBSD11
(イントラネット)
1.11秒 0.51秒 0.03秒 0.03秒 0.01秒 0.02秒
さくらインターネット
ライト
FreeBSD9
(インターネット)
1.23秒 0.64秒 0.08秒 0.12秒 0.06秒 0.06秒
※ 時間は、URL呼び出し開始からデータ取得終了までにかかった時間。
※ C言語バイナリが最小時間は一番小さかった。

CGIのサイズ
ファイルサイズ hello.cgiの種類
1,988,354 GO バイナリCGI
6,604 C言語 バイナリCGI
140 PHP CGIスクリプト
115 perl CGIスクリプト
2019.07.08

ServerRoot must be a valid directory


執筆:2015.04.13
編集:2015.04.13


httpd.exe: Syntax error
ServerRoot must be a valid directory
Define SRVROOT "C:/Apache22"
ServerRoot "${SRVROOT}"

ServerRoot "C:/Apache22"


apache 2.4の設定にあわせようとしてみましたが
apache 2.2系は、定義した変数を代入として使用することはできないようですね。

» ServerRoot must be a valid directory'">続きを読む

カテゴリー: General
2015.04.13

Indy Cookie 2007


執筆:2007.01.05
編集:2007.03.19
編集:2007.07.09
編集:2007.07.18
編集:2007.07.21
編集:2007.11.23
編集:2009.10.16


追記:2009.10.16 IndyTiburon.zip(Indy 10.5.7)にて修正されているようです。
IndyTiburon.zipに移行して indy10.zip(10.2.3)は開発がとまったようですので注意が必要です。
このページの内容は古くなっています。
参考にする場合は注意が必要です。

10.0.52は、かなり古いので
cookieのドメインの最初が .で始まっていると処理できずエラーになります。
(IdCookie、IdCookieManager)
(10.1.6でも直っていませんでした。:2007.3、2007.7)
(10.2.3でも直っていませんでした。:2007.10)


他にも修正をみつけたので、この文書は
インストール方法と分離しました。(2007.7.21)
最新版のインストール方法は、こちらに書いてあります。


パッチ: クッキーのバグを修正します。

Indy10 Cookie bug fix(2007年3月中旬 時点、version 10.1.6)
Indy10 Cookie bug fix(2007年10月中旬 時点、version dev 10.2.3)
Indy9   Cookie bug fix(2007年7月中旬 時点、version 9.0.5.0(stable),indy9.0.18(stable), DevSnapshot)

【現象】
1.
   example.comがexample.comのcookieを渡し、ソフトウェアに保存したとします。
   .example.comでのcookieを、example.comで取得できません。

2.
   anywordexample.comにソフトウェアが接続するとexample.comのcookieをanywordexample.comに渡します。 
   example.com.anydomainにソフトウェアが接続するとexample.comのcookieをexample.com.anydomainに渡します。

 後者(2.)は、セキュリティ勧告ものレベルなのは容易に想像がつくと思います。

   サイトと同名の文字列を含んでる場合に限られますが、
   誘導によりクッキーの略奪が可能なので注意が必要です。

(3.)パス付き/で終わらないクッキーを保存した場合、同じ文字が並ぶパスにわたしてしまいます。
    firefox2ではわたさないことを確認しました。(違うパスへ保存はできるようです。)
 ※ IE7では、Indyと同様の現象が起きます。
    Netscpeの仕様書を見るとそうなると 最終パス名の部分一致になると書いてありました。
   ※ Cookieには、きちんとした規格が無いようなことがかいてありました。
    firefox2のような動作がいいと個人的に私は思いますのでそういう風に修正を加えます。

  /で終わらないクッキーを書いた方が悪いと思いますが、そういうミスはあるものです。
  (共有サーバーで問題になります。他人のアカウントにわたすので)
  例:   path=/tea; http/〜/tea/のものを  http/〜/team/ にもわたします。 
    

【対策】
※:適用した場合のコードの安全性はご自分で確認を取ってください。
  わたしは、一切責任はもちません。

コードが修正されている可能性も否定できませんので
まず、何もしない状態でセキュリティホールが残っているか確認をとることをお勧めします。
下の再現コードである程度確認できると思います

2007年3月でのdevコードなので、該当行が多少移動しているかもしれません。
関数名も書いているので探しやすいと思います。
 (delphi2005付属の10.0.52は、行数が違いますので関数名で探してください。)

Indy10
\Lib\Protocols\
IdCookie.pas
  単純に切り落とすと間違った判定をします。
TIdNetscapeCookie.IsValidCookie
Indy 〜 10.1.16 :
331: function TIdNetscapeCookie.IsValidCookie

begin
//....(省略)
   Result := FDomain = RightStr(AServerHost, Length(FDomain));
修正
  var ACookieDomain : String;
begin
//....(省略)
//  Result := FDomain = RightStr(AServerHost, Length(FDomain));
// bad code : FDomain = RightStr(AServerHost, Length(FDomain));
//   FDomain        AServerHost
//  xxxx.yyyy.com , zxxxx.yyyy.com : is not valid
//  xxxx.yyyy.com ,  xxxx.yyyy.com : is valid
// .xxxx.yyyy.com ,  xxxx.yyyy.com : is valid
// .xxxx.yyyy.com , yxxxx.yyyy.com : is not valid
      if (Copy(FDomain,1 , 1)='.') then
           ACookieDomain := FDomain
          else
           ACookieDomain := '.' + FDomain;
       Result := ( ACookieDomain = RightStr('.' + AServerHost, Length(ACookieDomain)) );
Indy 10.2.3 : 
-      Result := TextEndsWith(AServerHost, FDomain);
+       // bad code : Result := TextEndsWith(AServerHost, FDomain);
+       //    TextEndsWith('noexample.com',  'example.com') = true : is not valid
+        if (Copy(FDomain,1 , 1)='.') then
+            Result := TextEndsWith('.' + AServerHost, FDomain)
+         else
+            Result := TextEndsWith('.' + AServerHost, '.' + FDomain);
IdCookieManager.pas
  ドメインの比較にPos関数を使ってはいけません。
135: function TIdCookieManager.GenerateCookieList

begin
//....(省略)
  if IndyPos(LCookiesByDomain[i], URL.Host) > 0 then
修正
  TempCookiesDomain : String;
begin
//....(省略)
//  if IndyPos(LCookiesByDomain[i], URL.Host) > 0 then
    TempCookiesDomain := LCookiesByDomain[i];
    if (Copy(TempCookiesDomain,1 , 1) <> '.') then TempCookiesDomain := '.' + TempCookiesDomain;
    if (TempCookiesDomain  = RightStr('.' + URL.Host, Length(TempCookiesDomain))) then
注意
 Netscapeの仕様書では、/で終わらない場合、最後のパス名は部分一致になっています
 IE7もそういう動作をしているようです。
 firefox2では、部分一致にはなっていません。
 firefox2風に、/で終わるパスと同様の動作にするには以下のようにします。

function TIdCookieManager.GenerateCookieList

 if Pos(LCookieList.Cookies[j].Path, URL.Path) = 1 then
-->
// if Pos(LCookieList.Cookies[j].Path, URL.Path) = 1 then
 if (RightStr(LCookieList.Cookies[j].Path,1) = '/') then
  begin
    if Pos(LCookieList.Cookies[j].Path, URL.Path) <> 1 then continue;
  end
  else
  begin
    if Pos(LCookieList.Cookies[j].Path + '/', URL.Path) <> 1 then continue;
  end;
Firefox2では、Cookieのドメインに . がつくようなのでそうします。
Dev版(Indy 10.2.3)のIdGlobalProtocols.IsHostNameで
最初に . が付いているとFalseを返すようになってしまったので[ . ]が最初についていた場合取り除きます。

 .で始まるものを保存できるように修正をしましたので
 そのままでは最初の文字が . 付きと .がついていない物と混在してしまいます。
 以下のように修正します。
procedure TIdCookieManager.DoAdd

 if Length(ACookie.Domain) = 0 then LDomain := AHost
  else LDomain := ACookie.Domain;
-->
 if Length(ACookie.Domain) = 0 then LDomain := AHost
  else LDomain := ACookie.Domain;

  while (copy(LDomain, 1 , 1)='.') do LDomain := copy(LDomain, 2 , Length(LDomain));
  if (LDomain ='') then exit;
(省略)の部分は、ここでわかりやすくするために
省略しただけで誤解しないようにお願いします

Indy 9
IdCookie.pas
  単純に切り落とすと間違った判定をします。
function TIdNetscapeCookie.IsValidCookie

begin
//....(省略)
    if IsHostname(AServerHost) then
    begin
      if IsHostName(FDomain) then
        result := FDomain = RightStr(AServerHost,Length(FDomain))
       else
        result := FDomain = RightStr(DomainName(AServerHost),Length(FDomain));
    end
修正
  var ACookieDomain : String;
begin
//....(省略)
    if IsHostname(AServerHost) then
    begin
//      if IsHostName(FDomain) then
//        result := FDomain = RightStr(AServerHost,Length(FDomain))
//       else
//        result := FDomain = RightStr(DomainName(AServerHost),Length(FDomain));
      if (Copy(FDomain,1 , 1)='.') then
           ACookieDomain := FDomain
          else
           ACookieDomain := '.' + FDomain;
       Result := ( ACookieDomain = RightStr('.' + AServerHost, Length(ACookieDomain)) );
    end
IdCookieManager.pas
  ドメインの比較にPos関数を使ってはいけません。
function TIdCookieManager.GenerateCookieList

begin
//....(省略)
  if IndyPos(Uppercase(LCookiesByDomain[i]), Uppercase(URL.Host + URL.path)) > 0 then {FLX}
修正
  ACookieDomain : String;
begin
//....(省略)
//  if IndyPos(Uppercase(LCookiesByDomain[i]), Uppercase(URL.Host + URL.path)) > 0 then {FLX}
    ACookieDomain := LCookiesByDomain[i];
    if (Copy(ACookieDomain ,1 , 1) <> '.') then ACookieDomain := '.' + ACookieDomain;
    if (ACookieDomain  = RightStr('.' + URL.Host, Length(ACookieDomain))) then

注意
 Netscapeの仕様書では、/で終わらない場合、最後のパス名は部分一致になっています
 IE7もそういう動作をしているようです。
 firefox2では、部分一致にはなっていません。
 firefox2風に、/で終わるパスと同様の動作にするには以下のようにします。


 if Pos(LCookieList.Cookies[j].Path, URL.Path) = 1 then
-->
// if Pos(LCookieList.Cookies[j].Path, URL.Path) = 1 then
 if (RightStr(LCookieList.Cookies[j].Path,1) = '/') then
  begin
    if Pos(LCookieList.Cookies[j].Path, URL.Path) <> 1 then continue;
  end
  else
  begin
    if Pos(LCookieList.Cookies[j].Path + '/', URL.Path) <> 1 then continue;
  end;

 .で始まるものを保存できるように修正をしましたので
 そのままでは最初の文字が . 付きと .がついていない物と混在してしまいます。
以下のように修正します。

procedure TIdCookieManager.DoAdd

 if Length(ACookie.Domain) = 0 then LDomain := AHost
  else LDomain := ACookie.Domain;
-->
 if Length(ACookie.Domain) = 0 then LDomain := AHost
  else LDomain := ACookie.Domain;

  LDomain := Sys.Trim(LDomain);
  if ((LDomain <> '')and(IsHostname(LDomain))) then
    if (Copy(LDomain,1,1) <> '.') then LDomain := '.' + LDomain;
(省略)の部分は、ここでわかりやすくするために
省略しただけで誤解しないようにお願いします

バグの確認のためのコード DOS版 FORM版  
     ※コピーは、IEのみ動作します
ダウンロード
indy_10_src_patches
indy_mytest

ブラウザで確認したい場合 【 .で始まるクッキーの場合】

asp.netだとサンプルを作りにくいのでphpをサーバーに置きます。
---サーバーに保存します----phpのファイルです--------
<?php
  // cookie_test.php
   $s = '';
   if (isset($_COOKIE['name1'])) { $s .= 'name1='.$_COOKIE['name1']."\r\n"; }
   if (isset($_COOKIE['name2'])) { $s .= 'name2='.$_COOKIE['name2']."\r\n"; }

   setcookie ('name1','value1' ,time()+60*60*24*30, '/', '.example.com');
   setcookie ('name2','value2' ,time()+60*60*24*30, '/', 'example.com');
   header('Content-type: text/plain');

   print $s;
?>
-----------------------------------------------
example.comは、適当に自分のドメインに置き換えてください。
このファイルにIEやFirefoxでアクセスしてください。
2回ほどアクセスすると2つクッキーが表示されると思います。

しかし、Indyでは、パッチを適用しない場合は、1つしか表示できません。

バグの再現コードです。 (上のphpとセットで使用します)
-----------------------------------------------
 example code
-----------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
  var i:Integer;
begin
  Memo1.Text := IdHTTP1.Get(Edit1.Text);
  Memo2.Clear;
  for i := 0 to IdCookieManager1.CookieCollection.Count-1 do
    Memo2.Lines.Add(IdCookieManager1.CookieCollection.Items[i].CookieText);
end;

----------------------------------------------
サーバを経由しないで単体で確認したい場合は、上の DOS版を利用します




おまけ:
C:\WINDOWS\SYSTEM32\DRIVERS\etc\hosts

に、 127.0.0.数字  ホスト名[ドメイン名]
みたいに追加して、apache等のサーバーを起動すると
容易にローカルでデバッグできると思います。

-----------------------
ssl通信のはじめにエラー
最新版は、どうも一緒に配布してあるdllだと古くてエラーになるようです。
 ソースコードを見ると以下のようにありました。
 自分でコンパイル済みのdll最新版を入れるようにだと・・・

Indy OpenSSL now uses the standard OpenSSL libraries
for pre-compiled win32 dlls, see:
http://www.openssl.org/related/binaries.html
recommended v0.9.8a or later


バグ報告してあげようと思ったのですが、バグ報告ページに接続できないので、あきらめました。
(また海外のメーリングリストは、ウイルス・スパムメールの嵐に遭うので関わる気はありません。)

 ポカ。。。(((∂。∂)ン
あれ? 私は誰 いまなにしていました?
 あれれ・・・

追記:2007年7月でも修正されていなかったので、newsグループに報告しました。
追記:Snapshotをみても反応が無かったので、QualityCentralに登録しました。 openされたようです。
追記:2007.10 RightStrがTextEndsWithに変更されていることを確認しました。
           関数名が変わっただけで欠陥は直っていないようです。


Indyのバージョンの確認方法
(新規フォームにボタンを貼って、コードを置き換えてください)

uses IdAbout;

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdAbout.ShowDlg
end;

2007.07.23

Apache HTTP Server 2.0.59 -- Installation operation failed.

常駐ソフトを終了するといいみたいです。

私のPCの場合は、Microsoft Loopback Adapter
が動いていると、インストールできないようです。

一時的に
Microsoft Loopback Adapter
を無効にすることでインストールできました。
カテゴリー: General
2007.03.28

$ /usr/sbin/apachectl2 start
/usr/sbin/apachectl2: line 78: 4072 Bad system call $HTTPD -k $ARGV


cygrunsrvを入れる。


cygserver-config

net start cygserver

/usr/sbin/apachectl2 start


うごかないのであきらめる・・・

apache1をいれapache2を削除指定

/usr/sbin/apachectl start

うごいたのでヨシとしよう。

» apachectl2: line 78: 4072 Bad system call'">続きを読む

カテゴリー: General
2007.01.03

win apache2 日本語urlエラー
windowsのapache2で abc/.htaccessに

<FilesMatch "^abc$">
ForceType application/x-httpd-php

を使って
ブラウザで 日本語でURL をいれると
Internal Server Error
がでます。

abc/日本語
です

スクリプトで処理するため
日本語部分はフォルダには存在しません。
エラーログには
Invalid argument: utf8 to ucs2 conversion failed on this string: REDIRECT_URL=...
とあります。

abc/cdf みたいに
英数字だとエラーなく機能します。
 またlinuxのapache2では、abc/日本語
 とエラー無く日本語でアクセスできます。

windows apache2のなにか特殊なエラーのようです。
試しに、
Content-Type: text/html
ダミー
と出力する
phpのかわりにしたダミーソフト(exe)を作ってハンドラをすり替えても
同じエラーになるので
ログは、apachce2側のエラーのようです。

さて どうしよう・・・
追記
 どうやら不具合の様で修正されたらしいので
新しいapacheといれかえようと思います。
カテゴリー: General
2006.08.05

Apache2を起動

Apacheを起動できませんでした :
  Starting httpd: [] [warn] module php4_module is already loaded, skipping
  設定ファイルの編集
Include conf.d/*.conf
が2個あったので 一個削除
Apacheを起動できませんでした :
  [crit] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP.
Pre-configuration failed.
  あれぇ〜? なおらない。
と下を見ると・・・

 phpが馬鹿?

仕方がないので 急遽 仕様を変更

worker.htmlprefork


[root@localhost root]# update-alternatives --config apache2

There are 4 alternatives which provide `apache2'.

Selection Alternative
-----------------------------------------------
*+ 1 /usr/sbin/apache2.worker
2 /usr/sbin/apache2.prefork
3 /usr/sbin/apache2.threadpool
4 /usr/sbin/apache2.perchild

Press enter to keep the default[*], or type selection number: 2
Using `/usr/sbin/apache2.prefork' to provide `apache2'.

Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
  えっ? ヨシ 完璧?じゃ。。。
  synapticを起動
(゚ロ゚)ギョェ apacheが入っていたので削除
  起動 成功 ♪

じゃあ cgiとphpもいれたし動くよね?
  (゚ロ゚)ギョェ
  続く・・・

» Apache2を起動'">続きを読む

カテゴリー: Linux
2006.02.18

PR

[PR]