サーバー・ミドルウェアまとめ

# サーバー・ミドルウェア
サーバー・ミドルウェアの分野で学んだことをまとめていきます。

## ファイルシステム
記憶装置に保存されたデータを管理し、操作するために必要なOS機能のことをファイルシステムという。

### ファイルシステムの種類と特徴
|名前  |特徴  |
|---|---|
|ext4  |Linuxのデファクトスタンダード  |
|ntfs  |Windosのファイルシステム  |
|xfs  |CentOS7のデフォルト  |
|fat  |デジカメなどでよく使われるファイルシステム  |
|ISO9660  |CD-ROMで使われるファイルシステム  |
|udf  |DVDで使われているファイルシステム  |

### ファイルシステムの作成

```
mkfs -t ext3 /dev/sda5
```

### パーティション
記憶装置を利用するにはディスク上にパーティションを作成し、パーティション内にファイルシステムを作成する。
そして、パーティションとは、いくつかに区切ったディスクの領域のことで、Linuxでは、一般的に1つのディスクをいくつかの領域に分けて扱う。

**デバイスファイル**
Linuxではハードディスクをはじめとする、あらゆるデバイスをファイルとして扱えるようになっている。
デバイスファイルとはデバイスを表すファイルのことで、/dev以下に配置される。
デバイスファイルは生成する必要がなく、udevという仕組みで自動で生成される。

|デバイスファイル  |説明  |
|---|---|
|/dev/sda  |1番目のハードディスク  |
|/dev/sda1  |1番目のハードディスクの1番目の基本パーティション  |
|/dev/sda2  |1番目のハードディスクの2番目の基本パーティション  |
|/dev/sda3  |1番目のハードディスクの3番目の基本パーティション  |
|/dev/sda4  |1番目のハードディスクの4番目の基本パーティション  |
|/dev/sda5  |1番目のハードディスクの1番目の論理パーティション  |
|/dev/sda6  |1番目のハードディスクの2番目の論理パーティション  |
|/dev/sdb  |2番目のハードディスク  |
|/dev/sdc  |3番目のハードディスク  |


**基本パーティション**
基本的に4つに分けられる。これを基本パーティションという。

**拡張パーティション**
基本パーティションのうち1つだけは、拡張パーティションに変更でき、論理パーティンションとして扱える。

**コマンド**

```
# 1番目のハードディスク/dev/sdaの操作
fdisk /dev/sda
```


## i-node
ファイルはi-nodeで管理されていて、i-nodeにはファイルの属性情報が格納されている。
ファイル、ディレクトリともにi-nodeテーブルの1エントリが使用され、1:1で管理される。
i-nodeに保存される情報は、

- inode番号
- ファイルの長さ
- デバイスiD
- ファイルパーミッション
- 最終inode更新時(ctime)、最終ファイル更新時(mtime)、最終参照時(atime) を示すタイムスタンプ群
などです。

### ハードリンク
1つのiノードに複数のファイル名をリンクさせること。
元のファイルと同じi-node番号になる。

```
ln 元のファイル 作成するリンクファイル
```

### シンボリックリンク
ファイルに別名をつけること。元のファイルと異なるi-node番号になる。


```
ln -s 元のファイル 作成するリンクファイル
```

### コマンド

```
# 現在のiノード領域の使用状況を確認する
df -i
ファイルシス            Iノード I使用   I残り I使用% マウント位置
/dev/mapper/centos-root 8785920 92599 8693321     2% /
devtmpfs                 124884   330  124554     1% /dev
tmpfs                    127185     1  127184     1% /dev/shm
tmpfs                    127185   349  126836     1% /run
tmpfs                    127185    13  127172     1% /sys/fs/cgroup
/dev/sda1                512000   328  511672     1% /boot
none                       1000     0    1000     0% /vagrant

# ファイル・ディレクトリのiノード番号の確認
ls -li
17877331 drwxr-xr-x 2 root    root     6  4月 24 22:46 cgi-bin
34979807 drwxr-xr-x 5 vagrant vagrant 79  6月  1 20:52 html
34347652 drwxr-xr-x 2 vagrant root    23  5月 19 16:27 htmlNginx
51682070 drwxr-xr-x 2 root    root    22  5月 12 16:20 icons
```


## mount
mountとは、ディレクトリツリーに他のファイルシステム(記憶媒体)を追加すること。/mntもしくは/mediaにマウントすることが多く、記憶媒体はマウントすることで読み込み書き込みができるようになる。

