作成者別アーカイブ:

nginxのプロクシの裏側キャッシュを制御する

 nginxと裏のサーバ間のキャッシュを設定する。
 nginxのproxyでキャッシュする場合は、proxy_cacheを設定する。

proxy_cache_path /dev/shm/c levels=1:2 keys_zone=cachezone:512m;
server {
    location / {
        proxy_cache cachezone;
        proxy_pass http://appservers;
    }
}

 proxy_cache_pathでキャッシュの置き場所、置き方等を定義して、proxy_cacheでキャッシュ領域を割り当てる。
 で、この場合、プロクシを通過したデータを512Mまでキャッシュする。

 nginxでは細かい設定ができるのがイイね。

proxy_cache_path /dev/shm/c levels=1:2 keys_zone=cachezone:512m;
server {
    location / {
        set $dontcache 1;
        if ($request_filename ~* ".*\.jpg$"){
            set $dontcache 0;
        }
        if ($request_filename ~* ".*\.png$"){
            set $dontcache 0;
        }
        proxy_cache_bypass $dontcache;
        proxy_cache cachezone;
        proxy_pass http://appservers;
    }
}

 こうすると、要求されたファイル名がjpg, pngで終わるときしかキャッシュしない(proxy_cache_bypassに与えた値が0以外であるとき、キャッシュ機構をバイパスする)
 if文なので、$http_user_agent を使えばBOTと通常クライアントで異なる制御をしたりできる。
 また、特定のクッキーを持っている時だけバイパスするということも可能なので、開発ユーザにクッキーを食べさせておいて、該当クッキーをチェックするようにすると便利。

if ($cookie_author ~ “true”){
    set $dontcache 1;
}

みたいなこともできるし、そもそも、$cookie_author を 1/0 で制御するなら

proxy_cache_bypass $dontcache $cookie_author;

でも大丈夫。

(475)


カテゴリー: サーバ設定 | コメントをどうぞ

nginxで、入り口でまとめて認証をかける

 リリース前のサイトを本番環境でテストするとき、認証をかけたりするよね。
 DNSラウンドロビンとかLVSでバランシングしているときは、各ホストに.htaccessと.htpasswd書いたりするわけだけど、nginxでバランシングしている場合は、nginxの設定ファイルにまとめてかける。

server {
listen 80;
server_name hoge.tld;

location / {
auth_basic “auth”;
auth_basic_user_file “/usr/share/nginx/.htpasswd”;
proxy …
}
}

みたいな感じ。

nginxで認証を要求せず、裏のサーバが認証要求した場合には裏の認証要求が通る。
両方で認証を要求すると同じユーザ名:パスワードのセットで認証出来れば通るけど、それ以外の時は認証不能になる。

(330)


カテゴリー: サーバ設定 | コメントをどうぞ

NGINXをProxy利用 = UpstreamでKeepaliveを使う

 バランシングのテストにお名前.com VPS(KVM)を3台契約して、1台をバランサ、2台をアプリケーションサーバ(Apace)として構築して試験中。

 デフォルト設定でNGINXを通すと、NGINX-Apache間がHTTP 1.0 Closeコネクションになるため、abとかで叩くとApacheのスレッドが大量に立ち上がる。 この状態だと、リクエストのたびに新しい通信が立ち上がってくるし、Apacheのプロセスが切り替わりまくるからパフォーマンス的に美味しくない。
 調べてみると、最近のNGINXではupstream.keepaliveのディレクティブを使うことで、裏の通信をKeepAlive接続にできるようになるので、早速導入して評価。

と、設定前に負荷試験。

abで同時接続100、10000回のGETを実行(400KBのHTML、GZIPで60KBになるファイル)
NGINXでGZIP/SSL処理してAPACHEにつなぐと、200requests/sec程度のスループットだった。

#nginx.conf

upstream appservers {
server 192.168.10.10:80;
server 192.168.10.11:80;
keepalive 1000;
}

