Apacheについて


# はじめに
[初めてのWebサーバ「Apache」CentOS 7編 (NextPublishing)](https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEWeb%E3%82%B5%E3%83%BC%E3%83%90%E3%80%8CApache%E3%80%8DCentOS-7%E7%B7%A8-NextPublishing-%E5%A4%A7%E6%B4%A5-%E7%9C%9F-ebook/dp/B072BY2PPJ/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=apache&qid=1597420690&sr=8-3)
を読んたのでメモ

# HTTPメッセージ
1行とは行末がCRLFまで

## リクエストメッセージ
リクエストライン
リクエストヘッダ
< CRLF >
メッセージボディ


## レスポンスメッセージ
ステータスライン
レスポンスヘッダ
< CRLF >
メッセージ ボディ

**HTMLの中身なんかはメッセージボディにはいっている**


# モジュール
* 静的モジュール
  - コンパイル時に組み込まれているもの
  - httpd -l　で確認
* 動的モジュール
  - DSOの仕組みによって動的に組み込まれるもの
  - /usr/lib64/httpd/modules
  - httpd -M で確認


# apacheの設定ファイル
* メイン /etc/httpd/httpd.conf
* /etc/httpd.d/機能別の設定ファイル。モジュール毎に設定ファイルがあったり

## /etc/httpd/conf.modules.d/
* 必要なモジュールをロードするための設定ファイル

# ディレクティブ
* ServerRoot
  - Aapacheの設定ファイルの起点

```
# Do NOT add a slash at the end of the directory path.
#
ServerRoot "/etc/httpd"
```

* ServerAdmin
  - 管理者のメールアドレス

* ServerName
  - ホスト名:ポート番号

* AddDefaultCharset UTF-8
  - HTMLファイルの設定にかかわらず**レスポンスヘッダにUTF8が強制的に設定**される
  - **Webブラウザはレスポンスヘッダの文字コードでHTMLを表示使用とするので、異なる文字コードで書かれたものがあれば、文字化けしてしまう**

* DirectoryIndex
  - ファイルとしてではなくディレクトリがアクセスされた場合に表示されるファイルの指定

ディレクティブの後ろにコメントはできない

# MPM
apacheの動作モードを指定するモジュール

* preforkMPM
  - マルチプロセス
* workerMPM
  - マルチスレッド
* eventMPM
  - apache2.4から
  - 動作しないモジュールなどあるらしい
　- **Cent7のリポジトリにあるデフォルト**

https://ts0818.hatenablog.com/entry/2015/09/23/191335
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/apache-mpm-prefork-worker-event/


```
httpd -M  | grep mpm
 mpm_prefork_module (static)
```

# Apacheのアクセス制限と機能制限
セクションごとに**アクセス**と使える**機能**を限定する

# ディレクティブの有効範囲
**有効範囲はセクションと呼ぶ。下記ディレクティブを使用して、セクションを作成することで、ディレクティブの有効範囲を指定したディレクトリやファイルに限定させる**

* \<Directory>
  - ディレクトリが対象

* \<Files>
  - ファイルが対象
* \<Location>
  - URLに記述されたパスを対象にする


有効範囲を指定したディレクトリやファイルに限定することができる


## Optionsディレクトリでセクションごとに機能を限定する
**機能の許可設定**

いろんなOptions設定
http://bashalog.c-brains.jp/10/11/16-121901.php

**Optionsディレクティブを記述しないとALLが指定されているとみなされ、全ての機能が許可される**

Apache 2.4
/の設定

```
<Directory />
    AllowOverride none
    Require all denied
</Directory>
```


セクションディレクティブの内部で使用可能な機能を限定する



* FollowSymLinks
  - シンボリックリンクをによる対象セクションへのファイル参照を許可する。
* -Indexes 
  - ディレクトリの一覧が表示される// 普通削除する


## 下位のディレクトリで設定を変更したい場合
上位のディレクトリのOptionsディレクティブのオプション設定は、下位のディレクトリにそのまま引き継がれます。下位のディレクトリで設定を変更したい場合、すべてのオプションを記述してもかまいませんが、上位のディレクトリの設定に機能を加えたい、あるいは削除したいといった場合には、オプションの前にそれぞれ「+」、「-」を記述します。

## IPアドレスによるアクセス制御
**Requireディレクティブ **を用いる

旧バージョン　2.4前

```
Order allow,deny
Allow from all
```
新バージョン　2.4から

```
Require all grant 
```

