Перейти к содержанию

ajp: Поддержка прокси-протокола AJP с NGINX

Установка

Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:

  • RedHat Enterprise Linux 7, 8, 9 и 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-ajp
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-ajp

Включите модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:

load_module modules/ngx_http_ajp_module.so;

Этот документ описывает nginx-module-ajp v0.3.3, выпущенный 19 декабря 2023 года.


    http {
            upstream tomcats {
                    server 127.0.0.1:8009;
                    keepalive 10;
            }

            server {

                    listen 80;

                    location / {
                            ajp_keep_conn on;
                            ajp_pass tomcats;
                    }
            }
    }

Описание

С помощью этого модуля Nginx может напрямую подключаться к порту AJP. Мотивация для написания этих модулей заключается в высокой производительности и надежности Nginx.

Директивы

ajp_buffers

синтаксис: ajp_buffers the_number is_size;

по умолчанию: ajp_buffers 8 4k/8k;

контекст: http, server, location

Эта директива указывает количество и размер буферов, в которые будет считываться ответ, полученный от AJP-сервера. По умолчанию размер одного буфера равен размеру страницы. В зависимости от платформы это может быть 4K, 8K или 16K.

ajp_buffer_size

синтаксис: ajp_buffer_size the_size;

по умолчанию: ajp_buffer_size 4k/8k;

контекст: http, server, location

Эта директива устанавливает размер буфера, в который будет считываться первая часть ответа, полученного от AJP-сервера.

В этой части ответа, как правило, находится небольшой заголовок ответа.

По умолчанию размер буфера равен размеру одного буфера в директиве ajp_buffers; однако его можно установить меньше.

ajp_cache

синтаксис: ajp_cache zone;

по умолчанию: off

контекст: http, server, location

Директива указывает область, которая фактически является именем общей памяти для кэширования. Эта же область может использоваться в нескольких местах. Сначала необходимо установить ajp_cache_path.

ajp_cache_key

синтаксис: ajp_cache_key line;

по умолчанию: none

контекст: http, server, location

Директива указывает, какая информация включается в ключ для кэширования, например

    ajp_cache_key "$host$request_uri$cookie_user";

Обратите внимание, что по умолчанию имя хоста сервера не включается в ключ кэша. Если вы используете поддомены для разных мест на вашем сайте, вам нужно включить его, например, изменив ключ кэша на что-то вроде

    ajp_cache_key "$scheme$host$request_uri";

ajp_cache_methods

синтаксис: ajp_cache_methods [GET HEAD POST];

по умолчанию: ajp_cache_methods GET HEAD;

контекст: main,http,location

GET/HEAD — это синтаксический сахар, т.е. вы не можете отключить GET/HEAD, даже если установите только

    ajp_cache_methods  POST;

ajp_cache_min_uses

синтаксис: ajp_cache_min_uses n;

по умолчанию: ajp_cache_min_uses 1;

контекст: http, server, location

Устанавливает количество запросов, после которых ответ будет кэшироваться.

ajp_cache_path

синтаксис: ajp_cache_path /path/to/cache [levels=m:n keys_zone=name:time inactive=time clean_time=time];

по умолчанию: none

контекст: http, server, location

Эта директива устанавливает путь к кэшу и другие параметры кэширования. Кэшированные данные хранятся в файлах. Ключ и имя файла в кэше — это md5 проксируемого URL. Параметр Levels устанавливает количество подкаталогов в кэше, например для:

    ajp_cache_path  /data/nginx/cache  levels=1:2   keys_zone=one:10m;

имена файлов будут выглядеть так:

/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

ajp_cache_use_stale

синтаксис: ajp_cache_use_stale [updating|error|timeout|invalid_header|http_500];

по умолчанию: ajp_cache_use_stale off;

контекст: http, server, location

Если возникает ошибка при работе с AJP-сервером, возможно использование устаревшего кэшированного ответа. Эта директива определяет, в каких случаях это разрешено. Параметры директивы соответствуют параметрам директивы ajp_next_upstream.

Кроме того, параметр updating позволяет использовать устаревший кэшированный ответ, если он в настоящее время обновляется. Это позволяет минимизировать количество обращений к AJP-серверам при обновлении кэшированных данных.

ajp_cache_valid

синтаксис: ajp_cache_valid [http_error_code|time];

по умолчанию: none

контекст: http, server, location

Устанавливает время кэширования для различных кодов ответа. Например, следующие директивы

    ajp_cache_valid 200 302 10m;
    ajp_cache_valid 404      1m;

устанавливают 10 минут кэширования для ответов с кодами 200 и 302 и 1 минуту для ответов с кодом 404.

Если указано только время кэширования

    ajp_cache_valid 5m;

то кэшируются только ответы 200, 301 и 302.

Кроме того, можно указать кэшировать любые ответы, используя параметр any:

    ajp_cache_valid 200 302 10m;
    ajp_cache_valid 301      1h;
    ajp_cache_valid any      1m;