server {
listen 443;
server_name _;

location / {
proxy_http_version 1.1;
proxy_set_header Connection “”;
proxy_pass http://appservers;
}
}

 upstream.keepaliveをセットするのと、proxy_http_versionを1.1に(KeepAlive実装)、proxy_set_headerでConnectionを空にする(デフォルトでは、Connection: closeを送信してしまうため)

 Apache側は

KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 15

としてみた。

 先と同じようにabを実行してみた結果、210requests/sec程度になった。 もともと、ネットワーク転送量がワイヤースピード近くに達していたため、速度的にはそれほど改善していない。
 しかし、サーバのリソース的には相当改善が見られた。 CPU使用率のSys値(ユーザプログラム以外の部分で消費される無駄)が低下した。
 重いアプリケーションを動作させている場合には、オーバーヘッドが低下する分だけ応答速度の向上が期待できそうだ。

(1959)


カテゴリー: サーバ設定 | コメントをどうぞ

NGINXを使う(Proxy利用)

 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)


カテゴリー: サーバ設定 | コメントをどうぞ

安物のRAID装置は禍の元

 サーバの記憶装置では通常RAID構成がされていますよね。

 以前の職場で、なぜかRocketRAIDアダプタが乗っているサーバがあって、RAID5構成になっていました。 予算をケチって安く売っているカードを買って自前で組んだのでしょう。

 そのサーバであるときファイルが読めなくなりました。 アレイマネージャを確認すると何もエラー無し。
論理エラーかとも思ったのですが、システムが異常停止したわけでもない状態のサーバ機で論理エラーが発生することはあまりありません(主記憶やバスはECCで保護されているので)
OSのシステムログを確認するとデバイスドライバの応答停止エラーが発生していました。
しかし、他のファイルのアクセスは全く問題なく、システムの再起動を実行してもそのファイルだけアクセス不能。
システムを落として、別マシンで個別ドライブをフルリードスキャンしてみた結果、1台のドライブで読み込み不能セクタが発生していました(アクセスすると数十秒応答停止して、SMARTを確認すると再配置待ちセクタなどの値が変化する状態)
どうやら、このRAIDアダプタはドライブがデバイスタイムアウトした場合の扱いがしっかり実装されておらず、ドライブが応答しないときにアダプタもタイムアウトしてしまうお粗末な物だったようです。
結局、該当のドライブを外した状態で電源投入すると、Critical状態でシステムが起動して、該当ファイルは読み込めました。

 確かに、RAID5の仕様である、ストライピング&パリティ書き込みを実行して、高速化と1デバイスが喪失された状態でデータ復元は出来ましたが、冗長構成はエラーが発生しても処理を継続し、かつ正常にエラーが検出できなければ実用に耐えません。 このアダプタの存在によって、障害の切り分けが困難になったという点は特に問題ですね。

 やはり、価格差はあってもメジャーブランドの製品を選択するべきだと認識させられました。 予算的にハードウェアRAID構成が難しい場合は、無理にRAIDアダプタを搭載せずソフトウェアRAIDで構成しておく方がベターでしょう。

(116)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

