共用サーバの接続制限で良さげなapache module - mod_vhost_maxclients
ペパボの中の人さまさま。
- https://speakerdeck.com/matsumoto_r/virtualhosting-security-performance-operasion
- http://hb.matsumoto-r.jp/entry/2015/08/29/151920
- https://github.com/matsumoto-r/mod_vhost_maxclients
virtualhostごとに同時アクセス数や帯域を制限するmoduleにmod_cbandがあったけど
オーバヘッドが大きいのか、設定値の30%しか速度がでないなどややわかりにくかった。
mod_vhost_maxclientsは以下のことができる。
virtualhostごとの同時アクセス数、
1IPからのアクセス数、
制限を除外する拡張子の設定、
制限しないけどログ出力だけする、など
SSLアクセラレータ(reverse proxy)配下のnginxのcache_key
SSLアクセラレータ配下のnginxで
http、httpsで個別のキャッシュにしたいときに、
この設定をいれると、一見$schemeでhttp/httpsに振り分けられて
出来そうに見えますが、このままだと同じキャッシュになります。
proxy_cache_key "$scheme://$host$request_uri";
fastcgi_cache_key
uwsgi_cache_key
も同様
nginxに復号された状態でrequestがくるのでssl用のvirtualhostの
$schemeの中身はhttpになっています。
回避するには明示的にcache_keyにhttpsと指定する必要あり。
- http
proxy_cache_key "$scheme://$host$request_uri";
proxy_cache_key "https://$host$request_uri";
もしくはcache用の変数を1個かまして、proxy_cache_key は同じ設定にする。
($schemeは元から定義されている変数なので別に用意)
- http
set $cache_scheme "http"; proxy_cache_key "$cache_scheme://$host$request_uri";
set $cache_scheme "https"; proxy_cache_key "$cache_scheme://$host$request_uri";
SSLアクセラレータ(reverse proxy)配下のnginxで"/"なしのディレクトリにアクセスされたときのredirect
big-ip ipv6 nat memo
VirtualServerにipv6
Poolにはipv4で作成したものを割り当てた場合、
通信失敗にはならなくて、自動的にbig-ipのv4のaddressでnatされてserverに送信される
(snat automapしたときと同じ)
big-ip virtualserverに適用しているdefaultのSNIを入れ替える
やや面倒?
clientssl-foo: foo.example.com sni default
clientssl-bar: bar.example.com
これを
virtualserver example.com-httpsに適用している状態で
bar.example.com をsniのdefaultにしたい
前提:
virtualserverに設定する段階では
複数のclient sslprofileを適用する場合は
どれかひとつにだけsni defaultを適用している状態でしか設定できない
SSLのエラーが出ても良い場合
virtualserverから全部clientssl profile外す
- clientssl-foo のsni defaultを外す
- clientssl-bar にsni defaultを設定する
SSLのエラーを出さずに入れ替える
設定するときは最低1つのsni のprofileが必要だけど、
なぜかその状態から外すことはできるのでこれを利用する。
clientssl-foo2: foo.example.com を作成
(clientssl-fooと利用する証明書は同じでsni defaultだけ外す)
clientssl-bar2: bar.example.com を作成 sni default
(clientssl-barと利用する証明書は同じでsni defaultを設定)
virtualserver の設定で
clientssl-foo
clientssl-bar
を外して、代わりに
clientssl-foo2
clientssl-bar2
を追加して反映
abとh2load の違い
ubuntu 14 LTS
abはOSのapt
h2loadは公式のsourceから取ってきたもの。
serverはHTTP/2対応ではなくて、HTTP/1.0、HTTP/1.1対応のserverで実験
abはHTTP/1.0で接続
- keepaliveなし "Connection: close"
- よってnginxのdefaultだと圧縮されない
- http://nginx.org/en/docs/http/ngx_http_gzip_module.html
- gzip_http_version 1.0; すればHTTP/1.0でも圧縮を返す
h2loadはHTTP/1.1
- keepaliveあり "Connection: keepalive"
http benchmark ツール h2load
nghttp2 に含まれるh2load が便利らしい
- http://hb.matsumoto-r.jp/entry/2016/01/14/114048
- https://nghttp2.org/
- https://github.com/nghttp2/nghttp2
- https://nghttp2.org/documentation/h2load-howto.html
gitからとってきてコンパイルする。
libev、libevent等はyumで適当にいれる。
h2load使う場合はconfigure --enable-app する。
が、libspdylayがないと怒られた。
yumにもなかったのでこれも別途取ってこようとしたけど
めんどくさくなったのでubuntuでやりなおす。
sudo apt-get install g++ make binutils autoconf automake autotools-dev libtool pkg-config \ zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libev-dev libevent-dev libjansson-dev \ libjemalloc-dev cython python3-dev python-setuptools
autoreconf -i automake autoconf ./configure --enable-app make sudo make install
引数はabに似ている。
httpの場合はdefaultのprotocolがh2c(平文のHTTP/2)で、(clear textのc?)
通常のサーバにたいしては失敗するので-p http/1.1 をつける。
httpsの場合はhttp/2に対応していればh2で、対応していなければhttp/1.1で再接続してくれる。
h2load -c 100 -n 10000 -p http/1.1 http://myserver.example.com