接著上文寫
5.4.7 驗證模塊 需要輸入用戶名和密碼
模塊名稱:ngx_http_auth_basic_module
訪問控制基于模塊 ngx_http_auth_basic_module 實現,可以通過匹配客戶端資源進行限制
語法:
Syntax: auth_basic string | off;
Default:
auth_basic off;
Context: http, server, location, 1imit_exceptSyntax: auth_basic_user_file file;
Default: _
Context: http, server, location, 1imit_except
htpasswd?
用此命令生成用戶密碼文件
此命令來自于 httpd-tools 包,如果沒有安裝 一下即可
第一次生成文件
htpasswd -c 文件路徑 姓名 交互式生成密碼
htpasswd -bc 文件路徑 姓名 密碼 直接將密碼跟在后面 -c 代表新建用戶名和密碼對應的文件
-b 將密碼跟在用戶名后非第一次
htpasswd 文件路徑 姓名 交互式生成密碼
htpasswd -b 文件路徑 姓名 密碼 直接將密碼跟在后面
先安裝 httpd
谷歌瀏覽器查看:
由于瀏覽器的差異,有的內容不支持,下面去火狐瀏覽查看
使用另一種方式
瀏覽器查看:
5.4.8 自定義錯誤的頁面
我們可以改變默認的錯誤頁面,同時也可以用指定的響應狀態碼進行響應, 可用位置:http, server, location, if in location
Syntax: error_page code ... [=[response]] uri;
Default: _
Context: http,server,location,if in locationerror_page 固定關鍵字
code 響應碼(404 403 等)
= 可以將響應碼轉換
uri 訪問連接
默認錯誤頁面 404 報錯
自定義頁面:
① 錯誤了直接跳轉到主頁面
沒有再顯示404報錯,而是跳轉到了我們規定的頁面
② 精確頁面
頁面顯示:
③ 我們可以指定狀態碼,防止劫持
5.4.9 日志的存放位置
Syntax: error_log file [level];Default:
error_log logs/error.log error;
Context: main, http, mail, stream, server, location
level: debug, info, notice, warn, error, crit, alert, emergerror_log /apps/nginx/logs/xxx_error.log;
固定格式 文件路徑 級別(info debug等 可以忽略不寫)
將兩個網站的日志分離
自定義錯誤日志的位置
查看錯誤日志:
5.4.10 檢測文件是否存在
try_files 會按順序檢查文件是否存在,返回第一個找到的文件或文件夾(結尾加斜線表示為文件夾),如果所有文件或文件夾都找不到,會進行一個內部重定向到最后一個參數。只有最后一個參數可以引起一個內部重定向,之前的參數只設置內部 URI 的指向。最后一個參數是回退URI且必須存在,否則會出現內部500錯誤。
語法格式:
Syntax: try_files file ... uri;
try_files file ... =code;
Default: —
Context: server, location
server {listen 80;server_name www.lucky.com;root /data/html;location / {root /data;try_files $uri $uri.html $uri/index.html /about/default.html;
}
}
當不存在的時候,有托底頁面
如果存在,就正常顯示
5.4.11 長連接
keepalive_timeout timeout [header timeout];
#設定保持連接超時時長,0表示禁止長連接,默認為65s,通常配置在http字段作為站點全局配置keepalive_requests number;
#在一次長連接上所允許請求的資源的最大數量,默認為100次,建議適當調大,比如:500可以加在全局或者 server
案例:
keepalive_requests 3;
#最大下載三個資源就會斷開keepalive_timeout 60 65: #只能有一個空格
#開啟長連接后,返回客戶端的會話保持時間為60s,單次長連接累計請求達到指定次數請求或65秒就會被斷開,后面的60為發送給客戶端應答報文頭部中顯示的超時時間設置為60s:如不設置客戶端將不顯示超時時間。Keep-Alive:timeout=60 #瀏覽器收到的服務器返回的報文#如果設置為0表示關閉會話保持功能,將如下顯示:
Connection:close #瀏覽器收到的服務器返回的報文
默認開啟
keepalive_disable none | browser ...;
#對哪種瀏覽器禁用長連接
5.4.12 作為下載服務器配置
ngx_http_autoindex_module 模塊處理以斜杠字符 "/" 結尾的請求,并生成目錄列表,可以做為下載服務
小插曲:
刪掉此文件或者不管直接按 ENTER 進入,這是一個緩存文件
配置:
顯示:
一些其它命令:
[root@localhost nginx-1.18.0]#./configure --help |grep auto
#自帶--without-http_autoindex_module disable ngx_http_autoindex_moduleautoindex on | off;
#自動文件索引功能,默為offautoindex_exact_size on | off; ?
#計算文件確切大小(單位bytes),off 顯示大概大小(單位K、M),默認onautoindex_localtime on | off ;
#顯示本機時間而非GMT(格林威治)時間,默認offautoindex_format html | xml | json | jsonp;
#顯示索引的頁面文件風格,默認htmllimit_rate rate;
#限制響應客戶端傳輸速率(除GET和HEAD以外的所有方法),單位B/s,即bytes/second,默認值0,表示無限制,此指令由ngx_http_core_module提供set $limit_rate
#變量提供 限制 變量優先級高
看到 json 格式的畫面
5.4.13 用戶上傳資料
上傳需要借助開發小的程序, 并且程序 5M 和 nginx 10M 都會限制。 兩者取最小
client_max_body_size 1m;
#設置允許客戶端上傳單個文件的最大值,默認值為1m,上傳文件超過此值會出413錯誤client_body_buffer_size size;
#用于接收每個客戶端請求報文的body部分的緩沖區大小;默認16k;超出此大小時,其將被暫存到磁盤上的由下面client_body_temp_path
#指令所定義的位置client_body_temp_path path [level1 [level2 [level3]]];
#設定存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量,目錄名為16進制的數字,使用hash之后的值從后往前截取1位、2位、2位作為目錄名
5.4.14 其他設置
directio size | off;
#操作完全和aio相反,aio是讀取文件而directio是寫文件到磁盤,啟用直接I/O,默認為關閉,當文件大于等于給定大小時,例如:directio 4m;同步(直接)寫磁盤,而非寫緩存。open_file_cache off; ?#是否緩存打開過的文件信息open_file_cache max=N [inactive=time];
#nginx可以緩存以下三種信息:
(1) 文件元數據:文件的描述符、文件大小和最近一次的修改時間
(2) 打開的目錄結構
(3) 沒有找到的或者沒有權限訪問的文件的相關信息
max=N:#可緩存的緩存項上限數量;達到上限后會使用LRU(Least recently used,最近最少使用)算法實現管理
inactive=time:#緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少于open_file_cache_min_uses
#指令所指定的次數的緩存項即為非活動項,將被刪除open_file_cache_valid time;
#緩存項有效性的檢查驗證頻率,默認值為60s open_file_cache_errors on | off;
#是否緩存查找時發生錯誤的文件一類的信息,默認值為offopen_file_cache_min_uses number;
#open_file_cache指令的inactive參數指定的時長內,至少被命中此處指定的次數方可被歸類為活動項,默認值為1示例:
open_file_cache max=10000 inactive=60s;
#最大緩存10000個文件,非活動數據超時時長60sopen_file_cache_valid ? 60s; ?
#每間隔60s檢查一下緩存數據有效性open_file_cache_min_uses 5;
#60秒內至少被命中訪問5次才被標記為活動數據open_file_cache_errors ? on;
#緩存錯誤信息limit_except method ... { ... },僅用于location
#限制客戶端使用除了指定的請求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,
PROPPATCH, LOCK, UNLOCK, PATCHlimit_except GET {allow 192.168.44.20;deny all;
}
#允許 192.168.44.20主機下載,其他都拒絕
limit_except GET {
?allow 192.168.44.20;
?deny all;
}
#允許 192.168.44.20主機下載,其他都拒絕
六.高級配置
6.1 網頁的狀態頁
基于nginx 模塊 ngx_http_stub_status_module 實現,在編譯安裝nginx的時候需要添加編譯參數 --with-http_stub_status_module,否則配置完成之后監測會是提示語法錯誤注意: 狀態頁顯示的是整個服務器的狀態,而非虛擬主機的狀態。
狀態頁用于輸出 nginx 的基本狀態信息
Active connections:
#當前處于活動狀態的客戶端連接數,包括連接等待空閑連接數=reading+writing+waiting
accepts:
#統計總值,Nginx自啟動后已經接受的客戶端請求的總數。
handled:
#統計總值,Nginx自啟動后已經處理完成的客戶端請求總數,通常等于accepts,除非有因worker_connections限制等被拒絕的連接
requests:
#統計總值,Nginx自啟動后客戶端發來的總的請求數。
Reading:
#當前狀態,正在讀取客戶端請求報文首部的連接的連接數,數值越大,說明排隊現象嚴重,性能不足
Writing:
#當前狀態,正在向客戶端發送響應報文過程中的連接數,數值越大,說明訪問量很大
Waiting:
#當前狀態,正在等待客戶端發出請求的空閑連接數,開啟 keep-alive的情況下,這個值等于active – (reading+writing)
可以只提取里面的基本狀態的數字
[root@localhost conf.d]#curl 192.168.44.20/status 2>/dev/null|awk '/Reading/{print $2,$4,$6}'
為了安全考慮,可以搭配驗證模塊一起使用
server {listen 80;server_name www.lucky.com;root /data/html;location /status {stub_status;auth_basic "welcome future";auth_basic_user_file /mnt/.nginxuser;} }
再想提取的時候
[root@localhost conf.d]#curl http://lmy:123@192.168.44.20/status 2>/dev/null |awk '/Reading/{print $2,$4,$6}'
最終升級版
server {listen 80;server_name www.lucky.com;root /data/html;location /status {stub_status;auth_basic "welcome future";auth_basic_user_file /mnt/.nginxuser;allow 192.168.44.20;deny all;
}
}
6.2 nginx 第三方模塊
6.2.1 echo模塊
編譯之前,先關閉 nginx,導入壓縮包,并解壓。
6.3 變量
官方文檔? ? http://nginx.org/en/docs/varindex.html
6.3.1 內置變量
$remote_addr;? | 存放了客戶端的地址,注意是客戶端的公網IP |
$args; | 變量中存放了URL中的參數 |
$document_root;? | 保存了針對當前資源的請求的系統根目錄 |
$document_uri; | 保存了當前請求中不包含參數的URI,注意是不包含請求的指令 |
$host; | 存放了請求的host名稱 服務端的地址 |
$request_filename; | 當前請求的資源文件的磁盤路徑,由root或alias指令與URI請求生成的文件絕對路徑 |
$scheme;? | 請求的協議,例如:http,https,ftp等 |
$http_user_agent; | 客戶端瀏覽器的詳細信息 |
$http_cookie;? | 客戶端的cookie信息 |
$remote_addr;
#存放了客戶端的地址,注意是客戶端的公網IP$proxy_add_x_forwarded_for
#此變量表示將客戶端IP追加請求報文中X-Forwarded-For首部字段,多個IP之間用逗號分隔,如果請求中沒有X-Forwarded-For,就使用$remote_addrthe “X-Forwarded-For” client request header field with the $remote_addr variable appended to it, separated by a comma. If the “X-Forwarded-For” field is not present in the client request header, the $proxy_add_x_forwarded_for variable is equal to the $remote_addr variable.
客戶機 代理1 代理2 nginx服務器
$proxy_add_x_forwarded_for: 在代理1 上存的是 客戶機的ip
$proxy_add_x_forwarded_for: 在代理2 上存的是 客戶機的ip,代理1的ip 用逗號隔開
$proxy_add_x_forwarded_for: nginx 上存的是 客戶機的ip,代理1的ip,代理2的ip$args;
#變量中存放了URL中的參數,例如:http://www.kgc.org/main/index.do?id=20190221&partner=search
#返回結果為: id=20190221&partner=search 存放的就是這個select * from table where id=20190221$document_root;
#保存了針對當前資源的請求的系統根目錄,例如:/apps/nginx/html$document_uri;
#保存了當前請求中不包含參數的URI,注意是不包含請求的指令,比
如:http://www.kgc.org/main/index.do?id=20190221&partner=search會被定義為/main/index.do
#返回結果為:/main/index.do$host;
#存放了請求的host名稱
服務端的地址limit_rate 10240;
echo $limit_rate;
#如果nginx服務器使用limit_rate配置了顯示網絡速率,則會顯示,如果沒有設置, 則顯示0$remote_port;
#客戶端請求Nginx服務器時隨機打開的端口,這是每個客戶端自己的端口$remote_user;
#已經經過Auth Basic Module驗證的用戶名$request_body_file;
#做反向代理時發給后端服務器的本地資源的名稱$request_method;
#請求資源的方式,GET/PUT/DELETE等$request_filename;
#當前請求的資源文件的磁盤路徑,由root或alias指令與URI請求生成的文件絕對路徑,如:/apps/nginx/html/main/index.html$request_uri; https:// www.baidu.com/main/index.do?id=20190221&partner=search
#包含請求參數的原始URI,不包含主機名,相當于:$document_uri?$args,例如:/main/index.do?id=20190221&partner=search $scheme;
#請求的協議,例如:http,https,ftp等$server_protocol;
#保存了客戶端請求資源使用的協議的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等$server_addr;
#保存了服務器的IP地址$server_name;
#請求的服務器的主機名$server_port; 443 https
#請求的服務器的端口號$http_<name>
#name為任意請求報文首部字段,表示記錄請求報文的首部字段
arbitrary request header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores
#用下劃線代替橫線
#示例: echo $http_User_Agent; ?$http_user_agent;
#客戶端瀏覽器的詳細信息$http_cookie;
#客戶端的cookie信息$cookie_<name>
#name為任意請求報文首部字部cookie的key名$http_<name>
#name為任意請求報文首部字段,表示記錄請求報文的首部字段,ame的對應的首部字段名需要為小寫,如果有
橫線需要替換為下劃線
arbitrary request header field; the last part of a variable name is the field
name converted to lower case with dashes replaced by underscores #用下劃線代替橫線
#示例:
echo $http_user_agent;
echo $http_host;$sent_http_<name>
#name為響應報文的首部字段,name的對應的首部字段名需要為小寫,如果有橫線需要替換為下劃線,此變量有問題
echo $sent_http_server;$arg_<name>
#此變量存放了URL中的指定參數,name為請求url中指定的參數
#對比 變量 $arg 是全部, 如果 要id 如下
echo $arg_id;
6.3.2 自定義變量
假如需要自定義變量名稱和值,使用指令 set $variable value;
語法格式:
Syntax: set $variable value;
Default: —
Context: server, location, if
location /test {set $name xyl;echo $name;set $my_port $server_port;echo $my_port;
}
6.3.3 自定義圖標
favicon.ico 文件是瀏覽器收藏網址時顯示的圖標,當客戶端使用瀏覽器問頁面時,瀏覽器會自己主動發起請求獲取頁面的favicon.ico文件,但是當瀏覽器請求的 favicon.ico 文件不存在時,服務器會記錄404日志,而且瀏覽器也會顯示404報錯。