24時間365日フルマネージドホスティングサービスのデイーネット

[技術ブログvol.30] EC2サーバのトラフィックをレスポンシブに見る方法

[技術ブログvol.23] AWS EC2サーバのトラフィックを簡単に確認する方法で、サーバのトラフィックをvnstatで確認する方法を紹介しました。
今回は、グラフを「今どきな感じのレスポンシブ」にしてみたいと思います。

example.png

注意

vnstatの導入は完了しているものとします。
vnstatの導入については、[技術ブログvol.23] AWS EC2サーバのトラフィックを簡単に確認する方法を参照して下さいね。

vnstat-phpの導入

結論からいうと、今回はvnstat-phpというアプリをインストールするだけです。
[技術ブログvol.23] AWS EC2サーバのトラフィックを簡単に確認する方法で自作したHTMLをレスポンシブなものに改修してもいいですが、いい感じのグラフにしてくれるvnstat-phpを使うことにします。

サーバの準備

サーバはAWS上で「Centos6 with hvm (ami-13614b12)」を使います。
インスタンスタイプは、t2.microにしています。

サーバ環境の準備

vnstat-phpは、GitHubで公開されていますが、サーバ要件(Requirement)の記載がありません。
色々と試した結果、以下が必要になることが分かったので、予めインストールしておきます。

# yum -y install gcc gcc-c++ git
# yum -y install php-pear php-devel httpd-devel libicu libicu-devel
# pecl install intl

PHPはPHP 5.3.3がインストールされます。

intl拡張モジュールのインストールが完了すると、下記のメッセージが出ますので、php.iniにextension=intl.soの1文を追加しておきましょう。

configuration option "php_ini" is not set to php.ini location
You should add "extension=intl.so" to php.ini

ついでに「date.timezone = "Asia/Tokyo"」も追記しておきます。

GitHubからの導入

それでは、vnstat-phpをgitでインストールしていきます。
Apacheの設定はデフォルトのままなので、ドキュメントルートである/var/www/htmlにダウンロードします。

cd /var/www/html/
git clone https://github.com/DASPRiD/vnstat-php.git

コードの修正

要件の記載が無かったので、最初は気が付きませんでしたが、vnstat-phpはPHP5.4以降を想定して書かれています。
しかし、CentOS6のデフォルトのPHPバージョンは「5.3.3」です。

その為、vnstat-php内で使われている配列の処理がこのままでは動きません。
そこで、vnstat-phpの配列の処理の箇所を「PHP5.3」の記載方法のものに修正します。

修正が必要なファイルは2つあります。

  • vnstat-php/index.php
  • vnstat-php/Vnstat/Database.php

パッチの適用

ファイルを開いて該当箇所を修正してもいいですが、今回はパッチを作成しましたので、パッチの適用で修正を行います。

パッチファイルの作成

下記の内容にてパッチファイルを作成します。

vi vnstat-php53.patch
diff -u -r vnstat-php/index.php vnstat-php53/index.php
--- vnstat-php/index.php 2015-04-30 02:46:55.177345113 +0000
+++ vnstat-php53/index.php 2015-04-30 02:13:48.317353677 +0000
@@ -5,7 +5,7 @@

function formatBytes($bytes)
{
- $units = ['B', 'KiB', 'MiB', 'GiB', 'TiB'];
+ $units = array('B', 'KiB', 'MiB', 'GiB', 'TiB');
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes /= (1 << (10 * $pow));
@@ -15,7 +15,7 @@

function formatBitrate($bytes, $seconds)
{
- $units = ['bit', 'kbit', 'mbit', 'gbit', 'tbit'];
+ $units = array('bit', 'kbit', 'mbit', 'gbit', 'tbit');
$bits = ($bytes * 8) / $seconds;
$pow = floor(($bits ? log($bits) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
@@ -121,22 +121,22 @@

$hours = $database->getHours();

- $receivedData = [
+ $receivedData = array(
'className' => '.received',
- 'data' => [],
- ];
+ 'data' => array(),
+ );

- $sentData = [
+ $sentData = array(
'className' => '.sent',
- 'data' => [],
- ];
+ 'data' => array(),
+ );

$maxBytes = 0;

for ($i = $startHour; $i < 24; $i++) {
$hour = $hours[$i];
- $receivedData['data'][] = ['x' => $i, 'y' => $hour->getBytesReceived()];
- $sentData['data'][] = ['x' => $i, 'y' => $hour->getBytesSent()];
+ $receivedData['data'][] = array('x' => $i, 'y' => $hour->getBytesReceived());
+ $sentData['data'][] = array('x' => $i, 'y' => $hour->getBytesSent());

$maxBytes = max($maxBytes, $hour->getBytesReceived(), $hour->getBytesSent());
}
@@ -144,8 +144,8 @@
if ($endHour !== 23) {
for ($i = 0; $i <= $endHour; $i++) {
$hour = $hours[$i];
- $receivedData['data'][] = ['x' => $i, 'y' => $hour->getBytesReceived()];
- $sentData['data'][] = ['x' => $i, 'y' => $hour->getBytesSent()];
+ $receivedData['data'][] = array('x' => $i, 'y' => $hour->getBytesReceived());
+ $sentData['data'][] = array('x' => $i, 'y' => $hour->getBytesSent());

$maxBytes = max($maxBytes, $hour->getBytesReceived(), $hour->getBytesSent());
}
diff -u -r vnstat-php/Vnstat/Database.php vnstat-php53/Vnstat/Database.php
--- vnstat-php/Vnstat/Database.php 2015-04-30 02:46:55.172345190 +0000
+++ vnstat-php53/Vnstat/Database.php 2015-04-30 02:16:39.937346146 +0000
@@ -53,22 +53,22 @@
/**
* @var Entry[]
*/
- protected $days = [];
+ protected $days = array();

/**
* @var Entry[]
*/
- protected $months = [];
+ protected $months = array();

/**
* @var Entry[]
*/
- protected $top10 = [];
+ protected $top10 = array();

/**
* @var Entry[]
*/
- protected $hours = [];
+ protected $hours = array();

public function __construct()
{

パッチ適用

上記のパッチを適用します。

patch -p1 -d vnstat-php < vnstat-php53.patch

これで、vnstat-phpディレクトリ内の該当ファイルにパッチが適用されました。

動作確認

ブラウザから確認して下のようなグラフが表示されていれば完了です。

http://<your server>/vnstat/

vnstat.png

備考

他に遭遇したこと

vnstat-phpを初めて使ったのは、随分前になるのですが、その時は、時間別のHourlyのグラフだけ表示されませんでした。
その時は、d3.min.jsを最新のものに更新すると表示することが出来ました。(vnstat-php/xcharts/d3.min.js)

もし同じような状況になった場合は、上記を試してみるとうまく表示できるかもしれません。

D3.js

d3.min.jsの最新ファイルは下記からゲットしました。
https://github.com/mbostock/d3

技術ブログ中の人

これで、スマホからいつでもトラフィックを確認できるようになりました!
えっ、見たくない!?

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar