ウェブサイト及びサーバー監視の プレミアム製品

Server Densityについて

PuppetでのNginxの展開

当社のCEO デイビット・ミィトンは5月に開催れたPuppet Camp Tokyoのイベントで Server Densityの監視インフラをいかに管理するかについての講演をしました。この内容に沿って、サーバー間でどのようにPuppeでNginxを展開するかについて説明したいと思います。

当社は1年以上、100台近くのサーバーのインフラをPuppetを使用して管理してきました。当初は、Terremarkでの古いホスト環境にマッチするようにマニュアルで設定をして、 Softlayerに移行しやすいようにしていました。ここ数ヶ月間で、当社はForge のモジュールを使うようにリファクタリングして、サーバーの数を減らすためにいくつかのサーバーの役割を統合しました。Forge のモジュールを使用することにより、自分たちですべてを再実装するのではなく、コミュニティーコードを再利用できるようになりました。

PuppetでのNginxの展開

Puppet ソリューションの追求

選択肢は自分たちでマニフェストを書き込むか(新たに一つやり方を追加することになりますが)、コミュニティーに接触して、このような問題が既に解決されたかを確認して、既存の解決方法を(または少なくとも何とかできるキックスタートの方法)を再び作り込むようなことをやめることでした。

当社では自分たちで実行するより再利用が有効であると信じており、Forge のサイトに行くことが不可欠でした。

セットアップについて

  • 当社は 数カ月間後導入されるServer Densityのバージョン2のインフラが準備できるまでに、Puppet Enterpriseを運用しました。そして、十分に考慮が必要なのはロードバランサでした。当社では現在Poundを使用していますが、新製品に必要な追加機能は Nginxにのみありました.
  • Nginxはイベント起動型のWebサーバーであり、プロキシーやロードバランスの機能が備わっています。またIt has inbuilt native support for FCGI や uWSGIのプロトコルのサポートが備わっており、 uWSGIなどの高速アプリサーバーで Python WSGIのアプリを運用することができます。
  • PoundやVarnishとは違い, 新規の NginxはWebSocketsやGoogle’s SPDY のスタンダードのサポートだけではなく、サードパーティーのTCP/IPソケットをフルにハンドルするためのモジュールもサポートしているため、 非同期のWebSocket Python のアプリとアップストリームの Node.js プロキシーを選んで混ぜることができます。
  • これは明らかにPuppetを通じて展開及び構成することができなければなりません。
  • 当社独自のマニフェストを使用。 これらはpuppet masterにより Gihub repoを引き出されます。
  • Puppet Console やLive Managementは集中的に使用され、スイッチのフェイルオーバーなどの一過性の変化を誘発するために使用されます。 (PuppetConf 2012のビデオ).

すべての統合

Puppetlabs nginxのモジュールを選択しましたが, 当社はそれをPuppet Enterprise (PE) の設定に追加することが必要でした。. そのためにはA) 実際のコードが必要で、 B)既存のノードでそれを運用できることが必要でした。

A)を実行するには2つの方法があります。:

  1. puppet モジュールのインストール  puppetlabs/nginx
  2. git サブモジュール  既存のpuppet master モジュールのフォルダーに https://github.com/puppetlabs/puppetlabs-nginx.git を追加。

この決定はモジュールを確認して、それの強化を実現することで簡単にできました。当社はこれらの変更をpuppetlabs-nginxでフォークしており, フォークをpuppet masterに組み込む最善の方法は gitサブモジュールを得ることです。

B)に関しては、 PE コンソールがこのようにパラメータ化クラをサポートしていないことがすぐに解りました。そこで当社のサイトのpp.(実際には何もなし)とコンソールを統合するオプションしか残されていませんでした。それは ENC であり、すべてでした。しかし、それでは前述のように過渡の変化を起こすようにコンソールを使用することができなくなります。当社は、site.ppではなくコンソール上でノードパラメータを継続して管理することを望んでいます。 完全性のために、ノードの継承を使用することもできますが、おそらく大変なことになると思われます。

その解決方法として、クラス階層を設定することにしました。:


class serverdensity-nginx
{
class { 'nginx': }
nginx::resource::upstream {
'socky_rack':
ensure => present,
members => $lbTargetHosts,
}

PE コンソールによって当社独自のserverdensity-nginx が使用され、nginx のクラスを含むので、コンソールコードパラメータと nginx モジュールの機能を使用できるようになります。

コンソールを使用して一過性の変化を引き起こす

このソリューションの長所の一つは、制御インターフェースのnginxの欠如を克服し、Poundで慣れている操作の機能性を維持できることです。

Nginxは変更するのに設定ファイルを必要として、リロードの際に設定をロードします。 To, eg. はロードバランサーのローテーションから一つのノードを取り除くので、, それに相応する設定アファイルを修正して、nginxのリロードを引き起こします。

Puppetでは、これはコンソールを使用してノードやグループ、パ ラメータ を 変更することで実現し、実行するノードを起動します。Puppetはそれからnginxをリロードします。最善の場合には、リロードで切断されるこはありません。

代替の方法、他にどのように実行すればいいか?

後にPuppet Labs Nginx モジュールはJames Frymanのモジュール.に由来することを知ります。

2011年6月30日以降、Puppet Labsのモジュールはアップデートされていないので、その名前で呼んだ方がいいかもしれません。明らかに、Puppet Labs`はForgeのにPuppet Labsの名前空間内のすべてのモジュールが最高クラスで、積極的に維持されることを保証したいのである。彼らは2013年初めにもこのプロジェクトをキックオフしたいと言っていました。

当社はモジュールに変更を加えました。

  • SSL の改善 Qalys SSL Labs!に感謝します
  • 追加のカスタムログ
  • バグの修正と美化

そして、 フォークはGithubで確認できます。