web-dev-qa-db-ja.com

nginx(または他のクイックリバースプロキシ)を動的に構成する方法はありますか?

いくつかのn層サービスのアプリケーションサーバーである同一のノードがいくつかあるとします。そして、Apache ZooKeeperを使用して、分散アプリケーションのすべての構成を保持するとします。さらに、このアプリケーションの前にロードバランサーとリバースプロキシとしてnginxがあります。

したがって、node1でのみデータを変更するコマンドを実行し、ある期間、node2がnode1と異なるとしましょう。そして、すべての情報がnode2に移行され、node2がnode1と同じデータを持つまで、プロキシがすべての特別な要求(その特定のデータを必要とする)をnode1にリダイレクトする必要があります。

Nginx(または他のプロキシ)にApache ZooKeeperから構成を読み取らせる方法はありますか?またはもっと広い:プロキシ構成をオンザフライで効果的に切り替える方法はありますか?そしてもちろん、システム全体のダウンタイムなしで(または最小限の状態で)実行する必要があります。したがって、nginxを再起動することはできません。

19
Dima

Nginxには、構成を変更する2つの方法があります。

  • マスタープロセスへのHUPシグナルは、「リロード」をもたらします。 Nginxは多数の新しいワーカーを開始し、古いワーカーが正常にシャットダウンできるようにします。つまり、既存のリクエストを完了します。 noサービスの中断はありません。この構成変更方法は非常に軽量で迅速ですが、いくつかの制限があります。キャッシュゾーンを変更したり、Perlスクリプトを再コンパイルしたりすることはできません。

  • USR2シグナル、次にWINCH、次にQUITをマスタープロセスに送信すると、「実行可能アップグレード」が実行されます。このシーケンスにより、構成全体を完全に再読み込みし、Nginx実行可能ファイルをアップグレードすることもできます。ディスクキャッシュもリロードします(時間がかかる場合があります)。この方法では、noサービスの中断も発生します。

公式ドキュメント

42

Nginx-Clojure を試してください。 clojure/Java/groovyリライトハンドラーを使用してzookeeperにアクセスし、いくつかのnginx変数を更新してプロキシターゲットを動的に変更できます。例えば.

Nginx.confで

set $mytarget "";

location / {
   rewrite_handler_type Java;
   ## We will change $mytarget in MyRewriteHandler
   rewrite_handler_name my.MyRewriteHandler;
   proxy_pass $mytarget;
}

MyRewriteHandler.Javaで

public static class MyRewriteHandler implements NginxJavaRingHandler {

        @Override
        public Object[] invoke(Map<String, Object> request) {
           //access zookeeper
           ...............
           //change nginx variable mytarget
           ((NginxJavaRequest)request).setVaraible("mytarget", "http://some-Host-or-url");
        }
6
xfeep

更新として: Hipache ホスト構成をredisに保存します。これは、実行時に簡単に操作できます。また、node.jsとnode-http-proxyに基づいています。

2

HAProxyとそのUNIXドメインソケットインターフェイスを使用して可能です: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#9.2

サーバーまたはフロントエンド全体をダウンからアップに切り替えたり、オンザフライで元に戻したりすることができます。フロントエンドの2つのセットを定義し、それぞれが1つの特定の状態用に構成されている構成ファイルを使用すると、目的を達成できます。

2
qfiard

Nginx Luaを使用してnginxの動的構成を可能にし、必要なことを正確に実行できる興味深いプロジェクトがあります( https://github.com/samalba/hipache-nginx

それはHipacheの背後にいる人たちによって書かれています。

2
Khash

これは遅いかもしれませんが、お金があれば。 Nginx plusはまさにあなたにぴったりです。 単純なURL呼び出しを使用して、新しい構成をその場で取得します。

2
Bwire

から ドキュメント

nginx -s reload

-sは「signal」用で、signalには「quit」、「reload」、「reopen」、または「stop」を指定できます。

1

サーバーを再起動せずにnginx構成を動的に変更できるかどうかわからない。

同じ要件がある場合は、おそらくnodejszookeeperの統合を掘り下げたでしょう。

いくつかの興味深いオープンソースプロジェクトがあります。

node-zookeepernodejszookeeperと統合します。

node-http-proxy 負荷分散に使用できるプロキシhttpサーバー。

もちろん、それらは成熟度に欠けますが、あなたにとって興味深いかもしれません。

0