Speedtest.netの速度測定サーバを構築してみた

#はじめに
こんにちは、 @CloudRemix です。

![alt](https://qiita-image.cloudremix.net/IDCF-Kurara-Yiara.png)
[https://account.idcfcloud.com/auth/login](https://account.idcfcloud.com/auth/login)より引用

本日9月10日は[クラウドの日](https://www.idcf.jp/pressrelease/2016/20160909001.html)です。
記念日ということで、クラウドを使った速度測定サーバの作り方をご紹介します。

#Speedtest.netの速度測定サーバ？？？
Speedtest.net自体はご存知と思うので省略。

![alt](https://qiita-image.cloudremix.net/Speedtest.jpg)

早速ですが、Speedtest.netの速度測定サーバを構築とは？

自分だけの測定サーバを作ること？

残念！少し違います。

あまり知られていませんがSpeedtest.netは、Speedtest.netが用意したサーバではなく、有志が設置したサーバを使って速度測定を行っています。

そのため同じSpeedtest.netでも測定サーバによって結果が大きく異なります。


今回はこの速度測定サーバの作り方+有志サーバへの登録方法となります。

**注意！1TB/Dayのネットワーク転送が発生します。**設置は自己責任で・・

##目次
- サーバを選ぶ
- OS・ミドルウェアのセットアップ
- アプリケーションのセットアップ
- サーバの申請


#サーバの選び方
まずは、使用するサーバを選択しましょう。
選択肢としては自宅サーバ、VPS、クラウドが挙げられます。

[公式サイト](https://support.ookla.com/hc/en-us/articles/234578628)によると、最低でも1Gbpsの回線帯域が必要なため、ネットワークで選ぶと良いでしょう。
また、毎日~~500GB超~~1TB超の通信が発生するため、従量課金or速度規制にも注意が必要です。

|  | CPU | RAM | Network | Disk |
|:-:|:-:|:-:|:-:|:-:|
| 最低 | 4コア | 4GB  | 1Gbps | 1GB  |
| 推奨 | 4コア | 8GB  | 2Gbps | 1GB  |

参考：[Speedtest Server Requirements ? Ookla](https://support.ookla.com/hc/en-us/articles/234578628)
（1コア0.5GBでも普通に動きます。ネット帯域だけが重要です）


~~今回は3,240GBまで従量課金なし、2Gbps接続のIDCFクラウドを選択しました。~~
~~3日で無料枠を使い切ったので、今は[CloudGarage](https://cloudgarage.jp/)を使っています。~~
**→怒られたので、やめました。**

個人的には、従量課金一切なしの Cloudn と CloudGarage が気になりましたが、

 - Cloudn - ~~回線帯域が不明~~ **[非公開](http://www.cloudn-service.com/guide/manuals/html/flat/rsts/Introduction/service_spec.html#spec-network)だそうです**
 - CloudGarage - BANの危険性あり（構築自体は問題はないが、他の利用者に影響がある場合は停止・制限措置とのこと）

ということで今回は見送ります。
~~基本的には、ネットワークに定評のあるWebARENAのVPSクラウド（6GB）か、SuitePRO V4（2G）がオススメです。~~

 - ~~VPSクラウド（6GB）：1Gbps、3,600円~~
 - ~~SuitePRO V4（2G）：2Gbps、8,400円～~~

**転送量からWebARENAも無理です。**

なお、自宅サーバ（家庭用回線）はプロパイダーによる総量規制（30GB/日？）があるため避けたほうが良いでしょう
VPSはそもそも1Gbpsも帯域がないため、論外です。（↓参照）
参考：[VPS・クラウドのネットワーク仕様一覧 - Qiita](http://qiita.com/CloudRemix/items/20caea11fae08d3c0c81)


#サーバのセットアップ
使用するサーバを選択したら、OS・ミドルウェアをセットアップしましょう。
ウェブサーバとアプリケーションが動作すれば、ソフトウェアに制限はありません。（Windows ServerもOK）
参考：[Speedtest Server Requirements ? Ookla](https://support.ookla.com/hc/en-us/articles/234578628)

言語はPHP, ASP, ASP.NET,JSPのいずれかとなります。
今回はCentOS7 / nginx / PHPの組み合わせとしました。

##OSのセットアップ
実際にセットアップをしていきます。
各ソフトウェアの設定は各自におまかせですが、ポート開放は必須です。（あとドメインの割り当て）

###ポート開放とドメイン
最低2つのポート開放が必要となります。ポート番号は80+8080です。
IDCFクラウドでは、標準で無料FW、ルータが用意されていますので、管理画面から80ポートと8080ポートを開放するだけとなります。

また、IP直打ちはダメらしいので、ドメインを割り当てます。
ドメイン設定は省略

以下ソフトウェアのセットアップ。参考程度に
###nginx
```shell
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx

mkdir -p /var/www
mkdir -p /var/lib/nginx/fastcgi

cd /etc/nginx/
mv nginx.conf nginx.conf.backup
vi nginx.conf
```

config

```nginx.conf
user              nginx;
worker_processes auto;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
	worker_connections  2048;
	multi_accept on;
	use epoll;
}
http {
	include       /etc/nginx/mime.types;
	default_type  application/octet-stream;
	access_log  /var/log/nginx/access.log;
	keepalive_timeout 5;
	client_max_body_size    10m;
	server_tokens     off;
	server_name_in_redirect off;
	server {
		listen 80;
		root        /var/www;
		charset     utf-8;
		location ~ [^/]\.php(/|$) {
			fastcgi_split_path_info ^(.+\.php)(/.*)$;
			include fastcgi_params;
			fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
			fastcgi_param PATH_INFO $fastcgi_path_info;
			fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
		}
	}
}
```

###PHP
必要なパッケージは各自で確認してください

```PHP
yum -y install --enablerepo=epel,remi-php71 php php-devel php-fpm php-gd php-mbstring

sed -i 's/apache/nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm\/php-fpm.sock/g' /etc/php-fpm.d/www.conf
sed -i 's/listen.mode = 0660/listen.mode = 0660\nlisten.owner = nginx\nlisten.group = nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/;clear_env = no/clear_env = no/g' /etc/php-fpm.d/www.conf
chown -R nginx:nginx /var/lib/php/
```

###起動
```
systemctl start php-fpm.service
systemctl start nginx.service
systemctl enable php-fpm.service
systemctl enable nginx.service
```

#アプリケーションのセットアップ
OS・ミドルウェアが用意できたら、いよいよ速度測定のアプリをインストールします。
フロントエンドはダウンロードして展開するだけですが、バックエンドは少々複雑です。
参考：[Installing HTTP Legacy Fallback ? Ookla](https://support.ookla.com/hc/en-us/articles/234578548)

##フロントエンド

```
cd /var/www/
wget http://install.speedtest.net/httplegacy/http_legacy_fallback.zip
unzip http_legacy_fallback.zip
rm -f http_legacy_fallback.zip
rm -f speedtest/upload.asp
rm -f speedtest/upload.aspx
rm -f speedtest/upload.jsp
```

##バックエンド
同様にダウンロードして展開しますが、こちらは設定の編集と起動が必要となります。
また、セキュリティ上の理由から専用ユーザが推奨されていますので、新たにユーザを作成します。

```
useradd ookla
passwd ookla

su ookla
cd
mkdir ooklaserver
cd ooklaserver
wget http://install.speedtest.net/ooklaserver/ooklaserver.sh
chmod a+x ooklaserver.sh
```

インストール

```
./ooklaserver.sh install

#64bitOSなら y 押下
This will install the Ookla server for linux64 to the current folder. Please confirm (y/n) >
```


設定の編集は最低3ヶ所（上側は必須）
参考：[OoklaServer Daemon Advanced Configuration ? Ookla](https://support.ookla.com/hc/en-us/articles/234577948-OoklaServer-Daemon-Advanced-Configuration)

```OoklaServer.properties
vi OoklaServer.properties

OoklaServer.allowedDomains = *.ookla.com, *.speedtest.net　#コメントを除去

OoklaServer.tcpPorts = 5060,8080
#↓ポートの指定
OoklaServer.tcpPorts = 8080

OoklaServer.udpPorts = 5060,8080
#↓ポートの指定
OoklaServer.udpPorts = 8080

OoklaServer.maxThreads = 512
#↓お好みで（マルチセッションの最大値、負荷軽減）
OoklaServer.maxThreads = 32
```

自動起動を設定

```
su -
chmod +x /etc/rc.d/rc.local
vi /etc/rc.d/rc.local

#su ookla -c '/home/ookla/ooklaserver/OoklaServer --daemon'

reboot
```

##動作確認
[テスター](http://www.ookla.com/hosttester.php)が公開されているので、必ず動作確認を行いましょう。
![alt](https://qiita-image.cloudremix.net/Ookla-Host-Tester.jpg)

###記入例
 - OoklaServer/NetGauge TCP Host:
    - example.com:8080
 - Legacy HTTP URL:
    - http://example.com/speedtest/upload.php
 - Legacy HTTP URL #2:
    - http://example.com/speedtest/upload.php

全項目が`PASSED`となればOK

#サーバの申請
セットアップが終わって、動作確認もできたら早速有志サーバとして申請します。（これで終わりです）

[http://www.ookla.com/host](http://www.ookla.com/host)

利用条件等に同意して、
![alt](https://qiita-image.cloudremix.net/Ookla-Become-an-Ookla-Speedtest-Host.jpg)

項目を埋めていきます。

 - Server Installation
    - Ookla Server：ホスト名（テスターの一番上の項目）
 - Hardware Information
    - Current Processor：CPUのコア数
    - Memory Amount：物理メモリサイズ
 - Connection Information
    -  Available Bandwidth：回線帯域
    -  Uplink/Ethernet Connectivity：回線帯域
 - Hosted By Credit（この部分は公開されます）
    - Sponsor Name：サーバ名
    - Sponsor URL：サーバ名のリンク先
    - Server City：サーバの区市郡町村
    - Server State or Region：サーバの都道府県
    - Country：Japan。

![alt](https://qiita-image.cloudremix.net/Sign-Up-to-Host-a-Speedtest-Server.jpg)

すべての項目を埋めたら、SUBMITをクリックして、申請完了です！！

すぐに確認の自動送信メール（件名：Ookla.com Account Registration）が届き、審査待ちとなります。

2,3日程で審査結果が届くので、ゆっくり待ちましょう。
合格していれば、管理者用のアカウント情報、そして専用のカスタムドメインがメールに記載されています。

アカウント情報は、専用サイトにログインすることで、自身の測定サーバで測定された結果を見れます。
![alt](https://qiita-image.cloudremix.net/Speedtest-Results.jpg)

#一言
ネットの情報から1日300GBほどかな～と思っていたけど、
開始1日で~~600GB~~**1TB**を軽く超えた・・・。

九州地域のサーバが少ないようです。私（福岡）と鹿児島だけです。
誰か従量課金がなくて、1Gbps接続の格安サーバ（西日本）を知っていれば教えてください。（切実）

#参考
[Speedtest Servers ? Ookla](https://support.ookla.com/hc/en-us/categories/204419868-Speedtest-Servers)
[Speedtest.net by Ookla ホスト登録 ? がとらぼ](https://gato.intaa.net/net/speedtest_host)
[oklaServer（Speedtest.net ホスト）のセットアップのやり方 | ichigo-lab BLOG](http://blog.ichigo-lab.mydns.jp/archives/382)
[peedtest.netの測定サーバ提供はじめました。 ? satoweb-blog](https://satoweb.net/archive/6300)