反向代理與負載均衡的概念:
Nginx僅僅是作為nginx proxy反向代理使用,nginx其實是反向代理,只不過是有負載均衡的功能!
模塊詳解
upstream模塊
upstream www { #upstream是關鍵字,必須要寫,后面的www是一個群組名字,自己起名
server 192.168.70.127:80 weight=1; # server固定關鍵字,后面可以接域名或者IP,如果不指定端口默認80.
#weight權重,數值越大被分配的請求越多,結尾有分號
server 192.168.70.126:80 weight=1 bakup;#bakcup相當於熱備
server 192.168.79.128:80 weight=1 max_fails=2 fail_timeout=20s;#max_fails嘗試連接后端主機失敗的次數,這個值配合 proxy_next_upstream、 fastcgi_next_upstream和memcached_next_upstream這三個參數來使用。根據需求配置,不要太大建議1-3次
fail_timeout=20s 失敗秒數,在達到max_fails嘗試連接失敗次數后,休息20秒,在次連接默認10秒,建議2-3秒
}
upstream模塊調度算法
調度算法一份分為兩類:
第一類 靜態調度算法
分配的時候,不需要考慮后端節點服務器的情況(rr, wrr, ip_hash調度算法)
第二類 動態調度算法
根據自身的情況調度,根據后端節點狀態是否響應很快進行調度(least_conn,fair等)
靜態調度算法
rr輪詢(默認調度算法)
按照客戶端請求順序把客戶端的請求逐一分配到不同后端節點服務器
wrr權重輪序
在rr輪詢算法的基礎上加上權重,權重值越大,別轉發的請求越多,可以根據服務器狀態進行指定權重值大小
ip_hash
每個請求按照客戶端IP的hash結果分配,新的請求到達時,先將客戶端IP通過哈希算法哈希出一個值,在隨后的的客戶端請求中,客戶IP的哈希值只要相同,就會被分配至同一台服務器,該調度算法可以解決動態網頁的session共享問題,但是會導致請求分配不均
(在upstream里配置,如果是ip_hash,不能有weight和bakcup)
upstream www{
ip_hash:
server xxxx
}
動態調度算法
fair
fair算法會根據后端節點服務器的響應時間來分配請求,時間短的優先分配,必須下載nginx的相關模塊upstream_fair
upstream www{
fair;
server xxx;
server xxx;
}
least_conn
least_conn算法根據后端節點的連接數來決定分配情況,哪個機器連接數少就分發
url_hash算法(web cache)
和ip_hash類似,一般用於web緩存,根據訪問URL的hash結果來分配請求的,每個URL定向到同一個后端服務器,后端服務器為緩存服務器時效果明顯。
upstream www{
server xxxx
hash $request_uri;
hash_method crc32;
}
一致性hash算法
一致性hash算法一般用於代理后端業務為緩存服務(squid,memcached)的場景,通過將用戶請求的URI或指定字符串進行計算,然后調度到后端服務器上,此后任何用戶查找同一個RUI或者指定字符串都會被調度到這一台服務器上,此后后端的每個節點緩存的內容都是不同的。
http{ upstream www{ consistent_hash $request_uri; server xxxx id=1001 weigh=3; } }
http_proxy_module模塊
proxy_pass轉發代理
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
相關參數
- proxy_set_header 設置http請求header項傳給后端服務器節點,可實現讓代理后端服務器節點獲取訪問客戶端用戶真實IP地址 proxy_set_header Host $host;
- client_body_buffer_size 用於指定客戶端請求主體緩沖區大小
- proxy_connect_timeout 表示反向代理與后端節點服務器連接的超時時間
- proxy_send_timeout 代理后端服務器的數據回傳時間,在規定時間之內服務器必須傳完所有數據,否則斷開
- proxy_read_timeout 設置nginx從代理的后端服務器獲取信息時間,表示連接建立成功后,nginx等待后端服務器的響應時間
- proxy_buffer_size 設置緩沖區大小,默認該緩沖區大小等於指令proxy_buffers設置大小
- proxy_buffers 這是緩沖區的數量和大小,nginx從代理的后端服務器獲取響應信息
- proxy_busy_bufers_size 用於設置系統很忙時可以使用的proxy_buffers大小,官方推薦proxy_buffer*2
- proxy_temp_file_write_size 臨時緩存文件
反向代理重要參數
prox_pass http://server_pools; 通過proxy_pass功能把用戶的請求轉向到反向代理定義的upstream服務器
proxy_set_header Host $host; 在代理向后端服務器發送的http請求頭中加入host字段信息,用於后端服務器配置有多個虛擬主機,可以識別那個虛擬主機
proxy_set_header X-Forwarded-For $remot_addr; 用於接收用戶真實IP,而不是代理服務器ip
在配置文件里都會加上include proxy.conf;
在proxy.conf里增加參數,會顯得干凈
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
=========================NGINX--根據URL中的目錄地址實現代理轉發====================
當用戶請求www.daxian.com/upload/xx地址的時候,實現由upload上傳服務器池處理請求
當用戶請求www.daxian.com/static/xx地址的時候,實現由靜態服務器池處理請求
除此之外,對於其他訪問請求,全部交給默認動態服務器請求
環境 131負載均衡 126nginx 127apache(服務器有限,127當兩台服務器)
配置過程
在131nginx配置文件中添加
upstream static_pools { server 192.168.70.127:80 weight=1;#apache } upstream upload_pools{ server 192.168.70.127:8080 weight=1; } upstream default_pools{ server 192.168.70.126:80 weight=1;#nginx }
server {
listen 80;
server_name www.daxian.com;
location / {
proxy_pass http://default_pools;
include proxy.conf;
}
location /static/ {
proxy_pass http://static_pools;
include proxy.conf;
}
location /upload/ {
proxy_pass http://upload_pools;
include proxy.conf;
}
}
配置apache
cd /application/apache/conf/extra/ vim httpd-vhosts.conf <VirtualHost *:80> ServerAdmin 2647@qq.com DocumentRoot "/application/apache2.2.34/htdocs/www" ServerName www.daxian.com ServerAlias daxian.com ErrorLog "logs/www-error_log" CustomLog "logs/www-access_log" common </VirtualHost> <VirtualHost *:8080> ServerAdmin 2647@qq.com DocumentRoot "/application/apache2.2.34/htdocs/www8080" ServerName www.daxian.com ErrorLog "logs/www8080-error_log" CustomLog "logs/www8080-access_log" common </VirtualHost> 增加監聽端口8080 vim /application/apache/conf/httpd.conf Listen 80 Listen 8080
創建訪問目錄 mkdir -p /application/apache/htdocs/www8080 echo www8080>/application/apache/htdocs/www8080/index.html cd /application/apache/htdocs/www/ mkdir static/ echo static>index.html ../../bin/apachectl restart
web01修改hosts
192.168.70.127 web02 www.daxian.com
進行測試
curl http://www.daxian.com
apachewww
curl http://www.daxian.com/static/
static
cd www8080
mkdir /upload/
cd /upload/
echo "upload">index.html
測試
curl http://www.daxian.com:8080/upload/
upload
驗證結果
web01 修改hosts文件,將地址指向負載均衡器
192.168.70.131 lb01 www.daxian.com
ping www.daxian.com
PING lb-01 (192.168.70.131) 56(84) bytes of data.
64 bytes from lb-01 (192.168.70.131): icmp_seq=1 ttl=64 time=0.571 ms
64 bytes from lb-01 (192.168.70.131): icmp_seq=2 ttl=64 time=0.686 ms
64 bytes from lb-01 (192.168.70.131): icmp_seq=3 ttl=64 time=0.685 ms
測試
curl http://www.daxian.com
nginx wwww
curl http://www.daxian.com/static/
static
curl http://www.daxian.com/upload/
upload
============================nginx根據移動端轉發============================
在7層負載均衡下不需要人為拆分域名,對外只需要用一個域名即可,通過獲取用戶請求中設備信息($http_user_agent獲取)
vim nginx.conf
worker_processes 1;
events {
worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream android_pools { server 192.168.70.127:80 weight=1; #apache } upstream iphone_pools { server 192.168.70.127:8080 weight=1; } upstream pc_pools { server 192.168.70.126:80 weight=1; #nginx } server { listen 80; server_name www.daxian.com; location / { if ($http_user_agent ~* "android") { proxy_pass http://android_pools; } if ($http_user_agent ~* "iphone") { proxy_pass http://iphone_pools; } proxy_pass http://pc_pools; include proxy.conf; } } }
../sbin/nginx -s reload
局域網里就可以輸入ip地址訪問
安卓
http://192.168.70.131/static/
蘋果
http://192.168.70.131/upload/
pc
http://192.168.70.131