nginx實現負載均衡、緩存功能實戰


nginx實現負載均衡、緩存功能實戰

什么是正向代理?應用場景:翻牆

什么是反向代理?例如:haproxy和nginx

 

Nginx實現反向代理

nginx代理基於是ngx_http_proxy_module模塊的功能,該模塊有很多屬性配置選項,如:

proxy_pass:指定將請求代理至server的URL路徑;

proxy_set_header:將發送至server的報文的某首部進行重寫;

proxy_send_timeout:在連接斷開之前兩次發送到server的最大間隔時長;過了這么長時間后端還是沒有收到數據,連接會被關閉

proxy_read_timeout:是從后端讀取數據的超時時間,兩次讀取操作的時間間隔如果大於這個值,和后端的連接會被關閉。

proxy_connect_timeout: 是和后端建立連接的超時時間

 

proxy_pass配置常見用法有三種:

1、location的/uri將被替換為/newuri,如下:

location /uri {

proxy_pass http://ip:port/newuri;

}

將/mobi 的請求跳轉到新服務器上/mobile目錄下

location /mobi/ {

proxy_pass http://172.16.100.1/mobile/index.php;

}

172.17.253.236為反向代理服務器

vim /etc/nginx/nginx.conf

在瀏覽器上訪問

2、如果location的URI是通過模式匹配定義的,其URI將直接被傳遞,而不能為其指定轉換的另一個URI。

location ~ ^/mobile {

proxy_pass http://172.16.100.2;

}

172.17.253.132為反向代理服務器

vim /etc/nginx/nginx.conf

在瀏覽器上訪問

3、如果在location中使用的URL重定向,那么nginx將使用重定向后的URI處理請求,而不再考慮之前定義的URI

location /youxi {

rewrite ^(.*)$ /mobile/$1 break;

proxy_pass http://172.16.100.1;

}

172.17.253.132是反向代理

vim /etc/nginx/nginx.conf

在瀏覽器上訪問

客戶端發送請求給反向代理,而nginx作為反向代理,幫客戶端把請求發送給真正的后端服務器,而對於后台真正的服務器來說,他認為來訪問的客戶端是反向代理,此時如果想記錄真正的客戶端來訪問的信息日志,就需要定義一個頭部,把真正訪問的客戶端的ip打到頭部中,這樣后端服務器就能記錄真正訪問的客戶端的信息了。

proxy_set_header可將發送至server的報文的某首部進行重寫;常用於nginx做負載均衡時,獲取客戶端IP時,需要添加forward頭部。

proxy_set_header Host $host;

proxy_set_header X-REMOTE-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

原有請求報文中如果存在X-Forwared-For首部,則將client_addr以逗號分隔補原有值后,否則則直接添加此首部;

日志查看:

"$remote_addr" $host "$http_x_forwarded_for"

配置步驟:

1.在nginx反向代理服務器上配置

vim /etc/nginx/nginx.conf

在server段中配置

然后重啟nginx服務

2.在后端服務器上配置

vim /etc/nginx/ngin.conf

配置日志格式

然后重啟nginx服務

3.在瀏覽器上訪問反向代理,然后在后端服務器上查看日志

查看后端服務器的日志

tail -f /var/log/nginx/access.log

 

upstream(定義一組負載均衡的后端服務器)

nginx負載均衡是ngx_http_upstream_module模塊的功能,需要在配置文件http塊上下文中定義upstream塊,指定一組負載均衡的后端服務器,然后在上面講到的proxy_pass中引用,就可以反向代理時實現負載均衡了。

語法:server address [parameters];

paramerters:

weight:負載均衡策略權重,默認為1;

max_fails:在一定時間內(這個時間在fail_timeout參數中設置)檢查這個服務器是否可用時產生的最多失敗請求數

fail_timeout:在經歷了max_fails次失敗后,暫停服務的時間。max_fails可以和fail_timeout一起使用,進行對后端服務器的健康狀態檢查;

max_fails 3;fail_timeout 10s; 意思是在10s內最多失敗請求次數為3次,在經歷3次失敗請求后,暫停服務10s(一般max_fails和fail_timeout在一起用)

backup:當所有后端服務器都宕機時,可以指定代理服務器自身作為備份,對外提供維護提示頁面;

down:永久不可用

 

upstream dynamic {

server backend1.example.com weight=5;

server backend2.example.com:8080 max_fails=3; fail_timeout=5s ;

server 192.0.2.1 max_fails=3;

server backup1.example.com:8080 backup;

server backup2.example.com:8080 backup;

}

專業健康檢測模塊 nginx_upstream_check_module-master

 

