第十三周作業
nginx 是什么?
NGNIX是一個免費的、開源的、高性能的HTTP服務器和反向代理,以及一個IMAP/POP3代理服務器。NGNX以其高性能、穩定性、豐富的特征集、簡單的配置和低的資源消耗而著稱。
nginx 的程序結構
nginx是高度模塊化的,程序啟動的時候由一個master進程生成管理多個worker來進行并發相應用戶請求。可以達到10k并發。緩存進程則是由cache loader(載入緩存對象)和cache manager(管理緩存鏡像)兩部分組成。高度模塊化的nginx只有在后期版本才支持DSO(動態加載模塊)部分模塊支持動態裝載和卸載。
特性:異步、事件驅動和非阻塞
- 并發請求處理:通過poll/select 實現,只有當poll不支持時才使用select
- 文件IO: 高級IO sendfile,異步,mmap
nginx模塊配置文件結構
- 主配置文件:/etc/nginx/nginx.conf
- 輔配置文件:/etc/nginx/conf.d/*.conf
配置文件模塊分類:
核心模塊:core module
標準模塊:
- HTTP modles: web模塊
Standard HTTP modules:標準http模塊
Optional HTTP modules 可選http模塊
- Mail module:右鍵模塊
- Stream module:流模塊(傳輸層代理)
- 3rd party modules:第三方模塊,分布式文件系統需要用到
nginx的功用:
- 靜態web資源服務器;(圖片服務器,或js/css/html/txt等靜態資源服務器)
- 結合FastCGI/uwSGI/SCGI等協議反代動態資源請求。
- http/https協議的反向代理;
- imap4/pop3協議的反向代理;
- tcp/udp協議的請求轉發;
主配置文件
user nginx; 運行 nginx的用戶 worker_processes auto | number 可啟用的物理CPU核心數量[范圍值小于范圍值的數字] worker_cpu_affinity cpumask ... | auto; auto:綁定worker 到cpu核心上, cpumask:手動綁定,根據cpu核心數設定數組;0代表禁用,1代表啟用。以4核cpu為例:0001 0010 0100 1000;中間以空格區分。 worker_priority number 指定worker進程的nice值,設定worker進程優先級設定nice范圍[-20~19] worker_rlimit_nofile 65536; worker進程所能夠打開的文件數量上限;計算方法 cpu核心數 * worker進程最大連接數量。 # 查看設定進程數量 ulimit -n,設定ulimit number;最大65536 error_log /var/log/nginx/error.log warn; 錯誤日志文件保存位置 pid /var/run/nginx.pid; pid文件位置 daemon no | off; 是否以守護進程方式運行Ninx master_process on | off; nginx進程運行模式master單進程/多進程worker。默認是on error_log file [level] 錯誤日志保存位置,可設置等級 events { worker_connections 10240; 每個worker進程最大并發連接數量; accept_mutex on; 處理新的連接請求的方法;on由各個worker輪流處理新的請求,off每個新請求到達都會通知所有worker進程; use epoll; 指明并發連接請求的處理方法 }
http協議相關配置指令:
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server:默認虛擬主機
ssl:權限僅能夠通過ssl連接提供服務;
backlog=number:后院隊列長度;
rcvbuf=size:接收緩沖區大小;
sndbuf=size:發送緩沖區大小;
server_name name…: 虛擬的服務的主機名
支持*通配符號:server_name,magedu.com www.m,agedu.com
支持~其實字符做正則表達式模式匹配:server_name 【~^www\d+.magedu.com$ 】
匹配機制:
首先是字符串精確匹配;
左側*通配符匹配;
右側*通配符匹配;
正則表達式;
tcp_nodelay on | off
在keepalived模式下鏈接是否啟動TPC_NODELAY選項;
tcp_nopush on | off
在sendfile模式下,是否啟動TPC_CORK選項,是否一起打包發送;
sendfile on | off
是否啟動sendfile 功能;
定義路徑相關配置:
root path:
設定web資源路徑映射,用于指明用戶請求的url所對應的本地文件系統上的文檔所在的目錄路徑。
可配置位置:
http、server、location、if in location
location [ = | ~ | ~* | ^~ ] URI {…}
在一個server中location配置段可存在多個,用于實現從uri到文件系統的路徑映射,nginx會根據用戶請求的uri來檢查定義的所有location,并找出一個最佳匹配而后應用器配置;
=:對URI做精確匹配;
~:對URI做正則表達式模式匹配,區分字符大小寫;
~*:對URI做正則表達式模式匹配,不區分字符大小寫;
^~:對URI做左半部分做匹配檢查,不區分字符大小寫;
不帶符號:匹配其實于此URI的所有URL;
匹配優先級:
= >^~ > ~ >~* > /
書寫格式:
location = / { } 或 location *~ / { }
alias path:
定義路徑別名,文檔映射的另一種機制,僅能用于location上下文。
注意:location匯總使用root指令和alias指令的意義不同;1、root.給定的路徑對應用location中的/uri/左側、;2、aliash:給定路徑對應location中的/uri/右側/;
index file …:定義多個主頁,至左而右;
默認資源:http,server,location;
error_page code… [=[rsponse]] uri;
可自定義錯誤響應碼。
try_files file … uri;
定義客戶端請求的相關配置
keepalive_timeout timeout [header_timeout];
設定保存連接的超時時長,0表示禁止長連接,默認是75于第13項共同配置
keepalive_requests number:
再一次長連接上允許請求的資源的最大連接數量,默認100;
keepalive_disable none | browser …;
對那種瀏覽器禁用長連接;
send_timeout time;
想客戶端發響應報文的超時時長,此處只是連詞寫操作之間的間隔時長。
client_body_buffer_size size;
用于接收客戶端請求報文的body部分的緩存區大小,默認為16k,超出此大小時,將其被暫存到磁盤上有client_bodu_temp_path指令定義的位置;
client_body_temp_path path {level1 [leve 2 [leve3]]];
設定用于存儲客戶端請求報文的body比分的臨時存儲路徑及子目錄結構和數量;
16進制的數字為每層的目錄:client_body_temp_path /var/tmp/client_body 1 2 3
1:表示1位16進制數字表一級子目錄:
2:表示用2位16進制數字表示二級子目錄;
3:表示用2位16進制數字表示三級子目錄;
limit_tate rate;
限制響應給客戶端的傳輸數率,單位是bytes/second, 0表示無限制;
limit_except method … {…}
限制對指定的請求方法之外的其他方法的使用客戶端;
limit_except GET { allow 192.168.1.0/24; 限制指定客戶端 deny all ;其余放行 }
文件操作優化配置
aio on | off | threads [=pool];
是否啟用aio功能;優化阻塞;
directio size | off;
在Linux主機啟動O_DIRECT標記,此文件標示;大于等于給定的使用限制例如:direction 4m;
open_file_cache off;
ofen_file_cachemax=N [inactive=time];
nginx可以緩存以下三種信息;
文件的描述符,文件大小和最近一次的修改時間。
打開的目錄結構
沒有找到的或者沒有權限訪問的文件的相關信息。
max=N:可緩存的緩存項上限,達到上限后會使用LRU實現緩存管理;
inactive=time:緩存項目的非活動時長,在此處之地當的時長內未被命中的或者命中的次數少于ipen_file_chace_min_uses指令所指定的次數和緩存項即為非活動項目;
open_file_cache_valid time;
緩存項有效性的檢查頻率;默認為60s;沒有指定的活動次數便歸為非活動項,達到上限后LRU計算清理緩存,每隔設定值清理。
open_file_cache_min_user number;
在open_file_cache指令的inactive參數指定的時長內,至少應該被命中多次方可被歸類為活動項目;
open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件信息;
nginx模塊
nginx_http_access_module
實現基于ip地址訪問控制功能;
allow address | CIDR | unix | all;
deny address | CIDR | unix | all;
http、server、location、limit_except
nginx_http_auth_basic_module
auth_basic_string | off;
auth_bashic_user_file file;
location /admin/ {
alias /webapps/app1/data/; auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.ngxpasswd; }
ngxpasswd 由httpd-tools 提供
ngx_http_stub_status_module
stub_status;
配置示例:
location /basic_status { stub_status; }
用于輸出nginx的基本狀態信息;
Active connections:2
server accepts handled requests
120233 120233 120028
Reading: Wrinting Waiting: 1
Active connections :活動的連接數,數組至左往右;
accepts:已經接收的客戶端請求的總數;
handled:已經處理完成的客戶端請求的總數;
requests:客戶端發來的請求總數;
Reading:處于讀取客戶端請求報文首部的連接數:
Writing:處于向客戶端發送響應報文過程中的連接數;
Waiting:處于等待客戶端發出請求的空閑連接數;
log_format name string …;
string 可以使用nginx 核心模塊及其模塊內建的變量;
access_log path [format [buffer=size]緩沖區大小[gzip[=level]]壓縮存放[flush=time][if=condition]];
access_log off;
訪問日志文件路徑,格式及相關的緩沖的配置;
buffer=size
flush=time
open_log_file_cache max=N [inavtive=time][min_use=N][valid=time]
open_log_file_cache off;緩沖各日志文件相關的元數據信息;
max:緩存的最大文件數量;
min_use:在inactive指定的時長內訪問大于等于此值方可被當作活動項;
inactive:非活動時長;
valid:驗證緩存中各緩存項是否為活動項的時間間隔;
ngx_http_gzip_module
數據壓縮模塊,可以壓數據容量大小;
gzip on | off
是否啟用壓縮模塊
gzip_comp_level level
壓縮等級 level等級1-9;
gzip_disable regex…;
使用“User-Agent”頭部字段匹配任何指定的正則表達式禁用響應的
gzip_min_length length;
啟用壓縮功能的相應報文大小閾值
gzip_buffers number size;
支持實現壓縮功能時為其配置的緩存區數量及每個緩存區的大小;
gzip_proxied off | expired | on-cache | on-store | provate | no_last_modified | no_etag | auth | any …;
啟用時處off之外都需要指明,nginx 作為代理服務器接收到從被代理服務器發送的響應報文后,在任何條件下啟用壓縮功能的;
off:對代理服務器的請求不啟用;
on-cache,no-store,private:表示從被代理服務器收到的響應報文首部cache-control的值為此三者中任何一個,則啟動壓縮功能;
gzip_types mime-type…;
壓縮過濾器,僅對此設定的MIME類型的內容啟動壓縮功能:
gzip on; gzip_comp_level 6; gzip_min_length 64; gzip_proxied any; gzip_types text/xml text/css application/jacascript;
ngx_http_ssl_module
ssl on | off;
是否對虛擬主機啟動HTTPS協議
ssl_certificate file;
當前虛擬主機使用PEM格式的證書文件;
ssl_certificate_key file;
當前虛擬機上其證書匹配的私鑰文件;
ssl_protocols [SSLv2] [SSLv3] [TLSv1][TLSv1.1][TLSc1.2];
支持的ssl 協議版本,默認為后三個;
ssl_session_cache off | none | builtin [:size];
builtin[:size] 使用OpenSSL內建的緩存,為此緩存為每個worker進程私有;
ssl_session_timeout time;
客戶端一側的連接可以復用ssl session cache 中緩存的ssl 參數的有效時長;
配置示例:
server { listen 443 ssl; server_name www.magedu.com; root /var/share/html; ssl on ; ssl_certificate /etc/nginx/ngixn.crt; ssl_certificate_key /etc/nginx/nginx.key; ssl_session_cache shared:sslcache:20m; }
ngx_http_rewrite_module
將用戶請求的URI基于regex所藐視的模式進行檢查,而后完成替換;
例如
bbs,magedu.com/ --> www.magedu.com/bbs/ http://www.magedu.com/ --> https://www.magedu.com/ http://www.magedu.com/login.php;username=tom --> http://www.magedu.com/tom http://www.ilinux.io/bbs/ --> http://bbs.ilinux.io/
rewrit regex replacement [flag]
將用戶請求的URI的regex的條件匹配替換為replacement的新URI;
注意:rewrit多條規則的同時會被至上而下逐行匹配,如果沒有設定[flag]標志位則有可能出現無線循環;
replacement是http://或https://開頭,則替換結果會直接重定向返回客戶端。301:永久重定向。
[flag]:
last:重寫完成后停止對當前URI在檔期那location中后續其它重寫操作,而后對新的URI啟動新一輪重寫檢查,前提重啟新一輪循環;
break:重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后直接跳轉至重寫規則匹配塊之后其它配置,結束循環;
redirect:重寫完成后以臨時重定向方式直接返回重寫后生成的URI給客戶端,由客戶端重新發起請求,不能以http://或http://開頭。
permanent:重寫完成以后永久重定向方式直接返回重寫后生成的URI給客戶端,由客戶端重新發起請求。
return
return code [text];
return code URL;
return URL;
停止處理并返回給客戶端;
rewrite_log on | off
是否開啟重寫日志
if (condition ) {…}
映入一個新的配置上下文,條件滿足時,執行配置塊中的配置指令;
server
location
condition:
比較操作符:
==:等于
!=:不等
~:模式匹配,區分字符大小寫;
~*:模式匹配,不區分字符大小寫;
!~:模式不匹配,區分字符大小寫;
!~*:模式不匹配,不區分字符大小寫;
文件及目錄操作性判斷:
-e,!-e:文件、路徑、或連接文件是否存在:不存在,可以是字符串和變量
-f,!-f:文件是否存在,不存在
-d,!-d:路徑是否存在,不不存在
-x,!-x:檢查文件是否為可執行的文件,可以是字符串和變量
set $variable value;
用戶自定義變量;
ngx_http_referer_module
模塊用于阻止對”Refere"開頭字段中具有無效值的請求的站點訪問。
valid_referers none | blocked | server_names |string …;
定義referer首部的合法可用值
none:請求報文沒有收到referer首部;
blocked:請求報文的referer首部沒有值;
server_names:參數,其可以有值作為主機名或主機名模式;
arbitrary_string:直接字符串,但可使用*做通配符;
regular expression :被指定正則表達式模式匹配到的字符串,要使用*打頭;例如:*.magedu.com;
配置示例:
if ($invalid_referer) { return http://www.magedu.com/invalid.jpg; }
ngx_stream_proxy_module
基于傳輸層進行TCP、UDP和UNIX機型數據轉發,實現反向代理服務器。
proxy_pass address;
設置代理服務器的地址,地址可以指定唯域名或IP地址,以及端口或者$upstream定義組后調用。
可設置位置:server
proxy_timeout timeout;
在客戶端或代理服務器連接上的兩次連續讀寫操作之間設置超時,如果在此時間內沒有發送數據則關閉連接。
默認:proxy_timeout 10m;
可設置:stream,server
proxy_connect_timeout time;
定義與代理服務器建立連接超時;
默認:proxy_connect_timeout 60s;
可設置:stream,server
語法格式:
stream { upstrem group { 定義調用組; server 192.168.1.50:80; server 192.168.1.60:80; } proxy_connect_timeout 60s 定義時長 proxy_timeout 10m; 定義時長 server { listen 80; proxy_pass 192.168.1.2:80; } server { listen 80; proxy_pass $upstrem 調用定義的組 } }
nginx_http_upstream_module
用于定義可由proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass和memcached_pass 指令引用的服務器組。
upstream name {…}
定義后端服務器組,會引入一個新的上下文,組內的服務器由server定義,定義的組可被proxy_pass調用。
可設置:http
http { upstream GROUP { server 192.168.122.2:80; server 192.168.122.3:80; } } # 調用 server { location / { proxy_pass http://GROUP; } }
server address [parameters]
定義upstream上下文中的server組成員,以及相關參數;
可設置:upstream
address;
主機名;
ip+port
unix:/PATH/TO/SOME_SOCK_FILE
parameters:
weight=number 權重,默認為1.
max_fails=number;失敗嘗試次數,超過后server主機將被停用。
max_conns :當前的服務器每個worke最大并發連接數。
backup:備用服務器,只有所有主機都down時生效。
down:主機狀態不可用。
upstream GROUP { server 192.168.1.10:80 weight=3; server 192.168.1.20:80 max_fail=2 max_conns 24; server 192.168.1.30:80 backup; server 192.168.1.40:80 down; }
least_conn;
最少連接調度算法;當server擁有不同權重時為wlc:當所有后端主機的連接數相同是則使用wrr調度;
可配置:upstream
uptram GROUP { least_conn; }
least_time header | last_byte; [inflight]
指定組使用負載均衡方法,其中請求以最少的平均響應時間和最少的活動里娜姐傳遞給服務器,同時考慮服務器的權重,如果有多個這樣的額服務器。則使用加權魂環平衡方法一次嘗試他們。
header:如果header指定了參數,則使用接收response_header時間
last_byte:如果last_byte指定了參數,則使用接收full_response的時間
infight:如果inflight指定了參數(1.11.6),則還會考慮不完整的請求。
ip_hash:
源地址hash算法,能夠將來自同一個源ip地址的親求始終發往同一個upstream 的server;
hash key [consistent];
指定hash的key表實現調度,key可以是文本、變量或(文本+變量),從組中添加或刪除服務器可能會導致將大多數密鑰重新映射到不同的服務器。
consistent:參數,指定用一致性hash算法;
可配置:upstream
http { stream { hash $request_uri consistent 同一請求的uri發往同后臺主機 #hash $remote_addr #hash $cookie_name } }
ngx_http_fastcgi_module
fastcgi模塊允許想fastcgi服務器發送數據。
fastcgi_pass address;
可配置:location、if in location
locationg { fastcgi_pass 192.168.10.1:9000; }
fastcgi_index name;
定義fastcgi默認主頁:
可配置:http、server,location
也可定義在$fastcti-script_name變量中,需要開啟調用include fastcgi_params;
location / { fastcti_index index.php; }
fastcgi_param parameter value [if_not_empty];
設置應該傳遞給fastcgi服務器的參數,該值可以包含文本、變量以及他們的組合。需要開啟調用include fastcgi_params。
可配置:http,server,location
location / { fastcgi_parm SCRIPI_FILENAME /data/nginx/html/$fastcgi_scrip_name; include fastcgi_params; 調用 }
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
定義fastcgi緩存規則,緩存位置為磁盤上的文件系統,由path所指定的路徑來定義;
可配置:http
常用設定:
levels=levels;緩存目錄層級數量,分別1,2,3級別。
keys_zone=name:size;設置內存空間名字:大小
inactive=time:非活動時間。
max_sizi=size:磁盤緩存可用空間。
1、http配置定義規則,2、server或location調用規則(調用時需要同時設定保存哪些內容)
http { fastcti_cache_path /data/nginx/cache levels=1:2 keys_zone=dd;10m; location ~\. php$ { fastcgi_pass 192.168.12.134:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/nginx/html/$fastcgi_script_name; include fastcgi_params; fastcgi_cache dd; fastcgi_cache_key $request_uri; fastcgi_cache_valid 200 302 10m; fastcgi_cache_valid 301 1h; fastcgi_cache_valid any 1m; } }
fastcgi_cache zone | off;
調用指定的自定義緩存來緩存數據;
可設置:http,server,location
fastcgi_cache_key string;
定義用作緩存項的key的字符串;
可設置:http,server,location
fastcgi_cache_methods GET | HEAD | POST …;
為哪些請求方法使用緩存;
默認:fastcgi_cache_methods GET HEAD;
可設定;http,server,lcoation
fastcgi_cache_valid [code…] time;
單獨設定響應碼各自的緩存時長;
可設定:http,server,location
fastcgi_cache_min_uses number munber;
緩存空間中的緩存項在inactive定義的非活動時間內至少要被訪問到此處所指定的次數方可認作活動項;
默認:fastcgi_cache_min_user 1;
可設定:http,server,location
fastcgi_keep_conn on | off;
默認fastcgi服務發送響應報文后關閉連接,此功能開啟時保持連接。
默認:fastcgi_keep_conn off;
可設定:http, server,location
location \ { fastcgi_keep_conn on; fastcgi_cache_min_user 3; }
ngx_http_proxy_module
將訪問本機的請求,準發至后臺另一臺服務器進行響應,即實現反向代理服務器功能。
定義轉發,實現反向代理服務
定義緩存
代理服務器請求、響應超時時長
proxy_pass URI;
可配置;location,if in location,limit_except
proxy_pass http://host[:port]; 將在端口后補全Real Server服務的設定路徑(例如:http默認的/var/www/html/)
proxy_pass http://host[:port]/PATH; 如果location定義為路徑則將URI替換唯/uri/var/www/html/
location定義的URI是使用的正則表達式,在if語句或limit_except中私用proxy_pass 指令,則host不能帶有PATH.
server { location /uri/ { proxy_pass http://192.168.124.4:80; proxy_pass http://192.168.124.4:80/data/html/ } }
proxy_set_header filed value
可配置:http,server,location
設定發往后端主機的請求報文的請求首部值。
value 修改的內容。
proxy_set_header value $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for(適應較多)
location / { proxy_set_header X-NEW-Header $remote_addr; }
圖形工具:wireshark
proxy_cache_path
自定義緩格式
可配置:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
proxy_cache zone | off;
開啟調用自定義的緩存zone或關閉功能;
可配置:http,serer,location;
vim /etc/nginx/nginx.conf http { proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=NAME:10m; } vim /etc/nginx/ilinux.io location / { proxy_cache NAME; }
proxy_cache_key string;
定義緩存中用于“鍵”的內容;
可配置:http,server,location
server { proyx_cache_key $host$request_uri $cookie_user; } proxy_cache_valid [code...] time;
定義對特定響應嗎的響應內容的緩存時長,也可只設定響應時間。
可配置:http,server,location
server { proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 1m; } 或則 server { proxy_cache_valid 5m; }
proxy_cache_use_stale
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off
在某些服務通信期間可以使用過期緩存響應給客戶端。
默認:proxy_cache_use_stale off;
可配置:http,server,location;
error:與服務器建立連接,請求或響應發生錯誤時;
timeout:與服務器建立連接,傳遞請求或響應發生錯誤時;
invalid_header:服務器無響應;
updating:更新時允許使用過期緩存響應。
服務器返回代碼:
http_500,http_502,http_503,http_504,http_403_http_404,http_429.
server { proxy_cache_use_state http_502; }
proxy_cache_methods GET | HEAD | POST …;
客戶請求是包含列表中的指令,則緩存響應 GET, HEAD, POST…
默認:proxy_cache_methods GET HEAD;
可配置:http,server,location
server { proxy_cache_methods GET HEAD }
proxy_hide_header filed;
默認情況下,nginx不會從代理服務器對客戶端的響應中傳遞標題段"Date“,”Server“,”X-Pad“和”X-Accel-“。改proxy_hide_header指令設置不會傳遞的其它字段
proxy_connect_timeout time;
定義與服務器建立連接的超時,應該注意,此超時通常不會超過75秒。
默認:proxy_connect_timeout 60s;
可配置:http,server,location
porxy_read_timeout time;
定義從代理服務器響應的超時時長,超時時間則關閉連接。
默認:proxy_read_timeout 60s;
可配置:http,server,location
proxy_send_timeout time;
設置將請求傳送至代理服務器的超時時長,如果連續兩次超過設定的時長,則關閉連接。
默認:proxy_send_timeout 60s;
可配置:http,server,location
server { proxy_connect_timeout 60s; proxy_read_timeout 60s; proxy_send_timeout 60s; }
ngx_http_headers_module
給響應報文添加自定義首部或修改響應報文指定的首部值。
add_header name value [always];
添加自定義首部;
可配置:http,server,location,if in location
server { add_header X-Via $server_addr; add_header X-Accel $server_name; } expires [modified] time;
expires epoch | max | off;
用于定義Expore 或 cache-control 首部的值;
@:指定一天的是時間expires @15h30m;
max:是指10年。
Linux 常見的集群類型
LB:linux Balancing :負載均衡是由眾多服務主機在同一個網絡內構建出來將來至客戶端請求的大量數據分布其它主機中處理請求,能夠有效緩解常規模式下主機負荷。
HA:High Availiablity 高可用性能服務集群,集群中會每個服務都是一個節點,一旦節點出現軟件或硬件故障就會導致單點故障,影響整個服務正常運行,而HA的出現能夠解決單點故障,有效提高了服務的穩定性。
High peroframnce 高性能服務器集群將眾多臺主機的資源有效利用、提高高性能有分布式存儲;分布式計算;
擴展方法:
- 向上擴展:提升硬件的cpu、內存等處理設備對于提升的結果所花費的費用是不明顯的。
- 向內擴展:將多臺服務主機集合起來,不但能有效的提高性能,對于成本也是向上擴展成本要低的多。
實現方法:分為硬件和軟件實現例如負載均衡:硬件廠商就有F5 Big-IP、Citrix Netscaler而軟件可以有lvs(linux virtual server)基于某些協議來實現調度。協議還區分為(內核空間的TCP協議的 lvs)工作在用戶空間模擬內核空間TCP協議的nginx,haproxy…等
LVS四種集群優點和是采用場景
LVS-NAT:LVS-NetWork Address Translation 網絡地址轉換
修改請求報文的目標地址為 RIP,根據算法將請求發送至 Real Server,響應報文返回時通過網絡地址在經由Virtual Server 將源地址修改為本機VIP,在返回至客戶段。
- Director:需要打開核心轉發;
- RIP和DIP必須在同一個IP網絡,且應該使用私用網絡地址;RS的網關喲啊指向DIP
- 請求報文和響應報文都必須經由DIrector轉發;Director易于成為瓶頸。
- 支持端口映射,可修改請求報文的目標PORT。
- VS必須是Linux系統,RS可以是任意系統;
LVS-TUN:IP Tunneling:
轉發模式:不修改請求報文的IP首部(源IP為CIP,目標IP為VIP),而是在源IP報文之外再封裝一個IP首部(源IP是DIP,目標IP是RIP),將報文根據算法挑選出來的RS目標,RS響應報文時拆除VS分裝的IP首部響應給客戶端(源IP是VIP,目標IP是CIP)。
- DIP、VIP、RIP都應該是公網地址;
- RS的網關不能也不可能指向DIP,
- 請求報文要經由DIrector,但響應報文不經由DIrector;
- 不支持端口映射;
- RS的OS得支持隧道功能;
LVS-DR:LVS-Direct Routing; 直接路由
通過為請求報文重新封裝一個MAC地址首部然后轉發,源MAC是DIP所在的接口的MAC,目標MAC是根據算法分配的RS的RIP所在接口的MAC地址,(源IP:PORT,目標IP:PORT)保持不變;響應報文返回時直接返回給客戶端。
Director 的VIP和DIP要在同一物理網絡內
RS要配置vip地址,但不做請求報文;
確保前端路由器將目標IP為VIP的請求報文發往Director;
在前端網關做靜態綁定;
在RS上使用artables;
在RS上修改內核參數以限制arp通告及應答級別;
arp_announce 限制通告級別
arp_ignore 限制應答級別
RS的RIP可以使用私有網地址,也可以是公網地址;RIP與DIP在同一IP網絡,RIP的網關不能指向DIP,以確保響應報文不會經由Director;
RS跟Director要在同一個物理網絡;
請求報文要經由Director,但響應不能經由Director,而是由RS直接發送Client;
不支持端口映射;
LVS—fullnat
同時修改請求報文的源IP地址和目標IP地址進行轉發;
- VIP是公網地址,RIP和DIP是私網地址,且通常不在同一IP網絡,因此,RIP的網關一般不會指向DIP
- RS收到請求報文源地址是DIP,因此,只能響應給DIP,但Director還要將其Clinet;
- 請求和響應報文都經過Director;
- 支持端口映射;
注意:此類型默認不支持;
LVS-DR示例:
配置環境:
-
?Director 主機[ens33 IP:192.168.124.3]
-
RS1 主機[ens33 IP:192.168.124.4]
-
RS2 主機[ens33 IP:192.168.124.5]
系統版本:CentOS 7
?Director 主機
yum -y instlal ipvsadm # 安裝管理協議
ifconfig ens33:0 192.168.124.200 netmask 255.255.255.0 broadcast ens33:0 up #設置監聽網卡(可設置別名)IP地址網段并啟用即是:VIP
ipvsadm -A -t 192.168.124.200:80 -s rr # Director 監聽地址及端口,-s 指定輪巡方式rr
ipvsadm -a -t 192.168.124.200:80 -r 192.168.124.4 -g # 添加管理后臺真實主機將監聽的200的80端口傳送至124.4 主機
ipvsadm -a -t 192.168.124.200:80 -r 192.168.124.5 -g
RS1 主機 和RS2 主機
安裝web服務http并啟用默認端口80
yum -y install httpd
兩天主機分別建立默認訪問主頁:
vim /var/www/html/index.html
<h1> 192.168.124.4 </h1>
vim /var/www/html/index.html
<h1> 192.168.124.5 </h1>
ifconfig ens33:0 192.168.124.200 netmask 255.255.255.0 broadcast 192.168.124.200 up 設置監聽地址 VIP 并啟用
echo 1 >
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 修改全局通告級別
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 修改lo通知級別
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 修改lo通知級別
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
arp_ignore:
0:響應任意網卡上接收到的對本機IP地址的arp請求(包括環回網卡上的地址),而不管該目的IP是否在接收網卡上。
1:只響應目的IP地址為接收網卡上的本地地址的arp請求。
2:只響應目的IP地址為接收網卡上的本地地址的arp請求,并且arp請求的源IP必須和接收網卡同網段。
3:如果ARP請求數據包所請求的IP地址對應的本地地址其作用域(scope)為主機(host),則不回應ARP響應數據包,如果作用域為全局(global)或鏈路(link),則回應ARP響應數據包。
4~7:保留未使用
8:不回應所有的arp請求
arp_announce
0:允許使用任意網卡上的IP地址作為arp請求的源IP,通常就是使用數據包a的源IP。
1:盡量避免使用不屬于該發送網卡子網的本地地址作為發送arp請求的源IP地址。
2:忽略IP數據包的源IP地址,選擇該發送網卡上最合適的本地地址作為arp請求的源IP地址。
啟動httpd 服務
systemctl start httpd
通過瀏覽器訪問:192.168.124.200:80/index.html 多次刷新查看結果
LVS-Net 示例:
配置環境:
-
?Director 主機[ ens33 IP:192.168.124.3] [ens37 IP:192.168.35.10 ] 內外兩塊網卡
-
RS1 主機[ ens33 IP:192.168.30.21 ] 內網
-
RS2 主機[ ens33 IP:192.168.30.22 ] 內網
系統版本:CentOS 7
?Director 主機
ipvsadm -A 192.168.124.3:80 -s rr
ipvsadm -a 192.168.124.3:80 -t 192.168.30.21 -g
ipvsadm -a 192.168.124.3:80 -t 192.168.30.22 -g
R3和R4 主機
yum -y install httpd # 安裝http服務
vim /var/www/html/index.html
<h1> 192.168.30.21</h1>
vim /var/www/html/index.html
<h1> 192.168.30.22 </h1>
瀏覽器輸入192.168.124.3:80/index.html 多次刷新測試
原創文章,作者:N28_剛好遇到小熊貓,如若轉載,請注明出處:http://www.npownk.tw/124724