概述:反向代理是指的,服務器代理網絡上的客戶機請求,將請求轉達給內部真實服務器,而後在返回給Internet客戶端,代理服務器上面沒有任何網頁資料。反向代理和正向代理沒有衝突,能夠在防火牆設備中同時使用這兩種結合,正向代理能夠進行過濾,保護內部網絡安全。javascript
軟件七層負載均衡大可能是基於HTTP反向代理,Nginx反向代理可以支持虛擬主機,能夠按照輪詢,IP哈希,URL哈希,權重方式對後端服務器作負載均衡,還支持後端服務器健康檢查。php
常見的Web負載均衡方法:css
一、 DNS輪詢:將同一個主機名添加多個A記錄,DNS將解析請求安裝A記錄的順序,隨即分配到不一樣的IP上,使用dig baidu.com 就能夠看到不一樣的A記錄對應的IP地址。缺點:可靠性低,其中一臺出現故障,就不會給予迴應,就算從DNS去掉該服務器IP,可是也會保存在各地區的ISP衆多的DNS緩存中。系統股災不均衡,使用簡單輪詢,不能計算出服務器的負載差別,因此有可能客戶集中請求到其中某一臺服務器。html
二、F五、LVS、DNS只能解析這裏不作講述java
配置環境:node
三臺CentOS5.3,一臺作nginx代理,2臺apache作頁面測試。apache端口改成:8080,nginx使用80口接收客戶請求linux
yum -y install pcre-devel openssl openssl-devel //安裝包,不然編譯時候出錯nginx
#useradd wwwweb
#groupadd www算法
#usermod -g www www //設置nginx的用戶和組
#tar xzvf pcre-7.8.tar.gz
#./configure
#make ; make install //安裝pcre讓nginx支持rewrite重寫方便之後所需
[root@localhost tar]# cd nginx-0.7.16/
[root@localhost nginx-0.7.16]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
--with-http_stub_status_module:這個模塊用於獲取nginx自上次啓動以來的工做狀態,非核心模塊
--with-http_ssl_module : 把ssl編譯進去, 僅僅指定openssl庫的源代碼路徑仍是不夠的
[root@localhost nginx-0.7.16]#make ; meke install
#cd /usr/local/nginx/conf/nginx.conf
#vi nginx.conf
user www www; //設置用戶和組
worker_processes 4; //生成進程數,等於CPU總核數兩倍
error_log /data1/logs/nginx_error.log crit; //錯誤日誌路徑,錯誤日誌可選項爲:【debug info notice warn error crit】
pid /usr/local/nginx/logs/nginx.pid; //PID路徑
worker_rlimit_nofile 51200; //指定文件描述符數量
events {
use epoll; //使用網絡I/O模型
worker_connections 51200; //容許鏈接數,文件描述符
}
http
{
include mime.types; //文件類型
default_type application/octet-stream; //默認文件類型
charset UTF-8 //語言類型
server_names_hash_bucket_size 128; //根據CPU的cache來設定
client_header_buffer_size 4; //記錄緩存4k
large_client_header_buffers 4 8k; //若是4k不夠,用8k
sendfile on; //指定nginx是否調用sendfile函數(zero copy方式)來輸出文件,普通應用必須設爲on,對於普通文件用on。若是進行下載I/O負載應用,設置爲off,以平衡磁盤磁盤和網絡I/O處理速度。
#tcp_nopush on; //容許或禁止使用socket的TCP_NOPUSH(on freebsd或TCP_COR(on linux),此選擇僅僅在使用sendfile時候可用,
keepalive_timeout 65; //長鏈接超時時間
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#開啓gzip壓縮,用於支持在線實時壓縮輸出數據流
gzip on; //off關閉或者on開啓gzip功能
gzip_min_length 1k; //設置容許壓縮最小字節數,0表示多大都壓,最好設置大於1k,小於1k越壓越大
gzip_buffers 4 16k; //系統獲取幾個單位的緩存,用於存儲gzip壓縮結果數據流。4 4k 表明以4k爲單位,按照原始數據大小以4k爲單位的4倍申請內存。 4 8k 表明以8k爲單位,按照原始數據大小以8k爲單位的4倍申請內存,若是沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲gzip壓縮結果。
gzip_http_version 1.1; //判斷http協議版本,是否支持壓縮,不然用戶看到亂碼。默認便可,大部分都得支持
gzip_comp_level 2; //gzip壓縮比,1 壓縮比最小處理速度最快,9 壓縮比最大但處理最慢
gzip_types text/plain application/x-javascript text/css application/xml; //默認nginx是開啓gzip壓縮,可是隻針對html文件押送 gzip_types text/plain application/x-javascript text/css text/html application/xml text/javascript; 在nginx的gzip的gzip_types加上
gzip_vary on; //和http頭有關係,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,因此避免浪費不支持的也壓縮,因此根據客戶端的HTTP頭來判斷,是否須要壓縮。
client_max_body_size 50m; //容許客戶端請求的最大單個文件字節數
client_body_buffer_size 128k; //緩衝區代理用戶端請求的最大字節數,能夠理解先保存到本地在穿給用戶
proxy_connect_timeout 600; //和後端服務器鏈接的超時時間,發起握手等候相應超時時間
proxy_read_timeout 600; //鏈接成功後,等待後端服務器相應時間,已經進入後端的排隊之中等候處理
proxy_send_timeout 600; //後端服務器數據回傳時間,在規定時間內服務器必須傳完全部數據
proxy_buffer_size 16k; //只保存用戶頭信息一共nginx進行規則處理,用於緩存代理請求
proxy_buffers 4 32k; //告訴nginx保存單個用的幾個Buffer最大用多大空間
proxy_busy_buffers_size 64k; //若是系統很忙能夠申請更大的proxy_buffers,官方推薦 *2
proxy_temp_file_write_size 64k; //proxy緩存臨時文件大小
upstream http_server_pool {
server 192.168.1.2:8080 weight=4 max_fails=2 fail_timeout=30s;
server 192.168.1.3:8080 weight=2 max_fails=2 fail_timeout=30s;
} //設置地址池,後端2臺服務器
server //第一個虛擬主機,反向代理http_server_pool這組服務器
{
listen 80; //監聽端口
server_name www.xiao.com; //主機名稱
location /
{
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; //http://www.2tutu.com/post/2008/631.html //後端服務器返回500 503 404錯誤,自動請求轉發到upstream池中另外一臺服務器
proxy_pass http://http_server_pool;
proxy_set_header Host www.xiao.com;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log logs/www.xiao.com.access.log combined;
}
}
proxy_set_header Host www.xiao.com:
proxy_set_header Host $host :首先說明 proxy_set_header 指令在向反向代理的後端Web服務器發起請求時添加指定的 Header頭信息,後端web服務器有多個基於域名的虛擬主機時,經過頭信息Host,用於指定請求的域名,這樣後端web才能識別反向代理請求哪一個虛擬主機處理。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for :聯繫下面PS中所寫,在後端web中就算加上$http_x_Forwarded_for這條,也得不到用戶的IP,因此在nginx反向代理添加Header頭信息 X-Forwarded-For在配合後端服務器日誌文件的$http_x_Forwarded_for這條就能夠得到用戶的IP地址了。
PS:假設Nginx做爲Web服務器,nginx或Squid做爲反向代理後,就不能獲取客戶端的真實IP地址了,因爲在客戶端和Web增長了中間層,web沒有真實的IP,經過$remote_addr變量拿到是反向代理的IP,Web代理能夠增長$http_x_Forwarded_for信息,用於記錄客戶端IP和原來客戶請求的服務器地址,在日誌格式中加上便可。
log_format main '$http_x_Forwarded_for '
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /tmp/Nginx.access.log main; //在後端Web裏面加上這樣就能夠了
upstream : nginx支持4種算法,下面一一介紹
一、 輪詢
每一個請求按時間順序分配到不一樣的後端服務器了,後端服務器down掉,自動切除。
二、weight
設定服務器權值: weight=2
weight=4 服務器性能不均時候使用
三、 ip_hash
每一個請求按訪問ip的hash結果分配,每一個訪客有固定的後端服務器,能夠解決session問題
四、 fair(第三方)
按後端服務器的響應時間來分配,響應時間短的優先分配
五、url_hash (第三方)
按訪問的url的hash結果分配,使每一個url定向到同一個後端服務器,後端爲緩存服務器比較有效。
以往的架構lvs或者dns輪詢,這樣雖然squid裏面的均衡的,可是忽略了一點就是數據量,雖然每臺squid是均勻可是都是滿載的,重複的請求,會佔用不少空間,在前面換上nginx在配上 url_hash,根據url分流後,每個url會只存在一個squid上,每臺squid數據徹底不一樣。http://edu.codepub.com/2010/0202/20282.php
upstream http_server { //定義負載均衡設備的Ip及設備狀態
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
down : 當前的IP server暫時不參與負載,不進行反向代理
weight: 默認爲1,weight越大,負載的權重越大
max_fails: 容許請求失敗的次數默認爲1,當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤。
fail_timeout : max_fails次失敗後,暫停的時間
backup: 其它全部非backup機器down或者忙時候,請求backup機器,這臺機器壓力最輕
PS: nginx支持同時設置多組負載均衡,給不一樣的server使用
location:設置對URL進行匹配,好比 location / , location /data 這兩個設置優先級,/ 下也能夠,可是不如 /data下搜索更快,定位更準。