nginx高階訪客日誌切割

不太聪明的大鹅發表於2024-03-22

切割理念(先純手動的去切割日誌,備份日誌)

  1. 給nginx程序傳送訊號,讓nginx重新生成一個新日誌檔案,這就是一個日誌切割根本

/var/log/nginx/access.log.bak   # 1.備份原本日誌檔案

nginx  reload  reopen訊號
# 配置檔案中定義的日誌檔名,是這個
2. /var/log/nginx/access.log  	# 重新生成新日誌檔案,讓新日誌往這裡去寫



# 手動切割,修改日誌
#1.準備好舊的日誌檔案,測試寫入大量的日誌記錄,先用第一種辦法,for迴圈
[root@web-8 ~]#for num in {1..10000};do curl 10.0.0.8 ; done


#2.使用支援多程序,併發寫入的工具,如ab命令  apache提供的效能壓測命令,給網站傳送支援併發的大量的http請求。
[root@web-8 ~]#yum install httpd-tools -y

# 傳送10000個http請求,且招來100個人同時發請求
ab -c 100 -n 10000  http://10.0.0.8/


# 3.當前日誌數量
[root@web-8 /var/log/nginx]#cat all-server-accesss.log |wc -l
20000




# 3.讓你有一個已經記錄了大量日誌的檔案,得進行日誌切割了

切割思路就是,1.先重新命名,等於備份()  2. 重新記錄nginx日誌 (/var/log/nginx/access.log) 按天記錄日誌 (每天夜裡的 整點分進行日誌備份,日誌)
按天,生成一個新的日誌檔案

# 備份舊日誌(模擬是前一天的舊日誌)

cd /var/log/nginx && mv all-server-accesss.log all-server-accesss.log.$(date '+%F')

# 還得生成新日誌,得繼續記錄
給nginx程序傳送reopen訊號,重新生成新日誌
# 用這種方式,可以最精確的提取程序id號。

kill -USR1 $(ps -ef|grep nginx |grep master | awk '{print $2}')

此時會生成新的日誌
[root@web-8 /var/log/nginx]#ll
total 6084
-rw-r--r-- 1 www  root       0 May 23 10:10 all-server-accesss.log
-rw-r--r-- 1 root root 4160000 May 23 10:08 all-server-accesss.log.2022-05-23---10:04:17
-rw-r--r-- 1 www  root     700 May 23 10:10 error.log

