使用 http auth 和大量请求来提高 Nginx 的性能

使用 http auth 和大量请求来提高 Nginx 的性能

我在 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;
}

它可以工作 — 但速度很慢。它只能处理一个又一个请求,CPU 利用率高达 100%。如果我删除 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

答案1

我的问题的根本原因不是直接由 Nginx 引起的,而是我为 htpasswd 使用的算法。由于这个文件在我的上述配置中被反复检查,因此使用不消耗这种资源的算法非常重要。我最初使用的是 Python hashlib 调用的基于 sha512 的算法

passlib.hash.sha512_crypt.encrypt(password)

这太过分了。当通过直接调用 htpasswd 更改为更简单的算法时

htpasswd /path/to/passwdfile myusername 

性能问题已消失。

答案2

我在使用 Nginx 和基本 HTTP 身份验证时也遇到了同样的问题。htpasswd我使用的 bcrypt 选项的轮次太多。我尝试了最大值 17(使用选项-C 17),但服务器根本不喜欢这样。CPU 达到 100%,每个页面都需要一分钟才能加载。

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

-C选项仅在-B使用 bcrypt 时使用,用于设置 bcrypt 算法的计算时间(值越高越安全但越慢,默认值:5,有效值:4 到 17)。计算 bcrypt 密码哈希值的成本会随着该选项指定的轮数而增加-C

默认加密算法htpasswd使用的是针对 Apache 修改的 MD5 版本。但是使用 -B 选项,您可以使用 bcrypt。目前,Bcrypt 被认为非常安全。

我最终决定进行 7 轮。这似乎效果不错,CPU 不会激增,页面加载时间也不错。

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

相关内容