Linuxのfreeコマンドの見方

Linuxにメモリの空き容量を確認する「free」というコマンドがあるのですが、その見方について書いておきます。CentOS6での表示を理解していたら、CentOS7およびubuntu18.04では表示のされ方が違いました。

まずCentOS6でfreeコマンドをしたときの表示は以下です。単位はバイトで表示されています。

このサーバーはメモリが1ギガなので「Mem:」行のtotalを見ると、1019792バイトとなっています。

この1ギガバイトの内訳は以下です。
used(837576) + free(182216) = total(1019792)

空きメモリ(free)が182216バイトしかないように見えますが実際に使用できる空きメモリは「-/+ buffers/cache:」行にある855772バイトになります。

この実際に使用できる空きメモリの内訳ですが以下です。
free(182216) + buffers(152184) + cached(521372) = 「-/+ buffers/cache:」のfree(855772)

buffersとcachedってなんだ?ってことですが、buffersもcachedもディスクIOを低減するためのいわゆるバッファとキャッシュです。buffersがブロックデバイス用、cachedが通常ファイルのようです。名前の通りbuffersがバッファでcachedがキャッシュかと思っていたら違うみたいです。ブロックデバイス用のバッファ/キャッシュがbuffersで、通常ファイルのバッファ/キャッシュがcachedみたいです。いずれにせよbuffersとcachedに使われている領域はメモリが足りなくなったらOSが解放して使用できる領域なので、ここに割り当てられている分はfreeとみなして良いことになります。

ちなみにfreeコマンドに「-m」オプションをつけるとメガバイト単位での表示になります。どちらかというとこちらのほうが見やすいです。

上の2つの結果は同じ状態のものなのですが、このサーバーの実際に使える空きメモリは835メガバイトということになります。

なお「Swap:」行にも値がありスワップが発生しているのか?と思うのですが、メモリ全体に対してわずかな値なら気にしなくて良いようです。OSがよっぽど使わない分をディスクに追いやってるっぽいです。

次に、CentOS7およびubuntu18.04でfreeコマンドを実行したときの表示です。

「-/+ buffers/cache:」行がなくなって「Mem:」行だけの表示になりました。このサーバーもメモリは1ギガなので「Mem:」行のtotalを見ると、1014180バイトとなっています。

この1ギガバイトの内訳は以下です。
used(143772) + free(127524) + buff/cache(742884) = total(1014180)

CentOS6のときの考え方からすると、free(127524) + buff/cache(742884) = 870408バイトが空きメモリとして使える容量になるのですが、そうではないみたいです。新しいfreeコマンドにはavailableという列があり、こちらの値を空きメモリ量として見るようです。この場合では689392バイトになります。どういうことかと言うと、バッファとキャッシュは解放して良いメモリではあるものの即時で解放すると困る分もあり(まさに今、使っているものがあるということだろう)、それを考慮して本当に使えるメモリ量をavailableに表示しているようです。正直、availableの算出方法はよくわかりませんでしたが・・。

ただそうやって考えると、CentOS6のときのfreeコマンドで表示された「-/+ buffers/cache:」のfreeの値については、この値より少し少なめに見積もった値が本当のメモリの空き容量なのかな?とも思いました。まぁ、だいたいの量が分かれば良いのだけれど。

今後、availableについてもう少し理解できたら追記します。

Apacheのバーチャルホストを設定した時の直IP接続を拒否する方法

Apacheにバーチャルホストの設定をすると複数のドメインでの運用ができるようになります。ただユーザーがドメインではなくIPアドレスを直に指定してApacheにアクセスした場合、バーチャルホストの一番最初に記載されている設定が有効になります。

具体的な例で説明します。1台のWEBサーバーで www.example.com と www.hogehoge.com の2つのサイトを運営していたとします。このWEBサーバーのIPのアドレスが 192.168.1.28 だった場合、ユーザは以下のURLでアクセスができます。

