HAproxy,varnish,h2oで環境構築

https://www.varnish-cache.org/docs/trunk/phk/ssl_again.html

> No, Varnish still won't add SSL/TLS support.

varnish5.0.0でもsslの対応はしないらしいのですが、

> Instead in Varnish 4.1 we have added support for Willys PROXY protocol which makes it possible to communicate the extra details from a SSL-terminating proxy, such as HAProxy, to Varnish.

**HAProxyを使えばそれっぽくはなりますよ**とのことだったので設定してみました。
varnishといえば、以前からssl非対応で、ssl対応のためにLBとしてnginx等を入れるというやり方が以前からありますが、これはそのnginxの役割をHAProxyでやっているようなものです。

# 各バージョンの情報

* HA-Proxy 1.5.4
* varnish 4.1.3
* h2o 2.0.4

# 参考にしたページ

こちらを参考に設定してみて、うまくいかなかったら以下の手順を確認する方が良いかもしれないので先に記載します。
https://blog.feryn.eu/varnish-4-1-haproxy-get-the-real-ip-by-leveraging-proxy-protocol-support/

# varnishの設定

## `/etc/varnish/default.vcl`の編集

```default.vcl
# Default backend definition. Set this to point to your content server.
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    set req.http.x-clientip = client.ip;
    set req.http.x-serverip = server.ip;
    set req.http.x-localip = local.ip;
    set req.http.x-remoteip = remote.ip;
}
```

`backend default`はh2o側で寄せるため、デフォルトのままにしました。
`vcl_recv`は何行か追加しています。

## varnishの再起動

```
[test-web01 ~]# /etc/init.d/varnish restart
Stopping Varnish Cache:                                    [  OK  ]
Starting Varnish Cache:                                    [  OK  ]
You have new mail in /var/spool/mail/root
[test-web01 ~]# 
```

特にエラーが発生しなければOKです。

# HAProxyの設定

## `/etc/haproxy/haproxy.cfg`の修正

認証用のサーバー証明書の準備が必要です。

```text:haproxy.cfg
frontend http-in
        bind *:80
　　　　　　　　　　　　　　　　bind *:443 ssl crt /****/****/****/****.pem
        default_backend servers

backend servers
        server server1 127.0.0.1:6081
```

## HAProxyの再起動

特にエラーが発生しなければOKです。
認証周りでwarningが発生することがありますが、errorでなければ一先ず問題ないです。

```
[test-web01 ~]# /etc/init.d/haproxy restart
Enter PEM pass phrase:
Stopping haproxy:                                          [  OK  ]
Enter PEM pass phrase:
Starting haproxy: Enter PEM pass phrase:
                                                           [  OK  ]
[test-web01 ~]# 
```

# h2oの設定

## `/etc/h2o/h2o.conf`の修正

もし、デフォルトのままであれば、`localhost:80`のportを`8080`に変更します。
`localhost:443`の設定があったかと思いますが、varnish側からh2oに対して443でアクセスすることはないので、そのままにするか削除をしてしまって問題ありません。

```h2o.conf
user: nobody
hosts:
  "localhost:80":
    listen:
      port: 8080
      host: 0.0.0.0
    paths:
      "/":
        file.dir: /var/www/html
access-log: /var/log/h2o/access.log
error-log: /var/log/h2o/error.log
pid-file: /var/run/h2o/h2o.pid
```

## h2oの再起動

特にエラーが発生しなければOKです。

```
[test-web01 ~]# /etc/init.d/h2o restart
Stopping h2o:                                              [  OK  ]
Starting h2o: start_server (pid:9908) starting now...
                                                           [  OK  ]
[test-web01 ~]# 
```

# ブラウザで確認

## httpでアクセス

<img width="515" alt="httpでアクセス" src="https://qiita-image-store.s3.amazonaws.com/0/57635/06acf447-a4a0-2a30-3224-d264bccb1ffa.png">

## httpsでアクセス

<img width="508" alt="httpsでアクセス" src="https://qiita-image-store.s3.amazonaws.com/0/57635/3e2c1cc2-47b5-2a26-4a11-8567381f3998.png">

varnishが動作し、かつhttp,httpsどちらでもアクセスができることが確認できました。