ぽんこつエンジニアのブログ

PHP チョット デキル

Apache、Nginx、H2Oでベンチマークしてみた

すいません!!!

この記事を書いた後いろいろ調べてたら、wrkはhttp2に対応していませんでした! ということで、今回のベンチマークApache、Nginx、H2OのHTTP1.1でのベンチマークとなります!

ちゃんとHTTP2でベンチマーク取ったものを後日公開します!


最近HTTP2が色々盛り上がってるのは知ってたんですが、YAPC:ASIA 2015に行ったらH2Oが気になり始めたんで普段使ってるApacheよりきっとH2Oが早いぜって言ったら「いやH2Oとか知らんから、とりあえずNginxやろうよ」って言われたのでNginXも一緒にベンチマークしてみました。

環境

  • さくらサーバのVPS

  • メモリ1G

  • CPU 2コア

表示させるもの

表示させるのはなんでも良かったんですがとりあえず普通のページっぽいのが良かったんでここの無料テンプレートを使ってみました。

《無料》ホームページテンプレート.com | 商用可能なホームページテンプレート・WordPressテーマが完全無料

表示するとこんな感じ f-tpl.com

ついでにDockerやってみる

やったことないけどDocker流行ってるらしいから使ってみようと思ってやってみた。

それぞれのDockerfileはこんな感じ

Apache2

# cat docker/httpd/Dockerfile
FROM ubuntu:latest

RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y apache2

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2

ADD ./htdocs /var/www

EXPOSE 80

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

Nginx

FROM ubuntu:latest

RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx

ADD server.conf /etc/nginx/conf.d/server.conf
ADD ./htdocs /var/www

EXPOSE 80

CMD /usr/sbin/nginx -g "daemon off;"
server {
    listen 80 default;
    root /var/www;
}

H2O

FROM ubuntu:latest

