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,于 2023 年 12 月 19 日发布。
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_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 是语法糖,即使您仅设置
ajp_cache_methods POST;
也无法禁用 GET/HEAD。
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
该指令设置缓存路径和其他缓存参数。缓存的数据存储在文件中。缓存中的键和文件名是代理 URL 的 md5。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 指令的参数相匹配。
此外,更新参数允许在当前正在更新时使用过期的缓存响应。这可以在更新缓存数据时最小化对 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;
为响应代码为 200 和 302 的响应设置 10 分钟的缓存,为响应代码为 404 的响应设置 1 分钟的缓存。
如果仅指定缓存时间
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
设置转发请求数据包的缓冲区大小。范围为 (0, 2^16)。
ajp_hide_header
语法: ajp_hide_header name;
上下文: http, server, location
默认情况下,Nginx 不会将 AJP 进程的 "Status" 和 "X-Accel-..." 头传递回客户端。此指令可用于隐藏其他头。
如果必须提供 "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 处理程序,以使其有用。正如 Igor 所说,“如果没有自定义处理程序,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 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
您可以在 nginx-module-ajp 的 GitHub 仓库 中找到此模块的其他配置提示和文档。