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.