此時新日誌,就會記錄到這個新的日誌檔案中了
==> all-server-accesss.log <==
/index.html  10.0.0.8 - - [23/May/2022:10:10:56 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
/index.html  10.0.0.8 - - [23/May/2022:10:10:57 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
/index.html  10.0.0.8 - - [23/May/2022:10:10:58 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
/index.html  10.0.0.8 - - [23/May/2022:10:10:58 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"



對於舊的日誌 你最好 建立資料夾去分類管理他們

shell指令碼形式

.你得先有解決問題的思路,然後將思路轉變為linux命令,再最佳化為shell指令碼

#!/bin/bash

# 源日誌目錄
logs_path="/var/log/nginx"

# 備份日誌目錄
back_logs_path="${logs_path}/$(date -d 'yesterday' +'%F')"


# 建立備份目錄,以日期命名,注意,每天零點整切割,開始記錄新的一天的日誌,備份目錄應該是昨天
mkdir -p ${back_logs_path}


# 重新命名舊日誌名,注意日期
cd ${logs_path} && find . -type f |xargs -i mv {} {}.$(date -d 'yesterday'  +'%F') 


# 移動舊日誌檔案到該目錄下
cd ${logs_path} && find . -type f  |xargs -i mv {}   ${back_logs_path}

# 重新生成新日誌
kill -USR1 `ps -ef|grep nginx |grep master|awk '{print $2}'`

新增到定時任務

crontab -e 

0 0  * * * /bin/bash /my_shell/back_nginx.sh 

logrotate工具切割形式

# 看看該日誌切割工具,支援哪些軟體


# 預設改工具,對nginx的支援.
# 這裡的寫法,是針對你的yum安裝的nginx,實現日誌切割

[root@web-8 /var/log/nginx]#cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log {
        daily                            # 每天切割
        missingok                    # 忽略錯誤
        rotate 52                    # 最多保留多少個存檔    
        compress                    # 切割後且壓縮
        delaycompress            # 延遲壓縮動作在下一次切割
        notifempty                # 日誌為空就不切割
        create 640 nginx adm        # 切割的檔案許可權
        sharedscripts                # 共享指令碼,結果為空
        postrotate                    # 收尾動作,重新生成nginx日誌
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript                        # 結束動作
}


# 如果說你要用這個logrotate工具對你的編譯安裝的淘寶nginx實現日誌切割,你還會寫嗎?
# 會的扣 1 不會扣 2

# 區別是1.確定日誌目錄 /opt/ngx/logs/  ;    2.給nginx主程序傳送USR1訊號(tengine是生成了nginx.pid檔案,還是沒有)


# 生成切割指令碼
# 針對你編譯安裝的 淘寶nginx,實現自動的日誌切割

cat > /etc/logrotate.d/tengine <<EOF
/opt/ngx/logs/*.log {
        daily                            # 每天切割
        missingok                    # 忽略錯誤
        rotate 52                    # 最多保留多少個存檔    
        compress                    # 切割後且壓縮
        delaycompress            # 延遲壓縮動作在下一次切割
        notifempty                # 日誌為空就不切割
        create 640 nginx adm        # 切割的檔案許可權
        sharedscripts                # 共享指令碼,結果為空
        postrotate                    # 收尾動作,重新生成nginx日誌
                if [ -f /opt/ngx/sbin/tengine.pid ]; then
                        kill -USR1 `cat /opt/ngx/sbin/tengine.pid`
                fi
        endscript                        # 結束動作
}

看具體的效果,是否理解
先清理你剛才的shell的定時任務
重新生成nginx日誌環境,然後測試工具
[root@web-8 /var/log/nginx]#crontab -e
crontab: installing new crontab
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#ntpdate -u ntp.aliyun.com



23 May 10:59:03 ntpdate[4346]: step time server 203.107.6.88 offset -47699.063535 sec
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#
[root@web-8 /var/log/nginx]#date
Mon May 23 10:59:14 CST 2022


應該先修改時間,作為測試

測試logrotate工具是否實現日誌切割
手動實現日誌切割,執行該工具
logrotate -f /etc/logrotate.d/nginx


被切割後的日誌
[root@web-8 /var/log/nginx]#ll -h
total 21M
-rw-r----- 1 www  adm   10M May 24 00:01 all-server-accesss.log
-rw-r--r-- 1 root root 5.0M May 23 10:59 all-server-accesss.log.1
-rw-r----- 1 www  adm     0 May 24 00:01 error.log
-rw-r--r-- 1 root root  700 May 24 00:01 error.log.1




logrotate工具,本身會壓縮備份的日誌檔案,是因為,壓縮工作,被延遲到了下一次切割
logrotate -f /etc/logrotate.d/nginx
等於實現了第二次切割動作,本次會進行日誌壓縮了


最終的操作,應該吧這個切割命令,寫入到定時任務即可
[root@web-8 /var/log/nginx]#crontab -l
00 00 * * *  logrotate -f /etc/logrotate.d/nginx

目錄索引、下載服務

實現一個類似於ftp工具的功能

1.先準備好一個用於共享的資料目錄

2.部署server虛擬主機,然後去展示這些資料,完事

1. 準備一個 rpm包的 目錄

2. 提供該rpm包目錄的展示
mkdir /0224rpms

[root@web-8 /0224rpms]#yum install python3 python3-devel --downloadonly --downloaddir=/0224rpms


3.建立nginx的虛擬主機
[root@web-8 /0224rpms]#cat /etc/nginx/conf.d/autoindex.conf
server {

listen 11111;
server_name _;
location / {
	        autoindex on;
        autoindex_localtime on;
        autoindex_exact_size off;
	root /0224rpms;
}
}


4.重啟nginx實現該目錄索引功能
[root@web-8 /0224rpms]#systemctl reload nginx
如何明確,該虛擬主機是否可用
[root@web-8 /0224rpms]#netstat -tunlp |grep 11111
tcp        0      0 0.0.0.0:11111           0.0.0.0:*               LISTEN      4361/nginx: master  


5.測試訪問即可
此時這個虛擬主機就提供了基於http請求的檔案下載功能


6.利用wget下載
wget http://10.0.0.8:11111/python3-3.6.8-18.el7.x86_64.rpm

引數說明

Syntax:    autoindex on | off;
Default:    
autoindex off;
Context:    http, server, location


# autoindex on   ; 表示開啟目錄索引


Syntax:    autoindex_localtime on | off;
Default:    
autoindex_localtime off;
Context:    http, server, location


# autoindex_localtime on; 顯示檔案為伺服器的時間


Syntax:    autoindex_exact_size on | off;
Default:    
autoindex_exact_size on;
Context:    http, server, location

# autoindex_exact_size on; 顯示確切bytes單位
# autoindex_exact_size off; 顯示檔案大概單位,是KB、MB、GB


若目錄有中文,nginx.conf中新增utf8編碼
charset utf-8,gbk;

連線數監控

http://nginx.org/en/docs/http/ngx_http_stub_status_module.html 模組介紹

該ngx_http_stub_status_module模組提供對基本狀態資訊的訪問。

預設情況下不構建此模組,應使用 --with-http_stub_status_module 配置引數啟用它。

Nginx狀態資訊(status)介紹 Nginx軟體在編譯時又一個with-http_stub_status_module模組,這個模組功能是記錄Nginx的基本訪問狀態資訊,對於想了解nginx的狀態以及監控nginx非常有幫助。

讓使用者瞭解Nginx的工作狀態。

要想使用狀態模組,在編譯時必須增加--with-http_stub_status_module引數。
引數解釋

Active connections
當前活動客戶端連線數,包括Waiting連線數。

accepts
接受的客戶端連線總數。

handled
處理的連線總數。
accepts 通常,除非已達到某些資源限制(例如, worker_connections限制) ,否則該引數值相同。

requests
客戶端請求的總數。

Reading
nginx 正在讀取請求標頭的當前連線數。

Writing
nginx 將響應寫回客戶端的當前連線數。

Waiting
當前等待請求的空閒客戶端連線數。

# 注意
一個tcp連線,可以發起多個http請求
可以透過修改保持連線引數修改
keepalive_timeout 0; 表示關閉長連線

看下你的nginx支援這個模組嗎

nginx -V         必須有這個模組--with-http_stub_status_module

# 建立虛擬主機檔案,檢視status功能

[root@web-8 /etc/nginx/conf.d]#cat  status.conf
# 作用就是讓你訪問 ip:9999可以精確定位到這個虛擬主機
server{
    listen 9999;
    server_name _;
  	stub_status on;
  	access_log off; # 因為它不是一個基於http請求響應的網站,僅僅是展示連線的資訊,都不需要寫location。
}

重新讀取
[root@web-8 /etc/nginx/conf.d]#cat  status.conf
server{
    listen 9999;
    server_name localhost;
  stub_status on;
  access_log off;
}
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#systemctl reload nginx



為什麼啟用數是2

基於IP的訪問限制

模組

http://nginx.org/en/docs/http/ngx_http_access_module.html

1.配置語法

句法:    allow address | CIDR | unix: | all;
預設:    —
語境:    http, server, location,limit_except
允許訪問指定的網路或地址。如果指定了特殊值unix:(1.5.1),則允許訪問所有 UNIX 域套接字。

句法:    deny address | CIDR | unix: | all;
預設:    —
語境:    http, server, location,limit_except
拒絕對指定網路或地址的訪問。如果指定了特殊值unix:(1.5.1),則拒絕所有 UNIX 域套接字的訪問。

allow xxxxx;
deny   xxxx;
他倆的放置順序;

第一題
限制只允許10.0.0.0~10.0.0.255範圍的IP訪問(禁止其他網段的訪問)

建立虛擬主機,完成該功能
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
    allow 10.0.0.0/24;
    deny all;
	root  /www/deny-allow;
	index index.html;
}

}

建立測試資料,檢視訪問情況
[root@web-8 /etc/nginx/conf.d]#mkdir -p /www/deny-allow
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#echo 'I am web-8  , test  deny  and  allow !!!!!!!!'  > /www/deny-allow/index.html

[root@web-8 /etc/nginx/conf.d]#systemctl restart nginx
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#netstat -tunlp|grep 22334
tcp        0      0 0.0.0.0:22334           0.0.0.0:*               LISTEN      7402/nginx: master  




1. 用win去訪問,可以嗎?  可以的
http://10.0.0.8:22334/

2. 用61機器去訪問,
# 網路卡的流量,網段是對應起來的 
eth0   10.0.0.61
eth1    172.16.1.61



curl 10.0.0.8:22334        # 從61機器的10.0.0.61發出
curl 172.16.1.8:22334	  # 從61機器的172.16.1.61發出

提示

只寫一個allow的話,等於沒有任何意義,必須做好deny限制,才有實際意義。

第二題
限制只允許172.16.1.0 ~ 172.16.1.255 範圍的IP訪問,禁止其他任意的地址訪問。

[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
        #allow 10.0.0.0/24;
        allow 172.16.1.0/24;
		deny  all;  # 拒絕客戶端訪問該網頁根目錄下的資源,返回403許可權不足
	root  /www/deny-allow;
	index index.html;
}

}


你發現,處於同一個內網環境下的 ,有172網段的機器是通的,
比如win這回訪問可以通碼? 可以 1 不可以 2

第三題

  • 限制只允許windows訪問(禁止其他機器訪問,比如任意的 10.0.0.61 任意的172.16.1.52)
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
        # allow 10.0.0.0/24;
        # allow 172.16.1.0/24;
        allow 10.0.0.1;
		deny  all;  # 拒絕客戶端訪問該網頁根目錄下的資源,返回403許可權不足
	root  /www/deny-allow;
	index index.html;
}

}

# 待會試試,用不同網段的客戶端ip,訪問,檢視許可權
# 測試幾個客戶端
10.0.0.1 通 ,只有這一個ip地址是通的.

10.0.0.61  不通
172.16.1.52 不通

第四題

  • 限制拒絕10.0.0.0~10.0.0.255範圍的IP訪問(得允許其他網段訪問)
    (這個ip限制規則,自上而下的匹配,匹配到規則後,就不會繼續向後匹配了)
此時只能透過內網的172網路卡去訪問這個機器了
# 配置如下
[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
    deny 10.0.0.0/24;
	root  /www/deny-allow;
	index index.html;
}

}


# 透過如下這幾個客戶端試試,先用10網段的試試
發現10網段全部被拒絕
發現172網段是允許被訪問的

第五題
限制只拒絕windows訪問。其他人都允許訪問

[root@web-8 /etc/nginx/conf.d]#cat deny-allow.conf 
server {

listen 22334;
server_name _;

location /  {
        deny 10.0.0.1;
	root  /www/deny-allow;
	index index.html;
}

}



10.0.0.1 只有它不能訪問

基於使用者認證的訪問限制

簡單說就是訪問網站需要輸入賬號密碼

給虛擬主機,加上密碼驗證


1. 建立密碼,密碼不是一個簡單的純文字檔案,得基於密碼資料庫的儲存
有工具幫你完成htpasswd這個工具去建立密碼檔案
yum -y install httpd-tools 

建立密碼檔案
# -b 免互動,輸入賬號密碼即可
# -c 設定密碼寫入到什麼檔案

htpasswd -b -c /etc/nginx/auth_passwd yuchao01 yuchao666

[root@web-8 /etc/nginx/conf.d]#cat /etc/nginx/auth_passwd 
yuchao01:$apr1$.D27Ssim$P9KebeNNrgXWUIbo1fZs40


2. 讓nginx 的虛擬主機,支援該功能,並且由於是內網文件,讓他只在內網下可訪問
[root@web-8 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#cat auth_basic.conf 
server {
	listen 172.16.1.8:33334;
	charset utf-8;
	server_name _;
	location / {
		    	auth_basic "please input your account password";
        auth_basic_user_file /etc/nginx/auth_passwd;
		root /www/auth-html;
		index index.html;
	
	} 

}




        


3.建立測試資料
[root@web-8 ~]#mkdir -p /www/auth-html
[root@web-8 ~]#
[root@web-8 ~]#echo '我是用於驗證賬戶密碼的,你不輸入密碼,別想看到我!!!' > /www/auth-html/index.html


4.啟動測試訪問
用win去測試
10.0.0.8:33334  覺得通的 扣 1 不通 2,這一次都不是許可權之類的問題,而是tcp/ip都沒有建立。直接提示網路連線失敗

這裡由於我們是學習環境,linux虛擬機器的網段,都是vmware提供的純區域網
在企業裡,也會有內網環境,但是有網工給你配置好了所有的環境

你的辦公電腦,會有該內網的ip,可以訪問到該內網下的資料(需要進行一系列的網路轉發設定)





只能在內網環境下,去訪問了
172,只能是linux下的訪問


# 咱們臨時測試,還是先用windows去訪問該站點
# 理解了nginx虛擬主機,繫結網段即可,
# 還是改為,允許讓windows也可以訪問,修改監聽的地址,放置到10網段


[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#netstat -tunlp|grep 33334
tcp        0      0 10.0.0.8:33334          0.0.0.0:*               LISTEN      7765/nginx: master  
[root@web-8 /etc/nginx/conf.d]#cat auth_basic.conf 
server {
	#listen 172.16.1.8:33334;
	listen 10.0.0.8:33334;
	charset utf-8;
	server_name _;
	location / {
		    	auth_basic "please input your account password";
        auth_basic_user_file /etc/nginx/auth_passwd;
		root /www/auth-html;
		index index.html;
	
	} 

}
[root@web-8 /etc/nginx/conf.d]#
[root@web-8 /etc/nginx/conf.d]#netstat -tunlp|grep 33334
tcp        0      0 10.0.0.8:33334          0.0.0.0:*               LISTEN      7765/nginx: master  




# 此時你就可以基於10網段去訪問了

nginx限流模組

1.知道用法即可,生產下的限流,更多的是後端框架中限制,nginx這裡一般不做,可能導致請求出錯。知道用法,以後看到企業裡在用,會維護即可。
2.以及理解限流的概念。

計算機程式,會給網站帶來極大的惡意流量,導致伺服器壓力多大,以及網站所有的負載都會很大

www.taobao.com  

服務端
nginx 解析這使用者的請求
tcp/ip連線

大量的客戶端,大量的ip,去訪問伺服器,導致伺服器建立的大量的tcp連線
(這些大量的ip都是惡意ip,肉雞一類的機器,而非正常使用者的ip)

預設情況下,伺服器可建立的連線時65535個tcp連線

1.官網模組

https://nginx.org/en/docs/http/ngx_http_limit_req_module.html

2.配置語法

限速規則語法
https://docshome.gitbook.io/nginx-docs/he-xin-gong-neng/http/ngx_http_limit_req_module


ngx_http_limit_req_module 模組(0.7.21)用於限制每個已定義 key 的請求處理速率,特別是來自單個 IP 地址請求的處理速率。限制機制採用了 leaky bucket (漏桶演算法)方法完成。

3.引數示例

# 1.定義一個限速規則
# 定義限速區域,保持在10兆位元組的區域one,該區域的平均處理請求每秒不能超過1個。
# $binary_remote_addr 變數的大小始終為 4 個位元組,在64位機器上始終佔用64位元組
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req_zone $binary_remote_addr zone=two:10m rate=1r/s;

引數解釋
limit_req_zone        # 引用限速模組
binary_remote_addr    # 判定條件,遠端的客戶端IP
zone        # 定義限速區域名稱,記憶體大小
rate        # 限速規則,1秒只能1個請求


# 2.引用限速規則
limit_req zone=two  burst=5;  
limit_req # 引用哪一個限速區域

burst=5 # 令牌桶、平均每秒不超過 1 個請求,並且突發不超過5個請求。
nodelay  # 如果不希望排隊堆積的請求過多,可以用這個引數。

4.實際用法
限速規則是1秒一個請求
提供3個vip特殊名額

[root@web-9 /etc/nginx/conf.d]#cat www.yuchaoit.conf 
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
    listen       80;
    server_name  www.yuchaoit.cn;
    charset utf-8;
    access_log /var/log/nginx/www.yuchaoit.log;
    error_log  /var/log/nginx/error.www.yuchaoit.log;
    error_page 404 /404.html;
    limit_req zone=one burst=3 nodelay;
    location / {
        root   /usr/share/nginx/html/game;        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

5.訪問測試
正常限速內

[root@master-61 ~]#for i in {1..10};do curl -I www.yuchaoit.cn;sleep 1;done


超速訪問情況

[root@master-61 ~]#for i in {1..20};do curl -I www.yuchaoit.cn;sleep 0.5 ;done

nginx內建變數

官網
https://nginx.org/en/docs/varindex.html

學這些內建nginx變數,目的是為了在配置檔案中使用,如

日誌功能會用
url跳轉時用

$args                    #請求中的引數值
$query_string            #同 $args
$arg_NAME                #GET請求中NAME的值
$is_args                 #如果請求中有引數,值為"?",否則為空字串
$uri                     #請求中的當前URI(不帶請求引數,引數位於$args),可以不同於瀏覽器傳遞的$request_uri的值,它可以透過內部重定向,或者使用index指令進行修改,$uri不包含主機名,如"/foo/bar.html"。
$document_uri            #同 $uri
$document_root           #當前請求的文件根目錄或別名
$host                    #優先順序:HTTP請求行的主機名>"HOST"請求頭欄位>符合請求的伺服器名
$hostname                #主機名
$https                   #如果開啟了SSL安全模式,值為"on",否則為空字串。
$binary_remote_addr      #客戶端地址的二進位制形式,固定長度為4個位元組
$body_bytes_sent         #傳輸給客戶端的位元組數,響應頭不計算在內;這個變數和Apache的mod_log_config模組中的"%B"引數保持相容
$bytes_sent              #傳輸給客戶端的位元組數
$connection              #TCP連線的序列號
$connection_requests     #TCP連線當前的請求數量
$content_length          #"Content-Length" 請求頭欄位
$content_type            #"Content-Type" 請求頭欄位
$cookie_name             #cookie名稱
$limit_rate              #用於設定響應的速度限制
$msec                    #當前的Unix時間戳
$nginx_version           #nginx版本
$pid                     #工作程序的PID
$pipe                    #如果請求來自管道通訊,值為"p",否則為"."
$proxy_protocol_addr     #獲取代理訪問伺服器的客戶端地址,如果是直接訪問,該值為空字串
$realpath_root           #當前請求的文件根目錄或別名的真實路徑,會將所有符號連線轉換為真實路徑
$remote_addr             #客戶端地址
$remote_port             #客戶端埠
$remote_user             #用於HTTP基礎認證服務的使用者名稱
$request                 #代表客戶端的請求地址
$request_body            #客戶端的請求主體:此變數可在location中使用,將請求主體透過proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass傳遞給下一級的代理伺服器
$request_body_file       #將客戶端請求主體儲存在臨時檔案中。檔案處理結束後,此檔案需刪除。如果需要之一開啟此功能,需要設定client_body_in_file_only。如果將次檔案傳遞給後端的代理伺服器,需要禁用request body,即設定proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion      #如果請求成功,值為"OK",如果請求未完成或者請求不是一個範圍請求的最後一部分,則為空
$request_filename        #當前連線請求的檔案路徑,由root或alias指令與URI請求生成
$request_length          #請求的長度 (包括請求的地址,http請求頭和請求主體)
$request_method          #HTTP請求方法,通常為"GET"或"POST"
$request_time            #處理客戶端請求使用的時間; 從讀取客戶端的第一個位元組開始計時
$request_uri             #這個變數等於包含一些客戶端請求引數的原始URI,它無法修改,請檢視$uri更改或重寫URI,不包含主機名,例如:"/cnphp/test.php?arg=freemouse"
$scheme                  #請求使用的Web協議,"http" 或 "https"
$server_addr             #伺服器端地址,需要注意的是:為了避免訪問linux系統核心,應將ip地址提前設定在配置檔案中
$server_name             #伺服器名
$server_port             #伺服器埠
$server_protocol         #伺服器的HTTP版本,通常為 "HTTP/1.0" 或 "HTTP/1.1"
$status                  #HTTP響應程式碼
$time_iso8601            #伺服器時間的ISO 8610格式
$time_local              #伺服器時間(LOG Format 格式)
$cookie_NAME             #客戶端請求Header頭中的cookie變數,字首"$cookie_"加上cookie名稱的變數,該變數的值即為cookie名稱的值
$http_NAME               #匹配任意請求頭欄位;變數名中的後半部分NAME可以替換成任意請求頭欄位,如在配置檔案中需要獲取http請求頭:"Accept-Language",$http_accept_language即可
$http_cookie
$http_post
$http_referer
$http_user_agent
$http_x_forwarded_for
$sent_http_NAME          #可以設定任意http響應頭欄位;變數名中的後半部分NAME可以替換成任意響應頭欄位,如需要設定響應頭Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding

nginx新增第三方模組

1.理念

nginx除了支援內建模組,還支援第三方模組,但是第三方模組需要重新編譯進nginx。
(重新生成nginx二進位制命令)

1.如你的nginx預設不支援https
2.給你的nginx新增echo模組,用於列印nginx的變數。

2.編譯新增echo模組
echo-nginx-module 模組可以在Nginx中用來輸出一些資訊,可以用來實現簡單介面或者排錯。

# 1.模組網址 https://github.com/openresty/echo-nginx-module

yum -y install gcc-c++ 

yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel  

# 3.準備好nginx編譯環境
yum install pcre pcre-devel openssl openssl-devel  zlib zlib-devel gzip  gcc gcc-c++ make wget httpd-tools vim -y
groupadd www -g 666
useradd www -u 666 -g 666 -M -s /sbin/nologin
mkdir -p /yuchaoit/ ; cd /yuchaoit/
# 下載echo模組
yum install git -y
git clone https://github.com/openresty/echo-nginx-module.git

# 4.編譯nginx
wget http://nginx.org/download/nginx-1.19.0.tar.gz
tar -zxf nginx-1.19.0.tar.gz
cd nginx-1.19.0

./configure \
--user=www \
--group=www \
--prefix=/opt/nginx-1-19-0 \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-pcre \
--add-module=/yuchaoit/echo-nginx-module

# 5.編譯且安裝
make && make install 

# 6.建立快捷方式
ln -s /opt/nginx-1-19-0/sbin/nginx /usr/sbin/

# 7.驗證模組
nginx -V

3.建立新配置檔案,驗證echo模組

[root@web-9 /etc/nginx/conf.d]#cat echo.conf 

server {
    listen       11444;
    server_name  localhost;
    charset utf-8;
    location / {
       echo "yuchaoit.cn welcome you!";
       echo $uri;
       echo $document_uri;
       echo $remote_addr;
       echo $remote_port;
       echo $http_user_agent;
    }
}

4.客戶端訪問

[root@master-61 ~]#curl 10.0.0.9:11444/hello_chaoge
yuchaoit.cn welcome you!
/hello_chaoge
/hello_chaoge
10.0.0.61
42378
curl/7.29.0

location高階實戰

location是nginx的核心重要功能,可以設定網站的訪問路徑,一個web server會有多個路徑,那麼location就得設定多個。

Nginx的locaiton作用是根據使用者請求的URI不同,來執行不同的應用。

針對使用者請求的網站URL進行匹配,匹配成功後進行對應的操作。

官網文件
https://nginx.org/en/docs/http/ngx_http_core_module.html#location

1.語法介紹

Syntax:    location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:    —
Context:    server, location


官網用法

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

測試用法,如果定義瞭如上的5個location,則

http://yuchaoit.cn/                                                     匹配A

http://yuchaoit.cn/hello                                          匹配B

http://yuchaoit.cn/documents/hello                        匹配C

http://yuchaoit.cn/images/葫蘆娃.gif                    匹配D

http://yuchaoit.cn/documents/德瑪西亞.gif           匹配E


2.location語法優先順序
優先順序從高到低

有符號的,才有優先順序,否則都往後排


3.測試location實戰

# 配置檔案如下
server {
    listen 22333;
    server_name _;

    # 最低階匹配,不符合其他locaiton就來這
    # 屬於通用url規則
    location / {
        return 200 "location /  \n";
    }


    # 優先順序最高,等於號後面可以指定url
    location = / {
        return 200 "location = /  \n";
    }


    #以/documents/開頭的url,來這裡,如符合其他locaiton,則以其他優先
    location /documents/ {
        return 200 "location /documents/ \n";
    }

    #匹配任何以/images/開頭的請求,不匹配正則
    location ^~ /images/ {
        return 200 "location ^~ /images/  \n";
    }

    #匹配任何以.gif結尾的請求,支援正則
    location ~* \.(gif|jpg|jpeg)$ {
        return 200  "location ~* \.(gif|jpg|jpeg) \n";
    }

    access_log off;

}

4.客戶端測試訪問

[root@master-61 ~]#
# 精確匹配
[root@master-61 ~]#curl 10.0.0.9:22333
location = /  
[root@master-61 ~]#
# 依然是精確匹配
[root@master-61 ~]#curl 10.0.0.9:22333/
location = /  
[root@master-61 ~]#
# 沒有滿足的條件,因此匹配 /
[root@master-61 ~]#curl 10.0.0.9:22333/yuchaoit
location /  
[root@master-61 ~]#
# 沒有滿足的條件,因此匹配 /  ,這裡注意結尾的斜線
[root@master-61 ~]#curl 10.0.0.9:22333/documents
location /  
[root@master-61 ~]#

# 符合匹配規則,匹配到了location /documents/
[root@master-61 ~]#curl 10.0.0.9:22333/documents/
location /documents/ 
[root@master-61 ~]#
# 符合匹配規則,匹配到了location /documents/
[root@master-61 ~]#curl 10.0.0.9:22333/documents/yuchaoit.html
location /documents/ 
[root@master-61 ~]#

# 依然是沒有符合的規則,預設匹配  / 
[root@master-61 ~]#curl 10.0.0.9:22333/yuchaoit/documents/yuchaoit.html
location /  
[root@master-61 ~]#

# 透過正則表示匹配內容,只要是.jpg結尾
[root@master-61 ~]#curl 10.0.0.9:22333/yuchaoit/documents/yuchaoit.jpg
location ~* \.(gif|jpg|jpeg) 
[root@master-61 ~]#

# 即使前面匹配到了/documents/,但是結尾符合jpg優先順序更高
[root@master-61 ~]#curl 10.0.0.9:22333/documents/yuchaoit.jpg
location ~* \.(gif|jpg|jpeg) 

# 除非結尾檔名不符合,因此匹配到/documents/
[root@master-61 ~]#curl 10.0.0.9:22333/documents/yuchaoit.jpgggg
location /documents/ 
[root@master-61 ~]#
[root@master-61 ~]#

# 證明  ^~ 優先順序 大於 ~*
[root@master-61 ~]#curl 10.0.0.9:22333/images/yuchaoit.jpgggg
location ^~ /images/


5 實際工作使用

實際工作中,會有至少3個匹配規則如下,需要同學們學習了nginx負載均衡即可理解,以及具體的網站部署實踐。


# 1.必選規則,設定反向代理,官網也推薦該用法,可以加速處理,因為首頁會頻繁被訪問
# 該location 一般直接設定反向代理,轉發給後端應用伺服器,或者是靜態頁;
location = / {
        proxy_pass http://yuchaoit.cn;
}


# 2.靜態檔案處理,nginx強項
# 兩個模式,二選一即可
#   這個表示當使用者請求是 http://yuchaoit.cn/static/hello.css 這樣的請求時
#   進入/www目錄下,尋找static資料夾, 也就是/www/static/hello.css檔案
    location ^~ /static/ {
        root /www/;
    }

        # 這個表示請求是以如下靜態資源結尾的,進入到/www/下尋找該檔案
    #匹配任何以.gif結尾的請求,支援正則
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
        root /www/;
    }


# 3.還有就是通用規則,用於處理未定義的url,預設匹配
# 一般網站除了靜態檔案的請求,預設就是動態請求,因此直接轉發給後端
location / {
    proxy_pass http://my_django:8080/;
}


6. location的root和alias

nginx的location路徑匹配功能
1.匹配使用者的url
2.匹配到之後決定動作,代理轉發,或者設定網頁根目錄,提供靜態資料。


靜態頁面的設定,就得設定linux中的檔案路徑,nginx提供了2個引數
root和alias

語法:
1.root是定義最上層目錄,目錄路徑結尾的斜線可有可無;
2.alias是定義目錄別名,結尾必須以 "/" 結束,否則找不到檔案。
1.你還是必須要明確,使用者要訪問的url,是如下
http://10.0.0.8:33555/static/caixukun.jpg


2. 正確的配置檔案應該是如下
[root@web-8 /huya/static]#cat /opt/nginx-1-19-0/conf/extra/test-root-alias.conf 
server {


	listen 33555;
	server_name _;
	
	# 你現在需要設定
	# 需要訪問 10.0.0.8:33555/static/caixukun.jpg
	#  你有什麼寫法,可以返回這個資料,給使用者看到呢?
	# 當前有一個程式碼目錄,叫做 /huya/ 要求靜態資料放在這個目錄下
	# 已知有一個靜態圖片,放在如下的目錄中 /huya/static/caixukun.jpg 
	# 要求,要進行靜態請求匹配,匹配/static/ url開頭
	# 到這還看懂扣1 不懂 3
	# 等於匹配使用者訪問的url形式是  10.0.0.8:33555/static/caixukun.jpg
	location ^~ /static/ {
		# 兩種寫法第一個,寫root,root特點是會將該url(/static)填充到網頁根目錄下,認為它也是一個目錄
                # 應該正確寫法如下
		root  /huya/;
		
		# 第二種寫法,alias別名用法
		
	}

}

重啟服務



3.按照這個寫法的話,該資原始檔應該是防止在什麼位置?
給我發彈幕,你覺得完整的,正確的絕對路徑是
最終你要確保


(這裡的路徑,意識是,該caixukun.jpg資源放在伺服器上的什麼路徑下!!)
才能正確的訪問
http://10.0.0.8:33555/static/caixukun.jpg

alias引數用法

1.還拿這個url來做實驗,使用者需要訪問的url依然是

http://10.0.0.8:33555/static/caixukun.jpg

2. 修改nginx的配置檔案

相關文章