### コマンド
```
# マウントを実行
sudo mount /dev/sdb数字 /mnt

# アンマウントを実行
sudo unmount /mnt

# どのデバイスがどこにマウントされているかの確認
df -Th
ファイルシス            タイプ   サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root xfs        8.4G  2.0G  6.5G   23% /
devtmpfs                devtmpfs   488M     0  488M    0% /dev
tmpfs                   tmpfs      497M     0  497M    0% /dev/shm
tmpfs                   tmpfs      497M  6.5M  491M    2% /run
tmpfs                   tmpfs      497M     0  497M    0% /sys/fs/cgroup
/dev/sda1               xfs        497M  119M  379M   24% /boot
none                    vboxsf     113G  103G  9.9G   92% /vagrant

# 一般ユーザーでもマウントができるようになる
mount -o uid=<ユーザID>,gid=<グループID> /dev/sdb1 /mnt

# マウント情報の設定
/etc/fstabに以下のように記述する
/dev/sdb5 /mnt/diskA ext4 defaults 0 0
第四フィールドはマウントオプション
第五フィールドはdumpコマンドがダンプする必要があるかを記述
第六フィールドはfsckが実行順序を決定するための参照
```


## サービス
マシン上に動いている常駐のプログラムのこと。デーモンとも呼ばれる。
具体的なサービスとして
・httpd
・sshd
・mysqld
などがある。

### サービスに関するコマンド
LinuxのCentOS7以降は、Linuxの起動処理やシステム管理を行うsystemdでサービスの管理を行い、以下のコマンドを使用する。
また、CentOS6以前はservice、chkconfigコマンドを使用する。

CentOS7

```
起動
systemctl start サービス名

停止
systemctl stop サービス名

再起動
systemctl restart サービス名

状態の確認
systemctl status サービス名
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: active (running) since 日 2019-06-23 17:58:43 JST; 9s ago
     Docs: man:httpd(8)
           man:apachectl(8)

自動起動の設定
systemctl enable サービス名.service

自動起動の解除
systemctl disable サービス名.service

自動起動の一覧表示
systemctl list-unit-files -t service
firewalld.service                           enabled
getty@.service                              enabled
gssproxy.service                            disabled
halt-local.service                          static
htcacheclean.service                        static
httpd.service                               enabled
```

CentOS6

```
起動
service httpd start
もしくは
/etc/init.d/httpd status

ステータス
service httpd status

自動起動
chkconfig apache2 on

自動起動設定の確認
chkconfig
```


### ランレベル
ランレベルとは、Linux OSの動作モードのこと。
ランレベルごとに起動するサービスを設定できる。


|ランレベル  |意味  |内容  |
|---|---|---|
|0  |停止  |シャットダウンを実行する  | 
|1  |シングルユーザー  |rootのみでログインできるようになる  |
|2  |未使用/ユーザー定義可能  |NFSなしのマルチユーザーモード  |
|3  |マルチユーザー、ユーザー定義可能  |マルチユーザー、コンソールログインのみ  |
|4  |未使用/ユーザー定義可能  |未使用/ユーザー定義可能  |
|5  |ランレベル3 + Xディスプレイマネージャ起動  |ランレベル 3 + Xディスプレイマネージャ起動  |
|6  |リブート  |再起動  |



**コマンド**
CentOS6以前とCentOS7以降でランレベルのコマンドが異なる。

```
# CentOS6
# 現在のランレベルの確認
runlevel
N 3

# 特定のサービスのランレベルを確認
chkconfig --list httpd


# サービス毎のランレベルの変更
方法は2つある。
1, サービスのスクリプトを編集し、ランレベルを変更する
例えばhttpdのランレベルを変更したい場合は、/etc/init.d/httpdファイルのchkconfig行を変更する。

2, chkconfig -level 数字 サービス名 on/off


# CentOS7
# 現在のランレベルの確認
systemctl get-default
multi-user.target

# 一時的にランレベルを変更する
systemctl isolate ランレベル.target　もしくは　/sbin/init
ランレベルは
0: poweroff
1: rescue
3: multi-user
などが入る。

# 設定ファイル
/etc/systemd/system/defeault.target


```

### サービスが立ち上がる流れ
CentOS6以前では以下のような流れになっている。
1,initプロセスが立ち上がる
2,initプロセスが/etc/inittabファイルを読み込む
3,どのランレベルでOSを起動するかを確認
4,initは/etc/rc数字.d/を見に行き、起動するランレベルでonになっているサービスを立ち上げる
5,サービスが立ち上がる





## 時刻設定
NTPとTime Protocolの2つがある。
Time Protocolはネットワーク間の時間補正ができず、古典的な方法なので、今回はNTPのみを説明する。

### NTPとは
ネットワークを通じて正しい現在時刻を取得するためのプロトコル。Time Protocolとは異なり、通信時間の補正がされる。
また、ポートは123番が使われ、パケットはUDPが使用される。

### ハードウェアクロックとシステムクロック
ハードウェアクロックは、マザーボード内に内蔵されており、シャットダウンされ、システムが停止された後も可動し続ける。精度が高いわけではないので、定期的にntpサーバーと同期したあとのシステムクロックと同期する必要がある。
システムクロックは、Linuxがカーネル内部に持っている時計であり、OSの画面上で見るのはこの時刻。


**コマンド**

