apache module でWEBサーバフィルタを作る

[English]

IISやapacheに下図のようにモジュールを追加することで、WEBサーバの動作をコントロールすることができる。

例として、8:00から18:00以外の時間にアクセスされた場合、「時間外」を表示するフィルタ sample01 を作成する。

1.環境

OS: CentOS7.7

apache: 2.4.6

 

2. apxsのインストール

yum install httpd-devel

 

3. フィルタのテンプレートを生成

cd /tmp/work/

apxs -g -n sample01

 

4. ソースコードを以下のように修正

以下は、8:00-18:00以外の時間は、”overtime”というHTMLを表示する。

/* The sample content handler */
static int sample01_handler(request_rec *r)
{
  time_t timer;
  struct tm *t_st;
  char buff[256];
  time(&timer);
  t_st = localtime(&timer);

  sprintf(buff,"%02d%02d", t_st->tm_hour, t_st->tm_min);
  if(strcmp(buff,"0800")>=0 && (strcmp(buff,"1800")<=0)){
    return DECLINED;
  }
  else {
    r->content_type = "text/html";
    if(!r->header_only){
      ap_rputs("<html><body>overtime</body></html>", r);
    }
    return OK;
  }
}

static void sample01_register_hooks(apr_pool_t *p)
{
  ap_hook_handler(sample01_handler, NULL, NULL, APR_HOOK_FIRST);
}

 

5. Make

apxs -c mod_sample01.c

 

6. 生成されたモジュールを、apacheのモジュールフォルダにコピー

cp .libs/mod_sample01.so  /etc/httpd/modules/

 

7. apacheの設定ファイルを修正し、生成したモジュールを一番最初に読み込むようにする

#                                                                                                                                   
# Dynamic Shared Object (DSO) Support                                                                                               
#                                                                                                                                   
# To be able to use the functionality of a module which was built as a DSO you                                                      
# have to place corresponding `LoadModule' lines at this location so the                                                            
# directives contained in it are actually available _before_ they are used.                                                         
# Statically compiled modules (those listed by `httpd -l') do not need                                                              
# to be loaded here.                                                                                                                
#                                                                                                                                   
# Example:                                                                                                                          
# LoadModule foo_module modules/mod_foo.so                                                                                          
#                                                                                                                                   

LoadModule sample01_module modules/mod_sample01.so                                                                                 
Include conf.modules.d/*.conf


 

8. apache再起動