nginx相關

秋天的第一杯奶茶發表於2020-10-17

HTTP狀態碼列表:

狀態碼狀態碼英文名稱中文描述
100Continue繼續。客戶端應繼續其請求
101Switching Protocols切換協議。伺服器根據客戶端的請求切換協議。只能切換到更高階的協議,例如,切換到HTTP的新版本協議
200OK請求成功。一般用於GET與POST請求
201Created已建立。成功請求並建立了新的資源
202Accepted已接受。已經接受請求,但未處理完成
203Non-Authoritative Information非授權資訊。請求成功。但返回的meta資訊不在原始的伺服器,而是一個副本
204No Content無內容。伺服器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文件
205Reset Content重置內容。伺服器處理成功,使用者終端(例如:瀏覽器)應重置文件檢視。可通過此返回碼清除瀏覽器的表單域
206Partial Content部分內容。伺服器成功處理了部分GET請求
300Multiple Choices多種選擇。請求的資源可包括多個位置,相應可返回一個資源特徵與地址的列表用於使用者終端(例如:瀏覽器)選擇
301Moved Permanently永久移動。請求的資源已被永久的移動到新URI,返回資訊會包括新的URI,瀏覽器會自動定向到新URI。今後任何新的請求都應使用新的URI代替
302Found臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI
303See Other檢視其它地址。與301類似。使用GET和POST請求檢視
304Not Modified未修改。所請求的資源未修改,伺服器返回此狀態碼時,不會返回任何資源。客戶端通常會快取訪問過的資源,通過提供一個頭資訊指出客戶端希望只返回在指定日期之後修改的資源
305Use Proxy使用代理。所請求的資源必須通過代理訪問
306Unused已經被廢棄的HTTP狀態碼
307Temporary Redirect臨時重定向。與302類似。使用GET請求重定向
400Bad Request客戶端請求的語法錯誤,伺服器無法理解
401Unauthorized請求要求使用者的身份認證
402Payment Required保留,將來使用
403Forbidden伺服器理解請求客戶端的請求,但是拒絕執行此請求
404Not Found伺服器無法根據客戶端的請求找到資源(網頁)。通過此程式碼,網站設計人員可設定"您所請求的資源無法找到"的個性頁面
405Method Not Allowed客戶端請求中的方法被禁止
406Not Acceptable伺服器無法根據客戶端請求的內容特性完成請求
407Proxy Authentication Required請求要求代理的身份認證,與401類似,但請求者應當使用代理進行授權
408Request Time-out伺服器等待客戶端傳送的請求時間過長,超時
409Conflict伺服器完成客戶端的PUT請求是可能返回此程式碼,伺服器處理請求時發生了衝突
410Gone客戶端請求的資源已經不存在。410不同於404,如果資源以前有現在被永久刪除了可使用410程式碼,網站設計人員可通過301程式碼指定資源的新位置
411Length Required伺服器無法處理客戶端傳送的不帶Content-Length的請求資訊
412Precondition Failed客戶端請求資訊的先決條件錯誤
413Request Entity Too Large由於請求的實體過大,伺服器無法處理,因此拒絕請求。為防止客戶端的連續請求,伺服器可能會關閉連線。如果只是伺服器暫時無法處理,則會包含一個Retry-After的響應資訊
414Request-URI Too Large請求的URI過長(URI通常為網址),伺服器無法處理
415Unsupported Media Type伺服器無法處理請求附帶的媒體格式
416Requested range not satisfiable客戶端請求的範圍無效
417Expectation Failed伺服器無法滿足Expect的請求頭資訊
500Internal Server Error伺服器內部錯誤,無法完成請求
501Not Implemented伺服器不支援請求的功能,無法完成請求
502Bad Gateway作為閘道器或者代理工作的伺服器嘗試執行請求時,從遠端伺服器接收到了一個無效的響應
503Service Unavailable由於超載或系統維護,伺服器暫時的無法處理客戶端的請求。延時的長度可包含在伺服器的Retry-After頭資訊中
504Gateway Time-out充當閘道器或代理的伺服器,未及時從遠端伺服器獲取請求
505HTTP Version not supported伺服器不支援請求的HTTP協議的版本,無法完成處理

nginx配置檔案

