淺談Nginx模塊ngx_http_core_module(二)
🆔 定義客戶端請求的相關配置
1️⃣ error_page 錯誤頁404
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
- 這將導致內部重定向到uri 客戶端請求方法指定的內部重定向更改爲“GET”(對於除“GET”和“HEAD” 之外的所有方法)
- 此外,可以使用
=response
語法將響應代碼更改爲另一個,例如:
error_page 404 =200 /empty.gif;
- 如果錯誤響應是由代理服務器或
FastCGI / uwsgi / SCGI / gRPC
服務器處理的,並且服務器可能返回不同的響應代碼(例如200、302、401或404),則可以使用該代碼進行響應返回:
error_page 404 = /404.php;
- 如果在內部重定向期間不需要更改URI和方法,則可以將錯誤處理傳遞到命名位置:
location / {
error_page 404 = @fallback;
}
location @fallback {
proxy_pass http://後端;
/ 如果uri處理導致錯誤,最後發生的錯誤的狀態碼將返回給客戶端。
- 也可以使用URL重定向進行錯誤處理:
error_page 403 http://example.com/forbidden.html;
error_page 404 = 301 http://example.com/notfound.html;
/ 在這種情況下,默認情況下,響應代碼302返回給客戶端。
/ 它只能更改爲重定向狀態代碼之一(301、302、303、307和308)。
/ 當且僅當error_page 當前級別上未定義任何指令時,這些指令才從上一級繼承 。
- 示例:當訪問www.studylinux.com不存在的時候,返回指定的404錯誤文件,指定響應碼爲200
vim /apps/nginx/conf.d/pc.conf
server {
server_name www.studylinux.com;
location / {
root /data/nginx/pc;
}
error_page 404 = 200 /404.html;
location /404.html {
root /data/nginx/error_page;
}
}
nginx -t
nginx -s reload
mkdir -p /data/nginx/error_page
echo "SORRY,I AM DEAD!" > /data/nginx/error_page/404.html
- 修改hosts文件,測試效果
root@ubuntu1804-31:~# curl www.studylinux.com/xxx
SORRY,I AM DEAD!
root@ubuntu1804-31:~# curl -I www.studylinux.com/xxx
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Sat, 04 Jan 2020 13:02:31 GMT
Content-Type: text/html
Content-Length: 17
Last-Modified: Sat, 04 Jan 2020 12:56:12 GMT
Connection: keep-alive
ETag: "5e108b6c-11"
Accept-Ranges: bytes
2️⃣ try_files 檢查文件是否存在
- 按指定順序檢查文件是否存在,並使用找到的第一個文件進行請求處理(結尾加斜線表⽰爲⽂件夾);
- 該處理在當前上下文中執行。文件的路徑是
file
根據root
和alias
指令從參數 構造的 。 - 可以通過在名稱末尾指定斜槓來檢查目錄的存在,例如
“ $uri/”
。如果未找到任何文件,則會進行內部重定向到uri最後一個參數中指定的文件 - 最後⼀個參數是回退URI且必須存在,否則會出現內部500錯誤。
- 示例
location /images/ {
try_files $uri /images/default.gif;
}
location = /images/default.gif {
expires 30s;
}
- 最後一個參數也可以指向一個命名的位置,如下面的例子所示。從0.7.51版本開始,最後一個參數也可以是 code:
location / {
try_files $uri $uri/index.html $uri.html =404;
}
- Drupal/FastCGI示例:
location / {
try_files $uri $uri/ @drupal;
}
location ~ \.php$ {
try_files $uri @drupal;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param QUERY_STRING $args;
... other fastcgi_param's
}
location @drupal {
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to/index.php;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_param QUERY_STRING q=$uri&$args;
... other fastcgi_param's
}
- 上述例子中try_files
location / {
try_files $uri $uri/ @drupal;
}
- 該try_files指令由兩段代碼組成
# 第一部分
location / {
error_page 404 = @drupal;
log_not_found off;
}
# 第二部分
location ~ \.php$ {
try_files $uri @drupal;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
...
}
# try_files 在將請求傳遞給FastCGI服務器之前檢查PHP文件的存在
- Wordpress和Joomla的示例
location / {
try_files $uri $uri/ @wordpress;
}
location ~ \.php$ {
try_files $uri @wordpress;
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
... other fastcgi_param's
}
location @wordpress {
fastcgi_pass ...;
fastcgi_param SCRIPT_FILENAME /path/to/index.php;
... other fastcgi_param's
}
3️⃣ keepalive_timeout 設定長連接的超時時長
-
第一個參數設置保持連接的超時時長,0表示禁止長連接。默認爲75s,推薦120s
-
可選的第二個參數在
Keep-Alive:timeout = time
響應頭域中設置一個值。兩個參數可能不同。 -
Mozilla和Konqueror可以識別
Keep-Alive:timeout = time
頭域。MSIE在大約60秒內自行關閉保持連接。
4️⃣ keepalive_requests 長連接允許請求的資源的最大數量
在一次長連接上所允許請求的資源的最大數量。默認爲100次
5️⃣ keepalive_disable 對哪種瀏覽器禁用長連接
6️⃣ send_timeout 設置用於向客戶端發送響應的超時時間
- 設置用於向客戶端發送響應的超時時間。
- 超時僅在兩個連續的寫入操作之間設置,而不是傳輸整個響應。
- 如果客戶端在這段時間內沒有收到任何內容,則連接被關閉
7️⃣ client_body_buffer_size
- 設置讀取客戶端請求體的緩衝區大小。
- 如果請求體大於緩衝區,則整個身體或僅將其部分寫入 臨時文件。
- 默認情況下,緩衝區大小等於兩個內存頁面。這是x86上的8K,其他32位平臺和x86-64。其他64位平臺通常爲16K
- 超出此大小時,其將被暫存到磁盤上的由
client_body_temp_path
指令所定義的位置
8️⃣ client_body_temp_path
- 定義用於存儲包含客戶端請求正文的臨時文件的目錄。
- 在指定目錄下最多可以使用三級子目錄層次結構。例如,在以下配置中
client_body_temp_path / spool / nginx / client_temp 1 2;
- 設定存儲客⼾端請求報⽂的body部分的臨時存儲路徑及⼦⽬錄結構和數量,⽬錄名爲16進制的數字,
使⽤hash之後的值從後往前截取1位、2位、2位作爲⽂件名:
[root@s3 ~]# md5sum /data/nginx/html/pc/index.html
95f6f65f498c74938064851b1bb 96 3d 4 /data/nginx/html/pc/index.html
1級⽬錄佔1位16進制,即2^4=16個⽬錄 0-f
2級⽬錄佔2位16進制,即2^8=256個⽬錄 00-ff
3級⽬錄佔2位16進制,即2^8=256個⽬錄 00-ff
配置⽰例:
client_max_body_size 10m;
client_body_buffer_size 16k;
client_body_temp_path /apps/nginx/temp 1 2 2; #reload Nginx會⾃動創建temp⽬錄
🆔 對客戶端進行限制的相關配置
1️⃣ limit_rate 限制響應給客戶端的傳輸速率
- 限制響應給客戶端的傳輸速率,單位是bytes/second
- 默認值0表示無限制
2️⃣ limit_except
- 限制客戶端使用除了指定的請求方法之外的其它方法,只能用在
location
上下文。 - Method:
GET, HEAD, POST, PUT, DELETE
MKCOL, COPY, MOVE, OPTIONS, PROPFIND,
PROPPATCH, LOCK, UNLOCK, PATCH
- 示例
limit_except GET HEAD POST {
deny 192.168.111.200
allow 192.168.111.0/24;
deny all;
}
- 表示除了GET、HEAD、POST方法其他方法都限制,
- 主機範圍爲:禁止192.168.111.200、允許192.168.111.0/24、禁止所有。
- 即僅允許192.168.111.0網段訪問,但是禁止192.168.111.200的地址訪問
🆔 文件操作優化的配置
1️⃣ aio 是否啓用異步I/O功能
- linux 2.6以上內核提供以下⼏個系統調⽤來⽀持aio:
1、SYS_io_setup:建⽴aio 的context
2、SYS_io_submit: 提交I/O操作請求
3、SYS_io_getevents:獲取已完成的I/O事件
4、SYS_io_cancel:取消I/O操作請求
5、SYS_io_destroy:毀銷aio的context
2️⃣ directio 是否同步寫磁盤
- 操作完全和aio相反,aio是讀取⽂件⽽directio是寫⽂件到磁盤
- 啓⽤直接I/O,默認爲關閉,當⽂件⼤於等於給定⼤⼩時,例如
directio 4m
,同步(直接)寫磁盤,⽽⾮寫緩存。
3️⃣ open_file_cache 是否緩存打開過的⽂件信息
- nginx可以緩存以下三種信息:
(1) ⽂件元數據:⽂件的描述符、⽂件⼤⼩和最近⼀次的修改時間
(2) 打開的⽬錄結構
(3) 沒有找到的或者沒有權限訪問的⽂件的相關信息 max=N
:可緩存的緩存項上限數量;達到上限後會使⽤LRU(Least recently used,最近最少使⽤)算法實現
管理inactive=time
:緩存項的⾮活動時⻓,在此處指定的時⻓內未被命中的或命中的次數少於
open_file_cache_min_uses
指令所指定的次數的緩存項即爲⾮活動項,將被刪除
4️⃣ open_file_cache_errors
- 是否緩存查找時發⽣錯誤的⽂件⼀類的信息
- 默認值爲off
5️⃣ open_file_cache_min_uses
- open_file_cache指令的inactive參數指定的時⻓內,⾄少被命中此處指定的次數⽅可被歸類爲活動項
- 默認值爲1
6️⃣ open_file_cache_valid
- 緩存項有效性的檢查驗證頻率,默認值爲60s
- 示例
aio on; # 開啓異步I/O
directio 4m; # 開啓同步磁盤文件大小>4M
open_file_cache max=1000 inactive=20s; # 最⼤緩存1000個⽂件,⾮活動數據超時時⻓20s
open_file_cache_valid 30s; # 每間隔30s檢查⼀下緩存數據有效性
open_file_cache_min_uses 2; # 30秒內⾄少被命中訪問2次才被標記爲活動數據
open_file_cache_errors on; # 緩存錯誤信息
ngx_http_core_modules常用模塊就寫這些了