主頁 >  其他 > 循序漸進nginx(三):日志管理、http限流、https配置,http_rewrite模塊,第三方模塊安裝,結語

循序漸進nginx(三):日志管理、http限流、https配置,http_rewrite模塊,第三方模塊安裝,結語

2020-09-14 16:01:28 其他

目錄

  • 日志管理
    • access_log
    • error_log
    • 日志檔案切割
  • 自定義錯誤頁
  • http訪問限流
    • 限制請求數
      • 語法
      • 使用
    • 限制連接數
      • 語法
      • 測驗
    • 補充:
  • https配置
    • 使用
      • 生成證書
      • 配置nginx
      • 測驗
    • 補充
  • HttpRewrite模塊
    • if
      • if的語法:
      • 全域變數
      • 自定義變數:
    • 重定向rewrite
  • 第三方模塊
    • 前置知識(編譯安裝)
    • 安裝第三方模塊
  • 沒有講到的內容


前置知識章節:
1.介紹、安裝、hello world、location匹配?
2.反向代理、負載均衡、快取服務、靜態資源訪問?
3.當前章節??:日志管理、http限流、https配置,http_rewrite模塊,第三方模塊安裝,結語,?


日志管理

nginx里面有訪問日志和錯誤日志,訪問日志記錄記錄客戶端訪問nginx的每一個請求;錯誤日志記錄發生錯誤的請求,


access_log

access_log用于配置訪問日志,日志的格式可以根據log_format指令來進行自定義,

??log_format用于定義訪問日志的格式,log_format指令的第一個引數是格式名,可以給當前格式定義一個名字,第二個引數是格式字串,支持一些內部變數語法,比如$remote_addr會獲取到請求的客戶端的IP地址,log_format只可以配置在http塊中,
log_format示例:


log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

log_format mylog '[client_ip:] $remote_addr [time:] $time_local [user_agent:] "$http_user_agent"';

log_format語法說明:

  • 整個字串使用''包裹,內部可以使用$開頭的變數,比如$remote_addr會獲取到請求的客戶端的IP地址,其他字符都作為顯示效果,比如上面使用的""只是用于包裹資料而已,[]-:也是這樣的,
    ??access_log指令可以用來指定訪問日志的存盤位置和日志格式,access_log指令的第一個引數是訪問日志的存盤路徑,第二個引數是使用的格式的格式名.access_log可以使用在http, server, location, location的if, limit_except等塊中,
    語法格式:
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
* path是日志存盤路徑
* format用于定義格式,是log_formate的名字,
* buffer=size 為存放日志的緩沖區大小
* flush=time 為將緩沖區的日志刷到磁盤的時間
* gzip[=level] 表示壓縮級別
* if一般不配置

access_log off; # 關閉訪問日志記錄

??默認在nginx.conf中配置了access_log的默認配置:
20200701150511


nginx日志常見可用變數:(更多變數可以參考:英文檔案,某CSDN博客)

內置變數 說明
$remote_addr 客戶端的IP地址
$remote_user 客戶端用戶名,用于記錄瀏覽者進行身份驗證時提供的名稱,如果沒有登錄則為空
$time_local 訪問的時間與時區
$request 請求的URI和HTTP協議
$status 記錄請求回傳的HTTP狀態碼
$body_bytes_sent 發送給客戶端的檔案主體
$http_referer 請求來源的URL地址
$http_user_agent 客戶端瀏覽器資訊
$http_x_forwarded_for 經過的客戶端IP地址串列,如果請求是代理轉發的,那么原始的客戶端IP應該在這個欄位里面

error_log

  • error_log是錯誤日志,只有訪問錯誤的時候才會記錄下來,不支持格式定義,
  • error_log的語法是:error_log file [level];
    • error_log指令的第一個引數是錯誤日志存盤路徑,第二個引數是日志級別,
    • 日志級別有debug,info,notice,warn,error,crit幾個等級,debug的日志記錄是最完善的,crit只記錄“致命”級別的錯誤,
  • error_log可以設定在http、server、location、location的if塊中配置,
  • 指令error_log /dev/null用于關閉錯誤日志,/dev/null在linux中可以認為是一個無底洞,可以把它當作垃圾桶,