upstream塊里可以用多個server選項配置多個后端服務器,同時還可配置對后端服務器的健康狀態檢查,可以在server后面加上max_fails(proxy_next_upstream指定檢查策略,默認為返回超時為失敗)和fail_timeout參數實現;也可以用health_check選項來實現health_check可以指定的參數較多,不過需要定義在location上下文中。

另外,可以指定代理服務器自身作為備份server,當所有后端服務器都宕機時,對外提供維護提示頁面。

 

還可以指定負載均衡策略:主要有round_robin(加權輪詢,默認)、hash、ip_hash、least_conn(最少連接)和least_time(最少響應時間,商業版本),策略定義在upstream上下文即可;

 

編譯安裝tengine

1.在官方下載最新的tengine包,然后rz到linux系統上

2.然后解壓解包

tar xvf tengine-2.1.1.tar.gz

3.安裝編譯環境

yum groupinstall "development tools"

yum install prce-devel

yum install openssl-devel

4.cd tengine-2.1.1/

./configure --prefix=/usr/local/tengine

5.make &&make install

6.cd /usr/local/tengine

7.vim /etc/profile.d/nginx.sh 添加PATH變量

export PATH=/usr/local/tengine/sbin:$PATH

. /etc /profile.d/nginx.sh 使添加的PATH變量生效

8.cp /etc/nginx/nginx.conf /usr/local/tengine/conf 將nginx的配置文件拷過來作為tengine的配置文件

然后就可以修改tengine的配置文件

 

tengine實現健康檢測

該模塊在Tengine-1.4.0版本以前沒有默認開啟,它可以在配置編譯選項的時候開啟:./configure --with-http_upstream_check_module

 

修改tengine的配置文件

vim /usr/local/tengine/conf/nginx.conf

1.配置upstream (upstream在server段外面配置)

2.在location段配置

3.重新加載tengine的配置文件

nginx -s reload

4.在瀏覽器上查看健康檢測頁面

也可以直接查看代碼

也可以直接curl來訪問,這樣就可以用awk把down的機器的ip給截下來,然后再做處理

 

check interval=3000 rise=2 fall=5 timeout=1000 type=http;

該指令可以打開后端服務器的健康檢查功能

指令后面的參數意義是:

  • interval:向后端發送的健康檢查包的間隔。
  • fall(fall_count): 如果連續失敗次數達到fall_count,服務器就被認為是down。
  • rise(rise_count): 如果連續成功次數達到rise_count,服務器就被認為是up。
  • timeout: 后端健康請求的超時時間。
  • default_down: 設定初始時服務器的狀態,如果是true,就說明默認是down的,如果是false,就是up的。默認值是true,也就是一開始服務器認為是不可用,要等健康檢查包達到一定成功次數以后才會被認為是健康的。
  • type:健康檢查包的類型,現在支持以下多種類型
    • tcp:簡單的tcp連接,如果連接成功,就說明后端正常。
    • ssl_hello:發送一個初始的SSL hello包並接受服務器的SSL hello包。
    • http:發送HTTP請求,通過后端的回復包的狀態來判斷后端是否存活。
    • mysql: 向mysql服務器連接,通過接收服務器的greeting包來判斷后端是否存活。
    • ajp:向后端發送AJP協議的Cping包,通過接收Cpong包來判斷后端是否存活。
  • port: 指定后端服務器的檢查端口。你可以指定不同於真實服務的后端服務器的端口,比如后端提供的是443端口的應用,你可以去檢查80端口的狀態來判斷后端健康狀況。默認是0,表示跟后端server提供真實服務的端口一樣。該選項出現於Tengine-1.4.0。

 

check_http_send "HEAD / HTTP/1.0\r\n\r\n";

該指令可以配置http健康檢查包發送的請求內容。為了減少傳輸數據量,推薦采用"HEAD"方法。

當采用長連接進行健康檢查時,需在該指令中添加keep-alive請求頭,如:"HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"。

同時,在采用"GET"方法的情況下,請求uri的size不宜過大,確保可以在1個interval內傳輸完成,否則會被健康檢查模塊視為后端服務器或網絡異常。

 

Syntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]

該指令指定HTTP回復的成功狀態,默認認為2XX和3XX的狀態是健康的。

 

 

nginx反向代理實現動靜分離

vim /usr/local/tengine/conf/nginx.conf

配置upstream

配置location段

 

Nginx實現緩存功能

為什么需要緩存?

緩存的最根本的目的是為了提高網站性能,減輕頻繁訪問數據,而給數據庫帶來的壓力。合理的緩存,還會減輕程序運算時,對CPU帶來的壓力。在計算機現代結構中,操作內存中的數據比操作存放在硬盤上的數據是

要快N個數量級的,操作簡單的文本結構的數據,比操作數據庫中的數據快N個數量級 。