https://qiita.com/ngyuki/items/779ea21eec2ae6c450d5
http://www.y2sunlight.com/ground/doku.php?id=apache:2.4:acd


## .htaccess(ディレクトリ毎の設定ファイル)
* .htaccess = アクセスコントロールファイル
* アクセスのたびに読み込まれるので再起動はいらない
* 目的のディレクトリに.htaccessを置いてこれにディレクティブを書いてこのディレクトリ以下に対して有効な設定をいれる
* AllowOverride None
  - .htaccessによる設定の無効
  - .htaccessがあっても無効
 
**対象のディレクトリに書き込み権限のあるユーザーであればそのディレクトリに関するapacheの設定ができる**

* それ以外にも一部許すなどの設定がある
  - AllowOverride Options //optionsの設定のみを許可

* **.htaccessでアクセス制御する場合、AllowOverride Limitを設定していないといけない** .htaccessでrequireを使いたい場合


# CGI 
## CGIとは
* 動的なコンテンツを静止絵うするための仕組み。
  - リクエスト -> webサーバー -> CGIプログラム

* CGIプログラムが、リクエストを元に動的なコンテンツを生成。
  - クライアントからの入力を受け付けられるようになった

* CGIはインターフェースを規定するもの。Webサーバー上で動作するものならどのような言語でもある。
  - php perl python など

**ファイルを配置しただけで動くので、ちょっとした動的なサイトを作るならCGIを利用することが多い**

## CGIの問題点
開発言語の問題、性能の問題.

大規模な開発に向いていない言語。
アクセス数が多くなると、プロセスを起動するので、プログラムの起動処理が多くなり、重くなる

## FastCGI
https://www.xserver.ne.jp/manual/man_server_php_fastcgi.php

「FastCGI」とは、プロセス初回実行時に該当プロセスを一定時間サーバー内に保持することで、次回以降、実行時の「プロセスの起動/終了」を省略し、 高速化や、プロセスの起動/終了に伴うCPUへの負荷を軽減することで、速度面で優れるとされるモジュール版PHPと同等の処理能力を持つ動作方式です。

一度「プロセスの起動」をすると、一定時間は「プロセスの終了」を することなく起動し続けることで、処理時間の大幅な短縮と、プロセスの起動/終了に伴うCPUへの負荷を軽減します。

## CGIを使う時
CGIのメリットなど
https://tutorial.perlzemi.com/blog/20190328085626.html



## ApacheでのCGI
* centosでは/var/www/cgi-bin
* デフォルトでOptions noneなので、実行できない。ExecCGIでCGIの実行を許可するように変更する
* Webブラウザからは「http://ホスト名/cgi-bin/プログラム名」としてアクセスできるようにしています。

apacheのcgi実行担当モジュール
mod_cgi
mod_cgid

/var/www/cgi-bin以外でのcgi実行許可

AddHandler cgi-script .cgi

# SSI
* HTMLのコメント（<--と-->で挟まれた領域）の中に、#include file="ファイルの位置" といった形式の内容を記述することにより、指定したファイルの内容を読み込んでコメントと置き換えてくれる。コメントは削除され、Webブラウザ側には送られない。
* 指定したプログラムを起動して処理結果を挿入する（#exec）、サーバの環境変数を挿入する（#echo）、条件によって呼び出す内容を変更する（#if）などに対応していることが多い。




CGIの実行結果を埋め込む
<!--#execcgi="CGIプログラムのパス"-->


.shtmlが通常SSIのHTMLファイルとして扱う


CGIよりモジュールのほうが高速



# アクセスログの解析
AWStats

# Apacheのチューニング設定
## 前提
1クライアントからの1アクセスでhtml内の画像、CSS、Javascriptファイルなどに対していくつもサーバーにリクエストを投げるが、それを処理するのはクライアントとコネクションを張った1つのhttpdプロセス。

https://h50146.www5.hpe.com/products/software/security/icewall/iwsoftware/report/keep_alive.html


# MaxKeepAliveRequests
* 接続してから切断するまでに受け付けるリクエストの数
* デフォルトは100
* 1ページ当たりの平均的なファイル数＋α程度を設定

https://www.atmarkit.co.jp/ait/articles/0207/23/news002_2.html

# KeepAliveTimeout
接続しているセッションからのリクエストが来なくなってから切断するまでの待ち時間

# MaxClient,MaxSpareServers,MinSpareServers,StartServers
https://software.fujitsu.com/jp/manual/manualfiles/M060041/B1WN7141/02Z200/ihs01/ihs00006.htm