? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? nginx模塊
nignx -V #查看版本和當前安裝的模塊
如果是源碼安裝的使用絕對路徑加-V也可以查看
nginx -V 2>&1 | grep 模塊? ? #查看某個模塊有沒有安裝
配置文件:
server { # 默認網站配置文件
listen 80;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 監聽端口
server_name localhost;? ? ? ? ? ? ? ? ? # FQDN
#charset koi8-r;? ? ? ? ? ? ? ? ? ? ? ? # 網頁字符類型
#access_log /var/log/nginx/host.access.log main;? ? ? ? ? ? 日志
location / {
? ? root /usr/share/nginx/html;? ? ? ? ? # 網站主目錄
? ? index index.html index.htm;? ? ? ? ? # 默認主頁名
}
#error_page 404 /404.html;? ? ? ? ? ? ? ? # 錯誤頁面
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;? ? ? # 錯誤頁面
location = /50x.html {? ? ? ? ? ? ? ? ? ? # 錯誤頁面
root /usr/share/nginx/html;? ? ? ? ? ? ? ? # 錯誤頁面主目錄
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80? ? ? ? ? ? ? 代理設置
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000? ? ? 動態網站設置
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#location ~ /\.ht {
# deny all;
#}
}
連接狀態?
模塊-with-http_stub_status_module
# 目的:展示用戶和nginx連接數量的信息
nginx -V 2>&1 | grep stub_status? ? #查看模塊有沒有安裝
#模塊配置:
$ vim /etc/nginx/conf.d/default.conf
? ? ? server內添加:
? ? ? ? location /nginx_status { #/nginx_status? 自定義參數訪問這個就會跳轉到連接狀態
? ? ? ? ? ? stub_status;? ? #開啟模塊
? ? ? ? ? ? allow all;? ? ? #允許所有ip訪問
? ? ? ? ? }
$ systemctl restart nginx? # 重新啟動使配置文件生效
# 訪問網站:? http//ip地址/nginx_status
? ? ? Active connections: 1
? ? ? server accepts handled requests
? ? ? 5 8 27
? ? ? Reading: 0 Writing: 1 Waiting: 0
? # 解釋:
? ? ? `Active connections: 1`? ? ? ? ? ? ? ? #當前活動的連接數
? ? ? `server accepts handled requests`? ? #服務器接受處理請求
? ? ? `5`? ? ? ? #總連接數connection(TCP)連接數? ?
? ? ? `8`? ? ? ? #成功的連接數connection (TCP)請求數
? ? ? `27`? ? ? ? #總共處理的請求數requests(HTTP)
? ? ? `Reading:0`? ? ? #讀取客戶端Header的信息數 ? 請求頭
? ? ? `Writing:1`? ? ? #返回給客戶端的header的信息數 響應頭
? ? ? `Waiting:0`? ? ? #等待的請求數,開啟了keepalive
替換模塊
# 目的:網頁內容替換,替換文字
#模塊配置
$ vim /etc/nginx/conf.d/default.conf
? ? server內添加
? ? ? $ sub_filter nginx 'apache';? ? #將nginx替換成為apache
? ? ? $ sub_filter_once on;? ? ? ? ? #開啟單次替換,改成off的話就是替換所有
? ? ? ? location / {? ? ? ?
? ? ? ? root? /usr/share/nginx/html;
? ? ? ? index? index.html index.htm;
? ? ? ? }
$ systemctl restart nginx? # 重新啟動使配置文件生效
文件讀取
# 模塊:ngx_http_core_module
默認都是開啟的
# 語法:
? ? ? ? ? Syntax: sendfile on | off;
? ? ? ? ? Default: sendfile on;
? ? ? ? ? Context:? http, server, location, if in location
? ? ? ? ------------------------------------------------------
? ? ? ? ? Syntax: tcp_nopush on | off;
? ? ? ? ? Default: tcp_nopush off;
? ? ? ? ? Context:? http, server, location
? ? ? ? ------------------------------------------------------
? ? ? ? ? Syntax: tcp_nodelay on | off;
? ? ? ? ? Default: tcp_nodelay on;
? ? ? ? ? Context:? http, server, location
# sendfile模塊:
使用開啟或關閉是否使用sendfile()傳輸文件,普通應用應該設為on,下載等IO重負荷的應用應該設為off,因為大文件不適合放到buffer中。
傳統文件傳輸中(read/write方式)在實現上3其實是比較復雜的,需要經過多次上下文切換,當需要對一個文件傳輸時,傳統方式是:
? ? - 調用read函數,文件數據被copy到內核緩沖區
? ? - read函數返回,數據從內核緩沖區copy到用戶緩沖區
? ? - write函數調用,將文件數據從用戶緩沖區copy到內核與socket相關的緩沖區
? ? - 數據從socket緩沖區copy到相關協議引擎
從上面可以看出來,傳統readwrite進行網絡文件傳輸的方式,在過程中經歷了四次copy操作。
硬盤->內核buffer->用戶buffer->socket相關緩沖區->協議引擎
而sendfile系統調用則提供了一種減少多次copy,提高文件傳輸性能的方法。流程如下:
? ? - sendfile系統效用,文件數據被copy至內核緩沖區
? ? - 記錄數據文職和長度相關的數據保存到socket相關緩存區
? ? - 實際數據由DMA模塊直接發送到協議引擎
$ sendfile? ? ? on;? ? #默認打開
# tcp_nopush模塊:
sendfile為on時這里也應該設為on,數據包會累積一下再一起傳輸,可以提高一些傳輸效率。
$ tcp_nopush? on;? ? #默認打開
# tcp——nodelay模塊:
看上去是和tcp_nopush相反的功能,但是兩邊都為on時nginx也可以平衡這兩個功能的使用這個能夠提高高頻發送小數據報文的實時性。系統存在高頻發送小數據報文的時候,打開它。
$ tcp_nodelay on;? ? #小的數據包不等待直接傳輸。默認為on。
文件壓縮
# 原理介紹:啟動該模塊,使文件傳輸前進行壓縮,提升傳輸效率。
語法:
? ? Syntax: gzip on | off;
? ? Default: gzip off;
? ? Context: http, server, location, if in location
? ? -----------------------------------------------------? ?
#開啟壓縮,對數據進行實時壓縮
? $ gzip? on;?
#在響應這些種類的客戶端請求時不使用GZIP壓縮"msie6"對IE6瀏覽器的數據不進行GZIP壓縮
? $ gzip_disable "msie6"?
#小于1K的文件不啟動壓縮,小于1k的數據有可能越壓越大
? $ gzip_min_length 1k;?
#壓縮的級別,1-9個級別9是最高的但是壓縮速度慢?
? $ gzip_comp_level 4;
#讓前邊的緩存服務器識別壓縮后的文件
? $ gzip_vary on;
#開啟時,如果客戶端瀏覽器不支持Gzip處理,Nginx服務器將返回解壓后的數據,如果客戶端瀏覽器支持Gzip處理,Nginx 服務器忽略該指令設置。仍然返回壓縮數據
? $ gzip_static on;
#該指令用于設置Gzip壓縮文件使用存儲空間的大小,
`number`: 指定Nginx服務器需要向系統申請存儲空間的個數,
`size`: 指定每個緩存空間的大小。?
根據配置項,Nginx服務器在對響應輸出數據進行Gzip壓縮時需向系統申請number*size大小的空間用于存儲壓縮數據。默 認情況下,number*size的值為128,其中size的值為系統內存頁一頁的大小,用`getconf PAGESIZE`來獲取
? $ gzip_buffers 4 32k;? ? ? ? #壓縮過程都寫到buffer里面,壓縮完成才發給客戶端
#Nginx服務器可以根據MIME類型選擇性開啟Gzip壓縮功能。該指令涌來設置MIME類型。設置需要壓縮的數據格式
? $ gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
#默認值: gzip_http_version 1.1(就是說對HTTP/1.1協議的請求才會進行gzip壓縮)
? 注:99.99%的瀏覽器基本上都支持gzip解壓了。但是假設我們使用的是默認值1.1,如果我們使用了proxy_pass進行反向 代理,那么nginx和后端的upstream server之間是用HTTP/1.0協議通信的,如果我們使用nginx通過反向代理做Cache Server,而且前端的nginx沒有開啟gzip,同時,我們后端的nginx上沒有設置gzip_http_version為1.0,那么Cache 的url將不會進行gzip壓縮
? $ gzip_http_version 1.1;?
#gzip模塊可以在nginx主配置優化中查看
頁面緩存
# 作用:簡單的說,nginx expire功能就是為用戶訪問的訪問內容設定一個過期時間,當用戶第一次訪問到這些內容時,會把這些內容存儲在用戶瀏覽器本地,這樣用戶第二次訪問該網站,瀏覽器會加載檢查已經緩存在用戶瀏覽器恩地的內容,就不去服務器下載了開啟緩存可以加速瀏覽網站,合理的配置expires可以減少很多服務器的請求要配置expires。
#語法:
? ? ? ? Syntax:? ? expires [modified] time;
? ? ? ? ? ? ? ? ? ? expires? epoch | max | off;? ?
? ? ? ? Default:? expires off;
? ? ? ? Context: http, server, location, if in location
? ? ? -------------------------------------------------------? ?
#解釋:
epoch:指定“Expires”的值為 1 January,1970,00:00:01 GMT? ? ? ? ?
max:指定“Expires”的值為10年。?
-1:指定“Expires”的值為當前服務器時間-1s,即永遠過期。
off:不修改“Expires”和"Cache-Control"的值?
#使用方法一:
? ? ? ? ? location / {
? ? ? ? ? ? root? /app/tianyun.me;
? ? ? ? ? ? index? index.html index.htm;
? ? ? ? ? ? expires 24h;? ? ? #緩存保存24小時
? ? ? ? ? }
#使用方法二:
? ? ? ? ? location ~* .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
? ? ? ? ? ? ? root? /app/tianyun.me;
? ? ? ? ? ? ? expires 3650d;? #保存緩存3650天? ? ? ?
? ? ? ? ? }
防盜鏈
# 盜鏈:日志格式中的http_referer是記錄,訪問點引用的URL。也就是超鏈接的上一級地址。通過這段地址,可以發現一種網絡行為——盜鏈。非法盜鏈會影響站點的正常訪問。通過http_referer模塊可以控制這一點。防止非法盜鏈現象。如果開啟防盜鏈的話別人就不會盜取你的鏈接地址
語法:
? ? ? ? Syntax:? valid_referers none | blocked | server_names | string ...;
? ? ? ? Default: —
? ? ? ? Context:? server, location
? --------------------------------------------------------------------------------
#用法一:
? $ location ~* .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
? ? ? root /usr/share/nginx/html;
? ? ? valid_referers none blocked www.a.com;? ? ? #開啟www.a.com網站防盜鏈
? ? ? if ( $invalid_referer ) {? ? ? #如果來源域名不在這個列表中,那么$invalid_referer等于1
? ? ? ? ? return 403;? ? ? ? ? ? ? ? ? #等于 1? 返回403
? ? ? ? }
? ? ? }
#用法二:
? $ location ~* .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
? ? ? root /usr/share/nginx/html;
? ? ? valid_referers none blocked www.a.com? server_user ~\.baidu\. www.b.com;? ? ?
? ? ? #上面的就是開啟www.a.com網站防盜鏈,允許baidu? www.c.com 盜取鏈接
? ? ? if ( $invalid_referer ) {? ? ? #如果來源域名不在這個列表中,那么$invalid_referer等于1
? ? ? ? ? return 403;? ? ? ? ? ? ? ? ? #等于 1? 返回403
? ? ? ? }
? ? ? }
#如果在valid_referers none blocked *.www.a.com? #這樣的話所有的網頁都打不開,包括自己的
訪問請求頻率限制
定義: 在http內定義: limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s; limit_req_zone: # 限制請求 $binary_remote_addr: # 二進制地址 zone=req_zone: # 限制策略的名稱, 10m: # 占用10M空間 rate=1r/s; # 允許每秒1次請求 #1秒內只能相應10個請求超出得直接返回503引用: limit_req zone=rep_zone; #限制策論名稱 limit_req zone=req_zone burst=5; limit_req zone=req_zone burst=5 nodelay;
實例:
? 配置:? ? 先在http定義:? ? ? ? http {? ? ? ? ? ? limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;? ? ? ? ? ? ? }? ? 在server內引用:? ? ? ? ? ? ? ? ? ? server {? ? ? ? ? ? ? location / {? ? ? ? ? ? ? ? ? root /usr/share/nginx/html;? ? ? ? ? ? ? ? ? index index.html index.htm;? ? ? ? ? ? ? ? ? limit_req zone=req_zone;? ? ? ? ? ? ? ? ? ? ? #引用限制1秒內只能相應10個請求超出得直接返回503? ? ? ? ? ? ? ? ? limit_req zone=req_zone burst=5;? ? ? ? ? ? ? ? ? ? #引用限制,但是令牌桶有5個。有延遲。速度慢1秒內訪問10次會成功 如果訪問20次10會顯? ? ? ? ? ? ? ? ? ? ? 示成功5次放在burst緩存區里剩下得直接返回503? ? ? ? ? ? ? ? ? limit_req zone=req_zone burst=5 nodelay;? ? ? ? ? ? ? ? ? ? ? ? #引用限制,但是令牌桶有5個。無延遲。速度快如果1秒發送20個請求, 前15個請求正常響應, 后5個請求返回503, 第2秒發送6個請求, 正常響應。加brust=5和nodelay的情況下,有一個容量為5的緩沖區, rate=10r/s每秒能執行15次請求, 15=10+5。多的直接返回503錯誤。? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? } #burst=5 表示最大延遲請求數量不大于5。 如果太過多的請求被限制延遲是不需要的 ,這時需要使用nodelay參數,服務器會立刻返回503狀態碼。?
#情況 1: limit_req zone=req_zone;
第1秒發送10個請求, 正常響應。
第1秒發送13個請求, 前10個請求正常響應, 后3個請求返回503(Service Temporarily Unavailable)。不加brust和nodelay的情況下, rate=10r/s每秒只能執行10次請求, 多的直接返回503錯誤。
#情況 2: limit_req zone=req_zone brust=5;
第1秒發送10個請求, 正常響應。
第1秒發送13個請求, 前10個請求正常響應, 后3個請求放入brust等待響應。
第1秒發送20個請求, 前10個請求正常響應, 后5個請求放入brust等待響應, 最后5個請求返回503(Service Temporarily Unavailable), 第2秒執行brust中的5個請求。
第1秒發送20個請求, 前10個請求正常響應, 后5個請求放入brust等待響應, 最后5個請求返回503(Service Temporarily Unavailable), 第2秒發送6個請求, 執行brust中的5個請求, 將5個請求放入brust等待響應, 剩下的1個請求返回503(Service Temporarily Unavailable)。加brust=5不加nodelay的情況下, 有一個容量為5的緩沖區, rate=10r/s每秒只能執行10次請求, 多的放到緩沖區中, 如果緩沖區滿了, 就直接返回503錯誤。而緩沖區在下一個時間段會取出請求進行響應, 如果還有請求進來, 則繼續放緩沖區, 多的就返回503錯誤。
#情況 3: limit_req zone=req_zone brust=5 nodelay;
第1秒發送10個請求, 正常響應。
第1秒發送13個請求, 13個請求正常響應。
第1秒發送20個請求, 前15個請求正常響應, 后5個請求返回503(Service Temporarily Unavailable)。
第1秒發送20個請求, 前15個請求正常響應, 后5個請求返回503(Service Temporarily Unavailable), 第2秒發送6個請求, 正常響應。加brust=5和nodelay的情況下, 有一個容量為5的緩沖區, rate=10r/s每秒能執行15次請求, 15=10+5。多的直接返回503錯誤。
訪問連接頻率限制
# 通過IP地址,限制鏈接(TCP)。但是實驗環境無法測試
定義:
? ? 在http段定義:
? ? http {
? limit_conn_zone $binary_remote_addr zone=conn_zone:10m;? ? #conn_zone 定義的名稱
? ? }
limit_conn_zone:全局定義限制對象(IP),存儲區限制空間(10M)字
? #limit_conn_zone $binary_remote_addr zone=conn_zone:10m模塊開啟對單個ip、單個會話同時存在的連接數的限制。這里定義一個記錄區conn_zone,conn_zone的總容量是10m,該記錄區針對于變量 $binary_remote_add生效,這里是針對單個IP生效。該模塊只是一個定義,配置在http配置段,需要配合limit_conn指令使用才生效, limit_conn conn_zone 1表示該location段使用conn_zone定義的 limit_conn_zone ,對單個IP限制同時存在一個連接
引用配置:
? ? server {
? ? location / {
? ? .....
? limit_conn conn_zone 1;? ? ? #單個ip,同時只允許有一個tcp連接
? ? ? ? ? }
? ? ? }?
? limit_conn:該指令指定每個給定鍵值的最大同時連接數,當超過這個數字時返回503(Service )錯誤。如(同一IP同一時間只允許有2個連接):
? #客戶端的IP地址作為鍵。注意,這里使用的是 binary_remote_addr 變量,而不是 remote_addr變量remote_addr變量的長度為7字節到15字節,而存儲狀態在32位平臺中占用32字節或64字節,在64位平臺中占用64字節。binary_remote_addr變量的長度是固定的4字節,存儲狀態在32位平臺中占用32字節或64字節,在64位平臺中占用64字節。1M共享空間可以保存3.2萬個32位的狀態,1.6萬個64位的狀態,如果共享內存空間被耗盡,服務器將會對后續所有的請求返回 503 (Service Temporarily Unavailable) 錯誤。
訪問控制基于主機
$ allow #允許的主機
$ deny? ? #拒絕的主機
語法:
? Context: http, server, location, limit_except
? ---------------------------------------------------
啟動控制:
? ? server的字段內添加:
? ? ? server {
? ? ? ? ....
? ? ? ? allow? 10.0.111.28? ? #允許這個ip地址訪問
? ? ? ? deny? ? 10.0.111.27? ? #禁止這個ip地址訪問? ? ?
? ? ? }
#這個是有優先級存在的
訪問控制基于用戶
$ yum -y install httpd-tools #下載一個工具因為生成秘鑰的工具是由apache提供
$ htpasswd -cm /etc/nginx/conf.d/passwd pass
? ? ht=表示超文本
? ? -c=固定參數
? ? -m=第一次沒有文件的時候+m創建文件
? ? /etc/nginx/conf.d/passwd :創建文件的路徑
? ? pass = 創建的用戶
#啟動模塊:
? ? 在配置配置文件中添加:
? ? ? ? auth_basic “請輸入用戶密碼”;? #登陸時得提示消息
? ? ? ? auth_basic_user_file /etc/nginx/conf.d/passwd;? #前面是模塊 后面得是存放密碼得路徑? ? ? ? ? ? ? ?
#只有創建的用戶才可以登陸,創建的用戶和密碼都在/etc/nginx/conf.d/passwd內? ? ? ?