nginx
【注意nginx中,正則表達式的括號引用不是\1而是$1】
pam linux資源限定看一下
web服務器:http,https協議的實現
反代服務器:http reverse proxy,smtp/pop3 reverse proxy
smtp:簡單的郵件發送服務
pop3:郵局協議,存放郵件的
imap4:互聯網郵件訪問協議,pop3升級版
MIME:多功能的互聯網郵件擴展
major/minor
http協議藉助了mime來傳輸多媒體服務
web資源:URL
schem://user:password@host:port/path/to/some;params?perty#frag
http協議的報文格式
startline起始行
name:value
name:value header首部,有多個name:value組成
報文的主體部分
request:<method><request-URL><version>
<headers>
<body>
response:<version><status><reason-phrase>
<headers>
<body>
上邊就是http協議的報文的具體格式,具體的事例,可以再自己用的瀏覽器上查看,例如你使用的是chrome的話可以按f12來查看,或者直接使用服務器插件查看
tcpdump wireshark tshark
接下來分開來說明各個部分的含義
1.method請求方法 打算以何種機制獲得資源 表明客戶端希望服務器對資源執行的動作
GET 下載
POST 提交表單將表單的數據基於body發送過去
HEAD 只要head不要body
TRACE 追蹤資源,客戶端到資源經過了那些web網關
客戶端-正向代理---網關----反向代理--二級反向代理-資源
OPTIONS 請求服務器列出來某一個資源多支持的所有請求方法
webDAV:web的分佈式版本協作功能,一般關閉,風險太大,開啓後delete put可用
DELETE 刪除
PUT 上傳
2.status:狀態碼 告知客戶端此次的響應是不是成功
三位數字,1xx 2xx ... 5xx
表明請求處理的狀態
1xx:100 101 信息提示
2xx:成功類響應碼 200-206;最常見的是200,資源已經正常發送
3xx:重定向的響應碼 300-305
301(永久重定向 永久移動
302(臨時重定向 臨時移動
304(資源沒有修改
(tips:有的時候資源可能移動到了新的地址,這個時候返回一個狀態碼,請加上新位置的信息,叫做重定向,返回碼+location 值
這個值是新地址)
客戶端的緩存時有期效的,每次到期了再去服務器上請求的時候會回覆一個304表示資源沒有改變,如果資源改變了會給一個新的值
並且回覆200的響應碼
4xx:400-415 錯誤類信息,主要是客戶端錯誤,權限不夠資源不再賬號不對
404資源不再
403沒有權限或對方拒絕你
401服務器讓你輸密碼是用401響應
5xx:500-505 錯誤響應 服務器錯誤
500服務器內部錯誤,配置文件錯誤導致內部邏輯錯誤,或程序語法錯誤
502反向代理服務器與原始上游服務器無法再有效時間內獲得資源或無法通信
3.headers:請求響應報文的首部
媒體格式 MIME
major/minor
name:value
首部分類:
1.通用首部 請求響應報文都可以使用
date 報文創建時間
connection 鏈接狀態 keep-alive長連接 close短鏈接
via 報文經由的中間的代理服務器
cache-control 緩存控制 1.1啓用的
2.請求首部 請求專用
accept:可接受的媒體媒介類型;(MIME機制可以傳輸多媒體信息,http只傳輸超文本)
accept-charest 接受的字符集格式
accept-encoding:接受的編碼格式
accept—language:接受的語言
client-ip;允許的客戶端主機ip
host:請求的服務器名稱和端口
referer:包含當前正在請求的資源的上一級資源
user-agent:客戶頓代理
a.條件式請求首部
except
if-modified-since:某一時間後是不是發生過修改
un
if-none-match本地緩存中存儲的文件的etag值是否與服務器對應的資源不相同
if-match
b.安全請求首部
authrization:向服務器發送賬號密碼
cookie:向服務器發送cookie
3.響應首部 響應專用
a.信息行首部
age:相應時長
server:服務器端軟件程序的名稱版本等
b.協商首部
accept-ranges:服務器 端可接受的請求類型;*所有類型
vary:服務器查看您的其他首部列表,變化的
c.安全首部
set-cookie:給客戶端設定cookie
WWW-AUTHENTICAT:認證質詢
d.實體首部
allow:對此實體可使用的方法
location:資源的真正地址
content-encoding:資源編碼格式
資源語言
長度
地址
類型
e.緩存相關
etag:緩存首部
expires:實體過期時間
last-modified:最近一次修改時間
4.實體首部
5.擴展首部 用戶自己定義的
IO模型 unix網絡編程
阻塞性IO模型,非阻塞IO模型,複用性IO模型,事件驅動模型,異步IO模型
同步/異步:
阻塞/非阻塞:
關注調用者返回結果前的狀態,結果回來前能不能幹別的事
阻塞:blocking 調用結果返回之前調用者被掛起,什麼都不能做只能等着
非阻塞:nonblocking 調用結果返回之前調用者不會被掛起,處於忙等待,忙等待就是多久就回來看一下結果有沒有回來
阻塞會被裝入sleeping狀態
異步:被調用者通過(狀態),(通知)或者(回調)的方式,通知調用者被調用的運行狀態
阻塞性IO:兩個階段全被阻塞
非阻塞IO:第一階段沒被阻塞,盲等,但當發現數據寫入到內存中後開始阻塞,通常是串行
回調的通知方式有兩種:
同步/異步:關注消息通知機制
同步:等待對方返回消息
邊緣觸發:只通知一次,聽不見就拉倒
水平觸發:聽不見就一遍又一遍的通知
什麼叫阻塞性IO 兩個階段 wait for data,copy data
複用性IO:額外在內核中多加了一項機制,在調用後加入一層SELECT(),用戶阻塞在這層上,內核處理完後通知層,這層兩邊都是阻塞的
SELECT():層可以使是個總的,也可以每個用戶發一個,但是數量最優是1024,
POLL()
信號性IO:調用者向內核註冊一IO個信息,以備處理完成後內核的通知,提交後就可以作別的,但是當接收到一個結果後開始阻塞,不能再接收別的參數
異步IO:調用者發起後,留一個直制定的處理器,舉例,你去飯店要了面,老闆留了你的聯繫方式,面好了,老闆就你會來吃,你還要自己端會桌子,這叫異步 ,老闆給你端上桌才叫你,回來就能吃的叫同步
真正的多進程用戶最少是個信號性IO
一次IO 請求分成兩個階段
1.等待數據,以及數據從磁盤到內核內存的過程
2.複製過程,數據從內核內存到進程內存的過程
Nginx主要是解決c10k問題10000個客戶端併發連接
事件驅動模型實現
linux:epoll,
feature特性:
web服務器
web反向代理服務器
郵件反向代理服務器
通用的tcp/udp反代服務器(負載均衡的調度效果)最新版支持
作爲web服務器功能的實現LNMP
反代功能,負載均衡 回話保持
sendfile
讓靜態資源不進入用戶空間,直接在內核空間處理外發送給用戶
mmap
內存映射,將磁盤中的文件數據,映射到用戶空間,讀取時直接讀映射,但是雖然節省了讀取時間,卻加中了性能消耗
事件驅動
異步
非阻塞
nginx程序架構
master/worker
master進程
負責加載配置文件,管理worker進程,平滑升級等
worker進程(可多個)
處理並響應用戶請求
nginx公用
靜態的web資源服務器
結合fastcgi/uwsg/scgi等協議反代動態資源請求(lnmt,lnmp)
http/https反向代理(負載均衡)
smtp/imap/pop3協議的反向代理
tcp/udp協議的反代
負載均衡,容錯功能
高度模塊化,模塊類型
1.核心模塊:任何協議都會用到的模塊core module
2.標準模塊:自帶的模塊
Standard HTTP modules
Optional HTTP modules
Mail modules
Stream modules 每個協議都有核心模塊xxx core module,也要啓動
3.第三方模塊
靜態資源服務器配置
1.nginx安裝
rpmbuild 創建rpm包
儘管這裏演示的是編譯安裝,但是工作的時候爲了方便分發還是儘量用rpm安裝
groupinstall D Ts S P D
pcre-devel zlib-devel openssl-devel
【pid文件在/var/run】
【lock文件在/var/run或/var/lock】
nginx -s stop reload
2.配置
配置的組成部分
主配置文件:nginx.conf
include conf.d/*.conf
fastcgi,uwsgi,scgi的相關配置文件
mime.types:支持的mime配置
主配置文件的配置指令
directive value1 [value2...];空格隔開,分號結尾
注意:1.必須;結尾但是花括號不需要;
2.支持使用配置變量
內建變量
自定義變量
set variable_name 值
引用:$variable_name
主配置文件結構(花括號叫配置上下文)
main block:主配置段,全局配置
event {
...
} :事件驅動相關配置
http {
...
}:http/https等相關的配置端
mail{
...
}:郵件配置段
http配置段的結構
無論有幾個站點服務都要配置虛擬主機,也有FQDN端口IP地址三種
http {
...
...
server {
server_name
root
alias
location {
...
}:訪問控制
}
server {
...
}
...
}
main block常見配置指令
a.正常運行必備配置指令
user username [groupname];
制定運行worker的用戶
pid /path/to/pid_file ;
守護進程的pid文件路徑
worker_rlimit_nofile number #;
單個worker打開的文件的總數量最值
b.優化性能相關配置
1.worker_processes number|auto
worker進程的數量,通常是<=cpu核心數
2.worker_cpu_affinity cpumask|auto
指定worker用哪個cpu,但是不隔離
cpumask:
0000 0001 第一個cpu
0000 0010 第二個cpu
0001 0010 第一個和第二個
3.worker_priority nice;
優先級[-20,19]數字越小優先級越高
c.調試及定位問題相關配置
1.daemon on|off;
是不是以非守護方式運行
2.master_process on|off;
是不是以master/worker模型啓動進程
3.error_log file[level];
日誌文件路徑和級別
error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
錯誤日誌文件的記錄方式,及其日誌級別:
方式:
file /PATH/TO/SOME_LOG_FILE;
stderr:發送到錯誤輸出;
syslog:server=address[,parameter=value]:發送給syslog服務器;
memory:size
日誌級別:
debug依賴於configure時的--with-debug選項;
4.thread_pool name thread=number [max_queue=number];
定義線程數量和後援隊列長度
【因爲是依賴核心模塊的,所以以上配置語句的位置也很重要】
【/etc/security/limits.conf定義一個程序打開的最大的文件數量】
event 主要配置
a.worker_connections #;
每個worker進程所能夠併發打開的最大連接數
worker_processes*worker_connections
當前nginx所能相應的最大的併發連接數
b.use method(連接處理方法:select,poll等,但是linux上只有 epoll可用)
c.accept_mutex on|off
是否打開負載均衡(互斥)鎖;開啓後各個worker將會輪序的相應用戶請求,默認是開啓的
d.lock_file file
上邊的鎖的文件的路徑
http 專用配置
a.定義套接字相關功能
1.server {...}
定義虛擬主機,nginx都是虛擬主機,但是基於IP地址和基於主機名沒有區分
server{
listen PORT;(端口443是什麼?)
server_name HOSTNAME;
root /PATH/TO/DIR;
}
注意:1.不配置hosts文件的話,直接輸入IP地址,如果有多個server虛擬主機的話,將會顯示從上到下第一個server定義的主頁
2.配置多個虛擬主機的時候,可以不再主配置文件中寫server,但是要在主配置文件中的http{...}寫include寫
include conf.d/*.conf
然後創建同名目錄,在目錄中編輯.conf結尾的配置文件,文件內容是server{...}
2.listen address[:port] [default_server] [ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];
listen port [default_server] [ssl];指定端口的所有可用地址,多的選項和上邊一樣
listen unix:path [default_server] [ssl] ;unix sock 套接字,二者使用本地迴環接口通信,直接使用一段內存存儲請求和相應,雙方去內存取,避免了很多封裝操作,雙方一般值得是內核和程序
【怎麼給這個設置防火牆?使用-i lo -o lo 定義兩次-i/o定義回顧】
default_server:默認虛擬主機;
根據IP地址配置的虛擬主機,用戶用主機名登錄,或者放過來的情況下,無法匹配時會自動跳轉到的虛擬主機
ssl:限制該虛擬主機只能通過ssl連接提供服務;
backlog:後緩隊列的長度;
rcvbuf:接收緩衝大小;
sndbuf:發送緩衝區大小;
3.server_name name;
爲虛擬主機指明當前server的主機名
可以使連續多個名字,空格隔開
可以使用統配和正則表達式(~開頭,後邊的是正則表達式)
【問題是,如果有用戶輸入的可以被多個虛擬機匹配怎麼辦?有優先級】
優先級 1.精確匹配
2.左側統配
3.右側統配
4.正則表達式
4.root path;可以放在http(對所有server生效
server(對當前server生效
location(對某個url生效
if in location(對某個條件生效
root 本地系統路徑
設置web資源的路徑映射,用戶請求的url對應的本地系統上的文檔目錄路徑
5.tcp_nodelay on|off
是不是啓用nodelay功能,默認啓用,只有keepalive場景中才有意義
在ka場景下,如果請求的是一個很小的資源,那麼會默認等待,等多個小請求一起發過去,但是影響客戶端的體驗,開啓了nodelay之後不等待,有一個發一個不論多小
6.tcp_nopush on|off
只有在send_file啓用時纔有效,默認是關閉,一般用不到
7.send_file
讓靜態資源不進入用戶空間,直接在內核空間處理外發送給用戶,默認是關閉的,要手動啓動,必須啓動的功能
b.定義路徑相關的配置
1.root:看上邊
2.location:比較難但是用的非常多,看着很複雜
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
作用:根據用戶請求的uri來匹配定義的location,匹配到的時候請求將被相應的location塊中的配置所處理
location ~*\.txt {
....
}:location開了一個新的上下文,但是裏邊的處理動作只對location匹配到的資源有效,並且會先於別的資源處理,其實含有些if的含義
location可以有多個並且location中還可以嵌套location
location也並不是server必須要有的
=:uri精確匹配
~:正則表達式匹配,區分大小寫
~*:正表,但不區分大小寫
^~:錨定行首,就是對做左半部分匹配,不區分大小寫
【那麼一個請求的資源被多個location匹配怎麼辦?優先級= ,^~,~/~*優先級相同,不帶符號的location】
3.alias path
定義路徑別名,與httpd的alias一樣,只能用在location的上下文,只有被location匹配帶才解析到對應的別名上
結合httpd的alias來說明
httpd:
alias /bbs/ /web/forum/
nginx:
location /bbs/ {
alias /web/forum/;
}
關於alias右側的/的問題,結合root來解釋
我們訪問一個網站的時候,網址是這樣 www.mymy.com/bbs/
如果location中是root /web/forum/
那麼實際的應該是/web/forum/bbs/,/bbs/值得是root下的目錄
如果是alias呢
實際是/web/forum/,/bbs/就等於/web/forum/
5.index
設置默認主頁,可用位置location,server,http
6.error_page code uri
根據用戶請求資源的相應的狀態碼實現錯誤頁的重定向。就是指定對應的狀態碼顯示對應的頁面
注意:一個請求,會從開頭由上到下一次匹配,上邊的都匹配不到,將被error_log匹配,重定向到404頁面,這又是一個新的請求,又要從上邊依次匹配下來,所有要在root的目錄中要準備好404頁面,並且要注意的是這次的404雖然是正確的匹配到的,但是404中匹配要求不能是200還是404但是可以再配置文件中的error_page的地方中間狀態碼的後邊加上=200,f12就會顯示的是200
7.try_files file...url
某個url不在的話嘗試這裏定義的第一個文件,直到第n-1個,最後一個是個跳轉,重定向,如果前邊有就用其那邊的都沒有就重定向
作用在server和location
例:
location /test {
try_files: test1.html test2.html test3.html http://172.16.7.5/index.html
}
c.定義客戶端請求的相關配置
1.keepalive_timeout timeout;
保持連接的超時時長,0表示禁止使用長連接;默認75s
keepalive_requests number;
一次長連接上允許請求的資源的最大數量,默認100個
keepalive_disable none|browser...
對哪種瀏覽器禁止長連接
2.send_timeout
向客戶端發送響應報文的超時時長,特別的指兩次寫操作之間的間隔時長
3.client_body_buffer_size size;
用於接收客戶端請求報文的body部分的緩衝區大小;默認爲16k;超時此大小時,其將被暫存到磁盤上;
client_body_temp_path path [level1 [level2 [level3]]];
設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;
level1.2.3是數字,表示創建多少個[1|2|3]級子目錄
/var/tmp/body 2表示使用2個16進制字符創建子目錄256個2^8
/var/tmp/body 2 1 2
使用兩個字符創建一級子目錄,1個16進制字符創建二級子目錄,2個16進制字符創建三集子目錄
d.對客戶端的請求進行限制
1.limit rate rate
限定速率,每秒相應給客戶端的傳輸速率默認爲0無限制,默認單位字節/s
應用在http server location if上下文
2.limit_except method(GET,POST等)
限制客戶端請求時使用的方法
適用於location
method多個之間用空格隔開
location dir {
limit_except method
allow IP地址
deny all|IP地址
}表示對除了allow的網址以外的其餘都只允許用method這種方法
e.文件操作優化配置(不是很關鍵,瞭解)
1.aio on|off|thread[=pool]
異步傳輸功能是不是打開
http server location
默認是關閉的
2.directio size|off
是不是關閉直接io,啓用定義多大空間
3.open_file_cache off;
open_file_cache max=N【inactive=tme】緩存條目的上限
打開的文件緩存
nginx可以緩存以下三種信息
文件的描述符,文件大小和最近一次的修改時間
打開的目錄的結構
沒有找到的或者沒有權限訪問的文件的相關信息
在一定程度上提高性能
【那麼當緩存達到了允許緩存最大條目的上限後,又有要緩存的文件怎麼辦?採用lru算法,就是說查找最近最少用到緩存,清除,然後將新的放進去】
inactive=time
緩存的超時時長,再次制定的時間中沒有達到下邊的最小訪問次數的緩存就被定義成非活動項
4.open_file_cache_errors on|off
沒有找到的或者沒有權限訪問的文件的相關信息是否被緩存
5.open_file_cache_min_users number
緩存項的最少被訪問的次數,在上邊定義的非活動期限inactive=time內最少被訪問的次數
6.open_file_cache_valid time
多長時間檢查一次緩存項中的非活動緩存,將其刪除,默認是60秒
f.ngx_http_access_module
實現基於ip的訪問控制
allow 192.168.1.102/16
deny 192.168.0.0
這個跟之前httpd基於ip的訪問控制很像,都是從上到下定義,上邊的意思就是192.168.0.0這個網段除了192.168.1.102意外都不允許訪問
哪裏都能用
g.ngx_http_auth_basic_module
基於用戶認證的訪問控制
auth_basic string|off
是不是開啓基於用戶的訪問控制string是說明,有點像httpd的authname
auth_basic_user_file file
認證用的賬號密碼文件路徑
文件格式(明文)
name:passwd:comment
密碼格式
1.htpasswd生成
2.crypt也行,但不如htpasswd,用第一個就好
h.ngx_http_stub_status_module模塊:
用於輸出nginx的基本狀態信息
至關重要 面試要用
輸出nginx基本狀態信息
之後好多內容都是些腳本來從獲取裏邊的內容的
location /status {
stub_status;
}
active connections 1
server accepts handed requests
155 155 298
reading:0 writing:1 waiting:0
active connections # 活動客戶端連接數
accepts 接受的客戶端連接總數量(第一個155)
handed 已經處理完成的客戶端請求的總數(第二個255)
requests 請求總數;總數-accepts=沒接收的數量
reading 正在讀取客戶端請求報文首部的連接數
writing 正在向客戶端發送響應報文過程的連接數
waiting 啓用了保持連接功能後,處於正在等待客戶端發出請求的空閒連接數,如果數值很大,可能是keepalive時間太長了
i.ngx_http_referer_module
記錄跳轉的信息,像從哪些連接跳轉到我們的網站,或者是盜鏈的防止,定義那些是合法合理的跳轉
1.valid_referers none | blocked | server_names | string ...;
定義合法的referer數據;
server location
none:請求報文中沒有referer首部的,允許
blocked:請求報文中存在referer,但是沒有值,也是允許,合法的
server_names:值是主機名,凡是來自這個域名的referer都是合法的
arbitrary string:直接字符串,或者可以用*統配的
regular expression:~正表,正則表達式模式所描述的字符串
valid_referers none blocked server_names *.magedu.com magedu.* ~\.magedu\.;
if ($invalid_referer) {
return 403;
}
$invalid_referer模塊自帶的變量,值得是沒有被valid_referer匹配到的,返回403後去403那邊定義返回的網頁之類的
ssl module
ngx_http_ssl_module 默認不會編譯,編譯時記得啓用
【ssl/tls
tls:傳輸層安全 1.0 1.1 1.2 與ssl版本一一對應
ssl:v3.1 v3.2 v3.3
ssl在建立連接的時候,先向服務器hello,服務器收到後返回hello以及自己的證書,然後雙方進行祕鑰加密算法的交換,完成後建立連接
斷開的時候,要先斷開ssl連接,在斷開tcp/udp連接】
nginx -V 安裝信息
# HTTPS server
#
#server {
# ssl on|off (或者在listen後面加ssl,兩者取一即可)
# listen 443 ssl;
爲了保證443端口一定是ssl監聽,要在後邊加上ssl
# server_name localhost;
# ssl_certificate cert.pem;
證書路徑(不管後綴名叫什麼都是pem格式)
# ssl_certificate_key cert.key;
私鑰路徑(與證書匹配的私鑰文件)
# ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
SSL協議的版本;默認值就好
# ssl_session_cache shared:SSL:1m;
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
兩種,一種是每個worker私有builtin,一個是共享shared
shared共享(建議)
name 緩存的名稱
1m是緩存大小,1m能緩存4000個sessions
大大提高性能
土豪公司會在前端的負載均衡上靠硬件實現ssl
# ssl_session_timeout 5m;
超時時間
ssl會話超時時長,指ssl session cache中緩存條目有效時長
時間內一個客戶端再次來請求會話,不需要從新驗證等
# ssl_ciphers HIGH:!aNULL:!MD5;
加密方式,!是取消,+是增加的
# ssl_prefer_server_ciphers on;
是不是有服務端選擇加密算法
客戶端把支持的所有算法發過無由服務端選擇
# location / {
# root html;
# index index.html index.htm;
# }
ngx_http_log_module
定義訪問日誌日誌格式和日誌文件位置,文件描述符緩存也可以定義,錯誤日誌是全局定義的
log_format name “string”
httpd中是用的%f等,而nginx中是但前配置文件中自帶的或者是用戶創建的變量
編譯安裝的默認值就行
access_log off;
access_log path [format [buffer=size [flush=time]]gzip[=level] [if=condition]];
open_log_file_cache max=N [inactive=time][min_uses=N] [valid=time]
日誌文件的文件描述符緩存機制
max=N 最大可以緩存的文件描述符數量
inactive=time 非活動項,當滿了的時候會將最近沒達到最少使用次數的刪除
min_uses=N 最小使用次數
valid=time 多長時間檢查一次哪些項失效
ngx_http_rewrite_module 重要的不行
url重寫
rewrite ragex正表 replacement[flag]
將基於前邊正則表達式模式進行檢查,匹配到的替換成後邊的replacement制定的url
在同一級別的配置塊中,存在多個rewrite的時候,會自上而下逐個檢查,含有循環機制
【當nginx替換循環了10次還沒結束,nginx會自動結束並報錯】
如果replacement是以http:// https:// 開頭,替換結果直接以重定向通知客戶端301.302
[flag]
客戶端不參與:
last:替換完成後,停止接下來的多有操作,從location的rewrite開始進行新一輪的檢查,替換以及後續操作
break:重寫完成後,即可停止對當前location中的rewrite檢查,進行其他配置
客戶端參與
redirect:重寫完成後以臨時重定向的方式返回重寫完成後生成的新的url給客戶端,客戶端發起新的請求;但是不能以http,https開頭
permanent:重寫完成後以永久重定向的方式返回重寫完成後生成的新的url給客戶端,客戶端發起新的請求,必須以http,https開頭
【只要是以http,https開頭的就是永久重定向】
【正則表達式匹配的位置是root後邊的,例如
rewrite ^/bbs /forum
www.mymy.com/bbs-----www.mymy.com/forum 】
rewrite_log on|off
適配與notice級別,並記錄到error_log中
return code|code url|url
停止以及後續的所有處理,並返回給客戶端一個響應碼,一般在錯誤的格式下才會使用return或者是用戶請求一個不允許的資源的時候使用,用戶的請求終止
if (condition){...}
引入新的上下文,適用於server和location
當條件()滿足時候,執行{}中的動作
比較操作符
==
!=
~ 區分大小寫
~*
!~
!~*
文件目錄存在判斷
-e
-f
-d
-x 執行權限
set $variable value
適用於server location if中
ngx_http_gzip_module
壓縮,以CPU的計算能力換取帶寬
gzip on|off
gzip_buffers number size
指明用於壓縮功能的buffers的數量和大小
gzip_comp_level level
壓縮級別,數字越大壓縮比越大越消耗CPU
gzip_disable regex
被正則表達式匹配到的,不會啓用壓縮功能
gzip_min_length #;
報文的值大與這個值的時候才啓用壓縮功能
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
對代理的請求所獲取的響應報文是不是啓用壓縮功能,以及如何啓用
off:禁止壓縮
expired:響應報文中包含expired的啓用
any:什麼請求都進行壓縮
gzip_types mime_type
壓縮過濾器,只對這個設定的內容進行壓縮
mime_type text/plain text/cdd text/xml...
一般簡單設置直接gzip on|off就可以,想要更加正確在加其他選線
ngx_http_limit_req_module
單ip的速率(請求數)限制
limit_req_zone key(一般是客戶端的IP地址) zone=name size rate=rate
基於區域空間,爲了識別每一個獨立的個體,要給個key,可以使堵路地址也可以是。。
ngx_http_fastcgi_module
LNMP
nginx+php:fastcgi協議
nginx:client
php-fpm:server
php:編譯時,支持fpm;
./configure ... --enable-fpm ...
/etc/php-fpm/conf/www.conf
php-fpm工作方式(類似於httpd的prefork):
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic | static
pm.start_servers:啓動fpm進程時啓動的工作進程數量;
pm.min_spare_servers:最少空閒進程數;
pm.max_spare_servers:最大空閒進程數;
pm.max_children:最大工作進程數;
user = USERNAME
group = GROUPNAME
fastcgi_pass address
指明服務器端地址,php-fpm監聽的地址ipv4 ipv6 unix domain
fastcgi_index name
默認的fastcgi職業資源
fastcgi_param parameter value[if not empty]
/usr/local/html(root)$fastcgi_script_name(用戶請求的文件名)
fastcgi_cache cachename
調用緩存,能命中的話就會性能提升,所以緩存的命中率是很重要
【調用緩存時必須要有的三個參數
..cache
..cache_key
..cache_valid】
【對於所有緩存來說,命中率都是一種藥的指標,有兩種標準命中需要時間和次數一般命中率30%以上就很好了】
【緩存結構很簡單,一個key(用戶的url)一個value(url對應的腳本的執行結果)】
【緩存是個哈希表,效率十分高,而且nginx還把key放到了內存中,查找更加快捷】
【內容放在磁盤中,將內容的哈希碼做目錄名,將內容放進去,然後將哈希碼放到key中】
【分級將哈希碼前兩位切出來做一級目錄名,再切兩做二級目錄名......】
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
適用於http中
path:緩存數據存放路徑
levels= 緩存目錄層級熟料,以及每一級的目錄數量
levels=1:2:1
1指使用1位16進制字符,2值使用2位16進制字符,分別是1級目錄2級目錄3級目錄
倒着的哈希碼
keys_zone=name:size 緩存名和緩存key在內存中使用多大空間
inactive=time 緩存的有效時長
max_size=size 磁盤上用於緩存數據的緩存空間的最大值
fastcgi_cache zone|off
適用於 http server location
調用指定的緩存空間來緩存數據
fastcgi_cache_key string
用作上邊定義的緩存空間的key的字符串,一般是用戶請求的url,用變量 $request_uri 表示
fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET HEAD POST..
緩存哪些類型的請求的相關數據;
fastcgi_cache_min_uses number
請求幾次才放進緩存,1表示有請求就放
fastcgi_cache_valid[code...]time
對不同響應碼的對應資源的緩存時長
404 403 301 303 304
any
epoll select詳細內容記住
select 是輪訓,該模式可操作的socket數量是FD_SETSIZE操作的,內核默認是32*32=1024個,通過遍歷1024個socket來完成調度,不論是不是活躍的都要遍歷一遍
epoll 是觸發式的,socket同poll一樣是無限制的,操作是基於內核提供的反射模式,那個socket是活躍就去訪問那個socket,而不需要遍歷,但是如果全部的socket都是活躍的,那麼性能不如輪訓遍歷
nginx load balance負載均衡:(1.10以後)
對tcp/udp調度
nginx proxy 反代:
reverse proxy
【反代通常指對單一客戶端反代,而不是一組,面向多個主機的時候要先通過別的組件(獨立的實體)將主機們定義成組,獨立實體代爲收到反代請求,然後分發給多個主機】
upstream模塊
對於數據流,lvs是工作在內核空間,對於長數據流,是直接發過去,而不是等發完後一起發過去,因爲直接發效率高,並且不直接發的話對於內存的佔用大,但是nginx是要完整接受後轉發,如果太大就緩存,還是太大就先暫存在磁盤的臨時空間,還要注意的是,後端響應回去的,報文是存下來一起發,但是大文件是切割成小報文在發,所以他也要個緩存位置
截圖1.0801 09:28
爲毛啓用反代:
1.前段阻斷一些惡意請求
2.後端與代理服務器可以建立一個長時間的長連接,減少每次建立連接的消耗
3.代理開啓緩存後端更加輕鬆
【注意:後端主機接受到的請求都是代理服務器的地址】
【想要後端有源地址,可以再代理服務器封裝請求報文的時候封裝進去,然後後端記錄一下就好】
【多級代理的每一級都要額外附加原地址,常用的xforwarded就是初級代理附加,然後後邊的代理轉發報文就好】
緩存可以拿出來單獨放一個服務器
反代算法可以基於url來調度具體到那個緩存服務器
哈希表存, url當鍵,服務器當地址,沒有就按照算法調度,一般是加權輪序wrr
調度後端服務器,可以分析user agent調度
版本上線 應用程序發佈
灰度模型:一次只更新一部分主機,一般在凌晨,訪問量較小,將一部分的權重該爲零,然後停止服務器,添加新應用,重啓,改回正常的權重,然後看請求是不是正常進行,正常就依次重啓
問題:
1.但是如果有回話怎麼辦
一般session都是放在server上的
【http的長連接是不超過10秒的,權重設置爲0的等10秒就好了可以下線(冷模式,一定要停掉,反正已經下線了)了,有回話就等回話的最長時間】
2.發了新版本後發現有bug怎麼辦
回滾
3.如果用戶上傳文件了怎麼辦,又不能覆蓋
一般nginx可以將用戶上傳的文件(靜態)單獨放到一個目錄或服務器來,到時候軟連接等就好
【nginx應用層可以實現動靜分離,lvs就不行】
壓縮對動態資源會對緩存服務器造成負擔
proxy模塊 upstream模塊
ngx_http_proxy_module
1.proxy_pass URL
location,if in location,limit_expect
【注意pass後面路徑不帶url(帶/)時,其會將location的uri傳遞給後端主機
location /uri/ {
proxy_pass http://HOST;
}
http://HOST/uri;
如果後面的路徑是一個uri的時候,會將location的uri替換爲proxy_pass的uri
location /uri/ {
proxy_pass http://HOST/new_uri/;
}
http://HOST/new_uri/uri/a.jpg
如果location定義uri的時候使用了正則表達式的模式,那麼proxy_pass之後必須不能使用uri;否則爲語法錯誤
location ~|~* PATTERN {
proxy_pass http://HOST;
}
】
上午第二節課
$proxy_host 當前代理服務器地址
2.proxy_set_header name value
http,server,location
將請求報文的首部重新定義,後直接添加一個首部,設定某個首部的值,爲我們制定的值,然後給後端主機
默認值 Host $proxy_host
connection close 關閉長連接
proxy_set_header X-RealHost $remote_addr
X-Forward-For $prox_add_x_forwarded_for
後端服務器(httpd)配置文件的logformat 默認的格式之一里邊加上{X-RealHost}i
3.proxy_cache_path[levels=levels]keys_zone=name:size [inactive=time] [max_size=size] ;
適用於http
調用緩存
proxy_cache zone|off
適用於http,location,server
proxy_cache_key string
$scheme$proxy_host$requests_uri
proxy_cache_valid [code] time
4.proxy_cache_use_stale 腐敗過期error|timeout|invalid_header|
是不是能用過期的緩存來給用戶
5.proxy_connect|read|send_timeout
連接超時時長
尤其是read,加長這個時間可以避免很多的502
6.proxy_buffer_size 緩衝,一般是開啓的不需要修改
buffering
buffers
ngx_http_headers_module
1.add_header name value [always]
向相應報文中添加自定義首部
可用上下文:http,server,location,if in location
add_header X-Via $server_addr;
X-accel $server_name
2.expires [modified] time
epoch|max|of
ngx_http_upstream_module 負載均衡調度模塊
將多個後端服務器定義成組,然後提供負載均衡,分發等功能,對於proxy還是一個後端服務器,不只是proxy,fastcgi也行
upstream name組名{
server backend1.mymy.com weight權重
server IP地址:端口 max_fails=3 fail_timeout weight權重
【server address[parameters]】
server unix:/path/to/sock_file
server backend1.mymy.com weight權重
}
只能用在http
server 參數
weight=#
默認爲1
max_fails=#
最大失敗嘗試次數
fail_timeout=#
這個時間中可以嘗試max_fails次數
backup
備用標記,所有主服務器不可用的時候纔會使用
down
手動標記服務器爲不可用
least_conn;
upstream
最少鏈接算法,當服務器擁有不同權重的時候,使用wlc算法,不寫時默認的加權輪序wrr,考慮權重
least_time header|last_byte
最少平均響應時間,和最少連接
header 只記錄接受響應報文首部的時長
last_byte 報文全部接受完後響應時間
僅對nginx企業版有效
ip hash
原地址哈希算法SH,來自同一個源IP地址的請求始終發往同一個後端服務器
hash key[consistent]
key $requests_uri等對同一uri都送到同一服務器
$remote_addr
$cookie_name
常用於緩存服務器,緩存服務器必須用一致性哈希算法並且對uri做哈希計算
【對後面分佈式算法至關重要】
調度基於hash 的key來調度,key可是文本,變量或二者組合
consistent:參數,指定使用一致性哈希算法
【正常哈希算法:把key做哈希計算,然後對key基於服務器總權重取餘,餘數是幾就放第幾泰服務器】
但是增刪服務器,總權重變了,哈希計算就全部不同了,於是有了一致性哈希算法
【一致性哈希算法:一個哈希環,分爲0到2^32-1個節點,將服務器放在節點上,然後對2^32取餘,落在環上後,做順時針旋轉,找離他最近的服務器,影響範圍小,但是容易造成環偏斜,有的環可能承載的請求太多,可以做虛擬節點,一個服務器做多個虛擬節點】
sticky cookie name後邊默認就行,基於cookie綁定
keepalive connection
(設定可以一直處在保持連接狀態的數量)
keepalive #;
nginx主機與後端代理服務器啓用保持連接功能
大大減少連接創建刪除時間和套接字使用數量
health_check
定義健康狀態檢測機制
只能用於location,也就是說只能定義在proxy_pass後邊
interval=time
檢測頻率,默認5秒1一次
fails=number
檢測失敗的次數,第一次檢測成失敗不馬上處理,默認爲1但是不要設爲1
passes=number
默認爲1,服務器從失敗轉爲成功是需要檢測的次數
uri=uri
判斷健康與否使用的uri
match=name
基於制定的match來衡量檢測結果的成敗,match是額外定義的出來的,這裏應用定義的match的名字就好
port=number
使用獨立的端口專門進行健康狀態檢測
僅對nginx企業版有效
match name{..}
只能用在http,衡量檢測結果是不是成功的方法
status code|!dode
header HEADER=VALUE
HEADER~VALUE
body ~|!~ “PATTERN"
下午第一節課
博客作業:講到的所有nginx內容
課外實踐作業:實踐tengine
ngx_stream_core_module
stream{
upstream sshsvrs {
server 192.168.10.130:22;
server 192.168.10.131:22
hash $remote_addr consistent;
}
server{
listen 172.16.100.6:22202;
proxy_pass sshsvrs
}
}
代理後端的ssh服務
1.listen後邊要指明要監聽的端口,如果協議有區別要指明是tcp或udp協議等,默認是tcp
下午第二節課
}