Nginx實現反向代理
nginx代理基於是ngx_http_proxy_module模塊的功能,該模塊有很多屬性配置選項,如:
proxy_pass:指定將請求代理至server的URL路徑;
proxy_set_header:將發送至server的報文的某首部進行重寫;
proxy_send_timeout:在連接斷開之前兩次發送到server的最大間隔時長;過了這么長時間后端還是沒有收到數據,連接會被關閉
proxy_read_timeout:是從后端讀取數據的超時時間,兩次讀取操作的時間間隔如果大於這個值,和后端的連接會被關閉。
proxy_connect_timeout: 是和后端建立連接的超時時間
1、location的/uri將被替換為/newuri,如下:
proxy_pass http://ip:port/newuri;
proxy_pass http://172.16.100.1/mobile/index.php;
2、如果location的URI是通過模式匹配定義的,其URI將直接被傳遞,而不能為其指定轉換的另一個URI。
proxy_pass http://172.16.100.2;
3、如果在location中使用的URL重定向,那么nginx將使用重定向后的URI處理請求,而不再考慮之前定義的URI
rewrite ^(.*)$ /mobile/$1 break;
proxy_pass http://172.16.100.1;
客戶端發送請求給反向代理,而nginx作為反向代理,幫客戶端把請求發送給真正的后端服務器,而對於后台真正的服務器來說,他認為來訪問的客戶端是反向代理,此時如果想記錄真正的客戶端來訪問的信息日志,就需要定義一個頭部,把真正訪問的客戶端的ip打到頭部中,這樣后端服務器就能記錄真正訪問的客戶端的信息了。
proxy_set_header可將發送至server的報文的某首部進行重寫;常用於nginx做負載均衡時,獲取客戶端IP時,需要添加forward頭部。
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反向代理服務器上配置
2.在后端服務器上配置
3.在瀏覽器上訪問反向代理,然后在后端服務器上查看日志
tail -f /var/log/nginx/access.log
upstream(定義一組負載均衡的后端服務器)
nginx負載均衡是ngx_http_upstream_module模塊的功能,需要在配置文件http塊上下文中定義upstream塊,指定一組負載均衡的后端服務器,然后在上面講到的proxy_pass中引用,就可以反向代理時實現負載均衡了。
語法:server address [parameters];
paramerters:
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:當所有后端服務器都宕機時,可以指定代理服務器自身作為備份,對外提供維護提示頁面;
server backend1.example.com weight=5;
server backend2.example.com:8080 max_fails=3; fail_timeout=5s ;
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系統上
yum groupinstall "development tools"
./configure --prefix=/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-1.4.0版本以前沒有默認開啟,它可以在配置編譯選項的時候開啟:./configure --with-http_upstream_check_module
vim /usr/local/tengine/conf/nginx.conf
1.配置upstream (upstream在server段外面配置)
也可以直接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,也就是一開始服務器認為是不可用,要等健康檢查包達到一定成功次數以后才會被認為是健康的。
- 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
Nginx實現緩存功能
緩存的最根本的目的是為了提高網站性能,減輕頻繁訪問數據,而給數據庫帶來的壓力。合理的緩存,還會減輕程序運算時,對CPU帶來的壓力。在計算機現代結構中,操作內存中的數據比操作存放在硬盤上的數據是
要快N個數量級的,操作簡單的文本結構的數據,比操作數據庫中的數據快N個數量級 。
例如:每次用戶訪問網站,都必須從數據庫讀取網站的標題,每讀一次需要15毫秒的時間,如果有100個用戶(先不考慮同一時間訪問),每小時訪問10次,那么就需要讀取數據庫1000次,需要時間15000毫秒.如果把頁面直接變成
頁面緩存,則每次訪問就不需要去數據庫讀取,大大提升了網站性能。
緩存服務工作原理
Nginx實現緩存是通過代理緩存pxory_cache,這也是ngx_http_proxy_module模塊提供的功能,這里配置選項較多,常用的選項有:proxy_cache_path、proxy_cache和proxy_cache_valid。
1、proxy_cache_path
proxy_cache_path定義一個完整的緩存空間,指定緩存數據的磁盤路徑、索引存放的內存空間以及一些其他參數,如緩存刪除策略。
如,proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10;
levels:配置在該目錄下再分兩層目錄,一層1個隨機字符作為名稱,二層2個隨機字符作為名稱,levels最多三層,每層最多兩個字符,這是為了加快訪問文件的速度;最后使用代理url的哈希值作為關鍵字與文件名,一個緩存數據如下:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c;
keys_zone:用來為這個緩存區起名,並設置大小。指定名稱為web,這個名稱后面proxy_cache需要
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分鍾后都將失效
配置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;
#access_log logs/host.access.log main;
add_header Magedu-Cache "$upstream_cache_status form $server_addr"; #給請求響應增加一個頭部信息,表示從服務器上返回的cache狀態怎么樣(有沒有命中)
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段配置)
3.配置proxy_cache_valid,設置不同響應代碼的數據緩存時間(在location段配置)
proxy_cache_valid 200 302 10m;
add_header Magedu-Cache "$upstream_cache_status form $server_addr";#給請求響應增加一個頭部信息,表示從服務器上返回的cache狀態怎么樣(有沒有命中)
memcached
memcached是什么
Memcached是一個自由開源的,高性能,分布式內存對象緩存系統。它是一種基於內存的key-value存儲,
用來存儲小塊的任意數據(字符串、對象)。這些數據可以是數據庫調用、API調用或者是頁面渲染的結果。
Memcached簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大數據量緩存的很多問題。它
的API兼容大部分流行的開發語言。本質上,它是一個簡潔的key-value存儲系統。
一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴
memcached配置
systemctl start memcached(注意是memcached)
memcache該怎樣使用呢, 可以用telnet來連接memchache
如果不想修改配置文件,可以通過啟動memcached手動指定參數,如下:
memcached參數:
-m <num> 指定分配給memcached使用的內存,單位是MB,默認為64;
-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.
-R <num> 為避免客戶端餓死(starvation),對連續達到的客戶端請求數設置一個限額,如果超過該設置,會選擇另一個連接來處理請求,默認為20
-k 設置鎖定所有分頁的內存,對於大緩存應用場景,謹慎使用該選項
-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 cmd_get 328806688 //get命令(獲取)總請求次數
STAT cmd_set 75441133 //set命令(保存)總請求次數
STAT get_hits 253547177 //總命中次數
STAT get_misses 75259511 //總未命中次數
memcached使用
set key flags exptime bytes [noreply]
key 是通過被存儲在Memcached的數據並從memcached獲取鍵(key)的名稱。
flags 是32位無符號整數,該項目被檢索時用的數據(由用戶提供),並沿數據返回服務器存儲。
exptime 以秒過期時間,0表示沒有延遲,如果exptime大於30天,Memcached將使用它作為UNIX時間戳過期。
bytes 是在數據塊中,需要被存儲的字節數。基本上,這是一個需要存儲在memcached的數據的長度。
value 是一個需要存儲的數據。數據需要與上述選項執行命令后,將通過新的一行。
凡是基於內存存儲的數據一掉電就沒有了,凡是基於硬盤存儲的數據一掉電還是能夠找回的
memcache的緩存數據是存儲在內存上的一掉電就沒有了,而nginx的緩存數據時存儲在硬盤上的,索引是存儲在內存上的,但是索引可以通過數據從建的
php去連接memcache緩存數據庫,需要安裝php-memcache(php連接memcache的客戶端)
然后在瀏覽器上訪問172.17.251.236/phpinfo.php,查看php是否支持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',時
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分布式存儲