# 全域性引數設定 
worker_processes  4;          #設定nginx啟動程式的數量,一般設定成與邏輯cpu數量相同 
error_log  logs/error.log;    #指定錯誤日誌 
worker_rlimit_nofile 102400;  #設定一個nginx程式能開啟的最大檔案數 
pid        /var/run/nginx.pid; 
events { 
    worker_connections  1024; #設定一個程式的最大併發連線數 
}
# http 服務相關設定 
http { 
    include      mime.types; 
    default_type  application/octet-stream; 
    log_format  main  'remote_addr - remote_user [time_local] "request" '
                      'status body_bytes_sent "$http_referer" '
                      '"http_user_agent" "http_x_forwarded_for"'; 
    access_log  /var/log/nginx/access.log  main;    #設定訪問日誌的位置和格式 
    sendfile          on; #是否呼叫sendfile函式輸出檔案,一般設定為on,若nginx是用來進行磁碟IO負載應用時,可以設定為off,降低系統負載 
    gzip              on;      #是否開啟gzip壓縮,將註釋去掉開啟 
    keepalive_timeout  65;     #設定長連線的超時時間
# 虛擬伺服器的相關設定 
    server { 
        listen      80;        #設定監聽的埠 
        server_name  localhost;        #設定繫結的主機名、域名或ip地址 
        charset koi8-r;        # 設定編碼字元 
        location / { 
            root  /var/www/nginx;           #設定伺服器預設網站的根目錄位置,需要手動建立
            index  index.html index.htm;    #設定預設開啟的文件 
            } 
        error_page  500 502 503 504  /50x.html; #設定錯誤資訊返回頁面 
        location = /50x.html { 
            root  html;        #這裡的絕對位置是/usr/local/nginx/html
        } 
    } 
 }

nginx命令

nginx -c /path/nginx.conf # 以特定目錄下的配置檔案啟動nginx:
nginx -s reload # 修改配置後重新載入生效
nginx -s reopen # 重新開啟日誌檔案
nginx -s stop # 快速停止nginx
nginx -s quit # 完整有序的停止nginx
nginx -t # 測試當前配置檔案是否正確
nginx -t -c /path/to/nginx.conf # 測試特定的nginx配置檔案是否正確

注意:
nginx -s reload 命令載入修改後的配置檔案,命令下達後發生如下事件

  1. Nginx的master程式檢查配置檔案的正確性,若是錯誤則返回錯誤資訊,nginx繼續採用原配置檔案進行工作(因為worker未受到影響)
  2. Nginx啟動新的worker程式,採用新的配置檔案
  3. Nginx將新的請求分配新的worker程式
  4. Nginx等待以前的worker程式的全部請求已經都返回後,關閉相關worker程式
  5. 重複上面過程,知道全部舊的worker程式都被關閉掉

nginx負載均衡

https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/#proxy_pass官方文件

  • max_fails,允許請求失敗的次數,預設為1。當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤。
  • fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間單位秒。max_fails可以和fail_timeout一起使用
upstream myweb { 
      server 172.17.14.2:8080 weight=2 max_fails=2 fail_timeout=2;
      server 172.17.14.3:8080 weight=1 max_fails=2 fail_timeout=1;    
    }

nginx四層代理

https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/官方文件

防盜鏈配置

# 日誌格式新增"$http_referer"
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "$http_x_forwarded_for"';                        
  • none : 允許沒有http_refer的請求訪問資源;(瀏覽器沒有這個)

  • blocked : 允許不是http://開頭的,不帶協議的請求訪問資源;

  • server_names : 只允許指定ip/域名來的請求訪問資源(白名單);

    準備兩臺機器,兩張圖片(快取問題)

valid_referers 使用方式
Syntax: valid_referers none | blocked | server_names | string …;
Default: —
Context: server, location

[root@nginx-server html]# vim /etc/nginx/conf.d/nginx.conf
server {
    listen       80;
    server_name  localhost;

    location / {
         root   /usr/share/nginx/html;
         index  index.html index.htm;

         valid_referers none blocked *.qf.com 10.0.105.202;
                if ($invalid_referer) {
                   return 403;
                }
        }
    location ~  .*\.(gif|jpg|png|jpeg)$ {
         root  /usr/share/nginx/html;

         valid_referers  qf.com 10.0.105.202;
                if ($invalid_referer) {
                   return 403;
                }
        }
}

nginx地址重寫

https://docs.nginx.com/nginx/admin-guide/web-server/web-server/官方文件

if 語句

