ajp: Unterstützung des AJP-Protokolls mit NGINX
Installation
Sie können dieses Modul in jeder RHEL-basierten Distribution installieren, einschließlich, aber nicht beschränkt auf:
- RedHat Enterprise Linux 7, 8, 9 und 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 und 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
Aktivieren Sie das Modul, indem Sie Folgendes an den Anfang von /etc/nginx/nginx.conf hinzufügen:
load_module modules/ngx_http_ajp_module.so;
Dieses Dokument beschreibt nginx-module-ajp v0.3.6 veröffentlicht am 13. Februar 2026.
http {
upstream tomcats {
server 127.0.0.1:8009;
keepalive 10;
}
server {
listen 80;
location / {
ajp_keep_conn on;
ajp_pass tomcats;
}
}
}
Beschreibung
Mit diesem Modul kann Nginx direkt mit dem AJP-Port verbunden werden. Die Motivation für das Schreiben dieser Module ist die hohe Leistung und Robustheit von Nginx.
Direktiven
ajp_buffers
Syntax: ajp_buffers die_anzahl ist_größe;
Standard: ajp_buffers 8 4k/8k;
Kontext: http, server, location
Diese Direktive gibt die Anzahl und die Größe der Puffer an, in die die Antwort, die vom AJP-Server erhalten wird, gelesen wird. Standardmäßig entspricht die Größe eines Puffers der Größe einer Seite. Abhängig von der Plattform beträgt dies entweder 4K, 8K oder 16K.
ajp_buffer_size
Syntax: ajp_buffer_size die_größe;
Standard: ajp_buffer_size 4k/8k;
Kontext: http, server, location
Diese Direktive legt die Puffergröße fest, in die der erste Teil der Antwort, der vom AJP-Server erhalten wird, gelesen wird.
In diesem Teil der Antwort befindet sich in der Regel der kleine Antwort-Header.
Standardmäßig entspricht die Puffergröße der Größe eines Puffers in der Direktive ajp_buffers; es ist jedoch möglich, sie kleiner zu setzen.
ajp_cache
Syntax: ajp_cache zone;
Standard: off
Kontext: http, server, location
Die Direktive gibt den Bereich an, der tatsächlich der Name des gemeinsamen Speichers für das Caching ist. Derselbe Bereich kann an mehreren Stellen verwendet werden. Sie müssen zuerst den ajp_cache_path festlegen.
ajp_cache_key
Syntax: ajp_cache_key zeile;
Standard: none
Kontext: http, server, location
Die Direktive gibt an, welche Informationen im Schlüssel für das Caching enthalten sind, zum Beispiel
ajp_cache_key "$host$request_uri$cookie_user";
Beachten Sie, dass standardmäßig der Hostname des Servers nicht im Cache-Schlüssel enthalten ist. Wenn Sie Subdomains für verschiedene Standorte auf Ihrer Website verwenden, müssen Sie ihn einfügen, z.B. indem Sie den Cache-Schlüssel in etwas wie
ajp_cache_key "$scheme$host$request_uri";
ändern.
ajp_cache_methods
Syntax: ajp_cache_methods [GET HEAD POST];
Standard: ajp_cache_methods GET HEAD;
Kontext: main,http,location
GET/HEAD ist Syntaxzucker, d.h. Sie können GET/HEAD nicht deaktivieren, selbst wenn Sie nur
ajp_cache_methods POST;
setzen.
ajp_cache_min_uses
Syntax: ajp_cache_min_uses n;
Standard: ajp_cache_min_uses 1;
Kontext: http, server, location
Legt die Anzahl der Anfragen fest, nach denen die Antwort zwischengespeichert wird.
ajp_cache_path
Syntax: ajp_cache_path /path/to/cache [levels=m:n keys_zone=name:time inactive=time clean_time=time];
Standard: none
Kontext: http, server, location
Diese Direktive legt den Cache-Pfad und andere Cache-Parameter fest. Zwischengespeicherte Daten werden in Dateien gespeichert. Der Schlüssel und der Dateiname im Cache sind md5 der proxied URL. Levels-Parameter legt die Anzahl der Unterverzeichnisse im Cache fest, zum Beispiel für:
ajp_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
werden die Dateinamen wie folgt aussehen:
/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
ajp_cache_use_stale
Syntax: ajp_cache_use_stale [updating|error|timeout|invalid_header|http_500];
Standard: ajp_cache_use_stale off;
Kontext: http, server, location
Wenn ein Fehler beim Arbeiten mit dem AJP-Server auftritt, ist es möglich, eine veraltete zwischengespeicherte Antwort zu verwenden. Diese Direktive bestimmt, in welchen Fällen dies zulässig ist. Die Parameter der Direktive entsprechen denen der Direktive ajp_next_upstream.
Zusätzlich erlaubt der Parameter updating die Verwendung einer veralteten zwischengespeicherten Antwort, wenn sie derzeit aktualisiert wird. Dies minimiert die Anzahl der Zugriffe auf AJP-Server beim Aktualisieren von zwischengespeicherten Daten.
ajp_cache_valid
Syntax: ajp_cache_valid [http_error_code|time];
Standard: none
Kontext: http, server, location
Legt die Cache-Zeit für verschiedene Antwortcodes fest. Zum Beispiel setzen die folgenden Direktiven
ajp_cache_valid 200 302 10m;
ajp_cache_valid 404 1m;
10 Minuten Caching für Antworten mit den Codes 200 und 302 und 1 Minute für Antworten mit dem Code 404.
Wenn nur die Cache-Zeit angegeben ist
ajp_cache_valid 5m;
dann werden nur 200, 301 und 302 Antworten zwischengespeichert.
Darüber hinaus kann angegeben werden, dass alle Antworten mit dem any-Parameter zwischengespeichert werden:
ajp_cache_valid 200 302 10m;
ajp_cache_valid 301 1h;
ajp_cache_valid any 1m;
Die Parameter für das Caching können auch direkt im Antwort-Header festgelegt werden. Dies hat eine höhere Priorität als die Festlegung der Cache-Zeit mit der Direktive. Das Headerfeld „X-Accel-Expires“ legt die Cache-Zeit einer Antwort in Sekunden fest. Der Wert 0 deaktiviert das Caching einer Antwort. Wenn ein Wert mit dem Präfix @ beginnt, wird eine absolute Zeit in Sekunden seit der Epoche festgelegt, bis zu der die Antwort zwischengespeichert werden kann. Wenn der Header das Feld „X-Accel-Expires“ nicht enthält, können die Parameter für das Caching in den Headerfeldern „Expires“ oder „Cache-Control“ festgelegt werden. Wenn ein Header das Feld „Set-Cookie“ enthält, wird eine solche Antwort nicht zwischengespeichert. Die Verarbeitung eines oder mehrerer dieser Antwort-Headerfelder kann mit der Direktive ajp_ignore_headers deaktiviert werden.
ajp_connect_timeout
Syntax: ajp_connect_timeout time;
Standard: ajp_connect_timeout 60s;
Kontext: http, server, location
Diese Direktive weist einen Timeout für die Verbindung zum Upstream-Server zu. Es ist zu beachten, dass dieser Timeout nicht mehr als 75 Sekunden betragen kann.
Dies ist nicht die Zeit, bis der Server die Seiten zurückgibt, dies ist die ajp_read_timeout Anweisung. Wenn Ihr Upstream-Server aktiv ist, aber hängt (z.B. wenn er nicht genügend Threads hat, um Ihre Anfrage zu verarbeiten, und Sie in den Pool von Verbindungen stellt, die später bearbeitet werden), wird diese Anweisung nicht helfen, da die Verbindung zum Server bereits hergestellt wurde.
ajp_header_packet_buffer_size
Syntax: ajp_header packet_buffer_size;
Standard: ajp_header_packet_buffer_size 8k;
Kontext: http, server, location
Setzt die Puffergröße des Forward Request-Pakets. Der Bereich ist (0, 2^16).
ajp_headers_hash_bucket_size
Syntax: ajp_headers_hash_bucket_size size;
Standard: ajp_headers_hash_bucket_size 64;
Kontext: http, server, location
Legt die Bucket-Größe für Hash-Tabellen fest, die von den ajp_hide_header und ajp_set_header Direktiven verwendet werden.
ajp_headers_hash_max_size
Syntax: ajp_headers_hash_max_size size;
Standard: ajp_headers_hash_max_size 512;
Kontext: http, server, location
Legt die maximale Größe von Hash-Tabellen fest, die von den ajp_hide_header und ajp_set_header Direktiven verwendet werden.
ajp_hide_header
Syntax: ajp_hide_header name;
Kontext: http, server, location
Standardmäßig gibt Nginx die Header "Status" und "X-Accel-..." vom AJP-Prozess nicht an den Client weiter. Diese Direktive kann verwendet werden, um auch andere Header zu verbergen.
Wenn die Header "Status" und "X-Accel-..." bereitgestellt werden müssen, ist es notwendig, die Direktive ajp_pass_header zu verwenden, um sie an den Client zurückzugeben.
ajp_ignore_headers
Syntax: ajp_ignore_headers name [name ...];
Standard: none
Kontext: http, server, location
Diese Direktive (0.7.54+) verbietet die Verarbeitung der Header-Zeilen aus der Antwort des Proxy-Servers.
Es kann eine Zeichenfolge wie "X-Accel-Redirect", "X-Accel-Expires", "Expires" oder "Cache-Control" angegeben werden.
ajp_ignore_client_abort
Syntax: ajp_ignore_client_abort on|off;
Standard: ajp_ignore_client_abort off;
Kontext: http, server, location
Diese Direktive bestimmt, ob die aktuelle Anfrage an den AJP-Server abgebrochen werden muss, falls der Client die Anfrage an den Server abbricht.
ajp_intercept_errors
Syntax: ajp_intercept_errors on|off;
Standard: ajp_intercept_errors off;
Kontext: http, server, location
Diese Direktive bestimmt, ob 4xx- und 5xx-Fehler an den Client zurückgegeben oder ob Nginx mit der Direktive error_page antworten soll.
Hinweis: Sie müssen den error_page-Handler explizit definieren, damit dies nützlich ist. Wie Igor sagt: "Nginx interceptiert keinen Fehler, wenn es keinen benutzerdefinierten Handler dafür gibt, zeigt es nicht seine Standardseiten. Dies ermöglicht es, einige Fehler abzufangen, während andere so weitergegeben werden, wie sie sind."
ajp_keep_conn
Syntax: ajp_keep_conn on|off;
Standard: ajp_keep_conn off;
Kontext: http, server, location
Diese Direktive bestimmt, ob die Verbindung mit dem Backend-Server aufrechterhalten werden soll.
ajp_next_upstream
Syntax: ajp_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
Standard: ajp_next_upstream error timeout;
Kontext: http, server, location
Die Direktive bestimmt, in welchen Fällen die Anfrage an den nächsten Server übertragen wird:
- error — es ist ein Fehler beim Verbinden mit dem Server, beim Senden einer Anfrage an ihn oder beim Lesen seiner Antwort aufgetreten;
- timeout — es ist ein Timeout während der Verbindung mit dem Server, beim Übertragen der Anfrage oder beim Lesen der Antwort vom Server aufgetreten;
- invalid_header — der Server hat eine leere oder falsche Antwort zurückgegeben;
- http_500 — der Server hat eine Antwort mit dem Code 500 zurückgegeben;
- http_502 — der Server hat eine Antwort mit dem Code 502 zurückgegeben;
- http_503 — der Server hat eine Antwort mit dem Code 503 zurückgegeben;
- http_504 — der Server hat eine Antwort mit dem Code 504 zurückgegeben;
- http_404 — der Server hat eine Antwort mit dem Code 404 zurückgegeben;
- off — es verbietet die Übertragung der Anfrage an den nächsten Server. Die Übertragung der Anfrage an den nächsten Server ist nur möglich, wenn nichts an den Client übertragen wurde — das heißt, wenn ein Fehler oder Timeout während der Übertragung der Anfrage auftritt, ist es nicht möglich, die aktuelle Anfrage auf einem anderen Server erneut zu versuchen.
ajp_max_data_packet_size
Syntax: ajp_max_data_packet_size size;
Standard: ajp_max_data_packet_size 8k;
Kontext: http, server, location
Setzt die maximale Größe des AJP-Datenpakets. Der Bereich ist [8k, 2^16];
ajp_max_temp_file_size
Syntax: ajp_max_temp_file_size size;
Standard: ajp_max_temp_file_size 1G;
Kontext: http, server, location, if
Die maximale Größe einer temporären Datei, wenn der Inhalt größer als der Proxy-Puffer ist. Wenn die Datei größer als diese Größe ist, wird sie synchron vom Upstream-Server bedient, anstatt auf die Festplatte gepuffert zu werden.
Wenn ajp_max_temp_file_size gleich null ist, wird die Verwendung temporärer Dateien deaktiviert.
ajp_pass
Syntax: ajp_pass ajp-server
Standard: none
Kontext: location, if in location
Die Direktive weist den Port oder Socket zu, auf dem der AJP-Server lauscht. Der Port kann allein oder als Adresse und Port angegeben werden, zum Beispiel:
ajp_pass localhost:9000;
unter Verwendung eines Unix-Domain-Sockets:
ajp_pass unix:/tmp/ajp.socket;
Sie können auch einen Upstream-Block verwenden.
upstream backend {
server localhost:1234;
}
ajp_pass backend;
ajp_secret
Syntax: ajp_secret ajpsecret
Standard: none
Die Direktive weist das Geheimnis des AJP-Servers zu.
ajp_pass_header
Syntax: ajp_pass_header name;
Kontext: http, server, location
Erlaubt das Übertragen spezifischer Headerfelder vom AJP-Server an einen Client.
ajp_pass_request_headers
Syntax: ajp_pass_request_headers [ on | off ];
Standard: ajp_pass_request_headers on;
Kontext: http, server, location
Erlaubt das Übertragen von Anfrage-Headerfeldern vom Client an den Server.
ajp_pass_request_body
Syntax: ajp_pass_request_body [ on | off ] ;
Standard: ajp_pass_request_body on;
Kontext: http, server, location
Erlaubt das Übertragen des Anfragekörpers vom Client an den Server.
ajp_read_timeout
Syntax: ajp_read_timeout time;
Standard: ajp_read_timeout_time 60
Kontext: http, server, location
Die Direktive legt die Zeitspanne fest, die der Upstream warten soll, bis ein AJP-Prozess Daten sendet. Ändern Sie diese Direktive, wenn Sie langlaufende AJP-Prozesse haben, die keine Ausgabe erzeugen, bis sie die Verarbeitung abgeschlossen haben. Wenn Sie einen Upstream-Timeout-Fehler im Fehlerprotokoll sehen, erhöhen Sie diesen Parameter auf etwas Angemessenes.
ajp_send_lowat
Syntax: ajp_send_lowat [ on | off ];
Standard: ajp_send_lowat off;
Kontext: http, server, location, if
Diese Direktive setzt SO_SNDLOWAT. Diese Direktive ist nur auf FreeBSD verfügbar.
ajp_send_timeout
Syntax: ajp_send_timeout time;
Standard: ajp_send_timeout 60;
Kontext: http, server, location
Diese Direktive weist einen Timeout für die Übertragung der Anfrage an den Upstream-Server zu. Der Timeout wird nicht für die gesamte Übertragung der Anfrage festgelegt, sondern nur zwischen zwei Schreiboperationen. Wenn der Upstream-Server nach dieser Zeit keine neuen Daten annimmt, wird die Verbindung von Nginx geschlossen.
ajp_set_header
Syntax: ajp_set_header name value;
Kontext: http, server, location
Erlaubt das Neudefinieren oder Anhängen von Feldern an den Anfrage-Header, der an den AJP-Server übergeben wird. Der Wert kann Text, Variablen und deren Kombinationen enthalten.
Diese Direktiven werden vom vorherigen Konfigurationsebenen geerbt, wenn und nur wenn keine ajp_set_header Direktiven auf der aktuellen Ebene definiert sind.
ajp_store
Syntax: ajp_store [on | off | path] ;
Standard: ajp_store off;
Kontext: http, server, location
Diese Direktive legt den Pfad fest, in dem Upstream-Dateien gespeichert werden. Der Parameter "on" bewahrt Dateien gemäß dem in den Direktiven alias oder root angegebenen Pfad. Der Parameter "off" verbietet das Speichern. Darüber hinaus kann der Name des Pfades eindeutig mit Hilfe der Zeile mit den Variablen zugewiesen werden:
ajp_store /data/www$original_uri;
Die Änderungszeit für die Datei wird auf das Datum des "Last-Modified" Headers in der Antwort gesetzt. Um Dateien in diesem Verzeichnis speichern zu können, muss der Pfad unter dem Verzeichnis mit temporären Dateien liegen, das durch die Direktive ajp_temp_path für den Datenstandort angegeben ist.
Diese Direktive kann verwendet werden, um lokale Kopien für dynamische Ausgaben des Backends zu erstellen, die nicht sehr oft geändert werden, zum Beispiel:
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;
}
Um klarzustellen, ajp_store ist kein Cache, es ist eher ein On-Demand-Spiegel.
ajp_store_access
Syntax: ajp_store_access users:permissions [users:permission ...];
Standard: ajp_store_access user:rw;
Kontext: http, server, location
Diese Direktive weist die Berechtigungen für die erstellten Dateien und Verzeichnisse zu, zum Beispiel:
ajp_store_access user:rw group:rw all:r;
Wenn Rechte für Gruppen oder alle zugewiesen werden, ist es nicht notwendig, Rechte für den Benutzer zuzuweisen:
ajp_store_access group:rw all:r;
ajp_temp_path
Syntax: ajp_temp_path dir-path [ level1 [ level2 [ level3 ] ] ] ;
Standard: $NGX_PREFIX/ajp_temp
Kontext: http, server, location
Diese Direktive funktioniert wie client_body_temp_path, um einen Speicherort für große proxied Anfragen im Dateisystem anzugeben.
ajp_temp_file_write_size
Syntax: ajp_temp_file_write_size size;
Standard: ajp_temp_file_write_size ["#ajp buffer size"] * 2;
Kontext: http, server, location, if
Setzt die Menge an Daten, die beim Schreiben in den ajp_temp_path gespült werden. Es kann verwendet werden, um zu verhindern, dass ein Worker-Prozess zu lange blockiert, während Daten gespult werden.
Bekannte Probleme
*
GitHub
Sie finden zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul im GitHub-Repository für nginx-module-ajp.