「Linux」タグアーカイブ

Apache(Webサーバ)のチューニングとベンチマーク

ここでは、Apache HTTP Serverのチューニングとベンチマークに関してまとめます。

Apacheのベンチマーク

Apacheの性能はサーバの性能にも左右されますが、Apacheの設定内容によっても変わってきます。
最近のサーバはそこそこ速くなっているので、デフォルト設定のままでもそこそこ速く動いてくれるのですが、それでもアクセス集中対策を考慮するにはサーバのApacheのチューニングも必要になります。

さて、チューニングの方法は説明する前に、性能測定の方法について説明します。

Apacheの性能測定には、ab(Apache Bench)コマンドを使用します。

色々なサイトでも紹介されていますが、基本的なコマンド操作は以下の様になります。

-n 数値  : リクエストの総数
-c 数値  : 同時接続数

指定したURLに対し「リクエストの総数」分のリクエストを行います。並列して接続するため、「同時接続数」を指定することが出来ます。

試しにabコマンドを叩いてみます。(URLは適当です。)
※絶対に他人のサイトを指定しないでください。DoS攻撃とみなされる可能性があります。負荷試験の一種なので、対象のサーバに高負荷を与えることになります。

ここで注目したいのは、以下の2点です。
Failed requests: 0
Requests per second: 134.39 [#/sec] (mean)

「Failed requests」でリクエストがフェールになった回数をカウントしています。Failが発生しない様に調整する必要があります。

では、調整の仕方を見ていきましょう。

Apacheのチューニング

Apache 2.2系と2.4系ではチューニングの設定が少し異なります。パラメタの名称が一部変更になっているためです。
以下にそれぞれのパラメタ設定例を示します。
ただし、この設定内容は環境により異なりますので、ご自身のサーバ環境によって値を調整してみてください。

Apache2.2系のチューニングパラメタ

Apache 2.2系のチューニング方法を以下に紹介します。今更感はあるのですが、最も効果的な結果が得られたのがこの環境だったので敢えて事例紹介します。

対象ファイル:/etc/httpd/conf.d/httpd.conf

viなどで開いて編集してください。

こちらがデフォルト状態の設定状態です。

こちらが設定変更後の値です。

StartServers1起動時に生成される子サーバの数
MinSpareServers1アイドル状態で待機している
子サーバの最小数
MaxSpareServers5アイドル状態で待機している
子サーバの最大数
ServerLimit10MaxClientsに指定できる上限値
MaxClients10同時接続可能なクライアントの数
MaxRequestsPerChild4000子サーバが処理できる
リクエストの総数

デフォルトの状態では、StartServersが「1」になっていたので、最初の接続に掛かる時間が遅くなる傾向にありそうです。
また、MaxClientsが「10」しかないため同時に処理できるリクエストの数が少なく、こちらも処理が遅くなる傾向にあったようです。
変更後の値に設定し、以下のコマンドでWebサーバを再起動します。

Webサーバの再起動が完了したら、コマンドを実行して動作を確認してみましょう。

主要な内容については以下の通りです。

Failed requests: 0
Requests per second: 601.08 [#/sec]

「Requests per second」の値が134.39→601.08に変化しており、1秒間に処理で来ているリクエストの数が大幅にアップ(約4.5倍)しました。

と、ここで問題です。
MaxClientsを適当にしていしましたが、子サーバ(プロセス)が使用するメモリを考慮して計算しないと、実装メモリよりも多くの子サーバが起動してしまうことになってしまいます。
そうなると、スワップ領域まで達し、最終的にもメモリ不足に陥ることになります。
まず、httpdプロセスがどれ位のメモリを使用しているか?そして、PHPを使用しているならば、PHPの利用するメモリも考慮する必要があります。
実際にサーバ上で動作する際に必要となるメモリ量も気に掛かります。

面倒ですよね。
色々な方が作られている様ですが、MaxClientsを自動計算してくれる仕組みがあります。
その方法について、次に説明を行います。

MaxClientsの自動計算

MaxClientsを自動計算する方法について記載します。
Apache Web Service(Webサーバ)は、並列処理を実現するために複数子サーバを起動して、同時に複数のクライアントから要求されるリクエストに対応します。
その最大値をMaxClientsで指定します。

理論的には、httpd(子サーバ)が利用するメモリとPHPが利用するメモリで1つのクライアントから要求される処理を行うとして、システムのメモリを割ることで値が得られる感じです。
この時、システムでそれ以外に使用するメモリも考慮する必要があり、意外と面倒な計算と情報収集を行うこととなります。

それを自動化してくれる仕組みが以下のサイトにあるスクリプトになります。

https://github.com/richardforth/apache2buddy

apache2buddyを利用してMaxClientsを計算させるには、以下のコマンドを実行し、表示される情報を利用します。

コマンドは以下に記していますが、上記のURLで示されたサイトに記載がありますので(英文ですが)、そちらを参考にされることをお勧めします。(本記事が古くなると使えなくなりますが、上記サイトはメンテナンスされていますので)

重要な箇所は以下の一文です。

Your recommended MaxClients setting (based on available memory) is between 33 and 37. <——- Acceptable Range (10% of MAX)

httpdを再起動した直後などは正確な数値が得られない場合がありますので、本来は24時間程度運用した状態で数値を計算することが望ましいです。

上記の例では、MaxClientsの値として33~37が望ましい値として提示されています。

正直、実験を行ったサーバでは、長時間のヒートランを行っていなかったのでこの値が示されましたが、本来であればもっと少ない値が得られるのではないかと思います。

これを元に、先程示したhttpd.confに記載されている以下の値を調整します。

StartServers
MinSpareServers
MaxSpareServers
ServerLimit
MaxClients
MaxRequestsPerChild

最後に、Webサーバの再起動を行えば設定が反映され安定した動作になると思います。こまめにチェックするというよりも、ある程度時間を空けてチェックすると良いと思います。

apache2buddy以外にも自動計算や手動計算の手法が幾つか紹介されています。
自分に合った方法を見つけることが重要です。
今回の手法は、Linux上での手法となります。Windows上での計算は難しいかな?

CentOS 7 へMariaDB 10.1(最新)をインストール

CentOS 7 + MariaDB 最新版をインストール

2018年3月時点における環境は以下の通り。

CentOS 7.4
MariaDB 5.5

この状況ですと、MariaDBの最新版がインストールされていない状態になっています。
MariaDBには、「Galera Cluster」が提供されておりますが、10.1以降ではデフォルトで組み込まれる様になりました。
つまり、10.0までのバージョンでは個別インストールが必要となります。

また、MariaDBとMySQLのバージョン関係を見てみましょう。


MariaDBバージョン MySQQLバージョン
MariaDB5.5.x MysQl5.5
別途Galera Clusterをインストール。
MariaDB10.0.x Mysql5.6
別途Galera Clusterをインストール。
MariaDB10.1.x Mysql5.7を取り入れ、MariaDB独自機能あり。
Galera Clusterは組み込み済み。

正直、現時点でMySQL 5.5はちょっと古い。5.6もしくは5.7をインストールしたい。
デフォルトのCentOS 7ではMariaDB5.5に対応しており、MariaDB10.xをインストールするには別途独自のインストール設定を行わなければならない。

ジレンマはあるが、後々のことを考えると選択肢は新しいバージョンを適用したい。

MariaDB 10.1.xをインストールする!

旧パッケージの削除

まず、既にインストールされているMariaDB関連のパッケージを確認→削除する。

確認すると、mariadb-libsがデフォルトでインストールされているので、これを削除する。

リポジトリの準備

MariaDBの本家からインストールを行えるようにリポジトリを追加する。

以下のサイトでも紹介されています。

https://mariadb.com/kb/ja/yum/

まずリポジトリの定義を行います。
/etc/yum.repos.d/にMariaDB.repoを作成します。
内容は以下の通りです。

MariaDBをインストール

これでMariaDBをyumでインストールできる。

確認してみます。

これでインストール自体は完了です。

MariaDBの初期設定

MariaDBの初期設定を行います。
インストール直後の設定はほとんど何もされていない状態にあるようです。
そこで、インストール設定を行います。
まず、デフォルトの設定ファイルをバックアップしておきます。
#本家では推奨されているわけではないのですが、気持ち的にオリジナルを無くしてしまうのは気持ち悪いw

バックアップ出来たので、初期設定を行います。

文字コードの設定が行われていない状態なので、設定をします。
以下の項目を追記します。

取りあえず、大まかな設定は済みました。
この後は、MariaDBを起動しMariaDBのセキュア設定を行う。

MariaDBの起動

MariaDBを起動する。

注意!!

2018-06-15時点において、上記の設定方法ではMariaDBが正常に起動できません!

多分、MariaDBのインストーラーがバグっている様に思えます。

こんな感じのエラーが表示されます。更に要求されたコマンドを実行してみます。

対処方法は以下の通りです。

まとめると、こんな感じ。

なんか最初のインストールでゴミが出来てしまうのと、インストールに必要なプラグインが抜け落ちてる感じがします。
それを無理矢理、MySQLのパッケージを削除→ゴミも削除→再度インストール。。。という流れでしょうか?

最後に、MariaDBを再起動時にも起動するように設定するには、以下のコマンドを実行します。

 

セキュリティ設定

セキュリティ設定を行います。

※パスワードは適当に入力してください。

これでセキュリティ設定は完了です。

こんな感じで使えるようになります。

 

 

 

PTP(Precision Time Protocol)を使用した時刻同期

PTP(Precision Time Protocol)を使用してみたくて、試しにやってみた。

PTPを実装するには、本来、PTPに対応したハードウェアである必要があるらしい。

普通に使っているだけならNTPで十分なのですが、諸所の事由から2台にマシンで精度の高い時刻同期を行わせたいことになり、已む無く実装検証を試みることにしました。

さて、上手く行くのか?
試した環境は、これまた諸所の事由によりホストOSとゲストOS・・・つまり、1台のマシンで実装検証(^^ゞ
#意味あるんかいな?

 

Apache DocumentRoot以外のディレクトリをシンボリックリンクで繋げたら、Forbidden 403 エラーの対策

Linux上のApacheでDocumentRoot以外の場所を参照できるようシンボリックリンクで接続したら、Forbiddenと表示されました。

Forbidden
You don’t have permission to access /user_dir/hoge.html on this server.

パーミッションや所有者をApacheに変更してみたり、色々試した結果SELinuxを無効にすることで正常に動作することを確認しました。

Permissiveになっていれば、SELinuxはモニタリング状態でありアクセス制御は掛かっていない状態になっています。

SELinux事態を無効(モニタリング状態)にしておくのは、あまり良いことではありません。

出来ればアクセス制御は正常に行われている状態にすべきです。

アクセスできない原因がSELinuxのアクセス制御に影響されることが確定されたら、以下の操作を行うことでこの問題を解決することが出来ます。

さて、一般にパーミッションの確認などをする際には、ls -laなど個人差はありますがlsコマンドを使います。
SELinuxコンテキストも同じように確認することが出来ます。
コマンドは以下になります。

通常のファイルはこんな感じです。

さてSELinuxコンテキストを変更するには、まず最初に対象となるディレクトリに対して設定を行います。

続いて、対象ディレクトリ内のすべてのファイルとフォルダーに対して設定を反映します。

対象ディレクトリ以下に多量のファイルがあると、時間が掛かる場合があります。
SELinuxを有効にします。
SELinuxの有効化は以下のコマンドを実行します。

最後にブラウザで動作確認を行ってください。

これでもForbiddenが表示される場合は、上記の操作に問題があるか?本当にパーミッションが間違っていないか?確認してください。

ついでに確認方法を記載します。

上記でも記載したとおり以下のコマンドで確認します。

設定が変更されているのが解ると思います。

 

 

 

service iptables save がCentOS 7で出来ない( ゚Д゚)

CentOS 7を使い始めて、iptablesの設定をしようとゴチャゴチャ・・・

# service iptables save
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.

出来ない!systemctl使えって言ってるよ!!

調べてみたら、なんかこんな感じで使える様になるらしいw

無事完了!
結局、コマンドをそのまま使える様に、以下をインストールするだけということですね。

それもあるのですが、centOS 7からfirewalldに移行していますので、なるべくそちらへ移行することが望ましいです。

Azure環境のCentOS 7でOpenVASを使えるようにするための設定

前回までで、取りあえずOpenVASのインストールを行いました。

ここで、Auzre環境を設定しないと接続出来ないことを思い出しました。

以前に提供されていたネットワークの設定で「エンドポイント」を指定するのと同じく、ファイアウォールのポートを解放してあげないと、接続出来ないんですね(^^ゞ

「Virtual Machine」から、今回の仮想マシンを選択し、「パブリックIPアドレス/DNS名ラベル」→「設定」へ進みます。

 

更に、「構成」→「DNS名」を入力します。

これで、ドメイン名の設定が完了します。

ここから、ポートを解放します。

同様に、仮想マシンを選択して、「リソースグループ」→「ネットワークセキュリティグループ」(画面のマークを探してください)を選択します。

「受信セキュリティ規則」を選択すると、以下の画面が表示されます。

「追加」を押して、「受信セキュリティ規則」に必要な項目を追加します。

今回は、HTTP(80)とOpenVASが使用するポート番号(デフォルトで9392)を開放します。

IPアドレスによる制限をする場合等、適宜必要に応じて設定してください。

設定が完了すると以下の様に設定した項目が追加されます。

これで、ポートが開放されましたので、ドメイン名を指定してブラウザで開いてみます。

https://ドメイン名/

開かない場合は、httpdが起動していない可能性があります。
前回の設定を確認してみてください。

更に、OpenVASの画面を開いてみます。

https://ドメイン名:9392
httpではなくhttpsであることに注意してください。
本来ならば、以下の画面が表示されるはず・・・なのですが、残念ながらセキュリティ警告画面が表示されると思います。

ブラウザにより異なりますので詳細は記しませんが、表示された画面の「詳細設定」などのリンクをクリックして、そこに掛かれている記述を確認しながら無理やりアクセスを行ってください。

場合によっては、セキュリティ例外に登録する必要があります。

すると、ログイン画面が表示されます。

設定したログインIDとパスワードを入力して設定の再開です。

次回はOpenVASの設定方法について更に続けます。

 

OpenVASをAzureのCentOS 7へインストールしてみる!

さてと、今回はAzureのCentOS 7へOpenVASをインストールしてみることにした。

AzureのCentOS 7と言っても、何が変わる訳でもないのだが、rootユーザが使えないだけw

自前でサーバ立てたら、rootユーザ使えるんだけど、今回はお試し気分がテンコ盛り状態なのでAzureで作ることにした。

AzureでCentOSの環境を作る方法については、他のサイトを参考にしてください。(「名前」とかに日本語入れるとデプロイ出来ないっぽいので注意かな?)

ちなみに、Azureで作った環境は、1コア メモリ3.5GBのスタンダードなものです。HDDは30GB程度かな?非常にプアなマシンですw

1.OSの更新

取りあえず、ログインして最初にすることは、環境を新しくしておくこと。

現時点(2016年5月初旬)で作業を行いました。

現在のバージョンは/etc/redhat-releaseを確認することで得られます。

その他、適当に/etc/bashrcや~/.bashrcを書き換えて、自分なりの環境を作っておきます。

2.Apacheのインストール

次に、なんとなくApacheが入っていない様なので、Apacheをインストールしておきます。

こちらもyumでインストールします。

最後に、OS再起動時に自動起動する様に設定する。

以上でApacheのインストールは完了です。
詳細なApacheの設定は省略します。

3.OpenVASのインストール

yumを使ってOpenVASをインストールします。

まずは、リポジトリを登録します。

次にいよいよOpenVASをyumを使ってインストールします。

途中で問い合わせがあるかも知れませんが、基本的に「y」でOKです。

Complete!

と表示されればOKです。

4.OpenVASの設定

OpenVASの設定を行います。

最初に、rsyc使うかどうか聞かれるので、Enter押して次へ。

ここでしばらく更新を待ちます。10分くらいかな?

その後、いきなりこんなメッセージが表示されます。

気にせず「Enter」ですね(^^ゞ

ユーザネームを聞かれます。
adminのままで良いのですが、Azure環境で使用するため、安全のためにデフォルト設定から適当なユーザ名に変更しておきます。
パスワードを入れて次へ。

なんかよく解らないうちにインストールは完了した模様。。。。

一旦、OpenVASのインストールは一旦ここまでにします。

Web画面から設定を行うことになるのですが、その前にAzure環境の設定を行う必要があります。

次回は、その設定方法について記載します。

 

CentOSにRPMforgeリポジトリを追加して、wputをインストールする。

FTPサイトからファイルをダウンロードする際に使うことが出来るwgetの逆で、FTPサイトへファイルをアップする機能でwputという機能がある。

ここでは、CentOS 6.xにおける実装方法を記載します。

他のバージョンについても基本的に同じなのですが、RPMForgeリポジトリだけ異なりますので気を付けてください。

あまりメジャーではないが、ftpでスクリプトを書いてゴチャゴチャするより手っ取りくファイルを転送出来るので便利です。

リポジトリを追加する前に、リポジトリの優先度を指定できるプラグインを追加しておきます。

それを実現するためのプラグインはyum-prioritiesです。

インストール方法について記載します。

<<リポジトリ優先度指定用プラグインのインストールと設定>>

<<RPMforgeリポジトリの追加>>

wputをインストールするには、RPMSearchでRPMをダウンロードしてインストールする方法もありますが、やはりCentOSであればyumでインストールを行いたいと思います。

RPMforgeリポジトリの追加にもyumを使用します。
やり方は、CentOS 6.xに関する方法です。
他のバージョンの時には別のファイルになるので注意してください。

<<wputのインストール>>

やっとインストールする準備が完了しました。

ということで、wputをインストールしちゃいます(^^♪

最後に確認してみましょう。

こんな感じでバージョンが表示されれば完成です。

使い方は至って簡単です。

wgetにも色々なオプションがあります。詳しくはヘルプを参照してください。