hysryt / wiki

https://hysryt.github.io/wiki/
0 stars 0 forks source link

Apache httpd #167

Open hysryt opened 3 years ago

hysryt commented 3 years ago

Ubuntuでインストール

$ apt update
$ apt install apache2
hysryt commented 3 years ago

有効になっているモジュールの確認

apache2ctl -M
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_event_module (shared)
 negotiation_module (shared)
 reqtimeout_module (shared)
 setenvif_module (shared)
 status_module (shared)

authn : authentication(認証) authz : authorization(認可)

hysryt commented 3 years ago

サーバーの起動

$ service apache2 start
$ pstree -a
bash
  `-apache2 -k start
      |-apache2 -k start
      |   `-26*[{apache2}]
      `-apache2 -k start
          `-26*[{apache2}]

StartServersに2が指定されているため、2つの子サーバープロセスが起動している。 {}で囲われているのはスレッド。 ThreadsPerChildに25が指定されているためメインスレッド + 25スレッドの合計26スレッドがある。

https://www.ipa.go.jp/security/awareness/vendor/programmingv1/b07_04.html forkしたプロセスはファイルディスクリプタも複製するため、このプロセスが直接クライアントと通信する。

つまり子プロセスはすべて80番ポートを使って通信する クライアントを識別する処理が必要? 通信が来た段階でクライアントごとのファイルディスクリプタが生成される? acceptシステムコールを使用し、通信が来たら新たにソケットを作成するとのこと

UNIXには他プロセスにファイルディスクリプタを渡す機能があるらしい? https://qiita.com/MoriokaReimen/items/5c4256ef620499a88bb3#comment-77b6070dba93c48ab748

hysryt commented 3 years ago

http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0950/03Y1830D/EY180028.HTM

hysryt commented 3 years ago

MPM(マルチプロセッシングモジュール)

リクエストの処理方法

prefork

1リクエストにつき1プロセスが動作する。 プロセスは予め確保しておく。 スレッドセーフでないプログラムを扱うことができる。 mod_phpはpreforkで動かす必要がある?(mod_phpがマルチスレッドに対応していない?) https://rikuga.me/2017/12/14/nazo-php-fpm-multi-thread/

worker

1リクエストにつき1スレッドが動作する。 スレッドは予め確保しておく。

event

イベント駆動? apache2.4以降のデフォルト?

https://qiita.com/esparrago_b/items/4f368599aba1a059dbd1

確認方法

$ apache2ctl -V | grep 'Server MPM'
Server MPM:     event
hysryt commented 3 years ago

CGI

MPMがpreforkの場合は mod_cgi 、workerまたはeventの場合は mod_cgid を使用する。 マルチスレッドのプロセスをforkするのは負荷が高い(スレッドを全て複製してしまう)ため、 mod_cgid ではCGI実行用のデーモンを別で一つ動作させている。

$ a2enmod cgi # preforkの場合
$ a2enmod cgid # worker, event の場合

apache.conf

AddHandler cgi-script .cgi
<Directory /var/www/>
  Options +ExecCGI
</Drectory>
hysryt commented 3 years ago

FastCGI

mod_fcgid

fcgid-scriptハンドラを設定されたプログラムはFastCGIプログラムとして実行され、 そのプロセスは次回以降のリクエストにも使いまわされる。 同時リクエスト数に応じて同じプログラムが複数実行されることもある。

$a2enmod fcgid

apache.conf

AddHandler fcgid-script .cgi
<Directory /var/www/>
  Options +ExecCGI
</Drectory>

ディレクティブ

ディレクティブ 説明 初期値
FcgidMaxProcesses 同時に実行する最大プロセス数 1000
FcgidMaxProcessesPerClass プロセスクラス?ごとの最大プロセス数 100