例如:每次用戶訪問網站,都必須從數據庫讀取網站的標題,每讀一次需要15毫秒的時間,如果有100個用戶(先不考慮同一時間訪問),每小時訪問10次,那么就需要讀取數據庫1000次,需要時間15000毫秒.如果把頁面直接變成

頁面緩存,則每次訪問就不需要去數據庫讀取,大大提升了網站性能。

 

緩存服務工作原理

 

緩存數據分為兩部分(索引,數據):

1、存儲數據的索引,存放在內存中;

2、存儲緩存數據,存放在磁盤空間中;

 

Nginx實現緩存是通過代理緩存pxory_cache,這也是ngx_http_proxy_module模塊提供的功能,這里配置選項較多,常用的選項有:proxy_cache_path、proxy_cache和proxy_cache_valid

 

1、proxy_cache_path

proxy_cache_path定義一個完整的緩存空間,指定緩存數據的磁盤路徑、索引存放的內存空間以及一些其他參數,如緩存刪除策略。

注意,該選項只能定義在http塊上下文中。

如,proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10;

緩存數據存儲在/data/cache目錄中;

levels:配置在該目錄下再分兩層目錄,一層1個隨機字符作為名稱,二層2個隨機字符作為名稱,levels最多三層,每層最多兩個字符,這是為了加快訪問文件的速度;最后使用代理url的哈希值作為關鍵字與文件名,一個緩存數據如下:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c;

keys_zone:用來為這個緩存區起名,並設置大小。指定名稱為web,這個名稱后面proxy_cache需要

引用;而10m就是內存空間的大小;

max_size:指定最大緩存數據磁盤空間的大小,最多緩存的數據大小,如果超過這個大小,就開始清理緩存數據,使用lru算法將最近最少使用的緩存數據清理掉。

inactive:在inactive指定的時間內,未被訪問的緩存數據將從緩存中刪除。

 

2、proxy_cache

proxy_cache用來引用上面proxy_cache_path定義的緩存空間,現

時打開緩存功能,如下:

proxy_cache web; #引用上面定義上的緩存空間,同一緩存空間可以在幾個地方使用

 

3、proxy_cache_valid

proxy_cache_valid設置不同響應代碼的緩存時間,如:

proxy_cache_valid 200 302 10m; 響應狀態碼為200 302的數據緩存住到失效的時間為10分鍾,不管有沒有人來訪問這些數據,10分鍾后都將失效

proxy_cache_valid 404 1m;

 

配置Nginx緩存實例:

先配置proxy_cache_path,再配置proxy_cache引用、打開緩存空間,接着配置兩個proxy_cache_valid;為方便調試測試,我們可以通過add_header給請求響應增加一個頭部信息,表示從服務器上返回的cache狀態怎么樣(有沒有命中),主要配置如下:

#定義一個完整的緩存空間; 緩存數據存儲在/data/cache目錄中/配置在該目錄下再分兩層目錄,名稱為web(proxy_cache引用),10m內存空間大小/最大緩存數據磁盤空間的大小為1G/10分鍾未被訪問的緩存數據將從緩存中刪除

proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10m;

 