http://www.example.com/index.html
http://www.hogehoge.com/index.html
http://192.168.1.28/index.html

このときのApacheのバーチャルホストの設定が以下であった場合、

<VirtualHost *:80>
  ServerName www.example.com
  :
</VirtualHost>

<VirtualHost *:80>
  ServerName www.hogehoge.com
  :
</VirtualHost>

「http://192.168.1.28/index.html」でアクセスしたリクエストには www.example.com のWEBページが表示されます(バーチャルホストの設定の先に書かれている方が有効になる)。もし www.example.com と www.hogehoge.com がまったく関係のないWEBページで、ユーザーが www.hogehoge.com を見たくてアクセスしたとしたら別のWEBページが表示されてびっくりするかもしれません。またバーチャルホストを設定して複数のWEBページを運営していることがユーザーに知られてしまいます。

ではどうするかと言うと、IPアドレスでアクセスしてきたユーザーには該当するページがないというエラーを表示させるようにします。そもそもIPアドレス直指定でアクセスするユーザーはほとんどいないと思いますが・・。

バーチャルホストの設定の最初に404へのリダイレクトの設定を追加します。以下のような感じです。

<VirtualHost *:80>
    ServerName dummy
    Redirect 404 /
</VirtualHost>

<VirtualHost *:80>
  ServerName www.example.com
  :
</VirtualHost>

<VirtualHost *:80>
  ServerName www.hogehoge.com
  :
</VirtualHost>

これでIPアドレスでアクセスしてきたユーザーにエラー画面を表示させることができます。

なお、このバーチャルホストの設定は ubuntu 18.04 LTS の Apache2(ver.2.4.29)で確認していますが、CentOS の httpd でも動作すると思います。

[広告]

= = = = = = = = = =
2021/3/7追記
2021/4/29加筆
= = = = = = = = = =
https(SSL通信)でも同じかと思い設定してみたのですが

<VirtualHost *:443>
    ServerName dummy
    Redirect 404 /
</VirtualHost>

こうすると今まで表示できていたページが表示できなくなりました。静的ページ(.html)は問題ないようですが動的ページ(.php、.cgi)が表示できません。エラーコード : SSL_ERROR_RX_RECORD_TOO_LONG らしいです。「SSL received a record that exceeded the maximum permissible length.」ともあります。

既存のページが表示されなくなってしまったので、この方法はSSL通信では使えそうにないです。他の解決法がないか調べてみたのですが良さそうなものは見つけられませんでした。

ここで終わるのも申し訳ないので(苦肉の策になりますが)専用のエラーページを設ける方法を書いておきます。

index.htmlというファイル名でエラーページを作成します(エラーページの記載は何でも良いです)。


<!DOCTYPE HTML>
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>Not Found</TITLE>
</HEAD>
<BODY>
不正なページアクセスです。
</BODY>
</HTML>

これを任意のディレクトリに格納します。今回は /var/www/html/dumy の配下にします。バーチャルホストの設定として以下を追記します。

<VirtualHost *:443>
    DocumentRoot /var/www/html/dumy
    ServerName (IPアドレス):443
</VirtualHost>

この443のバーチャルホスト設定はssl.confの一番下に追記してください。80のバーチャルホスト設定は一番上でしたが443は下です。

「https://IPアドレス」でサイトにアクセスしてみます。ブラウザによっては警告のページが表示されます。これはエラーページのサーバー証明書を用意していないからです。以下はFirefoxの例です。

詳細情報を表示すると SSL_ERROR_BAD_CERT_DOMAIN と記載されています。

これでユーザーがアクセスを諦めてくれれば良いですが無理やり続行(危険性を承知で続行)することも可能です。続行した場合は以下のエラーページが表示されます。

なお左上の赤枠ですが、ここにはファビコンが表示されます。エラーページ用のファビコンも用意したほうが良いでしょう。