跳转至

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" 根据指令 aliasroot 中指定的路径保留文件。参数 "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 仓库 中找到此模块的其他配置提示和文档。