Повышение производительности Nginx с помощью HTTP-аутентификации и большого количества запросов

У меня есть PHP-сторона, работающая через fpm за сервером Nginx. По причинам $ нам нужна базовая 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% -ной загрузке процессора. Если я удалю 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
0
задан 23 November 2016 в 18:15
2 ответа

Основной причиной моей проблемы был не прямой Nginx, а алгоритм, который я использовал для htpasswd. Так как этот файл проверяется снова и снова в моем конфигурационном файле выше, то вроде как важно использовать алгоритм, не являющийся голодным для этого ресурса. Изначально я использовал алгоритм на основе sha512, вызванный Python hashlib

passlib.hash.sha512_crypt.encrypt(password)

- это было слишком. При переходе на более простой алгоритм через прямой вызов htpasswd

htpasswd /path/to/passwdfile myusername 

проблема производительности исчезла.

.
0
ответ дан 5 December 2019 в 09:09

У меня была такая же проблема с использованием Nginx и базовой аутентификации HTTP. С htpasswd я использовал опцию bcrypt со слишком большим количеством раундов. Я попробовал максимум 17 (с опцией -C 17), но серверу это совсем не понравилось. Процессор был загружен на 100%, и каждая страница загружалась по минуте.

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

Параметр -C, который используется только при использовании bcrypt -B, устанавливает время вычислений, используемое для алгоритма bcrypt (чем больше, тем безопаснее, но медленнее, по умолчанию: 5, действительны: от 4 до 17). Стоимость вычисления хеш-значения пароля bcrypt увеличивается с увеличением количества раундов, указанного параметром -C.

Алгоритм шифрования по умолчанию, используемый htpasswd, представляет собой версию MD5, модифицированную для Apache. Но с опцией -B вы можете использовать bcrypt. Bcrypt сейчас считается очень безопасным.

В итоге я остановился на 7 раундах. Что, кажется, работает хорошо, процессор не скачет, а время загрузки страницы в порядке.

htpasswd -B -C 7 -c /etc/nginx/.htpasswd username
0
ответ дан 21 April 2021 в 09:32

Теги

Похожие вопросы