Назад | Перейти на главную страницу

Проблемы с производительностью Nginx при запросе одного пользователя, но с большим файлом конфигурации

У меня следующая конфигурация, используемая в серверном блоке, и по мере роста количества местоположений производительность существенно снизилась, даже если есть только один запрос (например, https://example.com/loc1/MyContext/index.html). Прямой доступ (без прокси) очень быстрый. Под ухудшением я подразумеваю, что отображение страницы через прокси занимает минуты, а для прямого доступа - секунды.

Назначение нескольких перенаправлений для одного и того же местоположения связано со следующим исходным требованием.

https://example.com/loc1 -> should go to https://example.com/loc1/MyContext/index.html
https://example.com/loc1/ -> should go to https://example.com/loc1/MyContext/index.html
https://example.com/loc1/myadmin -> should go to https://example.com/loc1/MyContext/index.html
https://example.com/loc1/admin -> should go to https://example.com/loc1/MyContext/admin.html
https://example.com/loc1/reporter -> should go to https://example.com/loc1/reporter/index.html

Пользователь всегда может ввести полный URL-адрес (например, через закладку). Keepalive_timeout установлен в 0, потому что прокси-сервер не поддерживает keepalive. Общие заголовки включены из общего файла, включенного с помощью директивы include (но удалены из этого вопроса для простоты).

Для каждого прокси-сервера есть 6 блоков местоположения для поддержки вышеупомянутой схемы URL. Размер файла конфигурации по умолчанию теперь превышает 250 КБ.

Вопросы / проблемы: 1. Почему производительность упала до такого уровня, что даже первое расположение в файле конфигурации занимает несколько минут (и даже время от времени истекает). Прокси-сервер очень удобен для прямого доступа. 2. Как можно отредактировать конфигурацию местоположения, чтобы уменьшить время отклика

Основной файл конфигурации (nginx.conf) выглядит следующим образом

user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 50000;

events {
    worker_connections  4096;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    underscores_in_headers on;
    proxy_buffering off;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    error_log   /var/log/nginx/error.log  debug;

    sendfile        on;
    #tcp_nopush     on;
    server_tokens   off;
    keepalive_timeout  0;
    #gzip  on;

    include /etc/nginx/conf.d/default.conf;
}

Default.conf выглядит следующим образом:

server {
  listen 80;
  return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name example.com;
    ssl on;
    ssl_certificate       /etc/nginx/security/server.pem;
    ssl_certificate_key   /etc/nginx/security/key.pem;
    ssl_session_cache shared:SSL:5m;
    ssl_protocols TLSv1.2;
    server_name_in_redirect on;
    client_max_body_size 100m;

    location = /loc1 {
        try_files $uri $uri/ =301 /loc1/myadmin;
    }
    location = /loc1/myadmin {
        return 301 https://example.com/loc1/MyContext/index.html;
    }
    location = /loc1/admin {
        return 301 https://example.com/loc1/MyContext/admin.html;
    }
    location = /loc1/reporter {
        return 301 https://example.com/loc1/reporter/index.html;
    }

    location = /loc1/ {
        return 301 https://example.com/loc1/MyContext/index.html;
    }

    location /loc1/ {
        proxy_pass          https://Sevice_1_IP_Address:443/;
        proxy_set_header        Host <Service_1_IP_Address>;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection "Upgrade";
        proxy_buffering         off;
        proxy_http_version      1.1;
        proxy_set_header        Origin '';
    }   

    location = /loc2 {
        try_files $uri $uri/ =301 /loc2/myadmin;
    }
    location = /loc2/myadmin {
        return 301 https://example.com/loc2/MyContext/index.html;
    }
    location = /loc2/admin {
        return 301 https://example.com/loc2/MyContext/admin.html;
    }
    location = /loc2/reporter {
        return 301 https://example.com/loc2/reporter/index.html;
    }

    location = /loc2/ {
        return 301 https://example.com/loc2/MyContext/index.html;
    }

    location /loc2/ {
        proxy_pass          https://Sevice_2_IP_Address:443/;
        proxy_set_header        Host <Service_2_IP_Address>;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;
        proxy_set_header        Upgrade $http_upgrade;
        proxy_set_header        Connection "Upgrade";
        proxy_buffering         off;
        proxy_http_version      1.1;
        proxy_set_header        Origin '';
    }

}

Я искал через SO и этот форум, но не нашел ничего, что указывает на мою проблему. Буду рад предоставить любую дополнительную информацию.

Судя по всему, проблема была решена после перезапуска модуля k8s. До этого я пытался проверить все показатели, связанные с процессором, памятью, диском и т. Д., И волноваться было не о чем.

Так что я не знаю, что послужило причиной исправления, поэтому считаю это разовым случаем.

Рефакторинг конфигурации я бы еще хотел посвятить отдельным вопросом. Спасибо всем, что уделили время.