RUN apt-get update
RUN apt-get install -y git
RUN apt-get install -y openssl
RUN apt-get install -y libssl-dev
RUN apt-get install -y cmake
RUN rm -rf /var/lib/apt/lists/*

RUN git clone https://github.com/h2o/h2o \
    && cd h2o \
    && git submodule update --init --recursive \
    && cmake . \
    && make h2o

ADD ./htdocs /var/www
ADD ./h2o.conf ./h2o/h2o.conf

WORKDIR /h2o
ENTRYPOINT ["./h2o", "-c", "h2o.conf"]
listen: 80
num-threads: 16
num-name-resolution-threads: 1
max-connections: 10240
hosts:
  default:
    paths:
      /:
        file.dir: /var/www
    access-log: /dev/stdout

ベンチーマークにはwrk使った

詳しくはこちら

HTTP ベンチマークツール wrk の使い方 | Boiler Room

結果

# wrk -t 4 -c 100 -d 10 http://localhost:8080/
Running 10s test @ http://localhost:8080/
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    75.85ms   89.06ms   1.04s    97.83%
    Req/Sec   381.83     54.12   595.00     71.50%
  15226 requests in 10.03s, 92.67MB read
Requests/sec:   1518.43
Transfer/sec:      9.24MB
# wrk -t 4 -c 100 -d 10 http://localhost:8081/
Running 10s test @ http://localhost:8081/
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    45.18ms   47.41ms 436.21ms   85.71%
    Req/Sec   721.54    309.45     1.59k    66.75%
  28802 requests in 10.06s, 173.45MB read
Requests/sec:   2864.44
Transfer/sec:     17.25MB
# wrk -t 4 -c 100 -d 10 http://localhost:8082/
Running 10s test @ http://localhost:8082/
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    24.84ms    7.14ms  69.96ms   76.78%
    Req/Sec     1.00k   231.60     2.03k    66.50%
  40141 requests in 10.08s, 242.71MB read
Requests/sec:   3983.43
Transfer/sec:     24.09MB

まとめ

ということで今回はH2Oの圧勝という形になりました。もう少し色々チューニングしたら結果も変わるかと思うんで詳しい人教えてください。

参考

qiita.com

最初で最後のYAPC:Asia

最初で(多分)最後のYAPC:Asia Tokyo 2015に参加してきました。ブログを書くところまでがYAPCとの事なのでちゃんと役目を果たそうと思います。

初参加だったのですがYAPC::Asiaは今年で最後とのことで、私にとっては文字通り最初で最後のYAPC::Asiaになりました。2日間どのトラックも楽しく有意義な話が聞けてモチベーション上がりました。

1日目の初めから行きたかったんですが、不覚にも前日飲み過ぎて遅刻しちゃいました。LarryWallさんの話聞きたかったな。。。というわけでそれ以降で聞いたトラックをつらつらと書いてきます。

1日目

Effective ES6

http://www.slideshare.net/teppeis/effective-es6

まずは出たことだけ知っていたES6のお話。部屋が満員で立ち見も出ているところに到着し見るの諦めようかと思いましたがどうにかスペースを確保出来て後ろのほうで人の合間から覗いてました。

6月に公開されたES6で導入された新しい機能や5との違い、今までカオスを薄めてきた数々のベストプラクティスとのお別れ等センセーショナルな内容でした。

TBD

Matz「Rubyの一番悪い点はPerlの影響」!? 次世代の言語の話も盛りだくさん #yapcasia #yapcasiaA - Togetterまとめ

ご存知Rubyの生みの親であるまつもと ゆきひろさんのお話。TBDは「To Be Defined」ではなく「Toward Brain-aware Design」だとのことでしたw現在作っている新しい言語であるStreemの紹介をしてて興味深かった。ちょっと自分でもやってみようかな。

Perlで学ぼう!文系プログラマのための、知識ゼロからのデータ構造と計算量

Perlで学ぼう!文系プログラマのための、知識ゼロからのデータ構造と計算量 // Speaker Deck

次はデータ構造のお話。文系プログラマではないはずなんですが、私は計算とか弱い系なので非常に分かりやすくてよかったです。

Electron: Building desktop apps with web technologies

Github社の作ったエディタで有名なAtomの基盤になっているElectronという技術についての説明とDemo。これもなかなか興味深いので今度なんか作ってみよう。

大規模でも小中規模サービスでも捗る microservices な Web サービスのつくりかた

最近何かと話題になるmicroserviceのお話。考え方やハマりどころなど具体的な話を沢山聞けてなんとなくイメージ出来るようになったつもりになりました。

2日目

ISUCONの勝ち方

ISUCONというWebアプリケーションのパフォーマンス改善コンテストの歴史と参加したときに役立つコツを色々と紹介していただきました。

我々はどのように冗長化を失敗したのか

yapcasia2015 // Speaker Deck

冗長化への挑戦と失敗の話。まだまだ自分はこの辺弱いので世のインフラ系エンジニアの苦労を垣間見た気がします。

Docker3兄弟について

DockerMachine、DockerCompse、DockerSwarmのDocker3兄弟の紹介。Docker3兄弟という言葉はアルパカ大明神さんが作った言葉なので他では通じないのでご注意をとのことです。

ランチセッションA

社内システムを自分たちで作るのっていいですね。勉強にもなるし、試してみたい技術使えるし。 運良く豪華弁当にありつけました。ごちそうさまでした。

Adventures in Refactoring

Github社でのリファクタリングの話。正しいことをキチンとやろうってことなんですが実際はそれがすごく難しいんですよね。それが出来ているGithub社は凄いなぁと思いました。

HTTP2 時代の Web

HTTP2の登場でHTTP1.1からどう変わるのか、必ず移行しなくてはいけないのか等のお話。まだまだHTTP2が浸透するには時間がかかるだろうけどこのビッグウェーブに乗らない手はないと個人的には思いました。Webエンジニアなら少なくとも知らないふりして置いておくのはマズイ気がしましたね。

おわりに

本当にどの話も面白かったです。あとで動画が上がるらしいので見たかった他のトラックも見ようと思います。

そんなYAPC::Asiaが今年で終了なんて本当に惜しいですが、どうやら次なるイベントが画策されているようで今後はこちらが盛り上がることを期待します。

builderscon.io

ドットインストールのAngularJS入門でハマった

夏休みだしAngularでもやるか〜と思ってドットインストールでAngularJS入門したんですが#3「コントローラーを使ってみよう」で動かなくなりました。

dotinstall.com

結論から言うと使っていたバージョンが違うという凡ミス。ドットインストールの方は1.0.1で自分が使っていたのは1.4.4でした。

公式のほうではもうそのバージョンはダウンロード出来なかったのですが、legacyな1.2なら大丈夫だろうと思いそっちに入れ替えたら無事動くようになりました。

https://angularjs.org/

f:id:ichikawa0829:20150815175130p:plain

なにが変わったのか

angularJsについて - QA@IT こちらのQAによるとどうやらAngularJSの1.3.0以降、デフォルトではグローバルに定義されているコントローラーは使えなくなったようですね。

解決策1:$controllerProvider.allowGlobals();
angular.module("ng").config(function($controllerProvider){
    $controllerProvider.allowGlobals();
});
var mainCtrl = function($scope) {

}

スクリプトのどこかでこのようにallowGlobalsを呼び出してあげると行けました。しかし、わざわざ禁止にしたものを許可するのは微妙な気がしますね。少なくとも自分のようなAngularぺーぺーはやめておいたほうがいい気がする。

解決策2:angular.module().contoroller()

1.ng-appの値を設定する。htmlタグに書いたけど実際はもっとスコープ狭めてdivとかに書いたほうがいいぽい。

<html lang="ja" ng-app="myApp">
<!-- ng-appとしていた部分をng-app="myApp"に変更 -->
・
・
・

2.angular.module().contoroller()から設定する

// moduleの第1引数にng-appで指定した値、controllerの第1引数にコントローラ名を指定する
angular.module("myApp", []).controller("mainCtrl", function($scope) {
    $scope.users = [
        
    ];
});

解決策2の方でやるほうがきっとより今風なんだろうな。一回本読もうかな。

GWのうちにWebの基本を復習しておく〜HTTPをざっくり1日目

HTTPってなんですか?

これ、意外とちゃんと答えられない人多いんじゃないですかね?実務の時はあまり気にせず使っていて、通常時はHTTPで個人情報とか送る時はHTTPS使ってやると暗号化されて安全に送れるんだよくらいに説明してるんじゃないですか?分からんことはまずググれとか言っちゃってたりして?

それも間違ってないけど、ビシッと答えられるとカッコいいもんです。新卒が入ってきて1ヶ月そろそろ研修も終わってOJT始まるのでここらで復習しとこうと思います。

HTTPとは

HTTPは、 「Hyper Text Transfer Protocol」の略です。

まずは新人ぽく「HTTP とは」とかぐぐってみたらこんな感じです。さすがGoogle先生、分かりやすいですね。

ようは「ハイパーテキストを転送するためのプロトコル(規約)」なわけです。ハイパーテキストとは何かというとHTMLやXMLなどが該当しますが、実際はそれ以外にも画像ファイルやJavaScriptCSSファイル、動画、PDFなどコンピュータで扱えるデータは大体HTTPで送れます。

Webでは、クライアント(PCやスマホガラケーなど)がこれらのデータが欲しいというリクエストをサーバに送り、それに対してサーバがレスポンス(HTMLや画像など)を返すというやりとりがされており、HTTPはそのやりとりをするためのルールといった感じでしょうか。

HTTPはTCP/IPをベースにしているので、次にそれらについてです。

TCP/IP

TCP/IPもよく聞く単語ですね。

先にTCP/IPにおける階層モデルですが以下のように分かれます。

アプリケーション層(HTTP,NTP,SSH,SMTP,DNS

実際にHTTPを実装するのがこの層の役割です。TCPで実装する場合はソケットというライブラリを使います。ソケットには接続、送信、受信、切断など基本的な通信機能を備えています。ソケット通信ってやつですね。

他にもFTPSMTPなどもこの層にあたります。

トランスポート層UDP,TCP

インターネット層で使用するIPは送信したデータが正しく送り先まで届けられたかは保証されません。そこで接続相手に対してコネクションを張りデータの抜け漏れをチェックするのがこの層の役目です。コネクションで転送するデータがどの層に渡るのか決定するのがポート番号で、HTTPではデフォルトでは80番を使用します。

インターネット層(IP)

ネットワークでデータを実際にやりとりする部分です。指定したIPアドレス宛てにパケット単位でデータのやりとりを行います。

ネットワークインタフェース層(イーサネット

物理的なケーブルやネットワークアダプタに該当します。

層ごとに抽象化して実装していれば別の層がどう実装されているかは気にしなくても良くなります。最も分かりやすいのはネットワークのところで、繋ぐときにWifi、有線、テザリング、どれを使っても同じようにChromeブラウジングが出来ていますよね。

まとめ

  • HTTPとはWeb上でHTMLやXML、画像や音声データなどを転送するためのルール
  • HTTPはTCP/IPをベースにしている
  • TCP/IP階層は4つに分かれ、アプリケーション層にはHTTP、トランスポート層にはTCP、インターネット層にはIPがそれぞれ該当する
  • IPはネットワークを使ってデータ送信するだけ、TCPはIPで送受信したデータの抜け漏れをチェック、HTTPはTCPから渡されたデータを受け取ったり別のリクエストを送信したりする

もう少し書く予定でしたが今日はここまで。明日続き書きます。

Laravelエキスパート養成読本

先日書いたとおり日本初のLaravel本を献本して頂きました。 (日本初のLaravel本が出ます! - ぽんこつエンジニアのブログ) この土日でひと通り読んだ感想を書いていきたいと思います。

一番最初にざっと目を通した時は、ちょっと物足りないかもしれないなというのが感想でした。 去年から仕事で4.1を導入してからずっとやってきて、Laravel5もリリース前からLaracast見たりしていたのでどんな機能があるのかは大体把握していたし今年から新しいプロジェクトをLaravel5で開発し始めているので新しい発見はそこまでないだろうなと思ったのです。

でもじっくり読んでみて感想が変わった部分が色々と出てきました。

「Chapter1〜Laravelを始めよう」

この章では、Laravelがもっと好きになりました。

自分はLaravelをどう書くかは知っていたのですが、どういう歴史があるのかは全然知らなかったんだな、と。

Laravelがどういう思いで開発され、それぞれのバージョンで何を解決したかったのか、どんな人達・コミュニティに支えられて来たのかなどを知るにつれてなんだかさらに愛着が出てきたという感じ。

「Chapter2〜MVCモデルが基礎からわかる」、「Chapter3〜IoCコンテナファサード、サービスプロバイダ、Eloquent」

ここでは初めてLaravel触る人たちにはこうやって教えればよかったんだなという発見ができました。 去年導入した時はホントに誰も触ったことがない状態で、「Laravelをどう使うべきなの?」かとか「IoCコンテナって何やねん」とかの質問への回答には四苦八苦しました。 あの時この本さえあれば、何か聞かれても無言でこの本を差し出せば済んだに違いない。そういう意味ではもう1年発売が早かったら最高でした(笑 まぁ今年も今のサービスに関わるエンジニアは増えていくと思うので、まず最初にこの本を渡してあげようと思います。

「Chapter4〜Laravel5の新機能を紹介」

個人的に一番楽しみにしていた章です。 Commnadバスとジョブキューやミドルウェア、フォームリクエストなどドキュメントを読んでなんとなく分かってたつもりの新機能を、実際どう使うかイメージ出来て凄く良かった! Elixerやphpspecもあとで使ってみようと思います。(ビヘイビア駆動開発。。。勉強します。。。 あと、地味に嬉しかったのはLaravel4からの移行方法です。新しいプロジェクトでLaravel5を使い始めて4ではこう書いてたけど5ではどうしたらいいんだ?って思っていた事が大分整理できました。

「Chapter5〜実践!RestAPIアプリケーション」

これがまた個人的にタイムリー!今まで会社では結構普通のWebサイトばかりやってきたんですが、これからSPAやアプリもやっていくことになりそうなので、どのように設計・実装していけばいいかなんとなく分かってありがたかったです。 あるのは知ってたけど使わなかったPUTやDELETEとかも扱うようになるんだなぁ。未経験の領域だったので新しい発見が多い章でした。

最後に

ということで、最初の感想からは程遠くとても充実した内容で気づきも多い本でした。 これからLaravelを始める人には絶対おすすめだし、自分みたいにひと通りやってみたけどもう一歩Laravelの世界に踏み込んで行きたい・理解を深めたいという人にも是非読んでほしい1冊です!

献本頂いた川瀬さん、本当にありがとうございました。

日本初のLaravel本が出ます!

ここ数年日本でも導入事例が増え、今年メジャーアップデートを迎えて益々盛り上がりをみせるPHPフレームワークLaravel!

これまで情報を得るには本家のドキュメントやhttp://readouble.com/laravel/などの翻訳サイト、Qiitaや個人ブログからが殆どだったと思いますがこの度、初の日本語書籍が発売されることになりました!

著者の一人である川瀬さんから光栄にも発売前に献本していただける事になり本日無事届きました。

f:id:ichikawa0829:20150417000308j:plain

内容はLaravelの歴史から基礎、Rest API、新バージョンLaravel5の紹介となんとも楽しげです! ざっと目を通した感じだと、Laravel気になってるけどやったこと無い人やこれから仕事でLaravel導入を考えてる人、この春入社の新卒君達あたりには凄くちょうどいい感じになっています。 (すでにLaravelがっつり使ってる人には少し物足りないかも。。。)

発売は4/21!乞うご期待!!

Raspberry Pi B+で1-wireデバイスを使ってみる

「Raspberry Piで遊ぼう! 改訂第3版」を見ながらRaspberry Piで遊び始めました。

1-wireデバイスを接続しようってとこまで来たんだけど、どうにも上手くいかない!デバイスを認識してくれない!

何度確認しても配線は合っている、/etc/modulesにw1-gpioとw1-thermは追加した、当然rebootもしたmodprobeも試した しかしどうにも認識されない。

もしかして壊れてる?断線?ブレッドボードがetc...とか色々探ってみたけどどうにも上手く行かなくて諦めかけたその時

いつの間にかたどり着いたページに全ての答えが

6-8 P.200 「1-wire デバイスを接続しよう」

Raspbian 2015-01-31(NOOBS 1.3.12)以降では、1-wireを有効にするための設定手順が増えましたました。スーパーユーザーで /boot/config.txt ファイルを開き、一番最後に以下の行を追加します。gpiopin=4はGPIO 4という意味です。ファイルを保存したらRaspberry Piを再起動し、P.200の手順に進んでください。

dtoverlay=w1-gpio-pullup,gpiopin=4

『Raspberry Piで遊ぼう! 改訂第3版』最新情報お知らせページ

見てみると結構、最新版と差異があったり誤植があったり、最新版では動かなくなっていたりしてるみたいです。

RaspberryPiの本見て遊んでる人は、見てる本の最新情報もチェックしてみたほうがいいかもね。