1. nginx のインストール
nginx は軽量の Web サーバー/リバース プロキシ サーバーおよび電子メール (imap/pop3) プロキシ サーバーであり、bsd にインストールされます。合意。これはロシアのプログラマー igor sysoev によって開発され、ロシアの大手ポータル Web サイトおよび検索エンジンである Rambler (ロシア語: рамблер) で使用されています。その特徴は、メモリ占有量が少なく、強力な同時実行機能を備えていることです。実際、nginx の同時実行機能は、同じタイプの Web サーバー間でより優れたパフォーマンスを発揮します。中国本土の nginx Web サイトのユーザーには、Baidu、Sina、NetEase、Tencent などが含まれます。
nginx の最新バージョンは 1.9.3 です。私がダウンロードしたのは Windows バージョンです。通常、実際のシナリオでは、Linux システムにインストールします。Linux システムは現在調査中なので、インストールします。ここでは紹介しないでください。公式ダウンロードアドレス:.ダウンロードが完了したら、解凍して nginx.exe を実行して nginx を起動すると、プロセス内に nginx が表示されます。
負荷分散を実現するには、conf/nginx.conf の構成情報を変更する必要があります。構成情報を変更した後、nginx サービスを再起動します。これは、次の方法で実現できます。 nginx -s reload コマンド。ここでは、ant が提供するバッチプロセスを使用して動作します。
nginx.bat ファイルを nginx.exe と同じフォルダーに置き、直接実行します。この記事で使用されるすべてのファイルは、記事の最後に記載されています。
2. サイトの構築と構成
1. 2 つの iis サイトを構築する
以下に 1 つだけあります。サイト 現在のサーバー情報を出力するために使用される単純なインデックス ページ。マシンが 2 台ないため、両方のサイトをこのマシンに展開し、それぞれポート 8082 と 9000 にバインドしました。
protected void page_load(object sender, eventargs e) { label0.text = "请求开始时间:"+datetime.now.tostring("yyyy-mm-dd hh:mm:ss"); label1.text = "服务器名称:" + server.machinename;//服务器名称 label2.text = "服务器ip地址:" + request.servervariables["local_addr"];//服务器ip地址 label3.text = "http访问端口:" + request.servervariables["server_port"];//http访问端口" label4.text = ".net解释引擎版本:" + ".net clr" + environment.version.major + "." + environment.version.minor + "." + environment.version.build + "." + environment.version.revision;//.net解释引擎版本 label5.text = "服务器操作系统版本:" + environment.osversion.tostring();//服务器操作系统版本 label6.text = "服务器iis版本:" + request.servervariables["server_software"];//服务器iis版本 label7.text = "服务器域名:" + request.servervariables["server_name"];//服务器域名 label8.text = "虚拟目录的绝对路径:" + request.servervariables["appl_rhysical_path"];//虚拟目录的绝对路径 label9.text = "执行文件的绝对路径:" + request.servervariables["path_translated"];//执行文件的绝对路径 label10.text = "虚拟目录session总数:" + session.contents.count.tostring();//虚拟目录session总数 label11.text = "虚拟目录application总数:" + application.contents.count.tostring();//虚拟目录application总数 label12.text = "域名主机:" + request.servervariables["http_host"];//域名主机 label13.text = "服务器区域语言:" + request.servervariables["http_accept_language"];//服务器区域语言 label14.text = "用户信息:" + request.servervariables["http_user_agent"]; label14.text = "cpu个数:" + environment.getenvironmentvariable("number_of_processors");//cpu个数 label15.text = "cpu类型:" + environment.getenvironmentvariable("processor_identifier");//cpu类型 label16.text = "请求来源地址:" + request.headers["x-real-ip"]; }
2. nginx 設定情報の変更
nginx の listen ポートを変更し、http サーバー下の listen ノードの値を変更します。このマシンのポート 80 が占有されているため、listen に変更しました。ポート8083に接続します。
listen 8083;
http ノードの下にアップストリーム (サーバー クラスター) を追加します。サーバー設定はクラスター サーバーの情報です。ここでは 2 つのサイトを構築し、2 つの情報を設定しました。
#服务器集群名称为jq_one upstream jq_one { server 127.0.0.1:9000; server 127.0.0.1:8082; }
http ノードの下の location ノードを見つけて変更します
location / { root html; index index.aspx index.html index.htm; #修改主页为index.aspx #其中jq_one 对应着upstream设置的集群名称 proxy_pass http://jq_one; #设置主机头和客户端真实地址,以便服务器获取客户端真实ip proxy_set_header host $host; proxy_set_header x-real-ip $remote_addr; proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; }
設定ファイルを変更した後は、必ず nginx サービスを再起動してください。最終的な完全な設定ファイル情報は次のとおりです
3. 実行結果
http://127.0.0.1:8083/index.aspx にアクセスして数回アクセスし、赤でマークされた部分に注目してください。
#ご覧のとおり、リクエストは 8082 サイトと 9000 サイトに分散されており、最初は 8082 サイトです。そして2回目は9000。このような結果は、負荷分散設定が成功したことを証明しています。 9000 のサイトを閉じてみて、ページを更新すると、出力 http ポートが常に 8082 であることがわかります。これは、サイトの 1 つがダウンしていることを意味します。正常なサイトがまだ存在する限り、私たちのサイトは引き続きサービスを提供できます。4. 問題分析
負荷分散サイトを構築しましたが、まだ次のような問題があります。 1. サイトがセッションを使用しており、リクエストが 2 つのサイトに均等に分散されている場合は、セッション共有の問題が発生しているはずです。 データベースを使用してセッション情報を保存するnginx を使用して、同じ IP へのリクエストを固定サーバーに割り当てるには、次のように変更します。 ip_hash は、IP に対応するハッシュ値を計算し、それを固定サーバーに割り当てます。
upstream jq_one{ server 127.0.0.1:8082 ; server 127.0.0.1:9000 ; ip_hash; }
2. 管理者はサイト ファイルをどのように更新する必要がありますか? 現在、サーバーは 2 つだけです。ファイルを 2 つのサーバーに手動で更新できます。サーバーが 10 台ある場合は、手動この操作は絶対に実行不可能です。
を使用できます。サイトのファイル アップロード機能により、ファイルが別のサーバーに割り当てられます。ファイル共有の問題を解決する方法。
4. 負荷構成が異なるサーバーは、構成も異なります。高いものもあれば、低いものもあります。高い構成を持つサーバーは、より多くのリクエストを処理できますか?
upstream jq_one{ server 127.0.0.1:8082 weight=4; server 127.0.0.1:9000 weight=1; }
通过weight设置每台服务器分配请求站的权重,值越高分配的越多。
5.由于请求是经过nginx转发过来的,可以在代码里面获取到用户请求的实际ip地址吗?
答案是肯定的,在localtion节点设置如下请求头信息
#设置主机头和客户端真实地址,以便服务器获取客户端真实ip proxy_set_header host $host; proxy_set_header x-real-ip $remote_addr; proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
代码里面通过request.headers["x-real-ip"],就能获取到真实ip
6.nginx实现静态文件(image,js,css)缓存
在server节点下添加新的localtion
#静态资源缓存设置 location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$ { expires 30d; root /nginx-1.9.3/html;#root: #静态文件存在地址,这里设置在/nginx-1.9.3/html下 break; }
这是index页面的代码
以上がnginx+iis がシンプルな負荷分散を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。