Nginx

通過 http auth 和大量請求提高 Nginx 的性能

  • April 21, 2021

我在 Nginx 伺服器後面通過 fpm 執行了一個 PHP 端。對於 $reasons,我們需要在該設置之前有一個 http 基本身份驗證,所以我最終設置為:

#… server section ….

   auth_basic "Restricted";
   auth_basic_user_file /path/to/htpasswd;

#… some more locations …

location ~ \.php$ {


   fastcgi_pass 127.0.0.1:9001;
   fastcgi_split_path_info ^(.+\.php)(/.*)$;
   include /etc/nginx/fastcgi_params;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_param HTTPS off;
   fastcgi_param APPLICATION_ENV production;
}

哪個有效-但速度很慢。它僅以 100% 的 cpu 使用率處理一個又一個請求。如果我刪除 http_auth 它的工作速度很快。

我的問題是:如何改進設置以確保即使使用 http_auth 性能也不錯?

以供參考:

# nginx -V
nginx version: nginx/1.8.1
built with OpenSSL 1.0.2j  26 Sep 2016
TLS SNI support enabled
configure arguments: --prefix=/usr --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error_log --pid-path=/run/nginx.pid --lock-path=/run/lock/nginx.lock --with-cc-opt=-I/usr/include --with-ld-opt=-L/usr/lib --http-log-path=/var/log/nginx/access_log --http-client-body-temp-path=/var/lib/nginx/tmp/client --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --with-ipv6 --with-libatomic --with-pcre --with-http_realip_module --add-module=external_module/ngx_devel_kit-0.2.19 --add-module=external_module/lua-nginx-module-0.9.15 --add-module=external_module/modsecurity-2.9.1-nginx-207c85d/nginx/modsecurity --with-http_ssl_module --without-mail_imap_module --without-mail_pop3_module --without-mail_smtp_module --user=nginx --group=nginx

我的問題的根本原因不是直接由 Nginx 引起,而是我用於 htpasswd 的算法。由於在我上面的配置中一次又一次地檢查此文件,因此使用一種不會佔用此資源的算法非常重要。我最初使用 Python hashlib 呼叫的基於 sha512 的算法

passlib.hash.sha512_crypt.encrypt(password)

這太多了。通過直接呼叫 htpasswd 更改為更簡單的算法時

htpasswd /path/to/passwdfile myusername 

性能問題消失了。

我在使用 Nginx 和基本 HTTP Auth 時遇到了同樣的問題。我使用htpasswdbcrypt 選項的輪數太多。我嘗試了 17 的最大值(帶有選項-C 17),但伺服器根本不喜歡這樣。CPU 達到 100%,每個頁面都需要一分鐘才能載入。

htpasswd -B -C 17 -c /etc/nginx/.htpasswd username

-C選項僅在使用 bcrypt 時-B使用,設置用於 bcrypt 算法的計算時間(越高越安全但速度越慢,預設值:5,有效:4 到 17)。計算 bcrypt 密碼雜湊值的成本隨著-C選項指定的輪數而增加。

預設加密算法htpasswd使用的是為 Apache 修改的 MD5 版本。但是通過 -B 選項,您可以使用 bcrypt。Bcrypt 現在被認為是非常安全的。

我最終解決了7輪。這似乎運作良好,CPU 不會飆升,頁面載入時間也很好。

htpasswd -B -C 7 -c /etc/nginx/.htpasswd username

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