自宅の無線LANを再構築

 先日、CanonのA3ノビプリンタのPixusPro9000を入手した。
 製品自体は2006年発売と古いのだけど、8色インク採用の結構良いモデルなのでフルサイズデジイチからA3出力して結構良い品質が得られる。 上位モデルなので、サポートも良く、古いのにWindows8用ドライバがメーカーからしっかりリリースされている。

 しかし、入手後に気づいたのだが、こいつはUSB接続オンリー。
 最近はプリンタもLAN接続が主流で、我が家のプリンタ置き場はプリントサーバPCを撤去してしまっているので、USBプリントサーバを別途購入しなければならない事態になった(今更PCサーバ設置は電力やメンテの面からイマイチ)が、双方向機能が使えるUSBプリントサーバは結構いい値段がする。

 お安く構築する方法はないかと検討したところ、ロジテックのLAN-W300N3L無線LAN APを見つけた。
 こいつは、安定性で定評のあるSilexのUSBデバイスサーバ機能を搭載している。
 USBデバイスサーバだから、PC上からUSBデバイスを直結したのと同じ状態で認識するので、双方向機能なども普通に使えるはず。

 というわけで、早速1台購入。
 プリンタ置き場に設置したPro9000とUSBケーブルで接続して設置。
 余っているUSB無線LANアダプタを自宅のメインサーバであるML110G7改 Windows Server 2012に接続して、このAPに接続し初期設定。
 メインネットワークとずらしたプライベートネットワークを割り当てし、無線の出力を安定接続に最低限必要な25%に制限、速度も重要ではないので帯域を20MHzに設定した(11b周波数帯の無線LANは混雑が激しいので、近隣の迷惑にならないよう、出力を必要な範囲に抑えて運用している)
 メインサーバ上でW300N3L用のUSBデバイスサーバクライアントを導入すると普通にプリンタが検出されたので、プリンタドライバパッケージを導入、プリンタを共有設定した。

 メインマシンのThinkPad W530から普通に接続して問題なく印刷可能。 インク残量表示や各種管理機能も全く問題なかった。
 無線LAN搭載のUSBデバイスサーバやプリントサーバよりも安価で良い選択肢といえる感じだ。 無線LANを無効にもできるので、有線接続のUSBデバイスサーバとしても使えるし、WDS対応なので無線LANのエリアを広げたり、同じチャネルを共有していろいろな場所にUSBデバイスを設置することもできる多用途機だ。

 地デジチューナーとスキャナを無線接続できると便利そうなので、あと3台購入しようかな(1台をメインの有線LANに接続、2台にチューナーとスキャナを繋いでWDS接続)

(176)


カテゴリー: レビュー | コメントをどうぞ

Office365をはじめました

 先日、Office2013がリリースされて、1台導入したのだけど、PCを多数保有しているとちょっと不便。
 楽天などで怪しいOEMライセンスの激安品を売っているけど、途中でProductキーがロックされたりして安心して使えないようだ(キー自体は正式なものだが、キーの用途が不正なので、購入していても正式ライセンスではない)

 そこで、この度、個人的にOffice365の契約を検討することになった。
 現在、30日の無料試用が利用できるので、早速申し込んで試用開始。

 今回のプランはOffice365 SmallBusinessPremiumで、月額1250円or年額12360円のクラウド型ビジネス向けサービスで、ビジネス向けではあるが1アカウントから契約できる。

 25GBのメールボックス、7GBのストレージ、Webベースのオフィスアプリなどが利用できるところまではGoogleAppsと大差ないけど、これに加えてSBPではOffice365 ProPlus(最新のOfficeスイートが利用できるサービスで、現状はOffice2013 ProPlusのデスクトップアプリ)が利用できる。
 Office365 ProPlusで利用したデータは標準でクラウドストレージに保存されていて、Officeのライセンスとストレージのアカウントが統合されているから、自宅でも外出先でも会社でも、同じようにアカウントでログインしてOfficeを使えば同じファイルを共有して作業ができる。

 SBPは1アカウントあたり5台のデバイスにOffice365 ProPlusを導入できるそうだ。
 私は自宅のメインデスクトップとメインノート、外出用のモバイルノート、MacのBootCamp環境で利用したいので多くのデバイスに入れられるこの契約は非常に有利だ。

 このサービスを会社で導入してくれると、自宅のPCで持ち帰った仕事をするためだけにオフィスを購入すると言う必要もなくなるのは大きな利点だろう(会社のアカウントでログインすればそのまま使える)
 クラウド型はもたつく印象もあるが、デスクトップ版を一度導入しておけば、普段は意識することなく利用できる感じで、問題は無さそうだ。

 Officeを複数導入する必要がある、イニシャルコストを抑えたいというニーズでは、Office365月額プランはかなり有利そうだ。

(652)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