Help us understand the problem. What is going on with this article?

h2oとUnixドメインソケット

More than 5 years have passed since last update.

h2oは部分的にではありますが、Unixドメインソケットをサポートしています。

Unixドメインソケットでlisten

h2oでUnixドメインソケットでlistenするには例えば以下のようなconfを用意します。

h2o.conf
listen:
  port: /tmp/h2o.sock
  type: unix
hosts:
  default:
    paths:
      /:
        file.dir: examples/doc_root
    access-log: /dev/stdout

この設定で起動しましょう。

$ make h2o && ./h2o -c h2o.conf

また/tmp/h2o.sockにアクセスするプログラムを用意します。ここではPHPで書いていますが、Unixドメインソケットを扱えるならなんでもいいです。

connect_h2o.php
<?php

$sock = fsockopen("unix:///tmp/h2o.sock", 0);

fwrite($sock, "GET / HTTP/1.1
Host: 127.0.0.1
Connection: Close

");

while (!feof($sock)) {
    echo fgets($sock);
}

fclose($sock);

connect_h2o.phpを実行してみます。

$ php connect_h2o.php
HTTP/1.1 200 OK
date: Tue, 09 Dec 2014 23:38:04 GMT
server: h2o/0.1
connection: close
content-length: 180
content-type: text/html
last-modified: Sun, 09 Nov 2014 20:07:25 GMT
etag: "545fc97d-b4"

<!DOCTYPE html>
<html>
  <header>
    <title>Welcome to H2O</title>
  </header>
  <body>
    <p>Welcome to H2O - an optimized HTTP server</p>
    <p>It works!</p>
  <body>
</html>
$

ちゃんとレスポンスが返ってきました。

Unixドメインソケットへリバースプロキシ

まだmasterにマージされていませんが、Unixドメインソケットにリバースプロキシを行えるようにするためのブランチとPRがあります。(時間取れてなくて絶賛放置中です。自分から送っておいてすいません to @kazuho )

https://github.com/h2o/h2o/pull/51

試しにこのPRのブランチをcheckoutします。

$ git remote add cubicdaiya https://github.com/cubicdaiya/h2o.git
$ git fetch cubicdaiya
$ git checkout cubicdaiya/feature/revproxy-unix

設定はこんな感じになります。(多分masterにマージされる時には別の書式になると思います)

h2o.conf
listen:
  port: 8081
hosts:
  default:
    paths:
      /tcp:
        proxy.reverse.url: http://127.0.0.1/
      /unix:
        proxy.reverse.path: unix:/tmp/nginx.sock:/

プロキシ先はnginxなのでnginx.confも用意します。

nginx.conf
worker_processes 1;

events {
    worker_connections 1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    keepalive_timeout  65;

    server {
        listen 80;
        root   html;
    }

    server {
        listen unix:/tmp/nginx.sock;
        root   html;
    }

}

手元(MacBook Pro)でh2oとnginx両方を起動した状態でh2oにabによるベンチを実行した結果が以下になります。

$ ab -k -n 10000 -c 500 "http://127.0.0.1:8081/tcp" 2>&1 | grep "Requests per second:"
Requests per second:    8818.33 [#/sec] (mean)
$ ab -k -n 10000 -c 500 "http://127.0.0.1:8081/unix" 2>&1 | grep "Requests per second:"       
Requests per second:    17492.24 [#/sec] (mean)
$

というわけで大体2倍くらいのパフォーマンスが出ました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした