Linux技術--負載均衡配置
# Nginx
## 1. nginx可以做什麼?
1. 可針對靜態資源高速高併發訪問及快取。
2. 可使用反向代理加速,並且可進行資料快取。
3. 具有簡單負載均衡、節點健康檢查和容錯功能。
4. 支援遠端FastCGI服務的快取加速。
5. 支援FastCGI、Uwsgi、SCGI、Memcached Servers的加速和快取。
6. 支援SSL、TLS、SNI。
7. 具有模組化的架構:過濾器包括gzip壓縮、ranges支援、chunked響應、XSLT、SSI及影象縮放等功能。在SSI過濾器中,一個包含多個SSI的頁面,如果經由FastCGI或反向代理處理,可被並行處理。
###1.1 作為WEB服務的話支援
1. 支援基於名字、埠及IP的多虛擬主機站點。
2. 支援Keep-alive和pipelined連線。
3. 可進行簡單、方便、靈活的配置和管理。
4. 支援修改Nginx配置,並且在程式碼上線時,可平滑重啟,不中斷業務訪問。
5. 可自定義訪問日誌格式,臨時緩衝寫日誌操作,快速日誌輪詢及通過rsyslog處理日誌。
6. 可利用訊號控制Nginx程序。
7. 支援3xx-5xx HTTP狀態碼重定向。
8. 支援rewrite模組,支援URI重寫及正則表示式匹配。
9. 支援基於客戶端IP地址和HTTP基本認證的訪問控制。
10. 支援PUT、DELETE、MKCOL、COPY及MOVE等較特殊的HTTP請求方法。
11. 支援FLV流和MP4流技術產品應用。
12. 支援HTTP響應速率限制。
13. 支援同一IP地址的併發連線或請求數限制。
14. 支援郵件服務代理。
###1.2 應用場景
(1)作為Web服務軟體
(2)反向代理或負載均衡服務
(3)前端業務資料快取服務
```
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
```
###1.3 優點
1. 支援高併發:能支援幾萬併發連線(特別是靜態小檔案業務環境)。
2. 資源消耗少:在3萬併發連線下,開啟10個Nginx執行緒消耗的記憶體不到200MB。
3. 可以做HTTP反向代理及加速快取,即負載均衡功能,內建對RS節點伺服器健康檢查功能,這相當於專業的Haproxy軟體或LVS的功能。
4. 具備Squid等專業快取軟體等的快取功能。
5. 支援非同步網路I/O事件模型epoll(Linux 2.6+)。
## 2. apache的特點
1. Apache 2.2版本非常穩定強大,據官方說,Apache 2.4版本效能更強。
2. Prefork模式取消了程序建立開銷,效能很高。
3. 處理動態業務資料時,因關聯到後端的引擎和資料庫,瓶頸不在Apache上。
4. 高併發時消耗系統資源相對多一些。
5. 基於傳統的select模型,高併發能力有限。select 模型 也就是 同步 epoll 非同步
6. 支援擴充套件庫,可通過DSO、apxs方法編譯安裝額外的外掛功能,不需要重新編譯Apache。
7. 功能多,更穩定,更安全,外掛也多。
8. 市場份額在逐年遞減。
### 2.1. 網路模式
同步網路模式 select
每個請求的狀態始終在維護著 (消耗好多資源)
非同步網路模式 epoll 處理伺服器端的併發 請求人數越多 伺服器肯定吃緊 系統資源也會緊張 I/O效率也會很慢
不定期將你的請求 篩選出來 直接告訴你 不用挨個select
epoll
每個請求 我不再維護你的狀態 如果有請求 就找我 找到了 給你服務 找不到拉倒
## 3. lighttpd的特點
1. 基於非同步網路I/O模型,效能、併發都與Nginx相近。
2. 擴充套件庫是SO模式,比Nginx靈活。
3. 目前國內的使用率比較低,安全性沒有Apache和Nginx好。
4. 通過外掛(mod_secdownload)可實現檔案URL地址加密(優點)。
5. 社群不活躍,市場份額較低。
**圖說三個伺服器的效能對比**
![對比](http://wenku.baidu.com/content/38b81d255fbfc77da369b13c?m=677eb0dc3e26a59492c4441651619924&type=pic&src=5dd71ac83defc33aec5890bf2a3391d6.jpg)
## 4. 為什麼nginx處理併發能力更強?
![併發對比](http://wenku.baidu.com/content/38b81d255fbfc77da369b13c?m=677eb0dc3e26a59492c4441651619924&type=pic&src=04aef6ab446c3a8206bdb42bfa270dd8.jpg)
## 5. 如何選擇web伺服器?
1. 靜態業務:若是高併發場景,儘量採用Nginx或Lighttpd,二者首選Nginx。
2. 動態業務:理論上採用Nginx和Apache均可,建議選擇Nginx,為了避免相同業務的服務軟體多樣化,增加額外維護成本。動態業務可以由Nginx兼做前端代理,再根據頁面元素的型別或目錄,轉發到後端相應的伺服器進行處理。
3. 既有靜態業務又有動態業務:採用Nginx。
此外,如果併發不是很大,又對Apache很熟悉,採用Apache也是可以的,Apache 2.4版本也很強大,併發連線數也有所增加。總的來說,在滿足需求的前提下,首先選擇自己最擅長的軟體,若發現了更好的軟體,可在掌握新軟體之後逐步替換。雖然動態和靜態業務都傾向於選擇Nginx,但是大前提是自己要熟練掌握Nginx。切記,在工作中不要盲目選擇軟體,這可能最終會導致自己無法控制局面,從而給企業帶來災難性的損失。
## 6. nginx功能模組說明
Nginx核心功能模組(Core functionality)
![conf](http://wenku.baidu.com/content/38b81d255fbfc77da369b13c?m=677eb0dc3e26a59492c4441651619924&type=pic&src=a8e3f54faec4cc381bd860c74c8abef9.jpg)
![con](http://wenku.baidu.com/content/38b81d255fbfc77da369b13c?m=677eb0dc3e26a59492c4441651619924&type=pic&src=7e6d94ecab96b43e7d9660894c035cc2.jpg)
## 7. nginx虛擬站點配置方式
如果在Ubuntu16.04下使用apt安裝nginx,安裝完畢後其工作目錄設定如下:
- nginx站點配置目錄:/etc/nginx/
- 其中主配置為nginx.conf
- sites-available子目錄存放站點配置檔案,其中有一個default檔案為虛擬站點的配置模板,自己的虛擬站點可以以此為模板進行配置。
- sites-enabled子目錄存放一個對應站點配置檔案的軟連線。必須在sites-availabel生成站點的配置檔案,然後到sites-enabled新增對應的軟連線。
- 預設站點根目錄 : /var/www/html/
- 日誌檔案目錄:/var/log/nginx/
- error.log記錄站點的錯誤,如果要檢視詳細的錯誤資訊,可以開啟該檔案檢視
以www.blog.com站點為例說明多個虛擬站點配置的方法:
~~~
#1.首先切換目錄到sites-available目錄
cd /etc/nginx/sites-available
#2.複製虛擬站點配置模板,生成自己虛擬站點的配置檔案
sudo cp default www.blog.com.conf
#3 編輯模板
#---------------------以下為配置內容-------------------
server {
listen 80; #監聽埠
#站點的根目錄
root /var/www/html/www.blog.com;
# Add index.php to the list if you are using PHP
#網站預設首頁開啟順序
index index.html index.htm;
#站點名稱,可以有多個名稱,中間用空格隔開
server_name www.blog.com blog.com;
}
#------------------到此結束------------------------------
#這個模板比較簡單,如果有複雜的要求,請以此為基礎進行改進
#4 儲存退出
:wq
#5 切換到sites-enabled目錄下,建立軟連線
cd ../sites-enabled
sudo ln -s /etc/nginx/sites-available/www.blog.com.con www.blog.com.conf
#6 重啟nginx服務
sudo service nginx restart (start/stop)
或者
sudo /etc/init.d/nginx restart
#7 切換到站點根目錄(根據你自己的設定進行),我假定站點根目錄是/var/www/html
cd /var/www/html
sudo chmod -R 755 www.blog.com
#編輯index.html
<html>
<head>
<meta charset='utf-8'>
<title>瘋狂程式設計師的部落格</title>
</head>
<body>
<h1>瘋狂的程式設計師</h1>
</body>
</html>