Nginx

nginx 變數的成本是多少?

  • June 12, 2020

nginx 常見問題解答有沒有一種正確的方法來使用 nginx 變數來縮短配置部分,將它們用作宏來使部分配置作為模板工作?)說(粗體是我的):

問:是否有適當的方法使用 nginx 變數來縮短配置部分,將它們用作宏以使部分配置作為模板工作?

A:變數不應該用作模板宏。變數在處理每個請求期間在執行時進行評估,因此與普通靜態配置相比,它們的成本相當高。使用變數來儲存靜態字元串也是一個壞主意。相反,應該使用宏擴展和“包含”指令來更輕鬆地生成配置,並且可以使用外部工具來完成,例如 sed + make 或任何其他常見的模板機制。

add_header Content-Security-Policy例如,為了更好的可讀性,我使用的是一個超長的:

set $CSP "default-src 'none'";

set $CSP "${CSP}; connect-src 'self'";

set $CSP "${CSP}; script-src 'self' https://*.domain.org 'unsafe-inline' 'unsafe-eval'";

set $CSP "${CSP}; style-src 'self' https://*.domain.org 'unsafe-inline'";

set $CSP "${CSP}; img-src 'self' data: https://*.domain.org";

set $CSP "${CSP}; font-src 'self' https://*.domain.org";

## CSP closing colon.
set $CSP "${CSP};";

add_header Content-Security-Policy "$CSP";

適當地使用變數會對 nginx 性能產生多大影響?是否有關於該主題的任何性能測試/研究?

在處理每個請求期間在執行時評估變數

想像一下您必須從記憶體或執行時獲取並保存變數的每個請求,您需要花費多少時間和記憶體?也許如果你有幾個請求它並不重要,但如果你有這麼多請求它會非常重要

它就像一個開放的靜態普通文件與一個動態文件。沒有什麼比直接訪問普通文件更快的了。

在您的情況下,您使用一個變數然後設置它很多次。由於缺乏基礎設施,我無法使用 Nginx 它自己進行基準測試,但我想分享適用於您的案例的 PHP 腳本的基準測試。

您要設置此文本:

預設原始碼“無”;連接-src’自我;script-src ‘self’ https:// .domain.org ‘unsafe-inline’ ‘unsafe-eval’; style-src ‘self’ https:// .domain.org ‘unsafe-inline’; img-src ‘self’ 數據:https: //.domain.org;font-src ‘self’ https:// .domain.org;

使用 PHP,您可以使用以下程式碼進行設置:

$csp = "default-src 'none'; connect-src 'self; script-src 'self' https://*.domain.org 'unsafe-inline' 'unsafe-eval'; style-src 'self' https://*.domain.org 'unsafe-inline'; img-src 'self' data: https://*.domain.org; font-src 'self' https://*.domain.org;";

但是由於某些原因,您要在設置實際輸出之前設置多次。所以程式碼將是這樣的:

$csp =  "default-src 'none'";
$csp = $csp."; connect-src 'self'";
$csp = $csp."; script-src 'self' https://*.domain.org 'unsafe-inline' 'unsafe-eval'";
$csp = $csp."; style-src 'self' https://*.domain.org 'unsafe-inline'";
$csp = $csp."; img-src 'self' data: https://*.domain.org; font-src 'self' https://*.domain.org";
$csp = $csp.";";

我使用循環執行第一個程式碼 1000 萬次,耗時0.0725793838500982 秒,第二個程式碼耗時1.049282026290894 秒。所以第二個程式碼大約慢了 15 倍。它只顯示請求時間基準,而不是記憶體、CPU、磁碟或任何其他資源使用基準。也許第二個程式碼也會比第一個程式碼佔用更多的資源。

就像它發生在 PHP 中一樣,它也會發生在 Nginx 執行時。正如 Nginx 文件所說,使用變數儲存靜態字元串是昂貴的,也是一個壞主意。如果它與上面的 PHP 類比相同,則成本要慢 15 倍

引用自:https://serverfault.com/questions/1019730