Параметры кэширования также могут быть установлены непосредственно в заголовке ответа. Это имеет более высокий приоритет, чем установка времени кэширования с помощью директивы. Поле заголовка “X-Accel-Expires” устанавливает время кэширования ответа в секундах. Значение 0 отключает кэширование ответа. Если значение начинается с префикса @, оно устанавливает абсолютное время в секундах с момента Epoch, до которого ответ может быть кэширован. Если заголовок не содержит поля “X-Accel-Expires”, параметры кэширования могут быть установлены в полях заголовков “Expires” или “Cache-Control”. Если заголовок включает поле “Set-Cookie”, такой ответ не будет кэшироваться. Обработку одного или нескольких из этих полей заголовка ответа можно отключить с помощью директивы ajp_ignore_headers.

ajp_connect_timeout

синтаксис: ajp_connect_timeout time;

по умолчанию: ajp_connect_timeout 60s;

контекст: http, server, location

Эта директива устанавливает тайм-аут для подключения к серверу верхнего уровня. Необходимо помнить, что этот тайм-аут не может превышать 75 секунд.

Это не время, пока сервер возвращает страницы, это ajp_read_timeout утверждение. Если ваш сервер верхнего уровня работает, но завис (например, у него недостаточно потоков для обработки вашего запроса, и он помещает вас в пул соединений для обработки позже), то это утверждение не поможет, так как соединение с сервером уже установлено.

ajp_header_packet_buffer_size

синтаксис: ajp_header packet_buffer_size;

по умолчанию: ajp_header_packet_buffer_size 8k;

контекст: http, server, location

Устанавливает размер буфера пакета Forward Request. Диапазон — (0, 2^16).

ajp_hide_header

синтаксис: ajp_hide_header name;

контекст: http, server, location

По умолчанию Nginx не передает заголовки "Status" и "X-Accel-..." от процесса AJP обратно клиенту. Эта директива может быть использована для скрытия других заголовков.

Если заголовки "Status" и "X-Accel-..." должны быть предоставлены, то необходимо использовать директиву ajp_pass_header, чтобы заставить их вернуться к клиенту.

ajp_ignore_headers

синтаксис: ajp_ignore_headers name [name ...];

по умолчанию: none

контекст: http, server, location

Эта директива (0.7.54+) запрещает обработку строк заголовков из ответа прокси-сервера.

Можно указать строку, такую как "X-Accel-Redirect", "X-Accel-Expires", "Expires" или "Cache-Control".

ajp_ignore_client_abort

синтаксис: ajp_ignore_client_abort on|off;

по умолчанию: ajp_ignore_client_abort off;

контекст: http, server, location

Эта директива определяет, должен ли текущий запрос к AJP-серверу быть прерван в случае, если клиент прервал запрос к серверу.

ajp_intercept_errors

синтаксис: ajp_intercept_errors on|off;

по умолчанию: ajp_intercept_errors off;

контекст: http, server, location

Эта директива определяет, следует ли передавать ошибки 4xx и 5xx обратно клиенту или позволить Nginx ответить с помощью директивы error_page.

Примечание: вам нужно явно определить обработчик error_page, чтобы это было полезно. Как говорит Игорь: "nginx не перехватывает ошибку, если для нее нет пользовательского обработчика, он не показывает свои стандартные страницы. Это позволяет перехватывать некоторые ошибки, передавая другие как есть."

ajp_keep_conn

синтаксис: ajp_keep_conn on|off;

по умолчанию: ajp_keep_conn off;

контекст: http, server, location

Эта директива определяет, следует ли поддерживать соединение с сервером на стороне бэкенда.

ajp_next_upstream

синтаксис: ajp_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];

по умолчанию: ajp_next_upstream error timeout;

контекст: http, server, location

Директива определяет, в каких случаях запрос будет передан следующему серверу:

  • error — произошла ошибка при подключении к серверу, отправке запроса к нему или чтении его ответа;
  • timeout — произошел тайм-аут при подключении к серверу, передаче запроса или чтении ответа от сервера;
  • invalid_header — сервер вернул пустой или некорректный ответ;
  • http_500 — сервер вернул ответ с кодом 500;
  • http_502 — сервер вернул ответ с кодом 502;
  • http_503 — сервер вернул ответ с кодом 503;
  • http_504 — сервер вернул ответ с кодом 504;
  • http_404 — сервер вернул ответ с кодом 404;
  • off — запрещает передачу запроса следующему серверу. Передача запроса следующему серверу возможна только тогда, когда ничего не было передано клиенту — то есть, если ошибка или тайм-аут возникают в середине передачи запроса, то невозможно повторить текущий запрос на другом сервере.

ajp_max_data_packet_size

синтаксис: ajp_max_data_packet_size size;

по умолчанию: ajp_max_data_packet_size 8k;

контекст: http, server, location

Устанавливает максимальный размер пакета данных AJP. Диапазон — [8k, 2^16];

ajp_max_temp_file_size

синтаксис: ajp_max_temp_file_size size;

по умолчанию: ajp_max_temp_file_size 1G;

контекст: http, server, location, if

Максимальный размер временного файла, когда содержимое больше, чем прокси-буфер. Если файл больше этого размера, он будет обслуживаться синхронно с сервера верхнего уровня, а не кэшироваться на диск.

