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

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

Установка на Debian/Ubuntu

Эти документы применимы к APT пакету nginx-module-ajp, предоставляемому репозиторием GetPageSpeed Extras.

  1. Настройте APT репозиторий, как описано в настройке APT репозитория.
  2. Установите модуль:
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<> начинается или заканчивается пробелом.