共用サーバの接続制限で良さげなapache module - 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

hogem.hatenablog.com

だいぶ前のだけど。どうしてもSSLのままredirectさせたい場合の解決方法。

やや強引だけど。-dでrequestがdirectoryに来て、かつ
"/"がない場合はrewriteしてhttpsに飛ばす設定

if (-d $request_filename) {
  rewrite ^/(.*[^/])$ https://$host/$1/ permanent;
}

一旦httpにredirectかかっても良い場合は、
http側のvirtualhostでhttpsにredirectさせても良い。

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 が便利らしい

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