VirtualHost名だけでなくServeAliasもみる

VirtualHost対応のために、アクセス時のホスト名とVirtualHost名をapacheモジュール内で比較させる方法がある。 しかし、これだけでは不十分で、実際にはServerAliasの設定がされているサーバーも多く、Aliasとマッチさせる必要もでてくる。 そのための関数を書いてみた。以下ソース。

static int check_virtualhost_name(request_rec *r) {

    int i;
    const char *header_name;
    const char *alias_name;

    header_name = apr_table_get(r->headers_in, "HOST");

    if (strcmp(header_name, r->server->server_hostname) == 0) {
        vlimit_debug_log_buf = apr_psprintf(r->pool, "Match: access_name=(%s) ServerName=(%s)"
            , header_name
            , r->server->server_hostname
        );
        VLIMIT_DEBUG_SYSLOG("check_virtualhost_name: ", vlimit_debug_log_buf, r->pool);
        return 0;
    }

    for (i = 0; i < r->server->names->nelts; i++) {
        alias_name = (char **)r->server->names->elts + (r->server->names->elt_size * i);
        vlimit_debug_log_buf = apr_psprintf(r->pool, "INFO: access_name=(%s) ServerAlias=(%s)"
            , header_name
            , alias_name
        );
        VLIMIT_DEBUG_SYSLOG("check_virtualhost_name: ", vlimit_debug_log_buf, r->pool);
        if (strcmp(header_name, alias_name) == 0 ) {
            vlimit_debug_log_buf = apr_psprintf(r->pool, "Match: access_name=(%s) ServerAlias=(%s)"
                , header_name
                , alias_name
            );
            VLIMIT_DEBUG_SYSLOG("check_virtualhost_name: ", vlimit_debug_log_buf, r->pool);
            return 0;
        }
    }

    vlimit_debug_log_buf = apr_psprintf(r->pool, "Not Match: access_name=(%s)"
        , header_name
    );
    VLIMIT_DEBUG_SYSLOG("check_virtualhost_name: ", vlimit_debug_log_buf, r->pool);

    return 1;
}

続きを読む

Apache Module Registry申請通過

世界中のWEBサーバーのほとんどはApacheで構築されている。

Apacheの開発が行われているApache Software Foundation(以下ASF)では、サードパーティ製の推奨モジュール群を、Apache Module Resgistryというサイトで提供するようにしている。

そのサイトは、Apacheモジュール開発者がソースと共に登録申請を出し、ASF側で問題無く推奨できるモジュールであれば、Apache Module Registryに登録され、ASFの推奨モジュールとして世界中に提供される。

僕も、apacheモジュールを開発したりしているので、ためしに作ったモジュールを二つほど申請してみた。

すると、なんと数日後申請がおり、Apache Module Registryに登録された。

申請したのは以下のモジュール。

[important]

[/important]

これで名実ともにApache(モジュール)開発者と名乗っちゃってもいいのかな。

apacheモジュールでmutexを使った排他制御を実装

apacheモジュールでプロセス間通信を行う場合に、共有メモリを使うと色々問題がでてくる。
preforkの性質上、複数のapache子プロセスがフォークされており、それらがそれぞれリクエストに対する処理を行うため、共有メモリ領域の書き込み時に衝突が起きたりして、データに齟齬が発生してくる。

それを防ぐのが排他処理だ。

今回は、aprで実装済みのglobal mutexを使って排他制御する方法を説明する。

続きを読む

apacheモジュールで共有メモリを使ったプロセス間通信

apacheモジュールでプロセス間通信を行う場合、共有メモリを使ってやる手法がある。

apacheモジュールでよく使われるaprで、共有メモリ用の関数が用意されているため、実装に問題が無い以上はaprを使った方が楽だ。

では具体的な使い方を。

続きを読む

VirtualHost単位で同時接続数制限できるapacheモジュール

 

 

 

 

[Warning]

より効率のよい同時接続数制限モジュールができたので、上記のページを参考にして下さい。

[/Warning]

 

 

 

 

[note]

[/note]

またapacheモジュールを作ってみた。

今回は、IP単位やファイル単位で同時接続数制限を実現するapacheモジュールであるmod_limitipconnを作り替えた。
ほぼ丸々書き換えなので、patchにしても意味なかった。

まずは、mod_limitipconnの下記問題点を改善した。

  • VirtualHostに対応していない
  • シンボリックリンクを含むドキュメントルートに対応していない
    • 二つのVirtualHostのドキュメントルートが同じディレクトリにリンクを張っていた場合、高負荷をかけるCGIが存在した場合、二つのVirtualHostで共通することになるが本当のリアルパスで制限できず、ドメイン毎に制限かけなくてはならない。
    • ドメインエイリアスなどをとった場合に、システム的に契約ドメインのドキュメントルートにドメインエイリアス用のリンクをはる場合などがあるため、契約ドメイン単位で制限をしたい。
  • 不要な機能が多い(OnlyIPLimit、NoIPLimitなどのMIMEタイプの制限)
    • 殆どの場合、Files・FilesMatch・Directory・DirectoryMatchなどで対応できる。

改善による機能としては、

  • VirtualHostに対するIP単位での同時接続数制限
  • VirtualHostに対する同時接続数制限(VirtualHostのMaxClients)
  • 引数にリアルパスを指定することにより、シンボリックリンクを含むドキュメントルートにも対応
  • 不要な機能を削除し、シンプルな設定を実現
  • .htaccess対応
  • error_logに出すと顧客に制限がばれちゃうので、システム管理者が見れるところにログ出力

である。

続きを読む