VKまたはOdnoklassnikiの多くのアプリケーション開発者は、アプリケーションが新しいアプリケーションの最上位になり、大きな負荷がかかる状況に直面しています。
クライアントがサーバーにアクセスするプロセスで、画像が生成されるとします。 多くのサーバーがあります。 単一のファイルシステムがなく、サーバー間でファイルが同期されていない場合、クライアントはどのようにこの画像を提供できますか?
毎秒多数の人がサーバーにアクセスする場合はどうすればよいですか? 答えは簡単です-nginx。
このトピックでは、静的ファイルと動的ファイルの両方のバランスを検討します。
すぐに予約します。 MySQLへのクエリのバランスをとるためのオプションについては説明しません。
つまり、大まかに言えば、同じphpスクリプトのセットがインストールされ、php-fpmがインストールおよび構成されているサーバーがあります。 両方のサーバーがクライアントの要求に応答し、ドメインが173.194.32.2および173.194.32.3で応答することに応じて、DNS構成にレコードが入力されます。
行きましょう。
サーバー設定
サーバー1:
外部IPアドレス:173.194.32.2
内部IPアドレス:192.168.0.1
サーバー2:
外部IPアドレス:173.194.32.3
内部IPアドレス:192.168.0.2
ネットワーク図は次のようになります。

Nginx設定。 サーバー1:
upstream nextserver { server 192.168.0.2; } upstream backend { server 127.0.0.1; } server { listen *:80; server_name 173.194.32.2; location / { root /var/www/default; # . access_log off; try_files $uri $uri/ @nextserver; } location @nextserver { proxy_pass http://nextserver; proxy_connect_timeout 70; proxy_send_timeout 90; proxy_read_timeout 90; } location ~* \.(php5|php|phtml)$ { proxy_pass http://backend; } }
この構成をさらに詳しく見てみましょう。
最初に、クライアントを配布するサーバーを定義します。
アップストリームnextserver
nextserver-静的ファイルをアップロードするためのサーバーのリスト
server 192.168.0.2;
アップストリームバックエンド
バックエンド-動的コンテンツ(phpなど)を配信するためのサーバーのリスト
server 127.0.0.1;
ところで、毎回同じサーバーへのクライアントからのリクエストを必ず取得する必要がある場合は、上流セクションにip_hashディレクティブを追加してください。
場所/
標準ディレクティブ。 サーバーのルートディレクトリは、ルートディレクティブによって設定されます。
root /var/www/default;
access_logを無効にします。 負荷が重い場合、アクセスログエントリは、最初はディスクに追加の負荷をかけ、2番目はディスクをすぐに詰まらせます。
access_log off;
この行で最も興味深いことが起こります:)ファイルの存在を確認し、次にディレクトリの存在を確認します。 ファイルが存在する場合、nginxはそれをクライアントに渡します。 ファイル/ディレクトリが存在しない場合、クライアントは場所@nextserverにリダイレクトされます。
try_files $uri $uri/ @nextserver;
場所@nextserver
ここではすべてが簡単です。 クライアントをこの場所にリダイレクトする場合、proxy_passディレクティブを介してクライアント要求をアップストリームnextserverにリダイレクトします。 この場合、それは192.168.0.2です。 アップストリームセクションには複数のサーバーが存在する可能性があるため、必要に応じてクライアントを複数のサーバーにリダイレクトできます。
2つのサーバーがある場合、最初のクライアントは最初のサーバーに移動し、2番目のクライアントは2番目に移動します。
さらに、リダイレクト設定はこのセクションで設定されます。 この場合、タイムアウトします。
proxy_pass http://nextserver; proxy_connect_timeout 70; proxy_send_timeout 90; proxy_read_timeout 90;
場所〜* \。(php5 | php | phtml)$
拡張子がphp5、php、phtmlのファイルをリクエストする場合-クライアントをハンドラーにリダイレクトします-この場合、アップストリームバックエンド
proxy_pass http://backend;
残っているのは、別のサーバーセクションを登録することだけです。この場合、サーバーはアドレス127.0.0.1をリッスンする必要があります。
このアドレスで、接続を受信し、php-fpmを使用して解決する必要があります。
サーバーセクションは、1つの詳細を除いて、上記のイメージと類似性で書かれています。 場所を変更します〜* \。(Php5 | php | phtml)$セクションを次のように変更します。
location ~* \.(php5|php|phtml)$ { fastcgi_pass unix:/tmp/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/default$fastcgi_script_name; include fastcgi_params; }
このセクションの説明では、php-fpmデーモンをインストールして実行し、/ tmp / php-fpm.sockにあるUNIXソケットをリッスンしていることを前提としています。
最初のサーバーと同様に、2番目のサーバーを構成します。 上流のnextserverセクションのアドレスを192.168.0.1に変更します(つまり、存在しないファイルの要求をサーバー1に送信する必要があることをサーバーに伝えます)。
さらに、server_nameディレクティブを変更します。
サーバー2の構成は次のようになります。
upstream nextserver { server 192.168.0.1; } upstream backend { server 127.0.0.1; } server { listen *:80; server_name 173.194.32.3; location / { root /var/www/default; # . access_log off; try_files $uri $uri/ @nextserver; } location @nextserver { proxy_pass http://nextserver; proxy_connect_timeout 70; proxy_send_timeout 90; proxy_read_timeout 90; } location ~* \.(php5|php|phtml)$ { proxy_pass http://backend; } }
したがって、クライアントが1つのサーバーに存在しない画像を要求すると、2番目のサーバーで画像を検索しようとします。
この場合の唯一の問題は、両方のサーバーに画像がない場合、リクエストがタイムアウトに達するまで、あるサーバーから別のサーバーに円で送信されることです。 その結果、503エラーが返されます。
この記事で指定されているnginxの構成は簡素化されており、要求されたファイルがない場合にループの問題を解決できるなど、改善することができます。 しかし、これは別の問題です。