```
# ハードウェアクロックの表示
sudo hwclock
2019年06月23日 17時18分46秒  -0.172014 秒

# ハードウェアクロックをシステムクロックへ同期する
sudo hwclock --hctosys


# システムクロックの時刻をハードウェアクロックへ定期的に同期する
/etc/crontabに
0 5 * * 0 root /sbin/hwclock --systohc > /dev/null 2>&1
を記述する

# システムクロックの時刻を表示
date
2019年  6月 23日 日曜日 18:05:49 JST

# システムクロックの時刻を設定
date 時刻


# ntpサーバから時刻を取ってくる
ntpdate

# 徐々に時刻の修正を行う
ntpdate -B

# 即座に時刻の修正を行う
ntpdate -b
* 時刻がずれることがあるため、即時反映は基本的にしない。

```


**ntpサーバの構築**
ntpサーバを構築するには、ntpdデーモンをインストールする。
設定ファイルは/etc/ntp.confになる。


**タイムゾーン**
地域ごとに時刻が異なるので、日本の時刻を設定する必要がある。地域ごとの時刻をタイムゾーンという。

```
# タイムゾーンの変更
ln -sf /usr/share//zoneinfo/Asia/Tokyo /etc/localtime
/usr/share/zoneinfoに各地域の時刻の設定ファイルがあり、それを/etc/localtimeにシンボリックリンクする。

# サーバの再起動時にタイムゾーンがUTCに戻らないための対応
/etc/sysconfig/clock以下に
ZONE="Asia/Tokyo"
UTC=false
を記入。
```

**ntpの階層構造**
ntpはストラタムと呼ばれる階層構造である。
ntpはサーバが1から16まで存在し、数字が小さいものほど正確な時刻を刻む。
ntpは複数のサーバと同期をとることで、突発的な通信遅延の変化などにも対応できる。

![ntp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148935/cd6c9a37-de5b-5e5b-7c49-3e437f166294.gif)
参照: https://www.infraexpert.com/study/tcpip25.html


## 言語設定
言語と地域の設定をロケール設定と言う。
Linuxでは環境変数「LANG」と「LC_*」で指定ができる。
例えば、日本の日本語の文字コードUTF-8の場合、「ja_JP.UTF-8」となる。


### 言語設定に関するコマンド

```
# 現在のロケールの確認
locale

LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```
例えば、LC_TIMEは月の名前、曜日、一般的な完全表示や短縮表示など、日付や時刻の書式を表す。


```

# 設定可能なロケールの一覧を確認
locale -a

iw_IL.iso88598
iw_IL.utf8
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
ka_GE
```

```
# 現在のロケールの確認
localectl

System Locale: LANG=ja_JP.utf8
    VC Keymap: de
    X11 Layout: de

# ロケールを日本語に設定する場合
localectl set-locale LANG=ja_JP.utf8

# ロケールの設定ファイル
/etc/locale.conf`
```

例えば、manページを日本語にしたい場合は以下のことをする。
1,LANGを日本語にする
2,日本語のmanページをインストールする
3,PATHを通す。
* LANGを日本語にしただけでは、manページは日本語にならない。

## ApacheとNginxの違い
webサーバを比較しました。

### Apacheの特徴
- モジュールを入れて拡張する
    -  MPM(マルチプロセッシングモジュール)の種類を変更可能。

**MPMの種類**

|MPM  |特徴  |
|---|---|
|worker  |リクエストはスレッドが処理する。マルチプロセス、マルチスレッドに対応していて、各プロセスに対し決められたスレッドを用意する。スレッド動作はリソースあたりの処理能力がプロセスよりも高くなる。  |
|prefork(デフォルト)  |事前にhttpd子プロセスをいくつか生成してクライアントからの要求を処理する。マルチスレッドでは動作しない。  |
|event  |wokerのようなマルチスレッド処理に加え、Keep-Aliveリクエストの処理に、コネクションを処理するスレッドとは別のスレッドを割り当てることができる。そして、ApacheはクライアントとのネットワークI/Oだけしかイベント駆動できない。  |


### Nginxの特徴
- リバースプロキシ機能で使われることが多い。
    - クライアントとwebサーバの間に立って、リクエストを代理で処理する
- 軽量データの大量配信に使われる。



### 主な違い
|特徴  |Apache  |Nginx  |
|---|---|---|
|駆動方式  |マルチプロセッシングモデルのプロセス駆動アーキテクチャ  |シングルスレッドモデルのイベント駆動アーキテクチャ  |
|よく使うAPサーバー  |Passenger(モジュールで拡張できる)  |Unicorn  |

### [WIP]それぞれのメリット、デメリット、使用場面
駆動方式が違うので、それぞれのメリット・デメリットも異なる。
それに応じて使用場面も変わる。

|項目  |Apache  |Nginx  |
|---|---|---|
|メリット  |CPUリソースが多く必要な処理が可能  |少量のプロセスだけで大量のリクエストを処理できる。  |
|デメリット |リクエストが大量に来たときに、プロセスが同時に起動しオーバヘッドが非常に大きくなる  |CPUリソースがたくさん必要な処理には向いていない  |
|使用場面 |アクセス数が少ないとき  |アクセス数が多いとき  |