if (condition) { … }
if 可以支援如下條件判斷匹配符號
~ 正則匹配 (區分大小寫)
~* 正則匹配 (不區分大小寫)
!~ 正則不匹配 (區分大小寫)
!~* 正則不匹配 (不區分大小寫)
-f 和!-f 用來判斷是否存在檔案
-d 和!-d 用來判斷是否存在目錄
-e 和!-e 用來判斷是否存在檔案或目錄
-x 和!-x 用來判斷檔案是否可執行

在匹配過程中可以引用一些Nginx的全域性變數
$args 請求中的引數;
$document_root 針對當前請求的根路徑設定值;
$host 請求資訊中的"Host",如果請求中沒有Host行,則等於設定的伺服器名;
$limit_rate 對連線速率的限制;
$request_method 請求的方法,比如"GET"、"POST"等;
$remote_addr 客戶端地址;
$remote_port 客戶端埠號;
$remote_user 客戶端使用者名稱,認證用;
$request_filename 當前請求的檔案路徑名(帶網站的主目錄/usr/local/nginx/html/images /a.jpg)
$request_uri 當前請求的檔案路徑名(不帶網站的主目錄/images/a.jpg)
q u e r y s t r i n g 與 query_string 與 querystringargs相同;
$scheme 用的協議,比如http或者是https
$server_protocol 請求的協議版本,“HTTP/1.0"或"HTTP/1.1”;
$server_addr 伺服器地址,如果沒有用listen指明伺服器地址,使用這個變數將發起一次系統呼叫以取得地址(造成資源浪費);
$server_name 請求到達的伺服器名;
d o c u m e n t u r i 與 document_uri 與 documenturiuri一樣,URI地址;
$server_port 請求到達的伺服器埠號;

Rewrite flag

last 相當於Apache裡的[L]標記,表示完成rewrite。預設為last。
break 本條規則匹配完成後,終止匹配,不再匹配後面的規則
redirect 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
permanent 返回301永久重定向,瀏覽器地址會顯示跳轉後URL地址

location指令

location 字首含義
= 表示精確匹配,優先順序也是最高的
^~ 表示uri以某個常規字串開頭,理解為匹配url路徑即可
~ 表示區分大小寫的正則匹配
~* 表示不區分大小寫的正則匹配
!~ 表示區分大小寫不匹配的正則
!~* 表示不區分大小寫不匹配的正則
/ 通用匹配,任何請求都會匹配到
@ 內部服務跳轉

nginx 日誌配置

ngx_http_log_module模組
http://nginx.org/en/docs/http/ngx_http_log_module.html官方文件
http://nginx.org/en/docs/varindex.html變數資訊

14、nginx 日誌配置
1、nginx 日誌介紹

nginx 有一個非常靈活的日誌記錄模式,每個級別的配置可以有各自獨立的訪問日誌, 所需日誌模組 ngx_http_log_module 的支援,日誌格式通過 log_format 命令來定義,日誌對於統計和排錯是非常有利的,下面總結了 nginx 日誌相關的配置 包括 access_loglog_formatopen_log_file_cachelog_not_foundlog_subrequestrewrite_logerror_log

# 設定訪問日誌
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
# 關閉訪問日誌
access_log off; 
  • path 指定日誌的存放位置。
  • format 指定日誌的格式。預設使用預定義的combined
  • buffer 用來指定日誌寫入時的快取大小。預設是64k。
  • gzip 日誌寫入前先進行壓縮。壓縮率可以指定,從1到9數值越大壓縮比越高,同時壓縮的速度也越慢。預設是1。
  • flush 設定快取的有效時間。如果超過flush指定的時間,快取中的內容將被清空。
  • if 條件判斷。如果指定的條件計算為0或空字串,那麼該請求不會寫入日誌。

作用域:

可以應用access_log指令的作用域分別有httpserverlocationlimit_except。也就是說,在這幾個作用域外使用該指令,Nginx會報錯。

access_log /var/logs/nginx-access.log

該例子指定日誌的寫入路徑為/var/logs/nginx-access.log,日誌格式使用預設的combined

access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m

該例子指定日誌的寫入路徑為/var/logs/nginx-access.log,日誌格式使用預設的combined,指定日誌的快取大小為 32k,日誌寫入前啟用 gzip 進行壓縮,壓縮比使用預設值 1,快取資料有效時間為1分鐘。

3、log_format 指令

Nginx 預定義了名為 combined 日誌格式,如果沒有明確指定日誌格式預設使用該格式:

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

