ajp: Поддержка AJP протокола прокси с NGINX
Установка на Debian/Ubuntu
Эти документы применимы к APT пакету nginx-module-ajp, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте APT репозиторий, как описано в настройке APT репозитория.
- Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-ajp
Показать дистрибутивы и архитектуры
| Дистрибутив | Версия | Компонент | Архитектуры |
|--------------|------------------|-----------|-----------------|
| debian | bookworm | main | amd64, arm64 |
| debian | bookworm-mainline| main | amd64, arm64 |
| debian | trixie | main | amd64, arm64 |
| debian | trixie-mainline | main | amd64, arm64 |
| ubuntu | focal | main | amd64, arm64 |
| ubuntu | focal-mainline | main | amd64, arm64 |
| ubuntu | jammy | main | amd64, arm64 |
| ubuntu | jammy-mainline | main | amd64, arm64 |
| ubuntu | noble | main | amd64, arm64 |
| ubuntu | noble-mainline | main | amd64, arm64 |
nginx_ajp_module - поддержка AJP протокола прокси с Nginx
Синопсис
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 количество размер;
значение по умолчанию: ajp_buffers 8 4k/8k;
контекст: http, server, location
Эта директива задает количество и размер буферов, в которые будет считываться ответ, полученный от AJP сервера. По умолчанию размер одного буфера равен размеру страницы. В зависимости от платформы это либо 4K, 8K или 16K.
ajp_buffer_size
синтаксис: ajp_buffer_size размер;
значение по умолчанию: ajp_buffer_size 4k/8k;
контекст: http, server, location
Эта директива устанавливает размер буфера, в который будет считываться первая часть ответа, полученная от AJP сервера.
В этой части ответа, как правило, находится небольшой заголовок ответа.
По умолчанию, размер буфера равен размеру одного буфера в директиве ajp_buffers; однако, его можно установить на меньший.
ajp_cache
синтаксис: ajp_cache зона;
значение по умолчанию: off
контекст: http, server, location
Директива указывает область, которая на самом деле является именем общей памяти для кэширования. Та же область может использоваться в нескольких местах. Сначала необходимо установить ajp_cache_path.
ajp_cache_key
синтаксис: ajp_cache_key строка;
значение по умолчанию: 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 отключает кэширование ответа. Если значение начинается с префикса @, оно устанавливает абсолютное время в секундах с начала эпохи, до которого ответ может быть кэширован. Если заголовок не включает поле “X-Accel-Expires”, параметры кэширования могут быть установлены в полях заголовков “Expires” или “Cache-Control”. Если заголовок включает поле “Set-Cookie”, такой ответ не будет кэшироваться. Обработку одного или нескольких из этих полей заголовка ответа можно отключить с помощью директивы ajp_ignore_headers.
ajp_connect_timeout
синтаксис: ajp_connect_timeout время;
значение по умолчанию: ajp_connect_timeout 60s;
контекст: http, server, location
Эта директива устанавливает таймаут для подключения к серверу upstream. Необходимо помнить, что этот таймаут не может превышать 75 секунд.
Это не время до возврата страниц сервером, это ajp_read_timeout выражение. Если ваш сервер upstream работает, но завис (например, у него недостаточно потоков для обработки вашего запроса, поэтому он ставит вас в пул соединений для дальнейшей обработки), то это выражение не поможет, так как соединение с сервером уже установлено.
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 имя;
контекст: http, server, location
По умолчанию Nginx не передает заголовки "Status" и "X-Accel-..." из процесса AJP обратно клиенту. Эта директива может быть использована для скрытия других заголовков.
Если заголовки "Status" и "X-Accel-..." должны быть предоставлены, то необходимо использовать директиву ajp_pass_header, чтобы заставить их вернуться к клиенту.
ajp_ignore_headers
синтаксис: ajp_ignore_headers имя [имя ...];
значение по умолчанию: 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 размер;
значение по умолчанию: ajp_max_data_packet_size 8k;
контекст: http, server, location
Установите максимальный размер пакета данных AJP. Диапазон составляет [8k, 2^16];
ajp_max_temp_file_size
синтаксис: ajp_max_temp_file_size размер;
значение по умолчанию: ajp_max_temp_file_size 1G;
контекст: http, server, location, if
Максимальный размер временного файла, когда содержимое больше, чем буфер прокси. Если файл превышает этот размер, он будет передан синхронно с сервера upstream, а не кэшироваться на диск.
Если 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 имя;
контекст: 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 время;
значение по умолчанию: ajp_read_timeout_time 60
контекст: http, server, location
Директива задает время, в течение которого сервер upstream ожидает, пока процесс 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 время;
значение по умолчанию: ajp_send_timeout 60;
контекст: http, server, location
Эта директива устанавливает таймаут при передаче запроса на сервер upstream. Таймаут устанавливается не на всю передачу запроса, а только между двумя записями. Если после этого времени сервер upstream не примет новые данные, то nginx закроет соединение.
ajp_store
синтаксис: ajp_store [on | off | path] ;
значение по умолчанию: ajp_store off;
контекст: http, server, location
Эта директива устанавливает путь, в котором хранятся файлы upstream. Параметр "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 размер;
значение по умолчанию: ajp_temp_file_write_size ["#ajp buffer size"] * 2;
контекст: http, server, location, if
Устанавливает количество данных, которые будут сброшены в ajp_temp_path при записи. Это может быть использовано, чтобы предотвратить блокировку рабочего процесса слишком надолго во время передачи данных.
Известные проблемы
*
POD ОШИБКИ
Привет! В приведенном выше документе были обнаружены некоторые ошибки кодирования, объясненные ниже:
-
В районе строки 212:
L<> начинается или заканчивается пробелом.