1、前提php
企業中,隨着用戶的增加,數據量也幾乎成幾何增加,數據愈來愈大,隨之也就出現了各類應用的瓶頸問題。html
問題出現了,咱們就得想辦法解決,通常網站環境,均會使用LAMP或者LNMP,而咱們對於網站環境的優化,除了對源代碼進行優化、SQL慢查詢優化 、SQL建立索引等以外,咱們還能夠對環境架構進行優化與擴展。mysql
所以,咱們引入了 Nginx 對站點實現負載均衡和動靜分離,來加快訪問速度。nginx
2、Nginx 動靜分離與負載均衡的實現機制web
Nginx 動靜分離與負載均衡的的實現離不開反向代理,什麼是反向代理呢?反向代理主要應用於集羣環境中,有多個客戶端給Nginx服務器發送的請求,當 Nginx 服務器接收到以後,會按照必定的規則將請求分發給了後端的業務處理服務器,此時,請求的來源也就是客戶端,是明確的,可是請求具體由哪臺服務器處理,並不明確,在這裏,Nginx 所扮演的就是一個反向代理角色。經過反向代理,咱們沒法直接看到後端服務器的服務器信息,所以反向代理具備隱藏業務服務器的做用!
sql
3、Nginx 反向代理實現
數據庫
一、網絡拓撲apache
二、環境準備vim
咱們準備好7臺服務器,2 臺 MySQL 數據庫作高可用,4 臺 Web 服務器,其中 2 臺裝 Nginx+PHP 作動態頁面的負載均衡,另外 2 臺裝 Apache+PHP 作靜態頁面的負載均衡,1 臺 Nginx 服務器,作反向代理服務器。後端
至於,服務器環境的安裝部署,這裏就不進行操做了,若有疑問的,能夠留言或者查看小弟前面的文章。
三、Nginx 服務器中 Nginx 服務配置文件修改
修改 http 部分
[root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf
一、從新定義 Nginx 服務的日誌記錄格式,關於關鍵字的釋義,大佬們能夠參閱官網。
二、使用 upstream 關鍵字定義後端服務器
格式:uptream + 後端節點組名稱(可自定義)
server + IP地址 + 權重 + 最大失敗次數 + 失敗超時時間 意思是:當後端節點連續兩次在3秒內沒法鏈接時,將放棄鏈接該節點,Nginx 將客戶端請求發送給下一節點。
修改 server 部分,這裏配置爲 Nginx 虛擬機
[root@nginx ~]# vim /wdata/nginx/config/80.conf
一、配置 Nginx location 匹配
分別配置以 .html 、.jpeg 、.jpg 、.gif 、.png 、.php 爲擴展名的文件的 location 規則。
proxy_set_header:容許從新定義或添加字段傳遞給代理服務器的請求頭。該值能夠包含文本、變量和它們的組合。在本例中意思將真實的客戶端地址添加到代理服務器的請求頭中。
proxy_pass:設置反向代理的鏈接,格式爲:proxy_pass + http://後端節點組的名稱; 。
X-Forwarded-For:簡稱 XFF 頭,它表明客戶端,也就是 HTTP 的請求端真實的 IP ,只有在經過了 HTTP 代理或者負載均衡服務器時纔會添加該項。
$remote_addr:遠端地址,也就是客戶端 IP 地址
二、配置站點日誌,這裏將日誌格式指定爲咱們在 HTTP 部分配置爲的 main 規則。
Nginx 反向代理的配置請參照圖中進行修改,其餘詳細的配置參數,請參閱官網,後續繼續更新。
4、後端 Nginx 服務節點配置
後端 Nginx 服務器節點主要用來作以 .php 擴展名結尾的站點文件的訪問和圖片文件的訪問,作到將圖片資源單獨剝離,以下降服務器負載。
一、配置以 .php 爲擴展名的站點服務器
[root@weba config]# vim 80.conf
如上圖:
a、listen:配置監聽端口,這裏配置爲 80 端口,在生產環境中,咱們可能會配置成 443 端口。
server_name:配置域名,這裏是實驗環境,所以採用默認未配置域名。
index:配置支持的文件類型
root:配置全局站點路徑
b、配置局部站點路徑、fastcgi的地址端口(指的是php-fpm的監聽地址及端口)、所支持的文件類型等
c、配置日誌文件
Nginx 站點的配置大概作到這種配置,基本就能夠進行訪問,若是在企業中須要更復雜的配置,請參考官方文檔。
二、配置單獨的圖片資源站點
[root@weba config]# vim 81.conf
如上圖:
配置方式跟 1 的配置徹底同樣,只是修改一下圖片資源的路徑便可。
WebA 和 WebB 的配置徹底同樣。最後修改完配置別忘了刷新,用命令:service nginx reload 便可
5、後端 Apache 服務節點配置
一、Apache 服務節點的配置基本也跟 Nginx 差很少,咱們這裏使用命令修改 Apache 配置文件。
[root@webc ~]# sed -i "s#/home/wwwroot/default#/wdata/http/www#g" /usr/local/apache/conf/httpd.conf
[root@webc ~]# sed -i "s#/home/wwwroot/default#/wdata/http/www#g" /usr/local/apache/conf/extra/httpd-vhosts.conf
[root@webc ~]# sed -i "s#/var/log/wwwlogs#/var/log/wwwlogs#g" /usr/local/apache/conf/httpd.conf
[root@webc ~]# sed -i "s#/var/log/wwwlogs#/var/log/wwwlogs#g" /usr/local/apache/conf/extra/httpd-vhosts.conf
[root@webc ~]# sed -i "s#/var/www#/wdata/http/www#g" /usr/local/apache/conf/extra/httpd-vhosts.conf
在 WebC 和 WebD 中分別執行,主要設置網站根目錄和日誌目錄。
二、修改 Apache 的端口和監聽地址
[root@webc ~]# vim /usr/local/apache/conf/httpd.conf
找到 Listen 行,修改成 0.0.0.0:80
如圖:
三、修改 Apache 日誌文件格式,方便咱們更好閱讀 Apache 日誌,也能夠保持默認。
找到 <IfModule log_config_module> 行,在下面的註釋下面添加
LogFormat "%a - %A %t \"%B\" \"%b\" \"%{Foobar}C\" \"%f\" - %h - %H \"%{Foobar}i\" %m \"%{Foobar}n\" \"%{Foobar}o\" - \"%p\" - \"%P\" %q %r %s \"%T\" \"%u\" \"%U\" \"%v\" \"%V\" %X" main
如圖:
至於所添加的參數的含義,你們可參閱 Apache 官方文檔。
到此 Apache 配置完成,還有一些關於 Apache 的權限配置等,這裏就先不作特殊說明,後期再作更新。
啓動 httpd 服務:
service httpd start
6、添加或者上傳站點文件
一、在 WebA 中的網站根目錄下添加 index.php 文件,內容以下:
<html>
<title>
This is a PHP page
</title>
<body>
Real ServerA<br><br>
<img src="1.jpg" alt="1" height="200" width="200" />
<img src="2.jpg" alt="2" height="200" width="300" />
<img src="3.png" alt="3" height="200" width="200" />
<img src="4.gif" alt=「4" height="200" width="380" /><br><br>
This is a PHP page !<br><br>
</body>
</html>
<?php
$link = new mysqli("192.168.20.150","root","123456");
if(!$link) echo "FAILD!鏈接錯誤,用戶名密碼不對";
else echo "OK ! MySQL 能夠鏈接。";
$link->close();
?>
二、在 WebB 中的網站根目錄下添加 index.php 文件,內容以下:
<html>
<title>
This is a PHP page
</title>
<body>
Real ServerB<br><br>
<img src="1.jpg" alt="1" height="200" width="200" />
<img src="2.jpg" alt="2" height="200" width="300" />
<img src="3.png" alt="3" height="200" width="200" />
<img src="4.gif" alt=「4" height="200" width="380" /><br><br>
This is a PHP page !<br><br>
</body>
</html>
<?php
$link = new mysqli("192.168.20.150","root","123456");
if(!$link) echo "FAILD!鏈接錯誤,用戶名密碼不對";
else echo "OK ! MySQL 能夠鏈接。";
$link->close();
?>
說明:這裏,咱們並無嚴格按照 PHP 文件的格式來書寫,只是簡單的爲了驗證負載均衡和反向代理來書寫的 PHP 文件。
三、在 WebA 和 WebB 的 image(圖片資源目錄) 目錄上傳 1.jpg 、2.jpg 、3.png 、4.gif 文件,如圖:
四、在 WebC 的站點根目錄添加 index.html 文件,內容以下:
<html>
<title>
This is a HTML page
</title>
<body>
Real ServerC<br><br>
<img src="1.jpg" alt="1" height="200" width="200" />
<img src="2.jpg" alt="2" height="200" width="300" />
<img src="3.png" alt="3" height="200" width="200" />
<img src="4.gif" alt=「4" height="200" width="380" /><br><br>
This is a HTML page !
</body>
</html>
五、在 WebD 的站點根目錄添加 index.html 文件,內容以下:
<html>
<title>
This is a HTML page
</title>
<body>
Real ServerD<br><br>
<img src="1.jpg" alt="1" height="200" width="200" />
<img src="2.jpg" alt="2" height="200" width="300" />
<img src="3.png" alt="3" height="200" width="200" />
<img src="4.gif" alt=「4" height="200" width="380" /><br><br>
This is a HTML page !
</body>
</html>
文件添加和上傳完成,下面咱們開始驗證咱們配置的動靜分離和負載均衡是否成功。
7、驗證動靜分離和負載均衡
一、在瀏覽中打開 http://192.168.20.138/index.php ,效果以下圖:
二、在瀏覽器 http://192.168.20.138/index.html ,效果以下圖:
三、查看 Nginx 負載均衡器的 Nginx 日誌。
訪問 http://192.168.20.138/index.php 日誌以下圖:
如圖能夠看出,當咱們訪問 http://192.168.20.138/index.php 時,服務器會將客戶端請求按照咱們配置的後端節點組中的順序或者權重依次發給 WebA 和 WebB ,當網頁中有圖片請求時,也會按照順序進行訪問 WebA 和 WebB 的圖片節點。
訪問 http://192.168.20.138/index.html 日誌以下圖:
如圖能夠看出,當咱們訪問 http://192.168.20.138/index.html 時,對於 html 的請求,會依次發給 WebC 和 WebD 節點服務,而對於圖片資源的訪問,會將請求發給兩臺圖片服務器。
由以上日誌能夠看出,Nginx 配置動靜分離和負載均衡時一件很簡單的工做,配置過程,須要咱們認真對待。
8、總結
通過前面配置與測試,咱們發現,Nginx 反向代理動靜分離、負載均衡很簡單,只須要咱們會使用兩個關鍵字:upstream 和 proxy_pass 便可,會使用這兩個關鍵字,基本的反向代理動靜分離、負載均衡是徹底能夠實現,可是在實際的生產環境中,須要咱們作的還有不少。