server {

listen 80;

server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

add_header Magedu-Cache "$upstream_cache_status form $server_addr"; #給請求響應增加一個頭部信息,表示從服務器上返回的cache狀態怎么樣(有沒有命中)

 

location / {

proxy_pass http://webserver; #引用上面定義的upstream負載均衡組

proxy_cache web; #引用上面定義上的緩存空間,同一緩存空間可以在幾個地方使用

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404 1m; #對代碼200和302的響應設置10分鍾的緩存,對代碼404的響應設置為1分鍾:

}

在tengine配置文件中具體配置如下:

vim /usr/local/tengine/conf/nginx.conf

1.配置proxy_cache開啟緩存功能(在http段配置)

proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10m;

2.配置proxy_cache引用上面定義的緩存空間(在location段配置)

proxy_cache web;

3.配置proxy_cache_valid,設置不同響應代碼的數據緩存時間(在location段配置)

proxy_cache_valid 200 302 10m;

proxy_cache_valid 404 1m;

4.在server段配置,給請求響應增加一個頭部消息

add_header Magedu-Cache "$upstream_cache_status form $server_addr";#給請求響應增加一個頭部信息,表示從服務器上返回的cache狀態怎么樣(有沒有命中)

 

memcached

memcached是什么

Memcached是一個自由開源的,高性能,分布式內存對象緩存系統。它是一種基於內存的key-value存儲,

用來存儲小塊的任意數據(字符串、對象)。這些數據可以是數據庫調用、API調用或者是頁面渲染的結果。

 

Memcached簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大數據量緩存的很多問題。它

的API兼容大部分流行的開發語言。本質上,它是一個簡潔的key-value存儲系統。

 

一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴

展性。

 

memcached配置

配置文件修改

/etc/sysconfig/memcached #路徑

PORT="11211" #端口

USER="memcached" #啟動用戶

MAXCONN="1024" #最大連接

CACHESIZE="64" #緩存空間大小

 

開啟memcache服務

systemctl start memcached(注意是memcached)

 

memcache該怎樣使用呢, 可以用telnet來連接memchache

如果不想修改配置文件,可以通過啟動memcached手動指定參數,如下:

memcached參數:

-d 指定memcached進程作為一個守護進程啟動

-m <num> 指定分配給memcached使用的內存,單位是MB,默認為64;

-u <username> 運行memcached的用戶

-l <ip_addr> 監聽的服務器IP地址,如果有多個地址的話,使用逗號分隔,格式可以為"IP地址:端口號",例如:-l 指定192.168.0.184:19830,192.168.0.195:13542;端口號也可以通過-p選項指定

-p <num> Listen on TCP port <num>, the default is port 11211.

-c <num>設置最大運行的並發連接數,默認是1024

-R <num> 為避免客戶端餓死(starvation),對連續達到的客戶端請求數設置一個限額,如果超過該設置,會選擇另一個連接來處理請求,默認為20

-k 設置鎖定所有分頁的內存,對於大緩存應用場景,謹慎使用該選項

-P 保存memcached進程的pid文件

-s <file> 指定Memcached用於監聽的UNIX socket文件

-a <perms> 設置-s選項指定的UNIX socket文件的權限

-U <num> Listen on UDP port <num>, the default is port 11211, 0 is off.

 

memcached狀態查看

STAT pid 22362 //memcache服務器的進程ID

STAT uptime 1469315 //服務器已經運行的秒數

STAT time 1339671194 //服務器當前的unix時間戳

STAT version 1.4.9 //memcache版本

STAT libevent 1.4.9-stable //libevent版本

STAT pointer_size 64 //當前操作系統的指針大小(32位系統一般是32bit,64就是64位操作系統)

STAT rusage_user 3695.485200 //進程的累計用戶時間

STAT rusage_system 14751.273465 //進程的累計系統時間

STAT curr_connections 69 //服務器當前存儲的items數量

STAT total_connections 855430 //從服務器啟動以后存儲的items總數量

STAT connection_structures 74 //服務器分配的連接構造數

STAT reserved_fds 20 //

STAT cmd_get 328806688 //get命令(獲取)總請求次數

STAT cmd_set 75441133 //set命令(保存)總請求次數

STAT get_hits 253547177 //總命中次數

STAT get_misses 75259511 //總未命中次數

 

memcached使用

memcached set 命令的基本語法如下所示:

set key flags exptime bytes [noreply]

value

set name 1 1800 8

xiaoming

key 是通過被存儲在Memcached的數據並從memcached獲取鍵(key)的名稱。

flags 是32位無符號整數,該項目被檢索時用的數據(由用戶提供),並沿數據返回服務器存儲。

exptime 以秒過期時間,0表示沒有延遲,如果exptime大於30天,Memcached將使用它作為UNIX時間戳過期。

bytes 是在數據塊中,需要被存儲的字節數。基本上,這是一個需要存儲在memcached的數據的長度。

noreply (可選) 參數告知服務器不發送回復

value 是一個需要存儲的數據。數據需要與上述選項執行命令后,將通過新的一行。

 

 

凡是基於內存存儲的數據一掉電就沒有了,凡是基於硬盤存儲的數據一掉電還是能夠找回的

memcache的緩存數據是存儲在內存上的一掉電就沒有了,而nginx的緩存數據時存儲在硬盤上的,索引是存儲在內存上的,但是索引可以通過數據從建的

 

php去連接memcache緩存數據庫,需要安裝php-memcache(php連接memcache的客戶端)

1.安裝memcache

yum install memcache

2.安裝php連接memcache的客戶端

yum install php-memcache

3.查看php支持的模塊

vim /data/web/phpinfo.php

<?php

phpinfo()

?>

然后在瀏覽器上訪問172.17.251.236/phpinfo.php,查看php是否支持memcache客戶端和服務的模塊,如圖:是支持的

4.編寫memcached測試腳本,然后在瀏覽器上訪問

vim /data/web/memcache.php

<?php

$mem = new Memcache;

$mem->connect("172.17.251.236", 11211); #連接Memcached

$version = $mem->getVersion();

echo "Server's version: ".$version."<br/>\n"; #輸出Memcached版本信息

$mem->set('magedu', 'Hello World', 0, 600); #向Memcached存儲數據'Hello World',時

間為600s

echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";

$get_result = $mem->get('magedu'); #獲取testkey的值

echo "$get_result is from memcached server.";

?>

然后在瀏覽器上訪問

memcached分布式存儲

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM