1. 網(wǎng)頁的狀態(tài)頁
基于nginx 模塊 ngx_http_stub_status_module
實現(xiàn),在編譯安裝nginx的時候需要添加編譯參數(shù) –with-http_stub_status_module
,否則配置完成之后監(jiān)測會是提示語法錯誤注意
狀態(tài)頁顯示的是整個服務(wù)器的狀態(tài),而非虛擬主機的狀態(tài)
yum install -y httpd-tools
htpasswd -bc /apps/nginx/conf.d/.httpuser scj 123456
cd /apps/nginx/conf.d/
vim pc.conf
#添加以下內(nèi)容
location /nginx_status {
stub_status;
}
nginx -t
nginx -s reload
#重新加載
192.168.67.100/ngin_status
#在任意瀏覽器訪問狀態(tài)頁
上面三個數(shù)字分別對應(yīng)accepts,handled,requests三個值
Active connections:
#當前處于活動狀態(tài)的客戶端連接數(shù),包括連接等待空閑連接數(shù)=reading+writing+waiting
accepts:
#統(tǒng)計總值,Nginx自啟動后已經(jīng)接受的客戶端請求的總數(shù)。
handled:
#統(tǒng)計總值,Nginx自啟動后已經(jīng)處理完成的客戶端請求總數(shù),通常等于accepts,除非有因worker_connections限制等被拒絕的連接
requests:
#統(tǒng)計總值,Nginx自啟動后客戶端發(fā)來的總的請求數(shù)。
Reading:
#當前狀態(tài),正在讀取客戶端請求報文首部的連接的連接數(shù),數(shù)值越大,說明排隊現(xiàn)象嚴重,性能不足
Writing:
#當前狀態(tài),正在向客戶端發(fā)送響應(yīng)報文過程中的連接數(shù),數(shù)值越大,說明訪問量很大
Waiting:
#當前狀態(tài),正在等待客戶端發(fā)出請求的空閑連接數(shù),開啟 keep-alive的情況下,這個值等于active – (reading+writing)
#為了安全考慮可以添加驗證模塊
server{
listen 80;
server_name www.pc.com;
root /data/nginx/pc;
location /admin{
stub_status;
auth_basic "admin site";
auth_basic_user_file /apps/nginx/conf.d/.httpuser;
}
}
2. Nginx第三方模塊
Nginx第三方模塊就是一種可選的插件,用于擴展和增強Nginx的功能,并根據(jù)特定需求自定義其行為。
第三方模塊可以添加新的指令、處理程序、變量或修改現(xiàn)有功能。
要使用第三方模塊,您需要在編譯和安裝Nginx時包含相應(yīng)的模塊源代碼,并按照模塊提供的說明進行配置。
2.1 echo模塊
介紹
echo-nginx-module
是一個第三方的 Nginx 模塊,可以解析配置文件中的 echo 指令,并執(zhí)行對應(yīng)的腳本或表達式,將其結(jié)果作為HTTP 響應(yīng)返回給客戶端
使用echo模塊,可以實現(xiàn):
1) 輸出純文本:將字符串作為響應(yīng)的一部分返回給客戶端。
2) 輸出變量值:將 Nginx 內(nèi)置變量或自定義變量的值返回給客戶端。這對于顯示請求頭信息或動態(tài)生成內(nèi)容非常有用。
3)輸出 HTTP 狀態(tài)碼:設(shè)置響應(yīng)的 HTTP 狀態(tài)碼。
4)控制請求處理流程:通過終止請求或?qū)⒄埱笾囟ㄏ虻狡渌?URL 來控制請求的處理流程。
要使用 echo-nginx-module
,需要在編譯安裝 Nginx 時添加該模塊,或者通過第三方軟件包管理工具進行安裝。
#示例
yum install git -y
#安裝git
git clone https://github.com/openresty/echo-nginx-module.git
#下載模塊包
#注:可能跟現(xiàn)nginx版本不符導(dǎo)致編譯失敗
unzip echo-nginx-module-master.zip
#解壓
#重新編譯安裝,加入echo模塊
./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/opt/echo-nginx-module-master
make -j2 && make install
#在配置文件中加入echo模塊配置
vim /apps/nginx/conf.d/pc.conf
location /ip {
default_type text/html;
echo "welcome, your ip addr: ";
echo $remote_addr;
}
nginx -t
nginx -s reload
#重新加載
#切換到測試機
curl 192.168.67.100/ip
3. 變量
在NGINX中,變量是一種用于存儲和檢索HTTP請求和響應(yīng)中的數(shù)據(jù)的機制。
變量可以包含請求頭、請求方法、請求參數(shù)、時間戳等信息。
http://nginx.org/en/docs/varindex.html
官方文檔
3.1 內(nèi)置變量
變量名 | 含義 |
---|---|
$remote_addr | #存放了客戶端的地址,注意是客戶端的公網(wǎng)IP |
$proxy_add_x_forwarded_for此變量表示將客戶端IP追加請求報文中X-Forwarded-For首部字段, | |
$args | 變量中存放了URL中的參數(shù) |
$document_root | 保存了針對當前資源的請求的系統(tǒng)根目錄,例如:/apps/nginx/html |
$document_uri | 保存了當前請求中不包含參數(shù)的URI |
$host | 存放了請求的主機名稱 |
$limit_rate 10240 | 如果nginx服務(wù)器使用limit_rate配置了顯示網(wǎng)絡(luò)速率,則會顯示,如果沒有設(shè)置, 則顯示0 |
$remote_port | 客戶端請求Nginx服務(wù)器時隨機打開的端口,這是每個客戶端自己的端口 |
$remote_user | 已經(jīng)經(jīng)過Auth Basic Module驗證的用戶名 |
$request_body_file | 做反向代理時發(fā)給后端服務(wù)器的本地資源的名稱 |
$request_method | 請求資源的方式,GET/PUT/DELETE等 |
$request_filename | 當前請求的資源文件的磁盤路徑 |
$request_uri | 包含請求參數(shù)的原始URI,不包含主機名 |
$scheme | 請求的協(xié)議,例如:http,https,ftp等 |
$server_protocol | 保存了客戶端請求資源使用的協(xié)議的版本 |
$server_addr | 保存了服務(wù)器的IP地址 |
$server_name | 請求的服務(wù)器的主機名 |
$server_port | 請求的服務(wù)器的端口號 |
$http_ | name為任意請求報文首部字段,表示記錄請求報文的首部字段 |
$http_user_agent | 客戶端瀏覽器的詳細信息 |
$http_cookie | 客戶端的cookie信息 |
$cookie_ | name為任意請求報文首部字部cookie的key名 |
$arg_ | 此變量存放了URL中的指定參數(shù),name為請求url中指定的參數(shù) |
3.1.1 示例
vim /apps/nginx/conf.d/pc.conf
#編輯配置文件
location /main {
index index.html;
default_type text/html;
echo "hello world,main-->";
echo $remote_addr;
echo $args;
echo $arg_user
echo $document_root;
echo $document_uri;
echo $host;
echo $http_user_agent;
echo $http_cookie;
echo $request_filename;
echo $scheme;
echo $scheme://$host$document_uri?$args;
}
- `index index.html;`:指定默認的索引文件為index.html,當訪問/main時,如果有index.html文件,將自動顯示該文件。
- `default_type text/html;`:指定默認的Content-Type為text/html,如果響應(yīng)中沒有特別指定Content-Type,則使用默認值。
- `echo "hello world,main-->";`:輸出字符串"hello world,main-->"。
- `echo $remote_addr;`:輸出客戶端的IP地址。
- `echo $args;`:輸出請求的查詢參數(shù)。
- `echo $arg_user;`:輸出名為user的查詢參數(shù)的值。
- `echo $document_root;`:輸出當前請求的根目錄路徑。
- `echo $document_uri;`:輸出當前請求的URI。
- `echo $host;`:輸出請求的主機名。
- `echo $http_user_agent;`:輸出客戶端使用的用戶代理。
- `echo $http_cookie;`:輸出請求中的Cookie。
- `echo $request_filename;`:輸出當前請求的文件路徑。
- `echo $scheme;`:輸出請求使用的協(xié)議(http或https)。
- `echo $scheme://$host$document_uri?$args;`:輸出完整的URL,包括協(xié)議、主機、路徑和查詢參數(shù)。
#換一臺機器測試
curl http://192.168.67.100/main
curl 'http://www.pc.com/main?user=zhou&title=cto'
curl -b uid=100 'http://www.pc.com/main?user=zhou&title=cto'
3.2 自定義變量
在 Nginx 中,自定義變量可以用于存儲和操作一些特定的值,以便在配置文件中的不同位置進行重用。
通過 set 指令可以將一個值賦給一個新的變量,即新建自定義變量。
#基本語法
Syntax: set $variable value;
#可使用環(huán)境
Context: server, location, if
#示例
location /test {
set $name kgc;
echo $name;
set $my_port $server_port;
echo $my_port;
}
nginx -t
nginx -s reload
#重新加載
#測試
curl www.pc.com/test
3.2.1 自定義訪問日志
http {
# 定義自定義訪問日志格式
log_format my_custom_log '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
# 配置使用自定義訪問日志格式的訪問日志文件
access_log /path/to/custom_access.log my_custom_log;
# 其他配置項...
}
在上述例子中,我們使用 `log_format` 指令定義了一個名為 `my_custom_log` 的自定義日志格式,該格式包含了 IP 地址、用戶名、訪問時間、請求內(nèi)容、狀態(tài)碼、傳輸字節(jié)數(shù)、引用頁面和用戶代理等信息。
然后,在 `access_log` 指令中指定了一個自定義訪問日志文件的路徑 `/path/to/custom_access.log`,并且將之前定義的 `my_custom_log` 格式應(yīng)用于該日志文件。
nginx -t
nginx -s reload
#重新加載
3.2.2 自定義json 格式日志
方便ELK收集日志
vim /apps/nginx/conf/nginx.conf
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"uri":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
vim /apps/nginx/conf.d/pc.conf
location / {
root /data/nginx/pc/;
access_log logs/access.log access_json;
}
#日志腳本
#!/usr/bin/env python3
#coding:utf-8
status_200= []
status_404= []
with open("access_json.log") as f:
for line in f.readlines():
line = eval(line)
if line.get("status") == "200":
status_200.append(line.get)
elif line.get("status") == "404":
status_404.append(line.get)
else:
print("狀態(tài)碼 ERROR")
print((line.get("clientip")))
f.close()
print("狀態(tài)碼200的有--:",len(status_200))
print("狀態(tài)碼404的有--:",len(status_404))
3.4 Nginx壓縮功能
Nginx通過在服務(wù)器上啟用gzip模塊來提供壓縮功能。
啟用gzip后,Nginx會自動檢測客戶端的瀏覽器支持情況,然后在服務(wù)器和客戶端之間壓縮和解壓縮文件。
太小的文件沒必要壓縮,壓縮說不定變大了。
#官方文檔
https://nginx.org/en/docs/http/ngx_http_gzip_module.html
#配置指令
#啟用或禁用gzip壓縮,默認關(guān)閉
gzip on | off;
#壓縮比由低到高從1到9,默認為1
gzip_comp_level number;
#禁用IE6 gzip功能
gzip_disable "MSIE [1-6]\.";
#gzip壓縮的最小文件,小于設(shè)置值的文件將不會壓縮
gzip_min_length 1k;
#啟用壓縮功能時,協(xié)議的最小版本,默認HTTP/1.1
gzip_http_version 1.0 | 1.1;
#指定Nginx服務(wù)需要向服務(wù)器申請的緩存空間的個數(shù)和大小,平臺不同,默認:32 4k或者16 8k;
gzip_buffers number size;
#指明僅對哪些類型的資源執(zhí)行壓縮操作;默認為gzip_types text/html,不用顯示指定,否則出錯
gzip_types mime-type ...;
#如果啟用壓縮,是否在響應(yīng)報文首部插入“Vary: Accept-Encoding”,一般建議打開
gzip_vary on | off;
#預(yù)壓縮,先壓縮好,不用臨時壓縮,消耗cpu
gzip_static on | off;
示例
vim /apps/nginx/conf.d/pc.conf
#編輯子配置文件
#測試
192.168.67.100/aaa.jpg
4. HTTPS
#官方文檔
https://nginx.org/en/docs/http/ngx_http_ssl_module.html
4.1 Nginx的HTTPS工作原理
-
生成和配置SSL證書:為了提供HTTPS服務(wù),首先需要生成SSL證書。這個證書由服務(wù)器私鑰和公鑰組成。私鑰用于對傳輸?shù)臄?shù)據(jù)進行解密,而公鑰則用于對數(shù)據(jù)進行加密。生成證書后,需要在Nginx配置文件中指定證書的路徑和其他相關(guān)信息。
-
客戶端發(fā)起HTTPS請求:當用戶在瀏覽器中輸入一個HTTPS的URL時,瀏覽器會向服務(wù)器發(fā)起HTTPS請求。默認的HTTPS端口是443。
-
服務(wù)器接收請求:Nginx作為HTTPS服務(wù)器,會監(jiān)聽并接收到客戶端發(fā)起的HTTPS請求。
-
SSL握手過程:在建立HTTPS連接時,需要進行SSL握手過程來確保連接的安全性。
-
建立加密連接:使用客戶端和服務(wù)器共享的會話密鑰,Nginx會使用對稱加密算法來對數(shù)據(jù)進行加密。這樣,客戶端和服務(wù)器之間的數(shù)據(jù)傳輸就變得安全和加密。
-
處理HTTPS請求:Nginx在建立了加密的HTTPS連接后,會繼續(xù)處理客戶端發(fā)送的HTTPS請求,如代理請求到后端應(yīng)用服務(wù)器或者提供網(wǎng)頁內(nèi)容等。
4.2 啟用功能模塊的配置過程
Nginx的HTTPS功能通過ngx_http_ssl_module
模塊來實現(xiàn)的。
ngx_http_ssl_module
模塊為Nginx添加了對SSL/TLS協(xié)議的支持,使其能夠提供HTTPS服務(wù)。
ngx_http_ssl_module
模塊提供了一組配置項,用于指定SSL證書、私鑰、加密算法、協(xié)議版本以及其他與SSL/TLS相關(guān)的設(shè)置。
ssl_certificate:指定SSL證書文件的路徑。
ssl_certificate_key:指定SSL私鑰文件的路徑。
ssl_protocols:指定支持的TLS協(xié)議版本,例如TLSv1.2、TLSv1.3。
ssl_ciphers:指定加密算法套件,例如AES128-GCM-SHA256、ECDHE-RSA-AES256-GCM-SHA384。
ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl緩存
off: #關(guān)閉緩存
none: #通知客戶端支持ssl session cache,但實際不支持
builtin[:size]:#使用OpenSSL內(nèi)建緩存,為每worker進程私有
[shared:name:size]:#在各worker之間使用一個共享的緩存,需要定義一個緩存名稱和緩存空間大小,一兆可以存儲4000個會話信息,多個虛擬主機可以使用相同的緩存名稱
ssl_session_timeout time;
#客戶端連接可以復(fù)用ssl session cache中緩存的有效時長,默認5m
#示例
mkdir /scj
#在根下創(chuàng)建新目錄
#自發(fā)證書腳本
CA_SUBJECT="/O=scj/CN=ca.scj.com"
SUBJECT="/C=CN/ST=js/L=nj/O=scj/CN=www.scj.com"
SERIAL=34
EXPIRE=202002
FILE=scj.com
openssl req -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crt
openssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key -subj $SUBJECT -out ${FILE}.csr
openssl x509 -req -in ${FILE}.csr -CA ca.crt -CAkey ca.key -set_serial $SERIAL -days $EXPIRE -out ${FILE}.crt
chmod 600 ${FILE}.key ca.key
bash certificate.sh
#運行腳本
ca.crt相當于頒發(fā)機構(gòu)
scj.com.crt相當于頒發(fā)對象
cat ca.crt scj.com.crt >www.scj.com.crt #合并
cat ca.key scj.com.key >www.scj.com.key #公鑰
vim /apps/nginx/conf.d/pc.conf
#編輯子配置文件
server {
listen 80;
listen 443 ssl; #ssl 端口號
ssl_certificate /opt/www.scj.com.crt; #證書存放路徑
ssl_certificate_key /opt/www.scj.com.key; #公鑰存放路徑
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.scj.com;
root /data/nginx/html;
}
nginx -t
nginx -s reload
#重新加載
https://192.168.67.100
#訪問網(wǎng)址
5、自定義圖標
favicon.ico 文件是瀏覽器收藏網(wǎng)址時顯示的圖標。文章來源:http://www.zghlxwxcb.cn/news/detail-688187.html
當客戶端使用瀏覽器問頁面時,瀏覽器會自己主動發(fā)起請求獲取頁面的favicon.ico文件。
當瀏覽器請求的favicon.ico文件不存在時,服務(wù)器會記錄404日志,而瀏覽器會顯示404報錯。文章來源地址http://www.zghlxwxcb.cn/news/detail-688187.html
#方法一:服務(wù)器不記錄訪問日志:
location = /favicon.ico {
log_not_found off;
access_log off;
}
#方法二:將圖標保存到指定目錄訪問:
#location ~ ^/favicon\.ico$ {
location = /favicon.ico {
root /data/nginx/html/pc/images;
expires 365d; #設(shè)置文件過期時間
}
到了這里,關(guān)于Nginx詳解 三:高級配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!