日志檔案切割

對于日志檔案有些版本會自動切割,有些版本不會,也就是說,如果你的服務端跑了一年,那么一年的訪問日志都存盤在access.log中,很明顯,這不是一個好的處理,這樣不方便我們在發生錯誤時分析日志,所以通常都會對日志檔案進行切割,根據業務需求可能按天、按周來進行切割,

??自動切割:如果你的nginx能夠自動切割日志,那么你就不需要看了,怎么判斷有沒有自動切割功能呢,查看一下/etc/logrotate.d下是否有nginx檔案,logrotate用于日志切割,linux自帶的,但內置的除了切割還有一些其他的操作,比如定時清除,有需要的可以自行看一下vim /etc/logrotate.d/nginx


??下面教的是使用定時任務自動切割日志檔案,當然如果你喜歡手動也沒問題,

我們只需要定義一個定時任務即可,
1.先提一下crontab的語法,用示例來簡單講解語法:

示例:0 * * * * /root/nginx-cut-log.sh>/dev/null 2>&1
crontab語法:
第一個引數:分(取值0-59,*代表每一個),對應上面第一個0
第二個引數:時(取值0-23),對應上面第二個0
第三個引數:日(取值1-31)
第四個引數:月(取值1-12)
第五個引數:星期(取值0-6,0代表星期日)
第六個引數:要運行的命令

額外的說明:
上面的命令中`>/dev/null 2>&1`用于把定時任務的標準輸出和錯誤輸出都重定向到“垃圾桶/黑洞”中,

2.然后撰寫一個切割日志檔案的腳本檔案nginx-cut-log.sh(命名隨意):

#!/bin/bash

#定義日志目錄變數
logs_path="/var/log/nginx/"

#切割日志,其實就是拷貝與新建而已,
#`date -d yes +"%Y%m%d"`中``可以用來獲取linux命令的執行結果,可以參考https://www.cnblogs.com/asxe/p/9317811.html

mv $logs_path/access.log $logs_path/access-`date +"%Y-%m-%d-%H-%M"`.log # 測驗的時候請打開這一個關閉下面的,這個用于每分鐘執行一次,
#下面的這個應該用于每天執行的情況,因為以日期命名了檔案
#mv $logs_path/access.log $logs_path/access-`date -d "1 day ago" +"%Y-%m-%d"`.log
#上面的操作類似于重命名,所以原本的access.log會沒了,使用下面的命令讓nginx重新生成一個access.log.
/nginx -s reopen;

3.記得給腳本檔案增加執行權限:

chmod +x nginx-cut-log.sh

4.然后定義一個定時任務:
執行命令crontab -e,并在那里附加下述命令:
* * * * * /root/nginx-cut-log.sh>/dev/null 2>&1
上面的用于每分鐘都創建新的日志檔案的測驗,正式使用應該前面兩個是一個準確的值,比如0 0 * * * /root/nginx-cut-log.sh>/dev/null 2>&1代表每天零點零分執行,


5.然后重啟crond:執行命令crond restart


6.然后你在/var/log/nginx/目錄下等一分鐘看是否會創建新的access.log檔案,如果創建了,就說明我們的日志切割成功運行了,當然,記得測驗完后清除我們上面在crontab -e中輸入的命令,因為那個代表了每分鐘都運行,



自定義錯誤頁

  • 自定義錯誤頁其實是一個非常小的內容,用于定義nginx的http請求發生錯誤的時候顯示的頁面
  • 語法:error_page code ... [=[response]] uri;
  • 示例:
    • error_page 500 502 503 504 /50x.html; :代表http回應碼為500,502,503,504時,回傳各自location的root下的/50x.html
    • error_page 400 http://xxxx.html:代表http回應碼為400時,回傳http://xxxx.html
    • error_page 404 = @fallback;還支持內部重定向,@fallback是自定義的一個內部重定向location.
    • error_page 400=200 http://xxxx.html:發生400錯誤時,回傳http://xxxx.html,并修改回傳的回應碼為200.


