一、nginx安裝
nginx是一款輕量級的web 伺服器/反向代理伺服器及電子郵件(imap/pop3)代理伺服器,並在一個bsd- like 協議下發行。由俄羅斯的程式設計師igor sysoev所開發,供俄國大型的入口網站及搜尋引擎rambler(俄文:рамблер)使用。其特點是佔有內存少,並發能力強,事實上nginx的並發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站用戶有:百度、新浪、網易、騰訊等。
最新版本的nginx版本為1.9.3,我這下載的是window版本的,一般實際場景都是安裝在linux系統下的,由於linux系統目前正在摸索中這裡就不介紹。官方下載地址:。下載完成之後解壓縮執行nginx.exe就啟動了nginx了,啟動後會在進程裡面看到nginx。
要實現負載平衡需要修改conf/nginx.conf的設定訊息,修改設定資訊之後重新啟動nginx服務,可以透過nginx -s reload指令實作。這裡我們使用 ants 提供的一個批次來操作。
將nginx.bat檔案放到nginx.exe相同資料夾下,直接執行就行了。文章結尾會提供本文所用到的所有文件。
二、網站建置及設定
#1.搭建兩個iis網站
網站下只有一個簡單的index頁面,用來輸出目前伺服器資訊。由於我沒有兩台機器,所以將兩個站點都部署到本機了,分別綁定了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監聽端口,修改http server下的listen節點值,由於本機80端口已經被佔用,我改為監聽8083端口。
listen 8083;
在http節點下新增upstream(伺服器叢集),server設定的是叢集伺服器的訊息,我在這裡搭建了兩個站點,設定了兩個資訊。
#服务器集群名称为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站點第二次9000。出現這樣的結果證明我們負載平衡搭建成功了。嘗試關閉其中的9000站點,然後刷新頁面發現輸出的http端口一直是8082,也就是說其中一個站點掛了,只要還有一個站點是好的,我們的還是可以服務。四、問題分析
雖然我們搭建了負載平衡站點,但還存在以下問題。 1.如果站點使用了session,請求平均分配到兩個站點,那麼必然存在session共享問題,該如何解決? 使用資料庫保存session資訊使用nginx將相同ip的請求分配到固定伺服器,修改如下。 ip_hash會計算ip對應hash值,然後分配到固定伺服器
upstream jq_one{ server 127.0.0.1:8082 ; server 127.0.0.1:9000 ; ip_hash; }建立一台redis伺服器,對session的讀取都會從該redis伺服器上讀取。後面的文章將介紹分散式快取redis的使用
2.管理員更新網站文件,該怎麼操作,現在還只有兩台伺服器,可以手動將文件更新到兩台伺服器,如果是10台呢,那麼手動操作必然是不可行的
3.網站中的檔案上傳功能會將檔案指派到不同的伺服器,檔案共用問題如何解決。
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中文網其他相關文章!