nginx可以作爲web服務器以及反向代理,還有mail功能,在nginx的配置文件中是分段的,main端表示對web和mail等都生效的,http表示作爲web時生效的,server用於定義虛擬主機嵌套在http內
對於多個站點,爲了配置看起來明晰,可以在http端使用include包含conf.d目錄下的所有文件,然後在conf.d目錄下分別以每個站點命名配置文件進行配置
location使用的修飾符
location[=|~|~*|^~] url {.....}
location URL{}
對當前路徑以及子路徑下的所有對象都生效
location =URL {}
精確匹配當前路徑,不包括子路徑。只對當前路徑生效
location ~|~* URL {}
模式匹配URL,此處的URL可使用正則表達式
~表示匹配的時候區分字符大小寫
~*表示匹配的時候不區分字符大小寫
location ^~ URL {}
明確說明不使用正則表達式
當這些混合使用的時候,=匹配的優先級最高,如果沒有,非正則表達式的優先級最高,再則,就是使用正則表達式的,最後就是沒加修飾符的
location 後加的URL需要和{root /path/to/dirctory}合併得到最終的文件系統路徑
2.nginx中定義訪問控制
基於ip的訪問控制
location / {
deny指令
allow指令 //可以加單個ip,網段,all等參數
)
基於用戶的訪問控制(使用auth basic)模塊
location / {
auth_basic "need password"
auth_basix_user_file htpasswd
}
用戶認證文件也是使用htpasswd生成 (建議生成爲隱藏文件)
3.index模塊(可以用在http,server,location中,有繼承關係)
index file (control which files are to be indexed) 定義默認頁面
4. auto index模塊
autoindex on //如果沒有主頁面,列出所有文件
5. limit requests模塊
6. limit conn模塊
7.stub status模塊
stub_status on;
開啓狀態報告模塊,在訪問返回的信息中
Active connextions:291
server accepts handled requests
reading : writing: waiting:
accepts:已經接受的連接的個數
handled:已經處理的連接的個數
requests:已經處理的請求的個數(requests/handled可以大致得出每個連接的請求數)
reading:nginx正在讀取其首部的請求的個數
writing:nginx正在讀取其主體的請求的個數或正處理請求內容的請求個數或正在向客戶端發送響應的請求的個數
waiting:長連接模式中的保持的連接個數
8.ssl模塊
相關指令:(定義在server段)
ssl on; //開啓ssl功能
ssl_certificate //指定證書
ssl_certificate_key //指定私鑰
ssl_session_timeout //超時時間
ssl_protocols //指定支持的協議的版本
ssl_ciphers //使用的算法
ssl_perfer_server_ciphers on; //是否允許服務端選擇其傾向的加密算法
9.proxy模塊
nginx通過proxy模塊實現反向代理的功能,nginx在作爲web反向代理服務器的時候,nginx負責接收用戶請求,並能夠根據URI,客戶端參數,或者是其他的處理邏輯將用戶請求調度至上游服務器,nginx在實現反向代理功能是最重要的指令是proxy_pass,它能夠將location定義的某URI代理至指定的上游服務器
eg:location /uri {
proxy_pass http:192.168.1.1:808/newuri;
} //此時是直接將uri進行了轉換
特殊情況:a.如果location定義的uri使用了模式匹配(~,~*,^~),其uri會直接被傳遞給上游服務器,而不會被轉換成一個新的uri
eg:location ~|^~|~* uri {
proxy_pass http:192.168.0.1:808;
} //此時訪問的就是192.168.0.1:808/~|^~|~* uri
b.如果location中使用了url重新,那麼nginx處理請求時也是處理重寫後的uri,而不是上游服務器定義的uri
eg: location /{
rewrite ...
proxy_pass http:192.168.0.1:808/index
} //那麼/index就不再生效,而是重寫後的uri
其他proxy相關指令:
nginx的http核心模塊中提供可很多的服務器變量($remote-ip就是表示客戶端地址),這些服務器變量在nginx的配置文件中可以直接進行引用
proxy_set_header X-Real-Ip $remote-ip
10.upstream模塊(用於實現負載均衡)
upstream NAME{
}
需要引入一個新的上下文,定義在server{}之外
定義upstream的時候需要給其一個獨特的名稱,然後使用proxy模塊代理至upstream上去,由upstram完成負載均衡的功能
例如:Upstream hadoop {
server 192.168.0.1;
server 192.168.0.1;
}
upstream模塊還可以實現後端健康狀況檢查,對於upstream而言,最重要的指令就是server
server指令接受的參數:wegiht=VALUE //用於定義權重(加權論調)
max-fails=VALUE //最大錯誤次數
fail_timeout=VALUE //定義錯誤超時時長
backup //通常用於定義錯誤提示(提供錯誤頁面)
ip_hash //根據源地址hash,能將同意客戶端請求始終定向至同一server
least_conn //將請求向連接數最少的服務器轉發
server {
listen 80;
servername localhost;
location / {
proxy_pass http://hadoop/; //注意此處仍要使用uri的格式
}
}
11.nginx的緩存
nginx在web服務器的時候,nginx可以將文件描述符(也就是文件系統上緩存對象對應的元數據)是緩存在內存空間的,同時也存儲頁面對應的鍵,並且這段內存空間是共享內存,而頁面的緩存是在磁盤上
proxy_cache_path //不能定義在server上下文,必須定義在http中(因爲定義的緩存是共享的,所以不能在某特定虛擬主機中進行定義)
procy_cache_path /var/nginx/cache [levels=levels] keys_zone=name:size [max_size]
levels:定義目錄級別
levels=1:2 //一級子目錄一個字符命名,二級子目錄兩個字符命名,最多只能有三級,並且各級子目錄命名最多兩個字符
keys_zone //給內存區域命名(可以用多個,每個緩存磁盤空間也就是之前定義的目錄會對應一個共享內存區域,這就是給這個內存區域命名和設定大小)
max_size //path指定的緩存目錄最大可以佔據多少磁盤空間
這樣,nginx就具有了緩存的功能,然後在server中定義需要緩存的虛擬主機使用定義好的緩存空間
在某個location中定義使用示例:
proxy_cache off;表示關閉
proxy_cache name; //就是keys_zone處定義的name
proxy_cache_valid 200 10m; //將返回狀態碼爲200的對象緩存十分鐘
nginx提供的緩存是公共的,對所有的用戶都是生效的
除了proxy_cache之外,另外還有三種常見的緩存:
open_log_cache:打開日誌緩存
open_file_cache :打開文件緩存
fastcgi_cache
12.nginx的壓縮功能
默認情況下,nginx編譯的時候會自動編譯gzip模塊,所以可以直接使用(啓用壓縮功能可以在一定程度上節約帶寬的)
在http上下文中
gzip on; //開啓gzip壓縮功能
gzip_min_length; //使用gzip壓縮的最小文件大小(達到這個大小之後纔會使用gzip壓縮)
gzip_buffer ; //gzip壓縮文件過程可以使用的內存空間大小
12.rewrite模塊
rewrite模塊引入了if指令,做條件判斷,只有在滿足條件的時候才做相應的處理
if通常只能用在server,location中,尤其是用在location中
if (condition) {
}
測試:
雙目測試: ~,!~
=,!=
~*,!~*
eg:if($request_method=POST){
}
if($request_uri~*/index){
}
建議用在location上下文中,在if中常用的有break指令,避免循環,推出判斷
return(0-999)
判斷是不是盜鏈行爲,需要使用referer模塊
使用valid_referers none www.example.com... //使用valid_referfer指令定義來自哪些網站的引用是合法的(none表示直接從瀏覽器輸入訪問的)
if($invalid_referer){
return 403
} //表示在定義了有效referfer之後,此處使用該參數匹配不符合有效引用的連接然後返回錯誤碼
如何使用rewrite指令完成url重寫
rewrite支持正則表達式
rewrite regex replacement [flag]
flag的四個值:last:本次重寫完成之後,重啓下一輪檢查(但是可能會帶來重寫循環)
break:本次重寫完成之後,不再檢查,直接執行後續操作(可以避免重寫循環)