http訪問限流


??訪問限流依靠ngx_http_limit_conn_module模塊,ngx_http_limit_req_module模塊,ngx_http_limit_conn_module用來限制連接數,ngx_http_limit_req_module用來限制請求數,
??為什么需要限流呢?那是為了防止過量的請求給服務端帶來過大的壓力,


?連接跟請求的區別:

  • http也是應用層協議,也是tcp的一種,http請求其實是使用tcp來連接請求的,在HTTP/1.0中,大多是一次連接,一次請求的,但它其實也支持Connection: keep-alive,如果在回應的Header中有這Connection: keep-alive,那么就會維持連接,直到回應/請求的Header中有Connection: close才斷開連接(超時也會,keep-alive也是有時效的),在Connection: keep-alive的時候一個連接可以發起多個請求,
    如下圖,我連續請求一張圖片,第一次的時候initial connection初始化了tcp連接,而第二次請求的時候沒initial connection,這代表連接沒用埠:
    20200624165205
    20200624165231
    百度的請求是支持Connection: keep-alive的,你可以嘗試在谷歌瀏覽器中打開百度的一張圖,并打開它的請求Timing來查看是否每一次都initial connection(初始化連接,這代表建立新的tcp連接,而stalled代表檢測是否有舊的可用的tcp連接,所以上面的第二種圖中沒用initial,只有stalled,stalled使用了沒斷開的tcp連接)中測驗,

限制請求數

語法

??limit_req_zone:用來設定請求限制規則,

  • 語法limit_req_zone key zone=name:size rate=rate;
    • key用于定義請求限制的物件,比如為$server_name的時候,代表限制虛擬主機的請求次數,為$binary_remote_addr$remote_addr時代表限制同一個IP的客戶端的請求次數,
    • zone=name:size中,name是當前這個請求限制規則空間的名字,size是這個空間的大小,
  • 使用位置 : limit_req_zone只能配置在Http塊,
  • 示例:limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;

??limit_req:與limit_req_zone配合,用來定義限制請求次數,

  • 語法:limit_req zone=name [burst=number] [nodelay | delay=number];
    • zone=name中name式limit_req_zone的名字
    • burst用來定義突發大小,例如在limit_req zone=req_zone burst=3中,限制請求次數是1,那么突發的2個請求會放到下一秒再執行,
  • 使用位置 :limit_req可以用在http, server, location
  • ??超出請求限制的請求,會回傳503.
  • 示例:limit_req zone=req_zone burst=3 nodelay;

使用

1.配置nginx:
20200625023223
2.重啟之后測驗:你可以在一秒內連續在瀏覽器中重繪,如果重繪多次之后突然回應503,那說明請求被限制了,或者你可以在/var/log/nginx/error.log中看到limiting requests




限制連接數

語法

??limit_conn_zone:用來設定連接限制規則,語法limit_conn_zone key zone=name:size;

  • key用于定義連接限制的物件,比如為$server_name的時候,代表限制虛擬主機的連接次數,為$binary_remote_addr$remote_addr時代表限制同一個IP的客戶端的連接次數,
  • zone=name:size中,name是當前這個連接限制規則空間的名字,size是這個空間的大小,
  • limit_conn_zone只能配置在Http塊,
  • 例如:limit_conn_zone $binary_remote_addr zone=addr:10m;

??limit_conn:與limit_conn_zone配合,用來定義限制連接次數,語法limit_conn zone number;

  • number是限制的次數,
  • limit_conn可以用在http, server, location,
  • 例如:limit_conn addr 1;,假如addr是一個限制同一個IP的客戶端的連接次數的規則,代表同一個IP的客戶端的并發連接為1.

