Webサーバとしては使い慣れていることもあってApacheをずっと使い続けてきたが、細かい設定がしにくいという点があり、今回NGINXを使用することにした。
ただし、今回はApacheを代替するわけではなく、Proxyとして利用することにした。
バランシングのテストにはお名前.com VPS(KVM)を3台契約して実装してみた。
まずは、基本のProxy構成。
と言っても、何も難しいことはない。
server {
listen 80 default_server;
server_name _;
location / {
proxy_pass http://localhost:10080;
}
}
これだと、NGINXがポート80で待ち受けて、すべてのリクエストをlocalhostポート10080に送る(Apache等をポート10080で待たせておく)
このままだと何も効果がないから、ここから色々追加していく。
location /php/ {
proxy_pass http://localhost:10080;
}
location /ruby/ {
proxy_pass http://localhost:20080;
}
こうなると、/phpに来たリクエストは10080に、/rubyに来たリクエストは20080に行くので、apache + passengerを一つの入口で受けられるようになる。 localhostの部分を変えて、192.168.10.10とかにすれば、別サーバに流れていくから、一つの入口からアプリ単位で内部では別サーバで動かすことができる。
更に、ロードバランシングも簡単に作れる。
upstream appservers {
server 192.168.10.10:80;
server 192.168.10.11:80;
}
server {
listen 80 default_server;
server_name _;
location / {
proxy_pass http://appservers;
}
}
これで、来たリクエストは192.168.10.10と11に分配される。
upstream.serverには簡単に重み付けが出来るので、
server 192.168.10.10:80 weight=5;
server 192.168.10.11:80 weight=10;
みたいにすることで、アプリケーションサーバの重み付けができる。
さらに、スタンバイ構成も簡単で
server 192.168.10.10:80;
server 192.168.10.11:80;
server 192.168.10.12:80 backup;
とすると、10,11が応答しない時だけ12に振り分けることもできる(backupと書かれたサーバが正常時待機系となる) 10,11のいずれかが復帰すればbackupは待機状態に戻る。
VerisgnのSSL証明書はバランシングすると台数分の取得を要求されるが、ホットスタンバイ・コールドスタンバイであれば、同時に動作する台数分で良いのこんなかんじで設定できるのは便利。
HTTPのgzip圧縮をNGINX側に任せられるので、アプリケーションサーバを本来の処理に専念させることもできる。
server {
listen 80 default_server;
server_name _;
gzip on;
location / {
proxy_pass http://appservers;
}
}
また、SSL処理もNGINX側で行う事になる。
server {
listen 443;
server_name _;
ssl on;
ssl_certificate /etc/pki/tls/certs/ssl.crt;
ssl_certificate_key /etc/pki/tls/private/server.key;
location / {
proxy_pass http://appservers;
}
}
NGINXでは帯域制限が容易にできるので、
location / {
proxy_pass http://appservers;
}
location /file/ {
limit_rate 2m;
proxy_pass http://appservers;
}
こんなふうにすると、file配下のダウンロードを2Mに制限できるので、ファイルダウンロードのせいでアプリが遅くなるみたいなことの解消が期待できる。
また、制御構造を使って、
location / {
proxy_pass http://appservers;
if ($http_user_agent ~* “msnbot”){
limit_rate 1m;
}
}
みたいなこともできるので、BOT様の速度を制限して通常接続の帯域を確保できる。
色々、更に便利な機能があるから、しばらく検証しよう。
(611)