nginx負載平衡的理解
nginx是一個輕量級的、高效能的webserver,他主要可以做下面兩件事:
現在nginx到處都可以見到,經常會看到宕機後的網頁會顯示nginx的字樣,這也說明nginx由於高性能、使用配置簡、開源單這些特點被越來越多的用戶所接受,所使用。
其中第一種作為http伺服器,結合php-fpm進程,對發來的請求進行處理,nginx本身並不會解析php,他只是作為一個伺服器,接受客戶端發來的請求,如果是php請求,則交給php進程處理,並將php處理完成之後的結果傳送給客戶端。這個很簡單,安裝好nginx+php-fpm之後配置好各自的設定文件,啟動就可以實現。運作原理可以看下面這段解釋:
Nginx不支援對外部程式的直接呼叫或解析,所有的外部程式(包括PHP)必須透過FastCGI介面來呼叫。 FastCGI介面在Linux下是socket(這個socket可以是檔案socket,也可以是ip socket)。為了呼叫CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解為用於啟動另一個程式的程式),這個wrapper綁定在某個固定socket上,例如連接埠或檔案socket。當Nginx將CGI請求發送給這個socket的時候,透過FastCGI接口,wrapper接收到請求,然後派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本並讀取返回數據;接著,wrapper再將傳回的資料透過FastCGI接口,沿著固定的socket傳遞給Nginx;最後,Nginx將傳回的資料傳送給客戶端。這就是Nginx+FastCGI的整個運作過程,如圖下圖所示。
上面這段話解釋了nginx+fastcgi的運行機制,在nginx配置文件中會對請求進行匹配,並作做出相應的處理,比如說直接返回錯誤文件(這裡和上面說的有點區別,我估計是nginx內部對html等這些靜態檔案可以做類似上圖的解析),使用php進程對php請求進行處理(這裡的php進程可以是多個)。
第二種是用反向代理事項負載均衡,這個其實其實很簡單,說起來就是自己定義一組server,對請求進行匹配,並將請求轉給server中的任意一個處理,來減輕每個server的壓力,先看看網路上對反向向代理的定義:
反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連接請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果傳回給internet上請求連接的客戶端,此時代理伺服器對外就表現為一個反向代理伺服器。
反向代理是和正向代理(或叫代理) 相反的,代理大家定聽過吧,為了更方便的訪問B資源,透過A資源間接的訪問B資源,特點就是用戶知道自己最終要訪問的網站是什麼,但是反向代理用戶是不知道代理伺服器後邊做了什麼處理的,反向代理中服務真正的處理伺服器放在內網,對外網而言只可以訪問反向代理伺服器,這也大大提高了安全性。
安裝軟體
nginx安裝很簡單
1、安裝nginx所需的環境,pcre(作用rewrite)、zlib(作用壓縮)、ssl,這個也可以自己下載編譯安裝
yum -y install zlib;
yum –y install pcre;
yum –y install openssl;
2、下載安裝nginx-*.tar.gz。
tar –zxvf nginx-1.2.8.tar.gz –C ./;
cd nginx-1.2.8;
./congigure --prefix=/usr/local/nginx;
make && make install;
3、配置
這裡配置的時候只需要修改http{}之間的內容就行了,修改的第一個地方就是設定伺服器組,在http節點之間加入
upstream myServer{
server www.myapp2.com:80; #這裡是你自己要做負載平衡的伺服器位址1
server www.myapp1.com:8080 # server www.myapp1.com:8080 #nginx中的upstream支援下面幾種方式:輪詢(默認,按照時間順序對所有伺服器一個一個的訪問,如果有伺服器宕機,會自動剔除)、weight(伺服器的方位幾率和weight成正比,這個可以在伺服器配置不均的時候進行設定)、ip_hash(對每個請求的ip進行hash計算,並按照一定的規則分配對應的伺服器)、fair(按照每台伺服器的回應時間(rt)來分配請求,rt曉得優先分配)、url_hash(按照訪問url的hash值來分配請求),我這裡使用了預設的輪訓方式。
將請求指向myServer
location / {
proxy_pass http://myServer;
}完整的文件(刪除註解)如下:
worker_processes <span>1</span><span>; events { worker_connections </span><span>1024</span><span>; } http { include mime.types; default_type application</span>/octet-<span>stream; sendfile on; keepalive_timeout </span><span>65</span><span>; upstream myServer{ server www.myapp1.com:</span><span>80</span><span>; server www.myapp2.com:</span><span>8080</span><span>; } server { listen </span><span>80</span><span>; server_name my22; location </span>/<span> { proxy_pass http:</span><span>//</span><span>myServer;</span> <span> } } }</span>
設定反向代理後端作為負載平衡的兩個伺服器
可以看到上一步驟有兩個伺服器位址,www.myapp1.com:80和www.myapp2.com:8080,上面的nginx我是安裝在虛擬機器上面的,這兩台伺服器我是安裝在本機win8系統中的,使用apache的virtualhost,設定了兩個域名,這兩個域名下的代碼是互相獨立的,設定也很簡單:
1、設定apache設定檔
我使用的是xampp整合環境,要修改的地方有兩個,在httpd.conf中監聽埠的地方加入
Listen 8080
也就是說這個地方監聽了兩個連接埠
Listen 80
Listen 8080看看下面這個句是否打開,沒有打開的話,打開,打開如下面所示
<span># Virtual hosts Include conf</span>/extra/httpd-vhosts.conf在httpd-vhosts.conf中加入下面的內容,
<VirtualHost *:<span>80</span>><span> ServerName www.myapp1.com #对应的域名,负载均衡的服务器地址 DocumentRoot E:\soft\xampp\htdocs\www.myapp1.com #代码文件夹 </span></VirtualHost> <VirtualHost *:<span>8080</span>><span> ServerName www.myapp2.com DocumentRoot E:\soft\xampp\htdocs\www.myapp2.com </span></VirtualHost>修改windows的hosts文件,追加下面的內容
<span>127.0</span>.<span>0.1</span><span> www.myapp1.com </span><span>127.0</span>.<span>0.1</span> www.myapp2.com修改linux的/etc/hosts文件,追加下面的內容
<span>192.168</span>.<span>1.12</span><span> www.myapp1.com #这里前面的地址对应我win8本机的ip地址 </span><span>192.168</span>.<span>1.12</span> www.myapp2.com
我在www.myapp1.com:80放了一個檔案index.php【E:softxampphtdocswww.myapp1.comindex.php】
www.myapp2.com:8080中也放了一個檔案index.php【E:softxampphtdocswww.myapp2.comindex.php】
文件中的內容基本上相同,只是I'm the myapp2這個地方有區別,一個是myapp1,另一個是myapp2。
如果你可以在win8瀏覽器中輸入www.myapp1.com:80和www.myapp2.com:8080看到不同的效果
並且在centos下面看到下面的結果(自己美化了下)說明配置成功了
[root@bogon nginx]# curl www.myapp1.com:<span>80</span><span> I</span><span>'</span><span>m the myapp1<br>【view】1</span> [root@bogon nginx]# curl www.myapp2.com:<span>8080</span><span> I</span><span>'</span><span>m the myapp2<br>【view】1</span>
<?<span>php </span><span>session_save_path</span>("./"<span>); </span><span>session_start</span><span>(); </span><span>header</span>("Content-type:text/html;charset=utf-8"<span>); </span><span>if</span>(<span>isset</span>(<span>$_SESSION</span>['view'<span>])){ </span><span>$_SESSION</span>['view'] = <span>$_SESSION</span>['view'] + 1<span>; }</span><span>else</span><span>{ </span><span>$_SESSION</span>['view'] = 1<span>; } </span><span>echo</span> "I'm the myapp2<br>"<span>; </span><span>echo</span> "【view】{<span>$_SESSION</span>['view']}";
看看效果
等所有都ok之後可硬透過瀏覽器訪問看看效果
忘了說了,nginx代理伺服器的位址是http://192.168.1.113,
瀏覽器輸入http://192.168.1.113/index.php之後,不停的刷新,你會發現,會在
I'm the myapp2、I'm the myapp1
這兩個頁面之間來回交換,view會沒刷新兩下增加一次,這也證明了前面所說的默認是輪訓的方式,但這裡又有一個比較常見的問題了,當用戶訪問網站時,未做處理的情況下,session會保存在不同的伺服器上(我這裡用兩個不同的資料夾模擬兩台伺服器),session資料可能出現多套,這個問題怎麼解決呢,下篇文章說說這個問題,其實也很簡單。
本文版權歸作者iforever(luluyrt@163.com)所有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責任的權利。
以上就介紹了centos+nginx從零開始配置負載平衡,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。