??補充:并不是所有的連接都會被計算,只有并發壓力的連接才計算,比如上面的limit_conn addr 1;代表每個IP只能有一個連接,但如果你給不了nginx請求壓力的話,那么假設你發起兩個連接,nginx馬上處理完第一連接之后,后面來的第二個連接此時并不算并發連接(這時候就限制失敗了),所以如果你下面測驗的話,可以訪問處理比較慢的資源,讓nginx持續地持有這個連接,然后我們再發起另外一個連接,這樣才能測驗成功,下面是官網檔案的一段話:

Not all connections are counted. A connection is counted only if it has a request being processed by the server and the whole request header has already been read.



測驗

上面說了, 要使用一個回應比較慢的資源,所以我們這里使用反向代理來作為回應,

1.新建一個后端服務端介面:(下面示例基于spring boot,我讓它sleep了10秒,也就相當于要處理十秒才能回應資料,此時有充足的時間來讓我們發起第二次資料)
20200629103517

2.配置default.conf:
20200629104145

3.測驗訪問:

  • 首先訪問一下http://192.168.31.128/user/info,這個是我的代理后的請求介面,回應時間至少需要十秒
  • 在上面回應的十秒內,用另外一個視窗訪問一下http://192.168.31.128/user/info,這個會直接得到503,而不是等待十秒的回應,

補充:

  • limit_rate可以用來限制回應的傳輸速度,這里沒講,


https配置

??注意,此時的https配置并沒有太多實戰意義,因為證書都是正規機構發的話,瀏覽器才能夠識別成安全的,這里的教學只是做個認知,就是知道怎么配置,證書什么的是都是應該從正規機構申請的,


  • 使用nginx -V查看編譯引數,如果有--with-http_ssl_module,那么就代表啟用了ngx_http_ssl_module模塊,默認的YUM方式安裝是攜帶這個模塊的,如果你是使用了編譯安裝的,那么自行去加上吧,

Https有什么好處,處理什么情況,這些自己查吧,

Https會使用幾種加密方式,非對稱加密用于身份驗證和密鑰協商,對稱加密用于采用協商的密鑰來對資料進行加密,另外散列演算法用于檢驗資料完整性,
對稱加密使用同一個密鑰,
非對稱加密,公鑰用于加密,私鑰用于解密
Https簡單流程:首先發起非對稱加密,服務端將公鑰發送給客戶端(此時發送的是證書,證書客戶端是需要校驗的),如果證書合法,那么客戶端使用偽亂數來生成一個會話密鑰,使用證書加密會話密鑰并傳輸給服務端,服務端使用私鑰來解密得到會話密鑰,然后后面傳輸的資料使用此時兩端都知道的會話密鑰來加密資料,??從這個簡單流程,應該我們只需要關心兩條??,一個是證書,一個是私鑰,


20200703003139


使用

生成證書

1.生成證書私鑰:此處生成的私鑰用于提交給CA來生成證書認證簽名檔案,
openssl genrsa -out server.key 2048用于生成密鑰Key,執行這個命令后需要輸入一個密碼,會基于這個密碼來生成私鑰,

  • genrsa代表使用RSA來生成私鑰,openssl rsa代表從私鑰中獲取公鑰,
  • 可選的-des3:指定生成的密鑰使用des3方式進行加密,這樣的話每次使用都需要輸出密碼來解密,
  • - out 檔案路徑:用于指定生成的key的位置,
  • 2048是密鑰的長度,長度越長,安全性越強,一般推薦使用2048,