如果不想使用Nginx預定義的格式,可以通過log_format指令來自定義。

語法

log_format name [escape=default|json] string ...;
  • name 格式名稱。在 access_log 指令中引用。
  • escape 設定變數中的字元編碼方式是json還是default,預設是default
  • string 要定義的日誌格式內容。該引數可以有多個。引數中可以使用Nginx變數。

log_format 指令中常用的一些變數:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-0r8Ivx3Z-1602848477700)(C:\Users\admin\AppData\Local\Temp\1561945706808.png)]

自定義日誌格式的使用:

access_log /var/logs/nginx-access.log main

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指令定義了一個main的格式,並在access_log指令中引用了它。假如客戶端有發起請求:https://qf.com/,我們看一下我擷取的一個請求的日誌記錄:

10.0.105.207 - - [01/Jul/2019:10:44:36 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" "-"

我們看到最終的日誌記錄中$remote_user$http_referer$http_x_forwarded_for都對應了一個-,這是因為這幾個變數為空。

面試時:注意日誌裡面的ip地址一定要在第一列。

5、error_log 指令

錯誤日誌在Nginx中是通過error_log指令實現的。該指令記錄伺服器和請求處理過程中的錯誤資訊。

語法

配置錯誤日誌檔案的路徑和日誌級別。

error_log file [level];
Default:	
error_log logs/error.log error;

file 引數指定日誌的寫入位置。

level 引數指定日誌的級別。level可以是debug, info, notice, warn, error, crit, alert,emerg中的任意值。可以看到其取值範圍是按緊急程度從低到高排列的。只有日誌的錯誤級別等於或高於level指定的值才會寫入錯誤日誌中。預設值是error

基本用法

error_log /var/logs/nginx/nginx-error.log

配置段:mainhttp, mail, stream, server, location作用域。

例子中指定了錯誤日誌的路徑為:/var/logs/nginx/nginx-error.log,日誌級別使用預設的 error

6、open_log_file_cache 指令

每一條日誌記錄的寫入都是先開啟檔案再寫入記錄,然後關閉日誌檔案。如果你的日誌檔案路徑中使用了變數,如 access_log /var/logs/$host/nginx-access.log,為提高效能,可以使用open_log_file_cache指令設定日誌檔案描述符的快取。

語法

open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];

預設值: 
open_log_file_cache off;
  • max 設定快取中最多容納的檔案描述符數量,如果被佔滿,採用LRU演算法將描述符關閉。

  • inactive 設定快取存活時間,預設是10s。

  • min_usesinactive時間段內,日誌檔案最少使用幾次,該日誌檔案描述符記入快取,預設是1次。

  • valid:設定多久對日誌檔名進行檢查,看是否發生變化,預設是60s。

  • off:不使用快取。預設為off。

    基本用法

    open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
    

    配置段:httpserverlocation作用域中。

    例子中,設定快取最多快取1000個日誌檔案描述符,20s內如果快取中的日誌檔案描述符至少被被訪問2次,才不會被快取關閉。每隔1分鐘檢查快取中的檔案描述符的檔名是否還存在。

    7、log_not_found 指令

    是否在error_log中記錄不存在的錯誤。預設是

    基本語法:

    log_not_found on | off;
    預設值: 
    log_not_found on;
    

    配置段: http, server, location作用域。

    8、log_subrequest 指令

    是否在access_log中記錄子請求的訪問日誌。預設不記錄

    基本語法

    log_subrequest on | off;
    
    預設值: 
    log_subrequest off;
    

    配置段: http, server, location作用域。

    9、rewrite_log 指令

    ngx_http_rewrite_module模組提供的。用來記錄重寫日誌的。對於除錯重寫規則建議開啟,啟用時將在error log中記錄notice級別的重寫日誌。
    基本語法:

    rewrite_log on | off;
    
    預設值: 
    rewrite_log off;
    

    配置段: http, server, location, if作用域。

    10、nginx 日誌配置總結

    Nginx中通過access_logerror_log指令配置訪問日誌和錯誤日誌,通過log_format我們可以自定義日誌格式。如果日誌檔案路徑中使用了變數,我們可以通過open_log_file_cache 指令來設定快取,提升效能。其他的根據自己的使用場景定義。

錯誤頁面配置

https://blog.csdn.net/weixin_39076313/article/details/101782111

nginx限流

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

相關文章