切割理念(先純手動的去切割日誌,備份日誌)
- 給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的配置檔案