2.創建服務器證書的申請檔案server.csr,CSR檔案是您的公鑰證書原始檔案,包含了您的服務器資訊和您的單位資訊,需要提交給CA認證中心審核,
openssl req -new -key server.key -out server.csr
會提示輸入幾個內容:

  • 如果你上面使用了-des3來生成證書私鑰,那么第一行會是要求你輸入私鑰的解密密碼server.key:生成密鑰時輸入的密碼
  • Country Name (2 letter code) [XX]:國家代碼,如CN,可以不填,直接回車跳過即可,
  • State or Province Name (full name) []:省份名稱,可以不填,直接回車跳過即可,
  • Locality Name (eg, city) [Default City]:城市名稱,可以不填,直接回車跳過即可,
  • Organization Name (eg, company) [Default Company Ltd]:機構名稱,可以不填,直接回車跳過即可,
  • Organizational Unit Name (eg, section) []:組織單位名稱,可以不填,直接回車跳過即可,
  • Common Name (eg, your name or your server's hostname) []使用SSL加密的域名,注意這里要配成你的網站的域名,不然在訪問的時候會說"這個證書不屬于這個網站(??英文我忘記是什么了)",如果你看到這樣的錯誤的話,你就應該知道是你的證書系結錯了域名,比如可以輸入www.123.com
  • Email Address []:郵件地址,可以省略
  • A challenge password []:有些認證機構需要這個密碼,一般為空
  • An optional company name []:可選的公司名稱,省略即可,
    ??其實上面這個創建證書檔案也就是自己用用而已,正式的時候都會去證書機構中申請,比如在阿里云或者騰訊云中申請一個免費的證書,個人用的話申請一個免費的就可以了,【PS:證書也是有區別的,一些證書只會加密資料,不能用于認證,比如說有些網站訪問的時候就會顯示XXX公司,其實這就是在證書中做了企業認證,】

3.生成CRT證書認證檔案:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
* X509用于自簽名
* -req:x509工具默認以證書檔案做為inputfile(-in file),指定該選項將使得input file的file為證書請求檔案,
* -days 30 用于設定證書的有效期
* -in:用于指定CSR證書申請檔案
* -signkey:用于指定簽名的私鑰
* -out:用于指定輸出的CRT證書認證檔案的路徑,


4.完成:
那么此時生成了一個.crt檔案和.key檔案,


配置nginx

簡單配置一個新的server:

server {
    server_name www.123.com;
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl_key/server.crt;
    ssl_certificate_key /etc/nginx/ssl_key/server.key;

    location / {
      root /usr/share/nginx/html;
    }
}
  • ssl_certificate用于配置服務端上CA證書的位置
  • ssl_certificate_key用于配置服務端上CA私鑰的位置
  • 在舊版本中ssl on用來開啟ssl,現在可以使用listen 443 ssl來代替,
  • 更多配置可以自行參考ngx_http_ssl_module

測驗

為了盡量達到仿真,所以我們手動配置一個dns,這樣的話我們就相當于有一個虛假的域名了,
20200617102018
訪問我們的虛假網站www.123.com
20200703103301
但由于我們是本地環境,它始侄訓報錯,它還是會在瀏覽器中顯示不安全,但https是已經配置成功了的,我們選擇強行訪問的話,鏈接欄仍熱會報紅:
20200617101920
只是因為我們是自己生成證書,導致證書頒發機構不可信而已,如果我們是從網上申請的證書,那么此時證書頒發機構應該是可信的,
20200617101831


補充

??正規域名的https配置可以稍微參考阿里云nginx配置https檔案



HttpRewrite模塊


if

if在nginx檔案中
??if屬于ngx_http_rewrite_module模塊,
??if可以做一些的判斷,根據條件來進行不同的處理,可以使用在server和location中,
??if的使用場景:

  • 場景一:假如你想讓沒有攜帶指定header的請求回傳403的話,這樣的請求判斷需要借助if,
  • 場景二:如果瀏覽器是IE瀏覽器,回傳指定資料
  • ,,,

下面是一個例子,就是如果瀏覽器是谷歌瀏覽器,就回傳503,

#禁止chrome訪問:如果$http_user_agent`如果包含Chrome,就禁止訪問,
if ($http_user_agent ~ Chrome) {
       return 503;
}

if的語法:

  • 判斷條件:
    • =用于判斷兩個值是否相等,例如if ($request_method = POST)
    • !=用于判斷兩個值是否不相等
    • ~:大小寫敏感的正則匹配,與后面的正則搭配使用,例如:if ($http_user_agent ~ MSIE)代表$http_user_agent如果包含MSIE,就為true,
    • ~*:對大小寫不敏感的正則匹配,與后面的正則搭配使用,
    • !~:如果~結果為true,則!~為false
    • !~*:如果~*結果為true,則!~*為false
    • -f:如果檔案存在,為true,例如:if (-f $request_filename)
    • !-f:如果目錄存在,檔案不存在,為ture;目錄和檔案都不存在,為false,例如:if (!-f $request_filename)
    • -d:如果請求的目錄存在,則為true
    • !-d:如果請求目錄的上級目錄存在,目錄不存在,為true;如果上級目錄和目錄都不存在,為false.
  • if可以使用變數來判斷,可用變數有全域變數和自定義變數,

下面是可以用作if判斷的全域變數

全域變數

引數名 說明
`$arg_PARAMETER PARAMETER是變數名,可以根據不同的PARAMETER獲取請求行中的指定引數,也就是URL中的引數,
$args URL中的查詢引數,,比如https://www.baidu.com/baidu?wd=nginx&tn=monline_4_dg&ie=utf-8中的wd=nginx&tn=monline_4_dg&ie=utf-8
$binary_remote_addr 二進制的客戶端IP地址,
$content_type 請求頭中的Content-Type欄位,
$cookie_COOKIE 客戶端cookie資訊
$document_root 當前請求在root指令中指定的值,
$document_uri 包含請求引數的原始URI
$host 請求頭中的Host欄位
$http_HEADER HEADER是一個變數,可以用于獲取請求頭中的引數值,
$http_user_agent 客戶端agent資訊,客戶端瀏覽器資訊
$http_cookie 客戶端cookie資訊
$is_args 如果有url引數,則為?;無則為空,
$limit_rate nginx配置的limit_conn的數值,
$query_string $args功能一致
$remote_addr 客戶端的IP地址
$remote_port 客戶端的埠
$request_filename 當前請求的資源檔案的路徑名
$request_method 請求的方法,GETPOST之類的,
$request_uri 包含請求引數的原始URI,不包含主機名
$scheme http還是https
$server_addr 服務端地址
$server_name 服務端名稱(域名)
$server_port 服務端接收請求的埠
$server_protocol http協議版本,1.0,1.1,HTTP/2
$uri $document_uri相同


自定義變數:

除了使用全域變數來判斷,還可以自己通過set $變數名 值設定變數,例如:

  location / {
    root   /usr/share/nginx/html;
    default_type text/html;
    set $flag "";
    if ($http_user_agent ~ Chrome) {
      set $flag "Chrome";
    }
    # 這里繞了一圈只是為了說明,可以使用我們自己設定的變數
    if ($flag = 'Chrome') {
      return 200 "hello";
    }
  }

set的值除了是一個字面值,還可以是一個全域變數,比如set $web_agent "${http_user_agent}";,set的使用應該是面向場景的,所以這里只做個開頭,當你想要某個值來做判斷的時候,你可以自己去探究一下這個值該怎么設定,


重定向rewrite

??rewrite屬于ngx_http_rewrite_module模塊,
??rewrite用于重寫url和重定向,一個比較常見的用途是,比如用于http重定向https,你原本訪問http://example.com,我幫你強制跳轉到https://example.com;比如某檔案位置遷移了,訪問舊的位置,重寫成遷移后的位置;比如根據不同瀏覽器重定向到不同頁面你是IE瀏覽器,我就幫你轉到一個特定的頁面;這就是rewrite干的活,做一些重定向的活,
??語法是:rewrite regex replacement [flag],可以使用在server, location, if中,

  • regex是正則,注意傳入的資料是uri,不包括域名,只包含訪問的資源路徑,
  • replacement是重定向的路徑,可以使用 ($1,$2)來獲取正則中的匹配結果或使用全域變數來拼接URL,
  • flag可以是以下幾個:
    • last:會內部重新發起一個重定向目錄的請求,可以匹配到nginx的location
    • beak:匹配后,會內部從root目錄查找重定向的目錄,不會匹配location
    • redirect:會回傳302給瀏覽器,讓瀏覽器發起新的請求,代表臨時重定向,瀏覽器不會快取,
    • permanent:會回傳301給瀏覽器,讓瀏覽器發起新的請求,代表永久重定向,瀏覽器會進行快取,下次訪問這個地址的時候,瀏覽器直接重定向,不需要訪問nginx再重定向,


實驗一:測驗regex匹配物件的是什么:

server {
    listen       80;
    server_name  127.0.0.1;
    location / {
      rewrite (.*) http://192.168.48.129$1 redirect;
    }
}

當訪問nginx所在機器192.168.31.128/aaa/bbb的時候,由于上面的規則是重定向到http://192.168.48.129$1,所以得出結論,regex對應的部分就是有/開頭的uri部分,
20200712204629


實驗二:重定向到指定的頁面:

server {
    listen       80;
    server_name  127.0.0.1;
    location / {
      #只有匹配成功的時候才重定向,訪問/rewrite/aaa時重定向,訪問/aaa時不重定向
      rewrite ^/rewrite/(.*) http://192.168.48.129/$1 redirect;

      #訪問http://192.168.31.128/rewrite時,重定向到http://192.168.48.129
      #訪問http://192.168.31.128/rewriteaaa,重定向到http://192.168.48.129
      #rewrite ^/rewrite http://192.168.48.129 redirect;

      #訪問http://192.168.31.128/rewrite,內部重定向到http://192.168.31.128/hello
      #root   /usr/share/nginx/html;
      #rewrite ^/rewrite /hello last;


      #訪問http://192.168.31.128/rewrite,回傳"root"+/hello.html資源
      #root   /usr/share/nginx/html;
      #rewrite ^/rewrite /hello.html break;

    }

    location /hello{
      default_type text/html;
      return 200 "hello";
    }
}


實驗三:與if配合重定向,假如瀏覽器是IE的,跳轉到指定頁面:

server {
    listen       80;
    server_name  127.0.0.1;
    location / {

      #訪問http://192.168.31.128/rewrite,回傳"root"+/hello.html資源
      root   /usr/share/nginx/html;
      # 如果http_user_agent中包含了chrome,那么就重定向
      if ($http_user_agent ~ Chrome) {
        rewrite ^(.*)$ /chrome/$1 break;
      }
      rewrite ^/rewrite /hello.html break;
    }
}



第三方模塊

上面的例子中都是內置模塊的內容,但也稍微提了一下第三方模塊,比如在負載均衡中提到了fair和url_hash,對于需要使用第三方模塊的,還是建議使用編譯安裝的方式,那樣添加第三方模塊比較方便,


前置知識(編譯安裝)

1.先到官網下載編譯安裝用的tar包,或者wget http://nginx.org/download/nginx-1.12.1.tar.gz【因為下面的演示的echo模塊最高兼容1.16,所以這里安裝1.16】
2.解壓tar包:tar -zxvf nginx-1.12.1.tar.gz
3.cd nginx-1.12.1/
4../configure --prefix=/etc/nginx,注意,編譯方式安裝,檔案目錄布局與yum安裝方式的不太一樣,
5.make && make install
6.進入/etc/nginx/sbin目錄下執行./nginx -v,如果能夠正常輸出nginx版本,那么就代表編譯安裝成功了,

??--prefix 用于指定nginx編譯后的安裝目錄

【docker內部的nginx也是編譯安裝的,如果你懂docker,那么你可以通過修改docker的dockerfile來添加第三方模塊】
【如果你是覆寫安裝的,注意保存之前的配置資訊,】


安裝第三方模塊

安裝第三方模塊需要我們重新編譯安裝,所以下面的程序是以編譯安裝為基礎的,
下面的安裝模塊我們以echo模塊為例,echo模塊可以回傳變數,比如echo $remote_addr;代表把客戶端的IP作為回應資料,
1.從github上下載echo模塊的源代碼:echo-nginx-module
或者直接在nginx所在的機器上wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
2.上傳到nginx所在的機器上,
3.解壓第三方模塊echo模塊:tar -zxvf v0.61.tar.gz
4.我們進入到之前的nginx源代碼目錄:cd nginx-1.12.1/
5.重新編譯安裝:./configure --prefix=/etc/nginx --add-module=/root/temp/echo-nginx-module-0.61
6.make && make install
7.進入/etc/nginx/sbin目錄下執行./nginx -V,如果能看到configure arguments: --prefix=/etc/nginx --add-module=/root/temp/echo-nginx-module-0.61,那么就代表編譯安裝成功了,除了這樣,你還可以嘗試在代碼中添加echo指令來測驗,


在還沒安裝之前:如果你在代碼中使用echo的話,重啟nginx會報如下的錯誤: ![20200629210011](https://progor.oss-cn-shenzhen.aliyuncs.com/img/20200629210011.png)
nginx: [emerg] unknown directive "echo" in /etc/nginx/conf.d/default.conf:5
nginx: configuration file /etc/nginx/nginx.conf test failed

那么如果我們安裝了之后,不報錯,并且訪問nginx服務端之后,回傳的是客戶端的IP地址的話,那么就說明第三方模塊安裝成功了,


知識補充:

  • --add-module=第三方模塊源代碼路徑 用于添加第三方模塊,--add-module=/usr/local/nginx/third_module/echo-nginx-module-0.60代表添加了echo模塊,
  • --with-模塊名 表示啟用的nginx模塊,如--with-http_ssl_module代表啟用了http_ssl_module模塊


沒有講到的內容

沒有講到的內容其實挺多的,但上面的應該是常見的內容了,學會了應該就夠日常使用了,后面有需要你自己去百度的時候應該就能看懂別人的配置了,
其他的內容由于優先級不是很高,而且考慮篇幅問題,所以這里沒有講解,下面列舉一下我覺得可能


??nginx還支持郵件服務,但可能比較少用,
??nginx與Keepalived搭配的高可用,【其實挺重要,大家可以自己搜索學習一下】
??nginx也支持NFS(網路檔案系統),但有一些替代方案,比如對于Java來說的話,比較常見的是FastDFS(也依托nginx)了,
??網頁壓縮,可以使用GZIP來進行網頁壓縮,來減少傳輸的資料,但壓縮是需要系統去處理的,所以可能需要消耗一些CPU資源,自己有需求就去找找看吧,
??nginx與其他服務器的比較,因為這篇文章重點不是這個,所以不講,
??如果你關心檔案傳輸方面的知識,那么可以了解下send_file 和tcp_nopush對于資料傳輸的處理,
??sub_status模塊,用來查看nginx自上次啟動以來的作業狀態,包括處理的連接數、請求數等,
??geoip可以用于地區識別,比如基于IP判斷用戶的地區,
??http_slice_module模塊可以用于大檔案分片的處理,
??如果你想拿來當面試談資,那么IO多路復用模型可以了解一下,nginx.conf的events塊中其實可以修改nginx對于請求處理的IO模型,當問nginx為什么那么厲害的時候,IO多路復用模型也可以談一下,

??我這篇文章講了一些例如負載均衡的內容,但這并不代表你不需要額外學習nginx的內容了,因為我只是講了普通情況,如果你的業務復雜的話,那么你最好仔細的看一下官方檔案了,
??請認清,這只是一篇用于基礎理論了解的文章而已,



轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/36556.html

標籤:其他

上一篇:網路通信協議

下一篇:Zabbix——可視化的資源監控解決方案

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more