摘要:經由超文本傳輸協議通信,但是數據包由安全協議加密,實現加密數據與認證功能。該模塊指令定義相關設置證書文件,私鑰文件,會話緩存等內容。允許在客戶端建立會話時傳遞請求服務器名稱,這樣服務器就會知道該發送哪個虛擬主機下的證書文件。
1、nginx基本狀態信息頁面
配置示例:
location /basic_status { stub_status; }
頁面展示含義:
Active connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106 Active connections: 活動狀態的連接數; accepts:已經接受的客戶端請求的總數; handled:已經處理完成的客戶端請求的總數; requests:客戶端發來的總的請求數; Reading:處于讀取客戶端請求報文首部的連接的連接數; Writing:處于向客戶端發送響應報文過程中的連接數; Waiting:處于等待客戶端發出請求的空閑連接數;2、記錄請求日志
指令:
log_format
作用域: http
access_log
作用域: http, server, location, if in location, limit_except
open_log_file_cache
作用域: http, server, location
在http區域定制日志格式
用法:log_format name string ...;
name指定一個格式名稱,string可以使用nginx核心模塊及其它模塊內嵌的變量指定格式。
可在每個server中,或location中指定一個日志存放路徑
用法:
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off;
指定日志存放路徑path,格式format,緩沖區大小buffer,也可啟用壓縮日志,指定壓縮級別gzip
2.3 open_log_file_cache定義一個緩存保存活躍的日志文件描述符數據
用法:
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off;
max:緩存的最大文件描述符數量;
min_users:在inactive指定的時長內訪問大于等于此值方可被當作活動項;
inactive:非活動時長;
valid:驗證緩存中各緩存項是否為活動項的時間間隔;
配置示例:
log_format combined "$remote_addr - $remote_user [$time_local] " ""$request" $status $bytes_sent " ""$http_referer" "$http_user_agent" "$gzip_ratio""; access_log /var/logs/nginx-access.log combined buffer=32k; open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;3、rewrite重寫
將用戶請求的URI基于regex所描述的模式進行檢查,而后完成替換;
URL重寫是一個非常有用的功能,如果一個網站在改進的過程中結構發生變化,無需客戶端更改已保存訪問地址仍可正常訪問;提升網站安全性,如放盜鏈行為。
syntax: rewrite regex replacement [flag] Context: server, location, if
將用戶請求的URI基于regex所描述的模式匹配檢查,匹配到時將其替換成replacement指定的新URI;
rewrite指令在同一級配置塊中存在多條rewrite規則,會按照順序自上而下逐一執行;被某一規則替換完成后,重新開始新一輪檢查,因此本身具有循環機制,flag所表示的標志位可控制循環機制;如果replacement是以http://或其他協議開頭的字符串,則直接以重定向方式返回給客戶端;
另外,rewrite指令接收到的URI是不包含host地址的,例如http://cutemsyu.com/articles/...,不包含"cutemsyu.com" ,在寫regex規則時應當注意。
[flag] 可用標識如下:
last:停止在當前區域繼續處理,將重寫的新URI在各location中重新處理;
break:將此處重寫的URI在本塊中繼續處理,但新的URI不會轉向其他location中處理;
redirect:將重寫的URI直接返回給客戶端,狀態代碼為302,表示臨時重定向。用在replacement不以"http://"或"https://"開頭的情況下;
permanent:將重寫的URI直接返回給客戶端,狀態碼為301,指明為永久重定向。
Example:
#flag 是last的一個例子 server { ... rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra last; return 403; ... } #如果上面的rewrite規則寫在location中,則應該使用break標識,防止死循環,如果循環超過10此,返回500錯誤碼 location /download/ { rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra break; return 403; }3.2 return
syntax: return code [text]; return code URL; return URL; context: server, location, if
停止處理并返回一個狀態碼給客戶端。
3.3 if 指令syntax: if (condition) { ... } context: server, location
引入一個新的配置上下文,滿足條件時執行配置塊中的指令
condition為判斷條件,支持三種設置方法:
變量名,如果變量值為空字符串或者以0開頭的任意字符串,則表示條件為false
使用比較符判斷變量與字符串的邏輯關系
判斷文件或目錄存在情況
其中 比較操作符有:
=
!=
~ 模式匹配,區分字符大小寫
~* 模式匹配,不區分字符大小寫
!~:模式不匹配,區分字符大小寫
!~*:模式不匹配,不區分字符大小寫
文件及目錄存在性判斷:
-e, !-e 檢查一個文件,目錄,或軟鏈接是否存在
-f, !-f 檢查一個文件是否存在
-d, !-d 檢查一個目錄是否存在
-x, !-x 檢查一個文件是否可執行
Example:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; }3.4 rewrite的應用 3.4.1 域名跳轉
Example:
#訪問video.cutemsyu.com 跳轉至v.cutemsyu.com server { listen 80; server_name video.cutemsyu.com; rewrite ^(.*) http://v.cutemsyu.com$1 ; ... }3.4.2 rewrite uri中參數
默認情況下nginx進行rewrite后都會自動添加舊地址中參數部分,在replacement末尾添加"?"即可屏蔽舊地址中的參數
Example:
##原來的訪問的url為http://cutemsyu.com/article/nature/index.php?id=22341 rewrite ^/article/nature/(.*) http://cutemsyu.com/article/natrue.html permanent 重寫之后訪問的URL為http://cutemsyu.com/article/nature.html?id=22341 也就是說原有的參數部分它會自動補上 rewrite ^/article/nature/(.*) http://cutemsyu.com/article/natrue.html? permanent 重寫之后的URL為http://cutemsyu.com/article/nature.html,沒有原來的參數部分3.4.3 防盜鏈
通常為了加快客戶端訪問資源響應時間,服務器不會一次性將全部資源響應給客戶端,首先傳回網頁的文本內容,當客戶端解析文本內容中的圖片、視頻等資源時會再次向服務器發起請求。當某個站點將圖片鏈接指向其他服務器,給其他服務器造成負擔,這就是非法的盜鏈行為。我們在搭建服務站點時要有意識防范盜鏈行為。
http協議頭部中referer頭域表示訪問當前資源的源地址,根據referer中的源地址URL來判斷是否來自本站,如非本站的地址,采取阻斷措施防止盜鏈。
syntax: valid_referers none | blocked | server_names | string ...; context: server,location;
valid_referers 指令根據規則檢測頭域中referer中值是否合法,如果非法內嵌變量 $invalid_referer 值為1.
參數含義:
none,表示檢測referer為空的情況
blocked,表示檢測referer的值被防火墻或者代理服務器刪除的情況,通常referer的值不以http://或https:// 開頭
server_names,referer的值應該被包含在server_name中
string,定義字符串形式。
開始或尾部帶有通配符*
正則表達式,以~引導,匹配http://后面的內容
Example:
#如果發現盜鏈,重寫鏈接為指定的表示禁止盜用的圖片 server { listen 80; server_name v.cutemsyu.com; location ~* ^.+.(gif|jpg|png|flv|mp4|swf)$ { valid_referers none blocked server_names *.cutemsyu.com ~.google. if ($invalid_referer) { rewrite ^/ http://v.cutemsyu.com/images/forbbiden.jpg } } }4、gzip壓縮
壓縮文本數據,提升網絡響應速度,作為靜態服務器使用很有必要開啟,壓縮文本將節省大量帶寬,同時提升響應速度。但是如果作為反向代理服務器則需要考慮,壓縮功能是否應該由后端服務器承擔,以此減輕前端服務器CPU壓力。
4.1 ngx_http_gzip_module該模塊功能是對指定類型數據使用gzip方法壓縮
作用域Context: http, server, location
gzip on |off;
此模塊gzip功能啟用或禁用
gzip_types mime-types ... ;
壓縮過濾器,僅對指定的MIME類型進行壓縮處理
gzip_comp_level level;
設置壓縮級別1-9,默認值為1壓縮速率最快,壓縮比最低
gzip_min_length length;
啟用壓縮功能的響應報文大小閾值,小于該置不進行壓縮。防止有些小數據壓縮之后更大的情況,推薦值為1024
gzip_buffers number size;
壓縮數據使用緩沖區大小,size默認為內存分頁大小
gzip_disable regex;
舊版本的瀏覽器對于gzip功能支持不完善,對于該指令配置的正則信息與瀏覽器類型匹配,匹配成功的響應不進行壓縮處理
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;
nginx作為反向代理服務器接收后端服務器響應結果壓縮控制
4.2 ngx_http_gunzip_module解壓模塊,該模塊對于不支持壓縮功能的瀏覽器請求,響應結果如果被壓縮則將其解壓后返回給客戶端。適用于某些以gzip方式壓縮過存儲的數據。
作用域Context: http, server, location
提示該模塊不是默認編譯內容,編譯選項--with-http_gunzip_module
gunzip on |off ;
是否開啟該模塊功能
gunzip buffers number size;
用于解壓數據使用的緩沖區空間配置
4.3 ngx_http_gzip_static_module靜態壓縮模塊,該模塊允許發送預壓縮數據,如果客戶端請求的數據已被壓縮過,且客戶端支持gzip壓縮,則直接返回壓縮數據。
作用域Context: http, server, location
提示該模塊不是默認編譯內容,編譯選項--with-http_gzip_static_module
gzip_static on | off ;
是否開啟該模塊
gzip_disable regex;
對于適配瀏覽器類型禁止gzip功能
gzip on; gzip_comp_level 3; gzip_types text/html text/css text/xml text/plain application/javascript; gzip_min_length 1024; gzip_disable "MISE [4-6]."; gzip_buffers 8 16K; gunzip on; #支持自動解壓功能5、ssl模塊
HTTP協議屬于明文協議,通過抓包就可獲取一些隱私數據。HTTPS經由超文本傳輸協議HTTP通信,但是數據包由SSL/TLS 安全協議加密,實現加密數據與認證功能。
ngx_http_ssl_module 該模塊指令定義https相關設置:證書文件,私鑰文件,ssl會話緩存等內容。
作用域Context: http, server
1. ssl on | off; 設定虛擬主機是否啟用HTTPS協議 2. ssl_certificate file; 指定當前虛擬主機使用的PEM格式的證書文件 3. ssl_certificate_key file; 指定當前虛擬主機上與其證書相匹配的私鑰文件 4. ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 支持ssl協議版本,默認為后三個 5. ssl_session_cache off | none | [builtin[:size]] [ shared:name:size ]; ssl會話緩存設置。 builtin[:size] --使用OpenSSL內建的緩存,此緩存為每worker私有。容易產生內存碎片不推薦。 shared:name:size --worker之間共享的緩存區域,size單位為bytes,1MB可存儲4000個會話;name為共享緩存區域名稱,多個虛擬主機可使用同一個共享緩存區。 6. ssl_session_timeout time; 客戶端可重復使用會話參數的超時時長。默認5分鐘
Example:
server { listen 443 ssl; server_name www.cutemsyu.com; root /website/ssl/htdocs; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_session_cache shared:sslcache:15m; ssl_session_timeout 3m; }5.2 基于域名的HTTPS虛擬主機
值得考慮的一個問題是如何實現多個HTTPS虛擬主機監聽在同一IP地址上。
情況一:每個虛擬主機使用各自的證書文件,如下
server { listen 443 ssl; server_name www.example.com; ssl_certificate www.example.com.crt; ... } server { listen 443 ssl; server_name www.example.org; ssl_certificate www.example.org.crt; ... }
如此配置的話,客戶端訪問這兩個站點建立SSL會話時收到的都是默認主機的證書文件。該問題是由于SSL協議造成的,SSL鏈接在客戶端發送HTTP請求之前建立起來的,然而nginx并不知道所請求的服務主機名,因此返回默認服務器證書文件。
解決方法一:
多個HTTPS虛擬主機使用同一證書文件和私鑰文件,證書和私鑰配置指令在http級別設定,server共享其配置
ssl_certificate common.crt; ssl_certificate_key common.key; server { listen 443 ssl; server_name www.example.com; ... } server { listen 443 ssl; server_name www.example.org; ... }
解決辦法二:
更通用的辦法是使用TLS Server Name Indication extension技術,即SNI。SNI允許在客戶端建立SSL會話時傳遞請求服務器名稱,這樣服務器就會知道該發送哪個虛擬主機下的證書文件。該技術需要瀏覽器支持,一般主流瀏覽器都已支持
Opera 8.0;
MSIE 7.0 (but only on Windows Vista or higher);
Firefox 2.0 and other browsers using Mozilla Platform rv:1.8.1;
Safari 3.2.1 (Windows version supports SNI on Vista or higher);
and Chrome (Windows version supports SNI on Vista or higher, too)
同時確保nginx支持SNI功能:
$ nginx -V ... TLS SNI support enabled ...
本篇文章到此結束,下篇總結nginx反向代理,fastcgi模塊,感謝關注!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39437.html
摘要:它是一個高性能的和反向代理服務器,同時也可以作為的代理服務器。如果相對域名或參數字符串起作用,可以使用全局變量匹配,也可以使用反向代理。 nginx是什么? nginx是俄羅斯人 Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的一個十分輕量級的HTTP服務器。它是一個高性能的HTTP和反向代理服務器,同時也可以作為IMAP/POP3/SMTP的代理服務器。ngi...
摘要:如果狀態碼附帶文字段落,該文本將被放置在響應主體。相反,如果狀態碼后面是一個,該將成為頭部值。沒有狀態碼的將被視為一個狀態碼,這種情況下需要以或者開頭。因為和不能簡單的只返回狀態碼,還必須有重定向的,這就是指令無法返回的原因了。 HTTP模塊(核心模塊,也是主要用到的模塊) server模塊 server模塊是http的子模塊,它用來定義一個虛擬主機 例子: server { ...
摘要:是一款輕量級的服務器反向代理服務器及電子郵件代理服務器,并在一個協議下發行。是以反向代理的方式進行負載均衡的。 Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,并在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,供俄國大型的入口網站及搜索引擎Rambler(俄文:Рамблер)使用。其特點是占有內存...
摘要:關于如何快速調教的幾點總結關于的好與壞,我覺得沒有必要去介紹了,在這里主要分享一下我在實際的項目部署中是如何快速的調教的。 關于如何快速調教Nginx的幾點總結 關于Nginx的好與壞,我覺得沒有必要去介紹了,在這里主要分享一下我在實際的項目部署中是如何快速的調教Nginx的。其中分享的源碼大家可以作為模板代碼,根據自身項目的實際情況,酌情使用。 這里簡單的說一說我為什么要寫這篇文章,...
閱讀 2234·2021-11-17 09:33
閱讀 2774·2021-11-12 10:36
閱讀 3395·2021-09-27 13:47
閱讀 884·2021-09-22 15:10
閱讀 3485·2021-09-09 11:51
閱讀 1392·2021-08-25 09:38
閱讀 2757·2019-08-30 15:55
閱讀 2608·2019-08-30 15:53