Если ajp_max_temp_file_size равен нулю, использование временных файлов будет отключено.

ajp_pass

синтаксис: ajp_pass ajp-server

по умолчанию: none

контекст: location, if in location

Директива назначает порт или сокет, на котором слушает AJP-сервер. Порт может быть указан самостоятельно или как адрес и порт, например:

    ajp_pass   localhost:9000;

с использованием сокета Unix:

    ajp_pass   unix:/tmp/ajp.socket;

Вы также можете использовать блок upstream.

    upstream backend  {
            server   localhost:1234;
    }

    ajp_pass   backend;

ajp_secret

синтаксис: ajp_secret ajpsecret

по умолчанию: none

Директива назначает секрет AJP-сервера.

ajp_pass_header

синтаксис: ajp_pass_header name;

контекст: http, server, location

Разрешает передавать определенные поля заголовков от AJP-сервера к клиенту.

ajp_pass_request_headers

синтаксис: ajp_pass_request_headers [ on | off ];

по умолчанию: ajp_pass_request_headers on;

контекст: http, server, location

Разрешает передавать поля заголовков запроса от клиента к серверу.

ajp_pass_request_body

синтаксис: ajp_pass_request_body [ on | off ] ;

по умолчанию: ajp_pass_request_body on;

контекст: http, server, location

Разрешает передавать тело запроса от клиента к серверу.

ajp_read_timeout

синтаксис: ajp_read_timeout time;

по умолчанию: ajp_read_timeout_time 60

контекст: http, server, location

Директива устанавливает время, в течение которого сервер верхнего уровня должен ждать, чтобы процесс AJP отправил данные. Измените эту директиву, если у вас есть длительные процессы AJP, которые не производят вывод, пока не завершат обработку. Если вы видите ошибку тайм-аута на стороне сервера в журнале ошибок, увеличьте этот параметр до более подходящего значения.

ajp_send_lowat

синтаксис: ajp_send_lowat [ on | off ];

по умолчанию: ajp_send_lowat off;

контекст: http, server, location, if

Эта директива устанавливает SO_SNDLOWAT. Эта директива доступна только на FreeBSD.

ajp_send_timeout

синтаксис: ajp_send_timeout time;

по умолчанию: ajp_send_timeout 60;

контекст: http, server, location

Эта директива устанавливает тайм-аут при передаче запроса к серверу верхнего уровня. Тайм-аут устанавливается не на всю передачу запроса, а только между двумя операциями записи. Если после этого времени сервер верхнего уровня не примет новые данные, то nginx закроет соединение.

ajp_store

синтаксис: ajp_store [on | off | path] ;

по умолчанию: ajp_store off;

контекст: http, server, location

Эта директива устанавливает путь, в котором хранятся файлы верхнего уровня. Параметр "on" сохраняет файлы в соответствии с путем, указанным в директивах alias или root. Параметр "off" запрещает хранение. Кроме того, имя пути можно явно задать с помощью строки с переменными:

    ajp_store   /data/www$original_uri;

Время изменения файла будет установлено на дату заголовка "Last-Modified" в ответе. Чтобы иметь возможность сохранять файлы в этом каталоге, необходимо, чтобы путь находился в каталоге с временными файлами, указанном директивой ajp_temp_path для местоположения данных.

Эта директива может быть использована для создания локальных копий динамического вывода бэкенда, который не часто изменяется, например:

    location /images/ {
            root                 /data/www;
            error_page           404 = @fetch;
    }

    location @fetch {
            internal;
            ajp_pass           backend;
            ajp_store          on;
            ajp_store_access   user:rw  group:rw  all:r;
            ajp_temp_path      /data/temp;

            root               /data/www;
    }

Чтобы было ясно, ajp_store не является кэшем, это скорее зеркало по запросу.

ajp_store_access

синтаксис: ajp_store_access users:permissions [users:permission ...];

по умолчанию: ajp_store_access user:rw;

контекст: http, server, location

Эта директива назначает права для созданных файлов и каталогов, например:

    ajp_store_access  user:rw  group:rw  all:r;

Если какие-либо права для групп или всех назначены, то не нужно назначать права для пользователя:

    ajp_store_access  group:rw  all:r;

ajp_temp_path

синтаксис: ajp_temp_path dir-path [ level1 [ level2 [ level3 ] ] ] ;

по умолчанию: $NGX_PREFIX/ajp_temp

контекст: http, server, location

Эта директива работает как client_body_temp_path для указания местоположения для буферизации больших проксируемых запросов в файловую систему.

ajp_temp_file_write_size

синтаксис: ajp_temp_file_write_size size;

по умолчанию: ajp_temp_file_write_size ["#ajp buffer size"] * 2;

контекст: http, server, location, if

Устанавливает количество данных, которые будут сброшены в ajp_temp_path при записи. Это может быть использовано для предотвращения блокировки рабочего процесса на слишком долгое время при записи данных.

Известные проблемы

*

POD ОШИБКИ

Эй! В приведенном выше документе были некоторые ошибки кодирования, которые объяснены ниже:

  • Вокруг строки 212:

    L<> начинается или заканчивается пробелом

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-ajp.