NGinxとDockerによる1つのタップ展開:ロードバランシングのための設定⚖


ようこそ戻るには、私たちは簡単に逆プロキシを導入し、どのように我々はいくつかのNGNX、我々のアプリのバランスをロードするには、簡単にスケールアウトし、提供するために使用することができます.最終的なアーキテクチャとして、最終的な結果として説明します.

今日、我々はNGinxの基礎に右にジャンプします、それで、最初に、あなたがそれをあなたのマシンにインストールしたことを確認してください.
インストールが完了したら、すべての魔法が本当に起こる設定フォルダに移動できます.このパスに移動して起動します/etc/nginx/ ( Linux上にあるならば、あなたはnginx.conf ファイルは、お気に入りのテキストエディタを使用して起動し、そこに見てみましょう.
ファイルは空ではなく、既に設定されているデフォルトの設定があり、すべてを削除して最初から起動します.
今日は3つの基本的なセットアップを学びます.
  • ローカルファイルの提供
  • ホストURLを提供する
  • 負荷分散による複数インスタンスへのアクセス
  • ローカルファイルの提供


    Aの基本骨格nginx.conf fileは(ほとんどのシナリオで)これらの2つのディレクティブを含んでいなければなりません.
    http {
    
    }
    
    events {
    
    }
    
    出発しますevents 今のところ空になって、他の指令に集中してください.http NGNXをHTTPサーバとして設定します.

    Before we continue, note that we'll be stopping and starting Nginx multiple times whenever we apply changes to the conf file, so if Nginx is not already running, run it using nginx command.
    If it is already running and we need to restart it, we'll have to stop it using nginx -s stop command, and then start it once again using nginx.
    If you're on Linux make sure that you are running these commands in an elevated grant using sudo.


    HTTPサーバを追加しましょう8080 :
    http {
        server {
            listen 8080;        
        }
    }
    
    events { }
    
    ファイルを保存し、nginxを再起動してlocalhost:8080 , 次の歓迎画面を見ることができます.

    NGinxは、まだ設定していないので、デフォルトのパスからこの静的なHTMLファイルを引っ張っている.私たちは今1つを設定するでしょう、私はindex.html フォルダ内にNginx_Article デスクトップで
    <html>
      <body>
        CUSTOM NGINX PAGE, YAY!
      </body>
    </html>
    
    そのフルパスは/home/{myusername}/Desktop/Nginx_Article/ , 私がLinuxを使っていることを覚えておいてください.そうすれば、このパスはあなたのケースにおいて少し異なるかもしれません{myusername} あなたのアカウントのユーザー名(コースのかすかな括弧なしで)で.
    ここで、ポート番号を打ったときにNGNXを設定してこのウェブページをポイントしましょう8080 :
    http {
        server {
            listen 8080;
            root /home/{myusername}/Desktop/Nginx_Article/;
        }
    }
    
    events { }
    
    nginxの再起動と再ロードlocalhost:8080 , そして、あなたは我々を見ることができるべきですindex.html うまくいった.
    さあ、レベルを高くしましょう.複数のディレクトリを持っていれば、ただ一つのルートだけではないでしょうか?
    イージー
    http {
    
        server {
            listen 8080;
    
            location /images {
                root /home/{myusername}/Desktop/Nginx_Article_Another_Directory/;
            }
    
                   location /videos {
                root /path/to/another/root/;
            }
        }
    
    }
    events { }
    
    ここで我々はroot 内部の指令location ディレクティブ、この設定はnginxにこのディレクトリを提供するよう依頼します./home/{myusername}/Desktop/Nginx_Article_Another_Directory/images 場合にlocalhost:8080/images が要求された.
    マシン上のディレクトリを作成するのを忘れないでください.
    重要な注意:ディレクトリ/imagesindex.html デフォルトで提供されるファイル、または特定のファイルを要求する必要がありますlocalhost:8080/images/cat.jpg , ファイルが保存されていなければ/images , 前の要求は禁断の状態を返します.
    パスマッピングの別の方法はalias 以下のディレクティブ
    http {
    
        server {
            listen 8080;
    
            location /documents {
                alias /home/{myusername}/Desktop/Nginx_Article_Another_Directory/top_secret;
            }
        }
    
    }
    events { }
    
    aliasディレクティブはnginxにこのディレクトリを提供するよう依頼します.home/{myusername}/Desktop/Nginx_Article_Another_Directory/top_secret 場合にlocalhost:8080/documents が要求された.

    🧾 要約しましょう

  • の場合alias ディレクトリは、NGinxが移動することになっていたフルパスを提供する必要がありますroot ディレクトリはディレクトリのルートパスを持っていて、そのパスに場所の値を追加するだけです.
  • 実際のディレクトリは/documents 内部Nginx_Article_Another_Directory , 私たちはディレクトリのために/top_secret .
  • ホストURLを提供する


    我々は逆プロキシを構築しているとしましょうwww.example.com , 我々は、ユーザーが我々自身のドメインからサイトを見ることを望みます、これは以下の構成を通して簡単にされることができました:
    http {
    
        server {
            listen 8080;
            location / {
                proxy_pass http://www.example.com/;
            }
        }
    
    }
    
    events { }
    
    移動するlocalhost:8080 nginxを再起動した後、例と同じページを見ることができます.COM .
    これは、ポートを通してアクセス可能なローカルホストアプリケーション(私たちの場合、バックエンドアプリケーション)を提供するときと同様に使用することができます5000 ,
    http {
    
        server {
            listen 8080;
            location / {
                proxy_pass http://127.0.0.1:5000/;
            }
        }
    
    }
    
    events { }
    

    負荷分散による複数インスタンスへのアクセス


    このユースケースでは、簡単なHello World Appを展開します.ミニマムセットアップでは、必要なのはマシン上の作業用のドッキングセットアップです.
    あなたのお気に入りのターミナルのアプリに頭を下げ、同じアプリの3つのインスタンスを、それぞれ独自のコンテナ上でスピン、我々は“HelloWorld”のDocker画像を使用しているでしょう80 , 要求されると、応答のコンテナのIDを出力します.
    foo@bar:~$ docker run -p 1111:80 -d strm/helloworld-http
    478405720f2106d718edb1602812528ae53011cb196dc3731447c64d0bd8f2ff
    
    foo@bar:~$ docker run -p 1112:80 -d strm/helloworld-http
    a374ce45bf07b9747573e7feb1ae9742e72d2a31d74c2da3caa43abd5586a108
    
    foo@bar:~$ docker run -p 1113:80 -d strm/helloworld-http
    422efc18f418772cb96ea6088f2f801854ad4da21436da2c485f3ef80cca20ec
    
    Dockerが各実行コマンドの後に各コンテナのIDを出力することに注意してください.また、ポートを通して、そのコンテナコンテナの外側からアクセス可能なアプリケーションの3つのインスタンスを展開することにも気付きます:1111 , :1112 , :1113 . たとえば、アプリケーションの最初のインスタンスに移動するには、頭にする必要がありますlocalhost:1111 , など.
    さあ、一緒に遊びましょうconf ファイルは、我々の3つのインスタンスの上に入って来る荷をバランスさせるためにそれをセットアップします.
    http {
    
        upstream allinstances{
            server 127.0.0.1:1111;
            server 127.0.0.1:1112;
            server 127.0.0.1:1113;
        }
    
        server {
            listen 8080;
            location / {
    
                proxy_pass http://allinstances/;
    
            }
        }
    
    }
    
    events { }
    
    我々のデッキに新しい指令を加えたように見えます.upstream , どこproxy_pass 今すぐポイント.

    upstream defines a cluster that you can proxy requests to. It's commonly used for defining a web server cluster for load balancing.


    基本的に、これはNginxRound-Robin 各々のサーバがリクエストの等しい数に役立つように、各々の着信要求.あなたがリフレッシュボタンを押すたびに、別のサーバーで迎えられる予定です.
    あなたは場所ディレクティブで、クリエイティブを得る可能性がありますproxy_passes , so /odd1111 or 1113 , and /even ポートに移動する1112 .
    あなたのアプリケーションがメモリ内のユーザーデータを保存しているかどうか?次に、ユーザのIPアドレスが変更されない限り、指定されたユーザが同じサーバをヒットすることが保証されるよう、ユーザーのIPアドレスをハッシュ化することでユーザのセッション「sticky」を作成する必要があります.
    upstream allinstances{
        ip_hash; # << Will hash the user's IP address and resolve to a single server
        server 127.0.0.1:1111;
        server 127.0.0.1:1112;
        server 127.0.0.1:1113;
    }
    
    追加後ip_hash コマンドは、どんなにあなたがページをリフレッシュしても、常に同じサーバーでサーブされます.
    私は今、あなたを得ることができる基本を持っていると思う.我々は、全体のセットアップをコンテナ(NGinxを含む)にパッケージングされ、単一のdocker-compose コマンド.
    オスカーワイルドによる小さいが、強力な引用で、このものを終えたいです
    良い仕事を続ける🚀.