NGINX 指令
1517 — 所有核心与模块指令——语法、默认值、上下文与真实配置示例。
说明
'master_process' 指令是一个标志,用于确定 NGINX 是否以主模式运行或以单进程模式运行。当设置为 'on' 时,启用主进程,允许 NGINX 管理 worker 进程。 这是 NGINX 的标准运行模式,在该模式下主进程负责管理 worker 进程,包括根据流量需求创建和终止它们。 如果 'master_process' 被设置为 'off',NGINX 将在没有主进程的情况下以单进程模式运行。在这种模式下没有 worker 进程;NGINX 会在单个进程中处理所有请求。这在调试或不需要多进程的轻量级环境中可能有用,但效率低于典型的主-worker 模型。配置此指令对于确保 NGINX 在预期的多线程环境中正常工作至关重要,在该环境中多个 worker 进程可以提高性能和资源利用率。 此指令的参数是一个简单标志——"on" 或 "off"——用于指示是否应启用或禁用主进程。它通常出现在 nginx 配置文件的 main 上下文中,其用法可能根据具体部署要求(例如资源限制或运行目标)而有所不同。
配置示例
master_process on;
将 'master_process' 设置为 'off' 会禁用工作进程,可能在高负载时导致性能下降。
在 'off' 模式下运行时,请确保您的配置支持在没有工作进程的情况下运行 NGINX。
说明
NGINX 中的 `timer_resolution` 指令允许你指定事件计时器的分辨率(以毫秒为单位)。该指令在核心模块中定义,对于优化 NGINX 的事件处理系统中的计时操作至关重要。通过调整 `timer_resolution`,用户可以影响事件的处理方式,从而可能提高对时序要求较高的应用的性能。 `timer_resolution` 指令的参数是一个表示以毫秒为单位计时器分辨率的单一数值。对于具有高频事件的应用来说,这一点尤其重要,因为更精细的计时器分辨率可能改善这些事件的执行时机。然而,将其设置得过低可能由于更频繁的计时器检查而增加 CPU 开销。因此,找到适合服务器工作负载的平衡至关重要。 请注意,该指令必须在 main context 中设置,也就是说它应该只出现在 NGINX 配置的顶层(例如,在 main configuration block 内,而不是出现在 events 或 http blocks 内)。了解应用对时序精度的需求将帮助你有效地利用该指令来提升整体性能。
配置示例
timer_resolution 100;
在设置非常低的值时要小心,因为它们可能导致更高的 CPU 使用率。
此指令仅在 main 上下文中生效,如果放在其他位置可能会导致错误。
说明
`pid` 指令在 NGINX 核心中用于定义一个文件的位置,该文件在 NGINX 启动时将包含主进程的进程 ID (PID)。这个 PID 文件对于管理 NGINX 进程至关重要,允许管理员轻松跟踪和控制进程,尤其是在执行诸如平滑关闭或重新加载等操作时。通过为该指令提供一个文件路径,NGINX 会在启动时创建该文件并将其 PID 写入其中。这有助于进程管理,确保系统管理员无需猜测进程 ID 就能有效管理服务。 `pid` 指令的参数是一个单一的参数,用于指定存储 PID 的文件路径。通常,该路径应设置为由运行 NGINX 进程的用户可写的位置,因此确保正确的权限很重要。如果由于权限问题或路径错误导致无法创建或写入指定的 PID 文件,NGINX 将报告错误并退出而不启动。因此,务必确保所提供的路径有效且可访问。`pid` 指令必须出现在主配置上下文,通常位于配置文件的顶层,在任何 server 或 location 块之前,因为它涉及整个 NGINX 进程而不是单个服务器进程。
配置示例
pid /var/run/nginx.pid;
确保指定的 PID 文件路径对运行 NGINX 的用户可写;否则 NGINX 将无法启动。
不要在对指定 PID 文件路径没有适当权限的情况下编译 NGINX;这可能导致启动失败。
如果更改 PID 文件位置,请在进行更改前停止 NGINX,因为如果进程已在运行,NGINX 不会自动更新 PID 文件。
说明
`lock_file` 指令在 NGINX 中用于定义一个特定文件,作为锁以防止多个 NGINX 实例同时启动。当 NGINX 启动时,它会尝试使用指定的文件创建锁。如果该文件已存在,表明另一个 NGINX 实例正在运行,则新的实例不会启动,并会记录相应的错误消息。该机制对于维护配置完整性并确保同一时间只有一个主 NGINX 进程在运行至关重要。 传递给 `lock_file` 的参数是一个文件路径,可以设置为任何可写位置。通常,这会是一个临时目录或指定的配置目录。通过仔细选择锁文件的位置,系统管理员可以更有效地管理多实例环境。在自动化脚本或服务管理器可能无意中尝试启动多个 NGINX 实例、从而导致冲突及其他不良状态的场景中,使用锁文件尤其有用。 需要注意的是,如果由于权限问题或文件系统错误无法创建指定的锁文件,NGINX 将无法启动并会显示与无法创建锁文件相关的错误消息。因此,管理员应确保 NGINX 进程具有创建并写入该锁文件的适当权限。
配置示例
lock_file /var/run/nginx.lock;
确保锁文件路径对 NGINX 用户可写。
多个 NGINX 实例使用相同的锁文件可能导致启动失败。
如果锁文件未被正确移除(例如由于崩溃或不当关闭),NGINX 可能无法启动,且需要人工干预。
说明
`worker_processes` 指令决定 NGINX 将创建多少个 worker 进程来处理请求。每个 worker 进程可以同时处理多个连接,使 NGINX 能够根据可用的 CPU 核心数量和传入请求的数量高效扩展。指定的 worker 进程数量会显著影响服务器的整体性能,尤其在高流量情况下。 该指令可以接受表示固定 worker 进程数量的整数值,或关键字 `auto`,指示 NGINX 根据可用的 CPU 核心自动设置数量。当设置为 `auto` 时,NGINX 会根据服务器上检测到的 CPU 核心数量计算 worker 进程数。建议根据硬件和具体应用需求设置此值以获得最佳性能。 在实际配置 `worker_processes` 指令时,系统管理员应监控其应用的负载和性能指标以确定合适的值。将 worker 进程数设置得过低或过高都可能导致性能下降。在某些环境中,可能需要仔细调优以匹配预期负载的特性。
配置示例
worker_processes auto;
将 worker_processes 设置为高于可用 CPU cores 的数量可能导致上下文切换并降低性能。
使用非常少量的 worker processes 可能会在高负载时导致响应变慢,因为可以并发处理的请求更少。
说明
`debug_points` 指令面向希望为调试目的操纵 NGINX 服务器执行流程的开发者和高级用户。该指令可以在主上下文中配置,并接受一个指定应触发哪个调试点的单个参数。该指令可用的操作数是 `stop` 和 `abort`,在执行过程中达到时它们会以不同方式影响 NGINX 进程。 当设置为 `stop` 时,NGINX 会在定义的调试点暂停执行,允许用户在需要时附加调试器。这对于对应用在响应特定请求或系统事件时的行为进行逐步分析尤为有用。另一方面,选择 `abort` 会导致进程立即终止,这对于调试致命错误或在特定不良状态下确保系统完整性很有帮助。 `debug_points` 指令的行为可以大大增强在开发或排查 NGINX 模块和配置时的调试体验。它作为一种在不修改实际源代码的情况下在代码中引入有意断点的机制,从而促进更有效的调试工作流。
配置示例
debug_points stop;
请确保您的 NGINX 构建已启用调试支持,否则该指令可能无法正常工作。
使用 `debug_points` 会影响 NGINX 的性能;在生产环境中应将其移除或注释掉。
说明
`user` 指令在 NGINX 中指定工作进程的用户和组权限。 这对安全非常重要,因为 NGINX 会以非特权用户而不是 root 身份运行,从而降低漏洞可能造成的影响。 该指令接受一个或两个参数:第一个参数是用户名,第二个(可选)是组名。 如果只提供一个参数,NGINX 将使用该用户关联的默认组。 例如,`user nginx;` 将用户设置为 'nginx',并使用该 'nginx' 的默认组。 当同时指定两个参数时,格式为 `user username groupname;`。 该指令必须在 NGINX 配置文件的主上下文中声明,通常在 `nginx.conf` 文件中,在定义 `events` 或 `http` 上下文之前。 该指令的更改仅在 NGINX 启动或重启时生效。如果进程已启动,更改此指令需要完全停止并重新启动 NGINX 才会生效。 应注意确保所指定的用户具有访问必要文件、目录和资源(例如日志或文档根目录)的足够权限,但不要拥有过于宽泛的访问权限,以保持最小权限原则。
配置示例
user www-data; user nginx nginx;
在启动 NGINX 之前,请确保指定的用户在系统上存在。
如果未指定组,将使用该用户的默认组;如果不谨慎管理,可能会导致意外的权限问题。
以权限不足的用户身份运行 NGINX 会导致其无法启动或无法访问所需的资源。
说明
`worker_priority` 指令允许你为 NGINX 的工作进程指定 nice 值,这可以影响操作系统在多核环境中如何调度这些进程。nice 值是一个整数,范围从 -20(最高优先级)到 19(最低优先级),可以细致地控制 CPU 资源如何分配给你的 NGINX 工作进程。该指令在需要相对于其他系统进程优先处理 web 流量的环境中特别有用,能确保 web 服务器在负载下快速且高效地响应。 默认情况下,NGINX 的工作进程继承系统的默认优先级设置。当你使用 `worker_priority` 指令设置特定优先级时,目的是通过减少与可能占用 CPU 资源的其他进程发生争用的可能性,使服务器的响应时间更可预测、更高效。需要注意的是,为 NGINX 工作进程设置较高优先级可能会导致其他系统进程的资源争用,因此需要谨慎考虑整体系统负载和需求。 在配置 NGINX 时,更改 `worker_priority` 设置后务必进行充分测试,因为其效果会根据工作负载和服务器架构有很大差异。此外,并非所有操作系统都支持 nice 的所有取值,因此建议参阅你所使用操作系统的文档以确保兼容性。
配置示例
worker_priority 10;
将优先级设置得过高可能会使服务器上的其他关键进程得不到 CPU 时间,从而导致不稳定。
并非所有操作系统都支持完整范围的优先级值,这可能导致意外的行为。
超过操作系统设置的最大 nice 值可能会导致配置错误。
说明
`worker_cpu_affinity` 指令在 main 上下文中使用,用于指定哪些 CPU 核心可以执行 worker 进程。这样可以通过确保 worker 进程在特定核心上运行来优化性能,从而避免进程在核心之间迁移时可能发生的上下文切换和缓存未命中。该指令接受一个或多个参数来定义 CPU 核心的亲和性。它在多核系统中尤其有用,能够最大化资源利用并最小化延迟。 该指令的参数以 CPU 列表的形式提供,可以用多种形式指定,包括单核指定(例如 '0')、范围指定(例如 '0-3')或两者的组合。每个附加的值表示对应 worker 可使用的允许 CPU 核心。当定义多个 worker 时,CPU 核心可以在这些 worker 之间分配,从而进一步增强并行处理。该配置有助于在高负载场景下保持性能,并能带来更可预测的响应时间。 实现 `worker_cpu_affinity` 可能需要一些试验以根据具体的工作负载和硬件架构确定最优配置。应通过仔细观察系统性能来指导这些决策,因为核心亲和性的有效性会根据工作负载模式和可用 CPU 核心数量等因素而变化。
配置示例
worker_cpu_affinity auto; # Example with specific core assignment for 4 workers: worker_cpu_affinity 0001 0010 0100 1000;
指定过多的 CPU cores 可能因负载分配不当而导致性能下降。
请确保指定的 CPUs 数量不超过系统上可用的 logical cores。
CPU mask 格式不正确可能导致 NGINX 启动错误。
说明
'worker_rlimit_nofile' 指令指定工作进程可以打开的文件描述符数量限制。这对于最大化 NGINX 能处理的并发连接或文件访问数量至关重要。当达到此限制时,工作进程将无法打开更多文件或连接,可能导致请求失败或连接被中断。对于高流量的网站和应用程序,该指令非常重要,因为默认限制可能不足。通过设置更高的值,管理员可以优化 NGINX 服务器的性能和响应性。该值在主上下文中设置,应根据预期流量和服务器的资源可用情况进行配置。
配置示例
worker_rlimit_nofile 65536;
将此指令设置得过高可能会耗尽服务器资源,导致不稳定。
确保系统级别的限制(通过 'ulimit' 设置)与期望值一致;否则,NGINX 将回退到系统限制。
对该指令所做的更改需重启 NGINX 才能生效。
说明
`worker_rlimit_core` 指令用于设置 NGINX 中工作进程生成的 core 文件的最大大小。core 文件是在进程崩溃时捕获其内存镜像的文件。该指令允许 NGINX 管理员指定用于调试和分析的 core 转储文件的最大大小。该指令中指定的值直接对应于 `ulimit` 对 core 转储的设置,从而实现有效的资源管理,并在开发或生产故障场景中便于排查问题。 通过指定非零数值,管理员可以根据需求配置 core 大小限制。但请注意,设置过大的 core 文件大小可能会占用大量磁盘空间,尤其是在进程崩溃频繁的环境中。另一方面,将其设置为 0 则完全禁用 core 转储,这可能在出现问题时妨碍调试工作。通常建议设置一个在捕获有价值调试信息与高效管理磁盘资源之间取得平衡的限制。 该指令必须在 NGINX 配置文件的主上下文中定义,通常在全局配置文件(例如 `nginx.conf`)中设置。管理员应确保拥有修改 core 文件生成设置的相应权限,并在使用此指令时考虑操作系统对 core 转储文件的限制与配置。
配置示例
worker_rlimit_core 512M;
通过将核心转储大小设置为 0 来禁用核心转储会使故障排查更加困难。
如果大量进程崩溃,设置过大的核心转储大小可能会占用大量磁盘空间。
确保运行 NGINX 的用户具有向指定位置写入核心转储文件的权限。
说明
`worker_shutdown_timeout` 指令在 NGINX 中指定在接收到终止信号后,NGINX 将等待工作进程优雅关闭的时长(以毫秒为单位)。这允许工作进程在被强制终止之前完成正在进行的请求并清理资源。在存在长连接或大型请求等可能需要额外时间完成处理的场景中,这一点尤其有用。 如果工作进程未能在指定的超时时间内完成其操作,NGINX 将强制终止这些进程。将此值设置得过低可能导致活动请求被中断,从而造成潜在的数据丢失或事务不完整;反之,设置得过高可能会延迟应用重启或关闭,影响维护或更新期间的可用性。实际上,在此处设置一个合理的值可以在服务连续性与在升级或优雅重启期间的高效资源管理之间取得平衡。
配置示例
worker_shutdown_timeout 30000; # Set a 30 seconds timeout for worker shutdown
将超时时间设置得过低可能导致正在进行的请求被异常终止。
未设置此指令可能导致使用默认超时时间,而默认值可能不适合所有应用程序。
说明
NGINX 中的 `working_directory` 指令用于指定工作进程运行的目录。该设置很重要,因为它决定了在执行时没有指定特定目录的进程的默认工作目录。通过指定工作目录,可以确保配置或其他指令中使用的相对路径相对于该目录正确解析。 该指令接受单个参数,参数应为要设置为 NGINX 工作进程工作环境的目录路径。它必须在 NGINX 配置文件的主上下文中使用。当 NGINX 工作进程启动时,它们会继承此设置,并用于解析相对路径、处理文件操作和管理日志等任务,这有助于有效管理权限和组织文件存储。 重要的是要确保指定的目录对 NGINX 进程可访问,并且已设置适当的权限。如果未提供可访问的目录,可能会在 NGINX 运行期间导致错误,尤其是在处理依赖于工作目录路径的日志或配置文件等文件时。
配置示例
working_directory /var/www/html;
在启动 NGINX 之前,确保指定的目录存在,因为缺失的目录可能导致启动错误。
运行 NGINX 的用户必须具有访问指定工作目录的必要权限。
使用相对路径可能会引起混淆;通常最好使用绝对路径。
说明
'env' 指令在 NGINX 配置文件的主上下文中使用,用于指定应传递给工作进程的环境变量。这对于设置工作进程在运行时可能需要访问的配置值尤其有用,例如 API 密钥、数据库连接字符串或其他可随部署环境变化的设置。'env' 指令的语法很简单;它接受一个参数,用于指定要设置的环境变量名称。您可以使用多个 'env' 指令来设置多个变量,因为每个指令都是独立生效的。 在底层的 C 代码中,'env' 指令在 NGINX 启动阶段被处理。指定的变量会被添加到 NGINX 工作进程的环境变量中,允许像访问任何标准环境变量一样访问它们。'env' 指令在将应用部署到容器化环境(如 Docker)或编排系统(如 Kubernetes)时尤其有用,因为它补充了部署的配置管理实践,使得无需修改应用代码即可轻松修改设置。 需要注意的是,通过 'env' 指令设置的值在 NGINX 进程重新加载时不会持续生效,除非它们在配置文件中被再次显式包含。此外,在启动 NGINX 之后通过系统对环境变量所做的任何更改都不会生效,除非重新启动 NGINX 进程。因此,理解如何有效使用此指令对于在各类部署中维护配置至关重要。
配置示例
env MY_DATABASE_USER; env MY_API_KEY;
在添加或修改 'env' 指令后,务必重启 NGINX 以使更改生效。
环境变量必须在正确的上下文中引用,才能被工作进程访问。
说明
`load_module` 指令允许用户在不重新编译整个 NGINX 二进制文件的情况下动态加载指定的 NGINX 模块。该指令必须放在主配置上下文中,并接受一个参数:要加载模块的共享对象文件的路径(通常以 .so 后缀结尾)。当 NGINX 工作进程启动时,该指令会指示 NGINX 尝试加载其参数中指定的模块,从而在不需重启或重新编译的情况下向服务器加入额外功能。 该指令对于启用可选功能或扩展核心 NGINX 能力的第三方模块(例如额外的认证机制或性能改进)可能至关重要。如果该模块依赖于其他模块或共享库,则这些依赖也必须在运行时满足,加载才能成功。用户应确保指定的模块文件可被访问,并且 NGINX 进程具有加载它所需的权限。如果模块加载失败,NGINX 会报告错误,并可能拒绝启动,具体取决于所遇错误的严重性。 为了有效使用该指令,用户通常在 NGINX 主配置块中定义它,该块会在任何其他配置设置之前被处理。重要的是要注意,应事先解决模块的任何依赖关系以避免运行时错误。
配置示例
load_module modules/ngx_http_custom_module.so;
确保指定的模块文件存在并且 NGINX 进程可以访问它。
检查与其他所需模块或库的依赖关系问题。
请记住仅在 NGINX 配置的主上下文中包含此指令。
说明
error_log 指令在配置 NGINX 的日志行为方面非常重要。它允许管理员定义一个或多个日志文件来记录错误消息,包括关键错误、警告以及有关服务器运行的通知性信息。该指令可使用不同的日志级别,例如 "debug"、"info"、"notice"、"warn"、"error" 和 "crit",用于确定记录消息的严重性。这些日志有助于诊断问题并监控服务器的性能与可靠性。 在最简单的形式中,error_log 指令接受一个参数,用于指定日志的文件路径。如果多次指定,NGINX 会将消息记录到多个文件中,每个文件可以有不同的日志级别。此功能使得可以对日志进行细粒度控制;例如,你可以将一般错误消息写入一个日志文件,而将关键错误写入另一个。默认情况下,日志级别设置为 "error",这意味着除非另行配置,否则只有错误及更严重的消息会被记录。
配置示例
error_log /var/log/nginx/error.log warn;
指定无效的文件路径将阻止日志记录,并可能在运行时导致问题。
多个 error_log 指令如果管理不当会导致混淆,尤其是在日志级别不一致时。
确保 NGINX 用户对日志文件位置具有写入权限。
说明
`pcre_jit` 指令控制是否对使用 PCRE(与 Perl 兼容的正则表达式)库处理的正则表达式使用 Just-In-Time (JIT) 编译。当启用 JIT 时,正则表达式会被转换为本地机器代码以提高模式匹配性能,这可以显著加快依赖正则表达式进行 location 匹配或 server 指令处理的请求处理速度。 该指令可在 `main` 上下文中使用,并可设置为 `on` 或 `off`。默认情况下,JIT 编译是禁用的(off)。然而,启用后,它可以提高使用正则表达式的 NGINX 操作的效率,尤其是在高负载条件下。必须确保系统上安装的 PCRE 库支持 JIT 编译,因为并非所有 PCRE 构建都包含此功能。 在使用 `pcre_jit` 指令时,管理员应注意,尽管它可以提升性能,但由于需要存储已编译的正则模式,可能会导致内存使用量增加。此外,在某些边缘情况下,使用复杂正则表达式可能会引发兼容性问题;因此,建议在启用此指令后对配置进行充分测试。
配置示例
pcre_jit on;
JIT 编译可能会因存储已编译的模式而增加内存消耗。
请确保已安装的 PCRE 库具有 JIT 支持;否则,尽管将指令设置为 'on',JIT 仍不会启用。
在更改此指令后测试配置,以避免与复杂 regex 模式相关的意外行为。
说明
`thread_pool` 指令用于定义一个线程池,允许 NGINX 将异步请求的处理卸载到线程中,这可以通过更好地利用多核处理器来提高性能。该指令接受两个到三个参数:线程池的名称、线程池的大小,以及可选的线程栈大小参数。参数允许对为使用线程处理并发连接分配的资源进行微调,有助于在服务器资源之间平衡工作负载分配。\n\n当设置了 `thread_pool` 指令时,NGINX 会在池中创建指定数量的线程,这些线程可用于处理 I/O 受限或需要阻塞操作的任务。线程独立于工作进程进行管理,允许高效地处理操作而不会阻塞主事件循环。这在诸如 Lua 脚本、文件上传或其他长时间运行的操作等场景中特别有用,这些操作如果直接在工作进程中处理通常会阻碍性能。可选的栈大小参数定义为每个线程分配的栈内存量,当将执行深度递归或占用大量栈的操作时,这一点尤为重要。\n\n应当谨慎管理线程池的大小和工作进程的数量,因为线程过多可能导致过度的上下文切换、性能收益递减,并最终造成资源耗尽。
配置示例
thread_pool my_pool 32;
将线程池大小设置得过高会导致频繁的上下文切换,从而降低性能。
不使用适当的线程同步机制可能导致共享资源出现竞态条件。
说明
`devpoll_changes` 指令在 NGINX 中用于配置在使用 devpoll 事件方法时,任何时候可以监视多少个文件描述符 (file descriptors) 的事件 (events)。这一技术在可能存在大量同时连接 (connections) 的环境中尤其有用,例如高流量 Web 服务器。为其设定一个合适的值使 NGINX 能够高效处理更多连接,而不会遇到可能降低性能的限制。 `devpoll_changes` 指令的参数是一个单一的整数值,指定每次 system call 返回的最大 events 数量。如果达到该限制,任何额外的变更在有可用空间之前都不会被处理。该指令的实际行为会显著影响网络操作与客户端处理的效率,尤其是在并发量高的系统中。配置不当可能导致资源浪费或连接丢失。 重要的是在配置该参数时要考虑系统的能力和预期负载,以实现最佳性能。确保此值与环境规格(例如可用的内存和 CPU)一致,有助于最大化服务器的吞吐量。
配置示例
events {
devpoll_changes 1024;
}将值设置为高于操作系统允许的最大值可能会导致系统错误。
未根据服务器负载调整该值可能导致资源使用效率低下。
错误配置可能会导致在超过限制时连接被断开。
说明
`devpoll_events` 指令在 `events` 上下文中指定时,会在 NGINX 的事件驱动架构中启用 DEVPOLL 机制来处理连接。DEVPOLL 可在 Solaris 及其他类 Unix 系统的某些变体上使用,提供了一种可扩展的方法来处理大量并发连接。通过使用 DEVPOLL,NGINX 可以高效地监视并响应文件描述符上的事件,而无需执行 O(n) 线性扫描——这种扫描在诸如 select() 或 poll() 等其他事件模型中可能成为瓶颈。 该指令不接受任何参数,通常用于在高负载条件下优化服务器应用的性能。它允许 worker 进程进入睡眠并以响应方式处理传入连接或其他事件,从而由于较少的上下文切换和整体系统响应性的提高而促进更好的 CPU 使用率和性能指标。它主要有利于预期会有大量并发连接的环境,例如处理数千用户的 Web 服务器。
配置示例
events {
devpoll_events;
}确保您的操作系统支持 DEVPOLL,因为该指令仅适用于实现此机制的系统。
即使启用了 DEVPOLL,如果错误配置 NGINX 的工作进程,也会导致性能不佳。
说明
`epoll_events` 指令在 NGINX 的 `events` 上下文中使用,允许管理员指定由 epoll 系统处理的事件数量和类型。它通过优化事件的排队和处理方式,提高了 NGINX 在同时处理大量连接时的性能和可扩展性。该指令接受一个参数,用于定义应如何管理事件。通过利用 epoll 的能力,NGINX 可以实现 non-blocking I/O,同时高效管理 read and write events 的回调,从而降低延迟并提高吞吐量。 在配置 `epoll_events` 时,用户可以调整诸如最大 file descriptors 数量或特定 event masks(指示 file descriptors 在何种条件下触发回调)的参数。这种可定制性对高并发环境尤为有用,通过调优事件模型可以带来显著的性能提升。用户应熟悉 Linux 中的 epoll interface,以及不同配置对系统资源使用和应用行为的影响。因此,该指令使得异步事件处理能够更精细化,从而有助于 NGINX 在 Web 服务方面保持快速和高效的声誉。 在 NGINX 需要处理大量并发连接的场景下,通常会使用 `epoll_events` 指令,例如高流量的 Web 应用,通过优化事件循环可以在负载下维持响应性和性能。
配置示例
events {
epoll_events 1024;
}使用过多的事件可能导致资源消耗增加。
不支持非 Linux 平台,请确保您的环境已为 epoll 正确配置。
说明
'worker_aio_requests' 指令在 'events' 上下文中使用,用于指定每个 NGINX worker 进程可处理的同时异步 I/O (AIO) 请求数上限。该指令在 NGINX 用于传输静态文件或通过异步机制高效处理大型媒体文件的场景中特别有用。通过设置此指令,管理员可以更好地管理 worker 进程的资源使用,并根据服务器能力和工作负载的性质优化性能。 设置时,指定的值应为正整数,表示 worker 可排队的最大 AIO 请求数。如果某个 worker 超过该数,它将无法接受更多的 AIO 请求,直到部分排队请求完成。该指令有助于调整大量使用异步文件操作的 NGINX 应用的性能,在吞吐量与资源消耗之间取得平衡。因此,其值应基于具体工作负载和测试来确定,以保证在不使 worker 进程过载的前提下实现最佳性能。 'worker_aio_requests' 的行为会显著影响服务器的响应时间和整体容量,尤其是在高负载场景下。因此,必须监控服务器性能并根据应用需求和底层硬件能力在必要时调整该值。
配置示例
events {
worker_aio_requests 1024;
}
将此值设置得过低可能会在高负载下导致性能瓶颈,因为 AIO 请求可能会被阻塞。
将其设置得过高可能会导致内存使用增加和潜在的资源耗尽,尤其是在低端硬件上高并发时。
说明
'eventport_events' 指令在 NGINX 中用于指定在事件处理模型中使用的事件端口的行为。它主要用于支持 event port API 的系统,通过采用一种可扩展的连接处理方法,实现更高效的事件驱动 I/O。该指令允许用户优化其 event loop 以获得更好的性能,尤其是在高并发场景中。 当指定 'eventport_events' 指令时,NGINX 将利用操作系统的 event port 机制,这可以极大地提升性能,因为它允许同时处理多个事件。在并发连接较多的环境中,这尤其有用,因为它减少了管理多个独立线程或进程的开销。与该指令相关的参数通常包括配置超时或其他相关属性的选项,以便根据需要调整性能。 应谨慎考虑是否使用此指令,因为它可能影响 Web 服务器的整体可扩展性和响应性。对其参数进行适当调优,可能显著提高高流量应用的吞吐量和响应时间。
配置示例
events {
eventport_events;
}确保您的操作系统支持 event ports,否则此指令将无效。
配置错误可能导致性能下降而非提升,尤其在工作负载不理想的场景下。
说明
`iocp_threads` 指令特定于 NGINX 在 Windows 上的运行时,允许用户配置用于通过 IOCP (I/O Completion Ports) 模型处理 I/O completion 的线程数量。该模型提供了一种可扩展的方法来处理多个并发 I/O 操作,对于高性能负载尤其有益。默认情况下,线程数设置为 CPU cores 的数量,但可以根据应用需求显式定义以优化性能。每个 I/O completion 线程独立运行,在 I/O 请求完成并发出完成信号时对其进行处理,从而实现对系统资源的更好利用。\n\n在使用 `iocp_threads` 时,管理员应考虑线程数与预期工作负载之间的相关性。线程数过少可能在高负载下造成瓶颈,而过多则可能导致上下文切换开销。因此,建议进行性能测试以确定最佳配置。此外,该指令主要在使用 IOCP 模型的 Windows 平台上生效,在不实现该模型的 Linux 或其他操作系统上不会产生任何效果。该指令在 NGINX 配置的 'events' 上下文中定义,那里是大多数与性能相关的配置设置所在。
配置示例
events {
iocp_threads 4;
}将数值设置得过高可能导致 CPU 争用并增加上下文切换开销。
配置不当可能在高负载下导致性能下降。
说明
'post_acceptex' 指令是一个配置选项,允许用户在 NGINX 的 event processing loop 中在成功的 accept 操作之后定义要执行的自定义函数。这在扩展连接被接受后如何处理连接的行为时特别有用。通过指定一个函数,开发者可以在特定场景下对连接处理获得更深的控制,例如记录连接细节或动态修改连接设置。 该指令接受一个参数,即 NGINX 将调用的函数名。该函数应符合 NGINX 可以识别并正确执行的预期签名。该机制为开发者和系统管理员提供了灵活的方法来定制 NGINX 配置以满足特定需求。此外,由于它在 event module 的低级别运行,因此效率很高并且允许在不显著开销的情况下实现自定义行为。 在实际操作中,定义一个 'post_acceptex' 函数不仅涉及实现函数本身的细节,还需要确保它能与 NGINX 架构的其他部分良好协作。正确实现后,可以实现高级功能,如处理特殊协议、自定义日志记录,或在连接建立后立即与第三方服务集成。
配置示例
events {
post_acceptex my_custom_accept_function;
}确保指定的函数在运行时被正确实现并可访问
请注意,错误配置 post_acceptex 函数可能导致连接处理问题或崩溃
函数的行为必须符合 NGINX 对事件驱动架构的要求。
说明
`acceptex_read` 指令在 NGINX 的 `events` 上下文中使用,用于控制 NGINX 在接受传入连接时是否利用 AcceptEx 套接字函数。AcceptEx 是 Windows 专用的 API,允许服务器在接受连接后立即读取传入的数据,同时减少上下文切换并提高性能。当设置为 'on' 时,NGINX 将尝试在接受连接时使用此功能,因其在处理套接字连接方面的高效性,可能在高负载下带来更好的性能。然而,该功能仅适用于支持 AcceptEx 的 Windows 平台。 此指令的参数是一个标志,可以为 'on' 或 'off'。将其设置为 'on' 时,NGINX 在管理新连接时会使用 AcceptEx 功能。相反,设置为 'off' 则会使用常规的连接接收方法。需要注意的是,尽管利用 AcceptEx 可以提升性能,但可能会在某些网络配置下引入兼容性问题,从而影响应用行为。 评估服务器的负载、处理的流量类型以及底层基础设施,有助于决定是否启用此选项。应注意,此功能仅针对 Windows,并不会影响非 Windows 平台上的 NGINX 安装。在启用 AcceptEx 前应进行适当测试,以确保不会在环境中产生任何意外的副作用。
配置示例
events {
acceptex_read on;
}此指令仅适用于 Windows 操作系统,对 Unix/Linux 系统无任何影响。
启用 AcceptEx 可能会与某些网络配置产生兼容性问题;建议在启用后进行充分测试。
说明
`kqueue_changes` 指令用于 NGINX 的事件处理上下文,尤其在使用特定于 BSD 风格操作系统(包括 macOS)的 kqueue 事件机制时优化性能。该指令允许用户设置在监控 file descriptors 时可排队的最大更改数,从而帮助在高负载情况下微调 NGINX 服务器的响应性。该参数指定一次可处理的挂起 file descriptors 更改的数量上限,这会影响在流量高峰期间处理连接的效率。 在设置此指令时,需考虑服务器上运行的应用类型和预期负载。较低的值可能在高流量下导致事件丢失,而较高的值则可能消耗更多内存和处理资源。平衡这些方面以确保最佳性能非常重要。例如,如果您的应用经常向监控中添加或移除 file descriptors,您可能希望增加此值以适应更高的传入连接速率。有效管理此参数可改善性能,特别是对于经历超出典型负载的连接突发的应用而言。 NGINX 默认值在许多用例中是合理的,但管理员可以根据应用的具体行为和需求调整 `kqueue_changes` 的值,以实现性能提升或降低事件队列饱和的风险。
配置示例
events {
kqueue_changes 256;
}将某个值设置得非常高可能会导致内存使用量增加。
确保您的应用确实需要更高的值;否则,可能会导致不必要的资源消耗。
在非 BSD 系统上不适用,因为 kqueue 是类 BSD 操作系统特有的。
说明
kqueue_events 指令专为在 NGINX 配置的 events 上下文中使用而设计。它指示 NGINX 使用 kqueue 事件通知机制,该机制效率很高,特别适合在像 FreeBSD 和 macOS 这样的与 BSD 兼容的操作系统上处理大量并发连接。通过利用 kqueue,NGINX 可以主动监视多个文件描述符,减少与轮询相关的 CPU 开销,从而在负载下实现更具扩展性的性能。 启用 kqueue_events 指令后,会影响工作进程处理事件的方式:只有在发生实际事件(例如有数据到达或连接被关闭)时,才唤醒空闲连接。这不同于可能需要定期轮询的旧事件机制,后者在连接增多时会消耗大量资源。请确保你的 NGINX 安装是以 kqueue 支持进行编译的,如果底层操作系统或构建不支持 kqueue,该指令将无法工作。 该指令接受一个参数,用于切换是否使用 kqueue。如果配置正确,优点包括由于更快的事件处理而降低的资源消耗和提高的速度。务必在暂存环境中测试该配置,确保其按预期工作且不会引入意外问题。
配置示例
events {
kqueue_events;
}确保 NGINX 在构建时包含 kqueue 支持;否则该指令将不会生效。
kqueue 仅适用于 BSD 系统;在不受支持的平台上使用该指令可能导致错误。
说明
events 指令是 NGINX 架构中的关键组成部分,用于管理服务器如何处理连接。它使 NGINX 能够采用事件驱动模型,显著提升性能和可扩展性,因为与传统的多线程方法相比,能够用更少的资源处理更多的连接。在 events 块中,可以设置各种参数来优化连接处理,例如 worker_connections,它定义了每个工作进程可以处理的最大并发连接数。 该指令本身不接受任何参数,而是作为一个容器,用于包含影响 NGINX 事件循环的配置选项。在 events 块下可配置的最重要的参数是 'worker_connections',它指定了每个工作进程允许的最大连接数。通过谨慎调整这些设置,管理员可以实现针对服务器工作负载的最佳资源管理和响应性。
配置示例
events {
worker_connections 1024;
}未将 worker_connections 设置为足够的数量会限制服务器容量。
确保操作系统已配置为允许指定数量的连接。
说明
worker_connections 指令对于优化 NGINX 中每个工作进程所管理的并发连接数至关重要。该指令本质上定义了单个工作进程可处理的连接上限,从而影响 Web 服务器的整体可扩展性。在确定该指令的值时,重要的是考虑服务器上的资源可用性,包括内存、CPU 和网络带宽。 为达到最佳效率,worker_connections 的值应与 worker_processes 指令一起配置。NGINX 可处理的最大潜在连接数可以计算为 `worker_processes * worker_connections`。通过调整这些参数,可以有效控制有多少客户端能够同时连接并与您的应用程序交互。 在高负载场景下,将该值设置得过高可能导致资源枯竭,从而引起服务器性能下降。根据流量模式监控并调整此指令有助于保持服务器的最佳状态。
配置示例
events {
worker_connections 1024;
}将此值设置得过高可能会耗尽系统资源并导致稳定性问题。
确保系统的文件描述符限制高于所需的连接数。
该指令并不限制所有进程的连接总数,这是一个常见的误解。
说明
'use' 指令允许用户指定 NGINX 在处理连接时使用的事件处理方法。根据平台以及 NGINX 内已编译的模块,该指令支持实现事件驱动架构的多种选项,例如使用 `epoll`、`kqueue` 或 `select` 方法。每种选项在服务器的运行环境下具有不同的性能特性和可扩展性。 该指令接受一个参数,用于指定所需的方法。正确的使用可确保 NGINX 有效地处理多个并发连接,优化资源使用并提高整体吞吐量。选择与服务器操作系统能力相匹配的方法至关重要;例如,在 Linux 系统上建议使用 'epoll',而在 BSD 系统上则优先使用 'kqueue'。 配置不当,例如为特定平台指定不支持的事件方法,可能导致启动时出错或严重影响性能。了解各事件方法的权衡和能力对于在生产环境中部署 NGINX 至关重要。
配置示例
events {
use epoll;
}确保所选方法受操作系统支持;否则 NGINX 将无法启动。
使用不合适的事件方法可能导致性能或功能下降。
必须在 'events' 块中定义 'use' 指令才能生效。
说明
`multi_accept` 指令在 NGINX 中用于优化连接处理流程,通过允许工作进程一次接受多个新连接,而不是每次仅接受一个。当启用该指令时,工作进程可以通过减少与上下文切换相关的开销以及单个连接处理的延迟来有效提高其吞吐量。 该指令可以设置为 `on` 或 `off`。当设置为 `on` 时,它指示工作进程尽可能接受操作系统套接字层允许的所有新连接。该行为在预计会有大量并发连接的高负载场景中特别有用。另一方面,当 `multi_accept` 设置为 `off` 时,默认行为是一次只接受一个连接。这可能导致传入连接的延迟增加,因为后续连接必须等待工作进程空闲以处理它们。 需要注意的是,在所有情况下启用 `multi_accept` 并不能保证带来性能提升。其效果在很大程度上取决于底层操作系统对套接字操作的处理方式以及服务器的具体负载情况。服务器管理员应监控服务器的性能,以判断启用该指令是否能达到预期的性能效果。
配置示例
events {
multi_accept on;
worker_connections 1024;
}启用 multi_accept 可能导致 CPU 使用率和 context switching 增加,尤其是在高负载情况下。
在某些系统上,如果底层 OS 无法对增加的接入量进行最优处理,启用此功能可能不会带来性能提升。
说明
NGINX 中的 `accept_mutex` 指令用于通过管理工作进程在高负载时如何处理传入连接来提高基于事件的服务器的性能。当设置为 `on` 时,该指令一次只允许一个工作进程接受新连接,从而减少竞争并提高资源利用率。在并发连接数超过单个工作进程处理能力的情况下,这尤其有用,因为它有助于防止惊群问题,即多个进程同时尝试接受新连接。 `accept_mutex` 指令依赖于 `accept_mutex_delay` 参数,该参数指定当有其他工作进程可用时,工作进程在尝试接受新连接前应等待的延迟(以毫秒为单位)。如果适当设置此延迟,它可以实现工作进程间的同步,降低资源被过载的可能性。这种同步通过确保一个工作进程“赢得”接受新传入连接的权利来实现,而其他进程则等待轮到它们。最佳配置会根据服务器的负载和底层基础设施的不同而有很大差异。
配置示例
events {
accept_mutex on;
accept_mutex_delay 500;
}将 `accept_mutex` 设置为 `on` 在高负载下可能导致连接接受的延迟增加;最好仅用于测试和调优场景。
确保已正确配置 `accept_mutex_delay`;延迟设置过高会降低响应性。
说明
'accept_mutex_delay' 指令在 NGINX 中指定了当 worker 进程尝试接受新连接但无法立即获取 accept mutex 时所应用的延迟。这个 mutex 对于在多个 worker 进程之间同步访问至关重要,以避免服务器因大量快速的连接请求而不堪重负。如果 worker 无法获取该 mutex,它会在再次尝试接受连接之前暂停由此指令指定的时长,从而在各 worker 之间平衡负载并提高效率。\n\n'accept_mutex_delay' 的参数以毫秒为单位定义,允许管理员根据服务器容量和预期负载进行精细调整。例如,设置 'accept_mutex_delay 500;' 允许 worker 最多等待半秒再重试。此设置会显著影响连接在多个 worker 进程之间的分配,尤其是在高并发场景下。适当的调优可以在最大化吞吐量和减少延迟的同时最小化资源争用。\n\n需要注意的是,虽然增加延迟可以在高负载时通过允许其他 worker 接受连接来改善公平性,但在低负载情况下也可能导致接受的连接数量减少,因此需要根据实际流量模式进行设置。
配置示例
events {
accept_mutex on;
accept_mutex_delay 300;
}要使该指令生效,accept_mutex 必须启用。
将延迟设置得过高可能会导致连接接受率降低,尤其是在低流量期间。
并非所有操作系统以相同方式处理 mutexes,这可能会影响该指令的行为。
说明
`debug_connection` 指令允许用户指定某些 IP 地址,从这些地址发起的传入连接会被专门记录到调试日志中。在排查 NGINX 实例的问题时,此指令非常重要,因为它能提供来自指定客户端请求处理的详细洞见。默认情况下,如果不使用此指令,任何 IP 都不会获得增强日志记录——而这对于有效调试至关重要。 使用该指令时,指定的 IP 可以是单个 IP 地址或子网的 CIDR 表示法,从而在各种网络场景中具有灵活性。该指令必须放在 NGINX 配置的 `events` 上下文中,因为它与连接处理相关。详细的日志不仅包含标准的请求信息,还会包含额外的调试细节,帮助系统管理员识别配置错误或连接异常。 需要注意的是,如果开启大量的调试连接,会产生大量日志文件,在生产环境启用时可能需要运维上的管理。因此,该指令通常用于临时诊断针对受控用户集的特定问题,而不是对全部传入流量全面启用。 总之,`debug_connection` 指令为有选择地增强特定客户端连接的日志记录提供了一个强大的工具,从而实现更有效的调试和系统监控。
配置示例
events {
debug_connection 192.168.1.0/24;
}确保 NGINX 是用调试支持编译的,否则此指令将无效。
注意日志级别和日志文件大小,启用调试日志可能会迅速耗尽磁盘空间。
不要在生产环境中对所有连接使用此指令,因为它会导致过多的日志记录和性能问题。
说明
'ssl_engine' 指令允许用户定义 NGINX 应该使用哪个 SSL 引擎来处理安全连接。默认情况下,NGINX 使用 OpenSSL 库,除非另有配置。当用户希望使用不同的 SSL 实现(例如 GnuTLS 或自定义 SSL 库)以获取更多功能或更高性能时,该指令非常有用。该指令仅接受一个参数,该参数对应于所需 SSL 引擎的名称。 在使用该指令时,必须确保指定的 SSL 引擎已编译进 NGINX,否则在运行时该命令将失败,可能导致启动错误。这种灵活性使系统管理员能够根据其基础设施或应用需求微调 NGINX 对 SSL/TLS 请求的处理方式。用户应始终验证所选 SSL 引擎与当前 NGINX 配置之间的兼容性,以及其整体性能和安全特性。
配置示例
ssl_engine 'openssl';
确保指定的 SSL 引擎已被编译进 NGINX;否则 NGINX 可能无法启动。
使用不受支持或配置不当的 SSL 引擎可能导致 SSL 握手失败或性能问题。
说明
指令 `ssl_object_cache_inheritable` 是一个标志,用于控制 NGINX 中 SSL 对象缓存设置的继承。 当该指令设置为 'on' 时,允许 SSL 对象缓存设置被子上下文继承,例如 server 或 location 块,从而实现对 SSL 缓存行为更灵活和集中化的管理。这在包含多个 server 块且需要共享相同 SSL 对象缓存设置的复杂配置中尤其有用。 默认情况下,SSL 缓存机制通过存储 SSL 会话参数和对象来提升性能,从而减少建立新 SSL 连接时的开销。继承这些设置的能力可确保开发者不必在各个块中重复缓存设置,简化配置过程,并将因设置不一致可能导致的错误降到最低。 如果省略 `ssl_object_cache_inheritable`,则行为默认是不允许继承,保持旧的行为,即需要在每个相关块中显式定义缓存设置。该指令在 SSL 性能至关重要的环境中尤为重要,可在不同服务器配置之间实现一致的缓存策略。
配置示例
ssl_object_cache_inheritable on;
确保该指令放在主上下文以达到预期效果。
将该指令设置为 'off' 会阻止缓存设置的继承,这可能导致子块中出现冗余配置。
说明
'quic_bpf' 指令在 NGINX Core 模块中用于控制是否启用用于处理 QUIC 数据包的 BPF 机制。BPF 是一个强大的功能,允许在底层对网络数据包进行过滤和操作,为 QUIC 协议提供高效的处理能力,从而通过降低延迟和改进拥塞控制来提升 Web 性能。通过使用 BPF,NGINX 能够实时分析流量模式并做出更好的决策,从而增强使用 QUIC 协议的应用程序的性能。 该指令接受一个标志参数,可设置为 'on' 或 'off'。设置为 'on' 时,NGINX 将对所有传入的 QUIC 连接应用 BPF,这可能通过更好地处理出入数据包来提高吞吐量并降低延迟。相反,设置为 'off' 则禁用此功能,恢复到没有任何 BPF 优化的 QUIC 数据包的默认处理。需要注意的是,为了使 BPF 有效工作,NGINX 必须在编译时包含支持该功能的必要库,并且底层操作系统也必须支持 BPF。
配置示例
quic_bpf on;
确保您的 NGINX 安装在编译时启用了 BPF 支持。
由于其底层特性,使用 BPF 可能需要更高权限才能运行。
当启用 BPF 时,与其他模块或指令的不兼容配置可能导致意外行为。
说明
'http' 指令是 NGINX 配置中的一个基本组成部分,提供配置 HTTP 相关设置的上下文。定义该指令后,它会封装所有其他与 HTTP 相关的指令,这些指令用于配置 Web 服务器如何处理请求和响应。此类设置包括用于 'server' 块、'location'、日志记录等的配置,允许管理员定义在不同服务器上下文和配置中如何处理传入的 HTTP 请求。 在 'http' 上下文中,管理员可以指定诸如 'server' 块之类的参数,从而启用虚拟主机设置,并配置协议设置、缓冲行为和访问控制。该结构允许对服务器行为进行细粒度控制,支持在高层应用优化和设置,影响所有已配置的服务器或选择性定义的块。该指令没有参数也表明它仅作为一个组织边界,而不需要特定选项来运行。 使用 'http' 指令意味着在其作用域内定义的后续指令与 HTTP 处理相关。例如,'server'、'location' 和 'client_max_body_size' 等指令通常嵌套在 'http' 块中,展示了其作为相关配置集合点的作用,最终有助于提高 NGINX Web 服务器的整体性能和灵活性。
配置示例
http {
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
}确保 'http' 指令没有嵌套在诸如 'server' 或 'location' 等其他上下文块中。
避免在同一配置文件中使用多个 'http' 指令,因为只允许有一个。
说明
'mail' 指令在 NGINX 中对于启用 mail 模块提供的邮件处理功能至关重要。当在配置的主上下文声明时,它会激活 NGINX 作为邮件代理服务器的能力,处理诸如 IMAP、POP3 和 SMTP 等协议。该指令不接受任何参数;其在配置中仅凭存在即表示应在 NGINX 操作中包含邮件功能。 初始化时,mail 模块会根据配置文件中跟在 'mail' 指令之后的其他与 mail 相关的专用指令来设置其配置。这些指令包括定义服务器和用户凭据、认证方法以及上游服务器的指令。值得注意的是,仅有该指令本身并不会处理任何邮件;它为后续指定 NGINX 如何与邮件客户端和邮件服务器交互的配置奠定了基础。 该指令在确保 NGINX 能有效地管理和转发电子邮件请求、并与现有 mail 基础设施无缝交互方面起着关键作用。通过集成 mail 协议,NGINX 将其功能扩展到静态和动态网页内容服务之外,包含强大的电子邮件处理能力,这在负载均衡环境或将多项服务整合到统一架构时尤其有益。
配置示例
mail {
server {
listen 110;
protocol pop3;
proxy on;
}
server {
listen 143;
protocol imap;
proxy on;
}
}确保为邮件协议和认证定义了额外的指令;否则,邮件功能将不完整。
请记住,该指令必须在主上下文中使用,不能包含在 server 或 location 块中。
您可能需要调整防火墙设置,以允许通过邮件端口(例如 TCP 110 和 143)的流量。
说明
`google_perftools_profiles` 指令位于 NGINX 核心配置中,用于启用使用 Google Performance Tools (gperftools) 收集性能分析信息。该性能分析有助于监控和分析 NGINX 进程的性能,使管理员能够定位性能瓶颈并相应地优化配置。启用该指令后,NGINX 会生成可用诸如 'pprof' 等工具分析的性能剖析信息。 具体来说,该指令接受一个参数,该参数是用于存放分析数据的输出文件路径。该信息包括 CPU 使用情况、内存分配统计和调用图,这些可以为 NGINX 工作进程的运行情况提供洞察。通过仔细检查生成的分析文件,可以识别并解决性能问题,从而改善 NGINX 服务器的性能和资源利用率。 该指令必须放在 NGINX 配置的主上下文中,并应以有效路径作为其参数。如果指定的路径对 NGINX 工作进程不可写,则不会启用性能分析,这可能导致对性能得出误导性的结论。它通常与其他性能相关指令配合使用,以获得对服务器状态的全面了解。
配置示例
google_perftools_profiles /var/log/nginx/perf_data;
确保指定路径具有正确权限,以便 NGINX 工作进程能够写入分析数据。
如果性能至关重要,请不要在生产环境启用分析,因为它可能增加开销。
在收集到必要的分析数据后,记得在生产环境中禁用或移除此指令。
说明
'stream' 指令允许 NGINX 处理非 HTTP 流量,使其能够传输 TCP 和 UDP 流。这项指令可以在主上下文中配置,允许用户为各种类型的流式数据指定不同的服务器或 upstreams。在 'stream' 块内,用户可以定义多个 server 块,每个 server 可以处理与常规 HTTP 处理不同的协议、端口或 upstream 配置。 通过引入该指令,用户可以在 'stream' 上下文中使用诸如 'server' 和 'proxy_pass' 等指令来处理流。例如,可以直接在此块中设置 TCP 负载均衡,根据 round-robin、least connections 或 IP hash 等算法将资源使用偏向不同的后端服务器。此外,还可以配置连接数限制、超时设置和错误处理,以确保流处理既高效又具有弹性。 'stream' 指令使 NGINX 成为更为通用的代理,支持诸如对 TCP 服务进行 SSL 终止之类的应用,从而简化安全传输。因此,它扩展了标准 HTTP/HTTPS 范式之外的用例,允许数据库和游戏服务器等应用有效地利用 NGINX 的网络管理能力。
配置示例
stream {
upstream backend {
server backend1.example.com:12345;
server backend2.example.com:12345;
}
server {
listen 12345;
proxy_pass backend;
}
}确保 'stream' 块不要放在 'http' 或 'server' 块内,因为它必须在主上下文中声明。
在 'stream' 指令中指定多个 'server' 块时,请记得正确配置监听端口以避免冲突。
说明
'include' 指令旨在通过允许包含其他配置文件来增强 NGINX 配置的模块化性和可维护性。这有助于将大型配置文件拆分为易于管理的部分,便于更新和组织。通过使用 'include' 指令,用户可以在单独的文件中定义公共设置,并在不同的配置上下文中按需包含这些文件,从而促进 DRY (Don't Repeat Yourself) 原则。 'include' 指令的参数由一个或多个配置文件的路径组成。该路径可以指定为绝对路径,也可以相对于当前工作目录的相对路径。也支持通配符,从而能够包含匹配指定模式的多个文件。当 NGINX 处理主配置文件时,会按出现的顺序解析并读取 'include' 指定的文件。这些文件中的指令随后会合并到当前上下文中,允许它们相应地影响配置设置。 'include' 包含的配置文件可以定义 NGINX 的各个方面,例如 location 块、server 设置或 upstream 配置。但是,应注意避免与主配置文件中现有设置发生冲突。如果包含的文件包含更改已定义配置的指令,则在合并后的配置中最后定义的值将优先。该灵活性使 'include' 指令成为结构化复杂 NGINX 配置的强大工具。
配置示例
# Example of using the 'include' directive include /etc/nginx/conf.d/*.conf;
确保包含的文件不含可能导致配置产生歧义的冲突指令。
如果当前工作目录发生变化,包含文件的相对路径可能会导致意外行为。
如果不仔细指定,使用通配符可能会包含意外的文件。
说明
'allow' 指令指定哪些 IP 地址被授予对指定的 server 或 location 块的访问权限。它可以接受 IPv4 和 IPv6 地址,也可以接受用于指定 IP 地址范围的 CIDR Notation。当存在多个 'allow' 指令时,可以将它们组合以对谁可以访问资源进行细粒度控制。如果请求来自匹配某一 'allow' 规则的 IP 地址,则授予访问,除非该地址也匹配 'deny' 指令。这种设置允许将特定客户端地址列入白名单,同时拒绝或限制其他地址的访问。 通常 'allow' 指令与 'deny' 指令一起使用,后者指定应被阻止的 IP 地址。该指令可以在不同的上下文中配置,如 http、server、location 和 limit_except,从而根据应用架构灵活地执行访问规则。配置后,请求的处理将根据评估顺序决定:如果存在任何 'allow' 规则,则将在任何 'deny' 规则之前进行检查。 提供给 'allow' 指令的参数可以是单个 IP 地址或 CIDR 块,CIDR 块是一种以类似 "192.168.1.0/24" 的格式表示的地址范围。例如,'allow 192.168.1.1;' 会允许来自特定 IP 192.168.1.1 的访问,而 'allow 10.0.0.0/8;' 会允许 10.0.0.0 至 10.255.255.255 范围内的所有 IP。
配置示例
location /protected {
allow 192.168.1.1;
deny all;
}确保 'allow' 和 'deny' 指令的正确顺序,因为如果随后匹配到 'deny',它会覆盖 'allow'。
如果使用,配置中必须明确支持 IPv6 地址;请确认 NGINX 是否已编译为支持 IPv6。
使用 'allow all;' 会允许所有人访问,可能导致资源意外暴露。
说明
'deny' 指令在 NGINX 中用于根据客户端的 IP 地址控制对服务器资源的访问。它可以在多个上下文中定义,包括 http、server、location 和 limit_except,从而在定义访问规则时提供灵活性。该指令需要一个参数,即要拒绝访问的客户端的 IP 地址(或 CIDR 表示法)。当来自与某个 'deny' 规则匹配的 IP 地址的请求到达时,NGINX 将返回 403 Forbidden HTTP 状态码,从而阻止对该请求的进一步处理。 该指令可以与 'allow' 指令配合使用,后者指定被授予访问权限的 IP 地址。在同时使用这两个指令的情况下,NGINX 会按定义的顺序评估规则,如果存在匹配的 'deny' 规则,则请求将被拒绝,而不考虑后续的 'allow' 规则。此外,'deny' 指令可以为 IPv4 和 IPv6 地址定义拒绝规则,使其能够适应不同的网络环境。
配置示例
location /protected {
deny 192.168.1.0/24;
deny 10.0.0.1;
}确保 deny 规则的顺序正确,因为它们按声明的顺序进行评估;后面的 allow 规则可能无法覆盖之前的 deny 规则。
错误使用 CIDR 表示法可能会无意中拒绝比预期更大范围的 IP 的访问。
在组合 deny 和 allow 指令时要警惕逻辑错误,因为二者之间的相互作用可能导致意外的访问结果。
说明
指令 `add_before_body` 在 NGINX HTTP core module 中使用,用于在响应体发送给客户端之前追加特定内容。这在无需修改应用或后端服务器的情况下,直接将脚本、注释或其他标记注入响应载荷时特别有用。插入的内容可以定义为字符串字面量,在请求处理阶段作为 HTTP 响应的一部分输出。 该指令可在 `http`、`server` 和 `location` 等上下文中指定,从而实现对内容插入位置的细粒度控制。该指令的参数是一个字符串值,表示要添加的内容。配置后,`add_before_body` 在输出阶段处理请求,确保指定内容位于原始响应体之前。 由于这会修改响应结构,因此必须确保插入的内容不会干扰响应的内容类型或结构。应仔细考虑所添加的内容,以保持有效的 HTTP 响应格式。
配置示例
http {
server {
location /example {
add_before_body '';
}
}
}确保插入的内容是有效的,并且不会破坏主响应体的结构。
使用大量内容可能会影响响应大小和性能。
避免添加会无意中更改内容类型的内容。
说明
`add_after_body` 指令在 NGINX 中用于定义应在 HTTP 响应结束时包含的内容,即在响应主体传输完成之后。这对于注入脚本、跟踪或分析代码,或任何需要在主要内容传送到客户端后加载的额外数据非常有用。 该指令需要一个参数,即将要追加的内容。该内容可以是纯文本、HTML,或服务器可以提供给客户端的任何有效数据片段。对于依赖客户端脚本的 Web 应用来说,这尤其有用,允许开发者添加必要的 JavaScript 片段或应在主要响应渲染后出现的 HTML 元素。通过使用该指令,可以在不直接修改原始响应主体的情况下进行内容修改,从而保留所交付内容的完整性。
配置示例
location /example {
add_after_body '';
}确保添加的内容有效且格式正确,以避免破坏响应的 HTML 结构。
注意添加大型脚本或大量数据对性能的影响,因为这会影响客户端的加载速度。
说明
'addition_types' 指令在 NGINX 中用于将文件扩展名映射到应添加到 HTTP 响应的 Content-Type 头中的自定义 MIME 类型。该指令使得 Web 服务器管理员可以处理默认 MIME 类型定义未涵盖的文件类型,确保根据文件类型正确传递内容。 'addition_types' 的语法至少需要一个参数,该参数由文件扩展名后跟 MIME 类型组成。可以在单个指令中为多个扩展名及其对应的 MIME 类型进行定义。当文件被提供时,NGINX 会将指定的扩展名与请求的文件进行匹配。如果找到匹配项,则相应的 MIME 类型会被包含在响应中,以补充 NGINX 配置中预定义的类型。 该指令可用于诸如 http、server 或 location 块等不同上下文,从而在为 Web 应用的不同部分配置 MIME 类型时提供灵活性。添加自定义 MIME 类型可以帮助避免客户端在处理文件时出现问题,确保浏览器正确解释所传送文件的内容。
配置示例
http {
addition_types .json application/json;
addition_types .xml application/xml;
}确保指定的 MIME 类型有效并被浏览器识别。
注意不要因使用相同的扩展名但指定不同类型而无意覆盖现有的 MIME 类型。
该指令不会自动恢复为默认类型;需要显式指定所有所需的类型。
说明
`auth_basic` 指令允许通过要求客户端进行 HTTP 基本认证来保护 NGINX 服务器内的位置或资源。当启用此指令时,客户端必须提供有效的用户名和密码,服务器会将其与配置中设置的凭据进行核对。该指令主要用于需要简单访问控制的场景,例如限制对网站特定部分的访问。 该指令接受一个参数,即 realm 名称。该名称是认证过程中重要的一部分,会显示在浏览器向用户呈现的认证对话框中。要完整实现基本认证,您还应将 `auth_basic_user_file` 指令与 `auth_basic` 配合使用,以指定包含允许的用户名和哈希密码的密码文件的位置。否则,该指令将无法生效,因为服务器不知道应验证哪些凭据。 在更高级的部署中,您可能希望使用 `allow` 和 `deny` 等其他指令进一步控制访问,这些指令可与 `auth_basic` 结合使用,根据客户端 IP 地址或其他条件细化哪些用户可以访问受保护的内容。
配置示例
location /private {
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
}确保密码文件已正确创建,并为 NGINX 用户设置了适当的权限。
注意语法;realm 名称需要用引号括起,且指令必须以分号(;)结束。
编辑配置后请记得重启 NGINX 以使更改生效。
说明
该 `auth_basic_user_file` 指令通常与 `auth_basic` 指令结合使用,后者在特定上下文中启用基本认证。 当用户向配置了基本认证的 NGINX 服务器发出请求时,服务器会检查是否存在 `auth_basic_user_file` 指令。如果存在,服务器会读取指定的文件,将客户端提交的用户名和密码与存储的哈希进行校验。该文件必须采用特定格式,每一行包含用户名及随后跟随的密码哈希,这些哈希可以使用诸如 `htpasswd`(来自 Apache HTTP Server 套件)等工具生成。认证过程旨在限制对特定资源的访问,确保只有有效用户可以访问这些资源。 重要的是确保用户文件被安全存储并且不可公开访问,以防止未授权访问其中的敏感凭据。此外,NGINX 通过支持各种密码学哈希算法来增强安全性,从而使攻击者更难以攻破用户账户。
配置示例
location /secret {
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
}用户文件必须可被 NGINX 进程读取;请确保已设置正确的文件权限。
必须严格遵循用户文件的格式(username:hashed_password)。
如果用户文件的路径不正确,身份验证将失败,从而允许未授权访问。
说明
`auth_request` 指令允许 NGINX 通过向指定位置发起子请求来处理认证。该位置用于处理认证请求;如果子请求返回 2xx 状态码,则授予对原始请求的访问权限。若响应不是 2xx 状态,则拒绝访问,原始请求不会被处理。 该指令可在多种上下文中使用,包括 `http`、`server` 和 `location`,便于在不同服务器配置中灵活集成。该参数期望一个单一的位置名或路径,NGINX 将使用它来执行认证检查。通常,这会是一个专门的端点,用于处理检查用户凭据或对所评估请求的访问条件的逻辑。 在使用 `auth_request` 时,必须确保子请求位置已正确配置,以根据认证结果返回正确的状态码。若需要,子请求还可以携带原始请求的头部,从而允许更复杂的认证检查(例如考虑客户端信息)。
配置示例
location /protected {
auth_request /auth;
}
location = /auth {
internal;
# Authentication logic here
if ($http_authorization = "Bearer valid_token") {
return 200;
}
return 401;
}确保 subrequest 的 location 配置为仅处理 `internal` 请求;否则,客户端可以直接访问它。
注意:如果嵌套的 location 配置错误,可能会导致级联 subrequest 失败,从而意外拒绝访问。
subrequest 的响应必须返回合适的 HTTP 状态码(200 表示成功,其他代码表示拒绝),以便被正确处理。
说明
`auth_request_set` 指令在 NGINX 中用于定义一个变量,该变量用于存储内部认证请求的结果。通常该指令接受两个参数:要设置的变量名以及要检查的响应(可以是状态码或特定变量)。在内部认证请求成功的情况下,该变量会被设置;如果失败,则该变量保持未设置状态或重置回初始状态。 该指令与 `auth_request` 指令结合使用时尤其有用,它通过评估认证请求的结果来实现更细粒度的访问控制。例如,基于 `auth_request_set` 设置的变量的值,可以执行附加逻辑,从而实现不同的访问级别或错误处理。如果认证请求返回 2xx 响应,则表示成功;任何 4xx 或 5xx 响应均表示失败,从而可以对未授权访问尝试做出可配置的响应。`auth_request_set` 指令的位置灵活,可在 `http`、`server` 或 `location` 上下文中使用,从而为配置提供了广泛的灵活性。 此外,确保内部认证请求配置正确且可达非常重要。该变量的行为以及它与其他指令的交互可能会显著影响 NGINX 的路由和访问控制行为,因此在生产环境中实现时需要进行充分测试。
配置示例
location /protected {
auth_request /auth;
auth_request_set $auth_status $upstream_status;
error_page 401 = @error401;
}
location = /auth {
internal;
proxy_pass http://backend_auth;
}确保在 `auth_request` 中的内部请求 URL 已正确配置,以避免无法访问的端点。
当请求可能不会返回有效的响应代码时,基于响应来设置变量要小心,因为这可能在访问控制评估中导致令人困惑的行为。
使用 `auth_request_set` 定义的变量的顺序会影响它们在后续处理中的可用性;请确保在引用之前已设置它们。
说明
'autoindex' 指令允许 NGINX 在目录中没有索引文件时生成并显示文件列表。当启用时,如果用户请求一个没有索引文件(例如 index.html 或 index.htm)的目录,NGINX 将返回该目录中文件的可排序列表。 该指令可在不同上下文中设置:http、server 和 location。通过设置 'autoindex on',用户可以暴露目录内容,这在调试时可能有用,但如果敏感文件被无意中暴露,则可能带来安全风险。输出可以通过相关指令定制,例如 'autoindex_format',以使用不同的输出格式(如精简或完整列表)。 重要的是要适当配置目录权限以避免未经授权的访问。当 'autoindex' 与像 'allow' 和 'deny' 这样的访问控制指令结合使用时,NGINX 会先应用访问规则以决定是否拒绝或允许该请求,然后才处理索引。
配置示例
location /files {
autoindex on;
}如果目录权限未正确设置,启用 'autoindex' 可能会向用户暴露敏感文件。
目录列表可能会泄露应用程序的结构,这在生产环境中可能构成安全隐患。
说明
`autoindex_format` 指令用于指定在启用 NGINX 的 autoindex 功能时目录列表的输出格式。该指令允许用户更改生成的 HTML 的外观,以提高可读性或实现自定义。NGINX 支持若干预定义格式,例如 `html` 和 `json`,每种格式对应不同的呈现风格。当在配置文件中设置该指令时,NGINX 会使用指定的输出格式,而不是回退到默认配置,从而增强目录索引对可能依赖响应中特定数据结构的客户端或应用程序的可用性。 在实际场景中,`autoindex_format` 可用于以友好的 HTML 方式展示目录内容(例如包含链接和文件大小),或以 `json` 格式用于 API 消费,这样可以被程序化地解析。该格式必须在有效的上下文中设置,具体为 `http`、`server` 或 `location` 级别,从而允许根据 NGINX 配置的作用域进行全面控制。该指令主要支持与各种客户端应用的集成,这些应用根据其期望的格式以不同方式处理目录列表。
配置示例
location /files {
autoindex on;
autoindex_format json;
}在使用此指令之前,请确保已启用 autoindex 模块并执行 'autoindex on;'。
指定未知的格式会导致错误;请仅使用受支持的格式。
说明
NGINX 中的 `autoindex_localtime` 指令会影响在启用目录索引时目录列表的生成方式。当该指令设置为 'on' 时,NGINX 会在目录列表中显示文件的最后修改时间为本地时区,而不是 UTC,这对更习惯于本地时间而非协调世界时的用户更直观。 该指令可放在多个上下文中,包括 'http'、'server' 和 'location',从而根据请求的作用域对其行为进行细粒度控制。该指令的参数只是一个标志:'on' 用于在目录列表中启用本地时间显示,'off' 用于禁用,且默认为 'off'。启用此功能可以提升用户体验,尤其是对于需要以用户友好方式显示文件元数据的应用,因为它让用户看到与其地理位置相关的时间格式,而无需从 UTC 进行转换。 需要注意的是,启用 `autoindex_localtime` 并不会更改存储在服务器上的文件的实际时间戳;它只是改变了这些时间戳在目录列表中向终端用户显示的方式。
配置示例
location /files {
autoindex on;
autoindex_localtime on;
}请务必启用 'autoindex' 指令以使本地时间显示生效;否则不会显示任何目录列表。
如果禁用了目录索引,此指令不适用。请确保将 'autoindex' 设置为 'on',以便 'autoindex_localtime' 生效。
说明
`autoindex_exact_size` 指令用于 NGINX HTTP 服务器中,用以决定在自动生成的目录列表中如何显示文件大小。当此指令启用(设置为 'on')时,NGINX 将以字节显示文件的精确大小。如果设置为 'off',在提供目录列表时会将大小转换为更易读的格式(例如 KB、MB 等)。此设置对于需要精确文件大小数据的用户尤其有用,特别是在需要密切监控文件大小的环境中。 此指令适用于 `http`、`server` 和 `location` 上下文,允许根据应用架构灵活放置。该指令接受一个标志参数:可以是 'on' 或 'off'。这些选项的存在允许服务器管理员根据特定服务器位置或整个服务器配置的需求自定义 autoindex 的行为。
配置示例
location /files {
autoindex on;
autoindex_exact_size on;
}确保已启用 autoindex 模块,否则该指令不会生效。
将此指令与其他 autoindex 指令一起误用可能导致输出混乱。
将此指令设置为 'on' 可能会显著增加目录列表的大小,从而使其更难阅读。
说明
'modern_browser' 指令在 NGINX 配置中使用,用于指定哪些浏览器应被视为现代浏览器并在处理请求时区别对待。它可以通过根据客户端能力启用或禁用某些功能或行为来提升 Web 应用的性能。该指令可以接受一个或两个参数,允许用户定义在何种具体条件下对现代浏览器应用某些优化或规则。例如,如果请求来自被识别为现代浏览器的客户端,NGINX 可以相应地调整其响应或路由行为。 在配置该指令时,如果指定一个参数,则表示浏览器版本;第二个可选参数可定义额外的兼容性设置。该指令适用于多种上下文,包括 HTTP、server 和 location 块,允许管理员根据用户的浏览器优化服务器响应,可能通过利用诸如 HTTP/2 或特定缓存机制等现代技术来提升整体用户体验。要有效利用此指令,正确理解 user-agent strings 和浏览器能力至关重要。
配置示例
server {
location / {
modern_browser Firefox 90;
}
}确保 user-agent strings 已正确指定,以避免发生意外行为。
如果未正确配置,使用过于宽泛的术语可能会无意中影响旧版浏览器。
说明
'ancient_browser' 指令在 NGINX 中用于管理来自被视为过时或与现代 web 标准不兼容的浏览器的入站请求。通过指定 'ancient_browser' 指令,服务器管理员可以决定是否提供特殊内容、将用户重定向到不同的 URL,或对这些旧版浏览器应用具体策略。当处理安全问题或确保使用过时浏览器的用户了解其技术限制时,这一点尤其有用。 该指令可以接受多个参数,每个参数代表一个被识别为过时浏览器的特定浏览器或 user-agent 字符串。其行为可以包括自定义错误页面、重定向至升级提示,或为这些过时客户端提供专门设计的简化版站点。在定义哪些浏览器属于此类别时的灵活性,使得 NGINX 服务器能够对旧客户端进行细粒度控制,从而在可访问性与现代 web 性能之间取得良好平衡。 在配置该指令时,重要的考虑因素包括确保指定了正确的 user-agent 模式,并理解不同上下文(http、server 和 location)会影响指令的有效性。同时也要在支持旧技术与维护服务器的安全性和性能标准之间取得平衡。
配置示例
http {
ancient_browser "MSIE 5.0";
ancient_browser "Mozilla/4.0";
location / {
# Normal processing
}
}浏览器检测基于 user-agent strings,这些字符串可以被伪造。
请谨慎构造 user-agent strings,以确保正确匹配并避免意外阻断。
彻底测试该行为,确保用户不会因过时的浏览器而受到不当阻碍。
说明
`modern_browser_value` 指令用于设置或修改与现代浏览器发起的请求相关的 HTTP 响应。它将处理特定浏览器行为的配置集中化,允许根据请求是否来自被识别的现代浏览器进行针对性的优化和响应调整。 配置后,该指令提供了一种指定值的方式,以修改服务器的响应头,特别为现代网页浏览器量身定制。这可以改善网站某些功能的浏览器兼容性和性能,或通过向现代浏览器提供有关如何处理特定资源的专门指示来增强安全性。参数可以包含用于指定缓存策略或响应格式的值,这些值是专为支持先进技术的新浏览器版本设计的。
配置示例
modern_browser_value "joyful_response";
确保所设置的值在目标浏览器中有效并被识别。
如果未正确处理,不正确的值可能导致与某些较旧浏览器不兼容。
说明
`ancient_browser_value` 指令在 NGINX 中用于为被识别为 'ancient' 的过时网页浏览器发起的请求指定响应设置。基本上,此指令表明 NGINX 应如何处理这些请求,使其能够优化响应或应用特定规则以提升用户体验或保持兼容性。该指令可以放置在诸如 `http`、`server` 或 `location` 等不同上下文中,根据配置范围提供灵活的应用。 该指令接受单个参数,通常是用于表示在检测到此类请求时应采取的操作或设置的数值或字符串。指令的行为会影响资源的提供方式,尤其适用于旨在支持广泛用户代理的网站。对于仍依赖旧版浏览器技术的遗留系统,这尤其有用,可确保这些系统接收潜在的补丁或指向更新资源的提示,而不是被直接拒绝访问。 例如,如果服务器判断 用户代理 符合被归类为 'ancient' 浏览器的条件,服务器可以返回自定义消息或重定向到建议用户升级浏览器的页面。总之,该指令是为希望在多样化用户群中保持可访问性的 Web 开发者提供的一个实用工具。
配置示例
http {
ancient_browser_value "Upgrade your browser";
}如果配置不当,旧版浏览器可能会收到默认响应,从而导致糟糕的用户体验。
过度依赖此指令,若未提供令人信服的提示,可能会阻碍用户升级浏览器。
说明
'charset' 指令用于在 NGINX 发送给客户端的 HTTP 头中定义应使用的字符集。它通过告诉浏览器传输数据的编码方式,在确保内容在客户端正确显示方面起着关键作用。这对于需要准确处理不同语言或符号的 Web 应用程序非常重要。 该指令接受一个参数,用于指定要使用的字符集,例如 'utf-8'、'iso-8859-1' 或 'windows-1251'。当设置该指令时,NGINX 会在响应的 'Content-Type' 头中包含 'charset',从而将此编码传达给客户端的浏览器。这可以帮助防止与字符显示不正确相关的问题,例如乱码或意外符号。 此外,'charset' 指令可以按上下文进行配置,也就是说可以在 HTTP、server 或 location 块中设置。这允许对 Web 应用不同部分如何处理字符编码进行细粒度控制,使其在网站各部分提供的内容上更具适应性。
配置示例
http {
charset utf-8;
server {
location / {
charset iso-8859-1;
}
}
}在 'location' 块内的 'if' 中设置 'charset' 可能导致意外行为。通常建议避免在 'if' 中使用 'charset'。
确保所指定的 charset 被你的内容所支持,否则浏览器仍可能误判文本编码。
说明
`source_charset` 指令在 NGINX 中用于为处理传入请求体建立字符集。该指令在处理表单和 POST 数据内容时尤为重要,可确保服务器根据指定的编码正确解释字符。该指令可应用于多种上下文,包括 `http`、`server`、`location` 和 `if in location`,从而允许根据不同的服务器位置或请求类型进行灵活配置。 在定义 `source_charset` 时,必须提供一个单一的字符集值作为参数,例如 'utf-8'、'iso-8859-1' 等。如果在处理传入数据时未指定字符集,NGINX 将默认以可能导致字符误表示的方式来解释数据,尤其是包含非-ASCII 字符的内容。对于处理多语言文本或来自编码标准各异地区的数据的应用程序来说,确保合理设置 `source_charset` 是至关重要的。 此外,某些字符集可能具有特殊的处理说明或限制,因此应查阅 NGINX 文档以了解支持的字符集以及它们在不同上下文中实现时的任何细节差异。错误配置或不正确的字符集值可能导致数据损坏、请求失败或服务器错误,因此在 NGINX 配置中测试和验证字符集设置非常重要。
配置示例
# Set the source charset to UTF-8 for proper encoding handling source_charset utf-8;
确保指定的 charset 受到支持;否则,NGINX 可能无法正确处理数据。
使用不正确的 charset 可能导致数据损坏,尤其是在处理非 ASCII 字符时。
请记住,根据您的应用需求,可能需要在不同的上下文级别设置该指令。
说明
NGINX 中的 `override_charset` 指令用于控制服务器所提供内容的响应字符编码。默认情况下,会遵从响应的 Content-Type 头中指定的字符集。然而,有些情况下管理员可能希望强制使用不同的字符集,而不管后端服务指定了什么。将 `override_charset` 设置为 `on` 可实现此目的。 当 `override_charset` 设置为 `on` 时,NGINX 会用服务器配置的字符集替换响应的 Content-Type 头中指定的任何字符集。这在来自不同来源的内容可能使用不一致字符集的环境中尤其有用,或者当服务器需要对所有 HTTP 响应应用统一字符集策略时。相反,当该指令设置为 `off`(默认设置)时,NGINX 将允许 Content-Type 中指定的字符集优先,从而可能导致不同响应之间的字符编码不一致。 该指令可以在多种上下文中配置,即 `http`、`server`、`location`,以及 `location` 内的 `if` 块中。每种上下文都允许根据不同的请求处理场景细化字符集行为。强制使用特定字符集可以提高与期望特定编码的客户端的兼容性,从而避免字符误解读相关的问题,尤其是在多语言内容中。
配置示例
http {
override_charset on;
server {
location / {
root html;
index index.html index.htm;
}
}
}确保指定的 charset 正确并被客户端支持,以避免内容渲染问题。
将 `override_charset` 与其他也会修改响应头的指令一起使用,可能导致意外结果,尤其是在与 `add_header` 一起使用时。
在将 `override_charset` 部署到生产环境之前,务必在预发布环境中测试其行为。
说明
NGINX 中的 `charset_types` 指令允许管理员指定哪些内容类型将应用特定的字符编码。该指令接受一个或多个 MIME types 作为参数,并且必须在 `http`、`server` 或 `location` 区块中使用。当响应匹配所定义的某一 MIME types 时,NGINX 会自动为该字符集添加相应的 `Content-Type` 头,从而告知客户端如何正确解释响应数据。 例如,如果您定义了 `charset_types text/html application/json;`,对于任何带有 `Content-Type: text/html` 或 `Content-Type: application/json` 的响应,NGINX 都会发送由 `charset` 指令定义的字符集。通过为不同的文件类型定义默认字符集,这在确保客户端正确渲染文本方面尤其有用,并提升与诸如 UTF-8 之类的多字节字符编码的兼容性。 如果请求的内容类型不匹配 `charset_types` 中指定的任何类型,NGINX 将不会对这些响应应用由 `charset` 指令定义的默认字符集,从而对不同内容类型如何处理字符编码提供更精细的控制。
配置示例
http {
charset UTF-8;
charset_types text/html application/json text/css;
}
如果在配置中未设置 `charset`,则 `charset_types` 不会生效,因为没有可应用于指定类型的字符集。
设置 `charset_types` 时请小心,因为它会影响定义上下文内所有匹配的响应,如果不加以妥善控制,可能导致意外行为。
说明
`charset_map` 指令允许用户指定在 NGINX 的 `http` 上下文中,不同字符集应如何映射到 MIME 组件。这对于确保 NGINX 所提供的内容正确标识其字符编码尤其有用,字符编码会影响浏览器如何显示内容。`charset_map` 块中的每一项由源字符集和目标字符集组成,提供了一种在需要时在不同编码之间转换的方法。 该指令在 `http` 上下文中生效,使用一个块结构进行配置,包含一系列格式为 `charset source_charset destination_charset;` 的条目。例如,如果某个字符集应被视为另一个字符集(例如将 `latin1` 映射到 `utf-8`),可以在该块中声明。当 NGINX 处理请求时,会查阅此映射以确定如何为发送给客户端的内容处理字符编码。 需要确保所定义的映射是准确且必要的,因为错误的配置可能导致客户端浏览器上的内容渲染不正确。此外,这对国际化也非常重要,内容可能需要根据用户位置和偏好以不同语言和编码进行提供。
配置示例
charset_map {
charset windows-1251 utf-8;
charset iso-8859-1 utf-8;
};确保所使用的所有字符集都被客户端浏览器支持并识别。
重叠或冲突的字符集定义可能导致意外行为或内容渲染不正确。
在修改 charset map 后,记得重启 NGINX 以确保更改生效。
说明
`dav_methods` 指令用于定义客户端通过 WebDAV 与资源交互时被允许的 HTTP 方法集合。该指令对于管理通过 HTTP 请求操作的资源权限至关重要。通过允许诸如 `GET`、`PUT`、`DELETE` 和 `PROPFIND` 等特定方法,管理员可以控制客户端在服务器上能执行哪些操作,从而增强安全性和功能性。 例如,如果该指令配置为允许 `PUT`,客户端将能够上传文件;而禁止 `DELETE` 则会阻止它们删除文件。这种细粒度的控制对于严重依赖 WebDAV 的服务来说非常重要,能够让服务器根据交互的方法做出适当响应。该指令可以接受一个或多个参数,这些参数对应于您希望允许的 HTTP 方法,从而在设置权限时提供灵活性。 总之,`dav_methods` 指令可在 `http`、`server` 或 `location` 上下文中使用,对于确保仅允许期望的 HTTP 操作从而有效保护您的 WebDAV 服务非常关键。
配置示例
location /dav {
dav_methods PUT DELETE PROPFIND;
}确保所指定的方法受 WebDAV 模块支持;否则,客户端可能会收到错误。
如果管理不当,添加过多的 HTTP 方法可能导致潜在的安全风险。
说明
'create_full_put_path' 指令是 NGINX 中的一个配置选项,用于指定在 PUT 请求期间是否为客户端上传的文件创建完整路径。将其设置为 'on' 时,NGINX 不仅会创建 PUT 请求中指定的目标文件,还会确保通向该目标文件的所有目录都已存在。在客户端可能尝试将文件上传到服务器上尚未创建的路径的场景中,这一点尤为重要,从而通过确保必要的目录结构就位来增强对文件上传的处理能力。 将指令设置为 'off'(默认)时,如果 PUT 路径中指定的某个目录不存在,NGINX 会返回 403 Forbidden 错误。然而,如果启用了 'create_full_put_path',在 PUT 操作期间如果中间目录缺失,NGINX 会尝试自动创建这些目录,从而允许上传成功。这在管理文件上传时非常方便,并且可以帮助防止客户端使用 PUT 请求时因目录缺失而导致的失败。 就期望行为而言,当该指令放在 http、server 或 location 上下文中时,其行为是一致的,使其在需要文件上传的各种配置中具有灵活性。
配置示例
location /uploads {
create_full_put_path on;
root /var/www;
}确保 NGINX 的 worker 用户具有创建目录的适当权限。
在自动创建目录时要谨慎,以避免无意中暴露敏感文件路径。
请记得确认在适当的上下文中包含此指令。
说明
指令 `min_delete_depth` 在 NGINX 的文件系统处理过程中用于指定进行删除操作所需的最小目录深度。当设置该指令时,NGINX 只允许删除深度大于或等于指定级别的目录。通过对删除操作施加更严格的条件,这对于防止意外删除根目录或顶级目录特别有用。 在 NGINX 的分层配置中,目录深度根据路径中斜杠 (/) 的数量来计算。例如,路径 `/var/www/html` 的深度为 2。该指令通过确保只有满足最小深度条件的目录才能被删除,从而有助于防止不可逆的删除。这样,管理员在管理服务器文件结构时可以降低与数据丢失相关的风险。 该指令可以在多个级别设置,包括 `http`、`server` 和 `location`,根据配置需要提供灵活性。分配给 `min_delete_depth` 的值必须是一个正整数,对应允许删除所需的目录深度。
配置示例
http {
min_delete_depth 2;
}如果设置得过高,可能会阻止对嵌套目录的合法删除。
如果目标目录的深度小于指定限制,则不适用。
说明
在 NGINX 的 HTTP 模块中,`dav_access` 指令用于根据客户端 IP 地址指定规则,以控制对 WebDAV 资源的访问。通过允许或拒绝特定的 IP 地址或地址范围,站点管理员可以管理谁可以访问通过 WebDAV 提供的资源。该指令可以包含一到三个参数,具体取决于所需的操作,通常涉及指定 'allow' 以授予访问或 'deny' 以限制访问。它通过将传入请求的 IP 地址与提供的规则进行比较来相应地允许或阻止该请求。 在配置 `dav_access` 时,管理员可以定义多个规则,这些规则可以是包含性的(allow)或排他性的(deny)。规则可以按层级结构组织,这意味着当冲突发生时,deny 规则可以覆盖 allow 规则。需要注意规则的顺序,因为 NGINX 会按顺序处理它们,并应用与第一个匹配规则相对应的操作。用户还可以组合 IPv4 和 IPv6 的规则,这些规则在配置中会被分别处理。
配置示例
location /webdav {
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_access allow 192.168.1.0/24;
dav_access deny all;
}确保 IP 地址格式正确,以避免意外被锁定。
allow 和 deny 规则的顺序可能导致意外的访问;请检查指令的顺序。
小心使用 'deny all',因为如果配置错误可能会阻止所有访问。
说明
`degradation` 指令允许用户根据服务器处理期间指定的条件自定义请求的处理。当使用该指令时,它会配置影响服务器行为的参数,这对需要优先处理某些流量类型或在不同负载条件下进行调整的应用尤其有用。该指令接受一个参数,该参数会影响请求的评估和处理方式,但关于该参数的有效选项和运行上下文的具体细节需要参考相关模块文档和系统资源。 该指令在基于实时负载或访问模式动态管理服务质量时尤其有用。通过实施 degradation 参数,管理员可以确保在更高负载下,应用仍能通过限制访问、调整响应行为或定义回退策略等方式继续运行。该机制对于在高峰使用时段或处理不稳定网络条件时保持服务连续性和性能至关重要。示例场景可能包括降低某些类型请求的优先级、启用详细日志以便故障排查,或调整响应时间。
配置示例
http {
degradation 1;
}确保该值设置得当,以避免意外的拒绝服务情况。
检查配置中 `degradation` 指令是否与其他访问控制指令一致。遵循明确的优先顺序。
说明
'degrade' 指令在 NGINX 中允许管理员指定当主后端服务器不可用时服务器应如何表现。该指令在可能有多个 upstream 服务器或服务的负载均衡设置中特别有用。启用 'degrade' 指令后,NGINX 会允许将服务器请求路由到指定的二级服务器或预定义的服务器集合,即使一个或多个 upstream 服务器宕机。这有助于保持服务可用性,并确保在故障情况下用户仍能收到响应。 启用该指令后,它会通过允许从二级资源提供请求而不是直接拒绝请求来实际改变失败时的行为。这在需要保持高可用性的环境中尤其有用。管理员必须确保已配置适当的回退设置,例如在 upstream 上下文中定义备用服务器,以有效利用该指令。此外,成功使用该指令还依赖于整体的健康检查和对 upstream 服务器的正确配置。
配置示例
http {
upstream backend {
server primary_server;
server backup_server backup;
}
server {
location / {
proxy_pass http://backend;
degrade;
}
}
}请确保 upstream 服务器已正确定义;配置缺失可能导致意外行为。
degrade 指令仅在使用 upstreams 时适用;在简单的 server 上下文中可能不会生效。
说明
'empty_gif' 指令在 NGINX 配置的 location 上下文中使用,用于指示服务器在请求匹配该 location 时返回一个小的透明 GIF 图像。该指令在用作跟踪像素或占位符时特别有用——在内容不可用但客户端跟踪需要响应的场景中。该指令不接受任何参数,并且会启用一个内置的 URL 响应来返回该空 GIF 图像,该图像尺寸为 1x1 像素且完全透明。 当对包含 'empty_gif' 指令的 location 发出请求时,NGINX 将不会在该 location 中继续处理该请求的其他指令;相反,它会生成一个包含 GIF 图像数据的 HTTP 响应。NGINX 的默认行为是执行典型的请求处理,除非像 'empty_gif' 这样的指令另有指定。因此,要有效使用该指令,需要在服务器的 location 定义中谨慎放置,以确保它不会无意中覆盖其他配置设置。 该指令增强了服务器在无需在服务器上保存实际图像文件的情况下提供多种功能的能力,从而在分析跟踪或视觉占位等用例中优化资源使用并简化配置。
配置示例
location /tracking {
empty_gif;
}确保该指令放置在正确的 location 上下文中;否则,它将无法按预期运行。
在包含其他冲突指令的 location 中使用 'empty_gif' 可能导致意外行为;请彻底测试配置。
说明
NGINX 中的 `fastcgi_pass` 指令用于指定将负责处理请求的 FastCGI 服务器的位置。它可以把流量指向 TCP 套接字、Unix 套接字,或带指定端口的 IP 地址。该指令通常在 `location` 块中配置,使 NGINX 能够根据 URL 路径和其他参数管理请求的处理方式。当接收到请求时,请求会被转发到已定义的 FastCGI 服务器,该服务器处理请求并将相应的响应返回给 NGINX,随后 NGINX 将该响应发送给客户端。 在使用场景中,你通常会将 `fastcgi_pass` 指令与其他指令(例如 `fastcgi_param`)一起配置,`fastcgi_param` 用于为 FastCGI 应用设置参数(例如脚本文件名、请求方法等)。FastCGI 服务器会返回已处理的数据,NGINX 将该响应转发回客户端。该机制对于 Web 应用中的动态内容生成至关重要,因为后端处理被卸载到 FastCGI 服务器,从而提升性能和可扩展性。
配置示例
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}确保 FastCGI 服务器正在运行并可访问;否则,NGINX 将无法连接并响应客户端请求。
检查 `fastcgi_pass` 中指定的套接字或地址是否与 FastCGI 应用的配置端口和 IP 地址匹配,以避免连接问题。
确保使用 `fastcgi_param` 包含相关参数,尤其是 `SCRIPT_FILENAME` 参数,否则 FastCGI 应用可能无法正常工作。
说明
NGINX 中的 `fastcgi_index` 指令指定当对不包含文件名的 `location` 发起 FastCGI 请求时要提供的默认文件。当客户端请求一个目录时,NGINX 会检查该目录中是否存在指定的 `fastcgi_index` 文件。如果请求中没有提供具体文件,NGINX 会自动将 `fastcgi_index` 的值附加到请求中,以便 FastCGI 服务器生成响应。 该指令通常与 `fastcgi_param` 和 `include` 设置配合使用,从而更无缝地集成 PHP 或其他基于 FastCGI 的应用。它通过确保在预期有索引文件(例如 `index.php`)时自动提供该文件,从而提升用户体验,而无需客户端显式指定。该指令可以在多个配置层级设置:`http`、`server` 和 `location`,这使得在不同 NGINX 上下文中可以进行更细粒度的控制。
配置示例
location / {
index index.php;
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}确保指定的文件存在于该目录中,以便能够正确提供。
如果未设置此指令,当期望使用索引文件但未由 FastCGI 明确请求时,可能会导致 404 错误。
说明
`fastcgi_split_path_info` 指令允许你指定一个正则表达式,用来匹配请求 URI 的一部分并将其分为两个部分:"script" 部分和 "path info" 部分。这对于 FastCGI 应用至关重要,在这些场景中你可能希望将某些 URI 请求路由到特定脚本,同时传递剩余的路径信息进行处理。该指令定义了 URI 的解析方式,使底层应用能够有效地处理请求。 当设置该指令时,服务器会根据指定的模式处理请求 URI,并将 script 与 path info 分别捕获到环境变量 `SCRIPT_NAME` 和 `PATH_INFO` 中。此功能允许开发者创建简洁的 URL,同时仍使脚本能以预期的输入正确运行。作为参数提供的正则(regex)应被慎重构造以充分捕获所需内容,否则不当的模式可能导致意外行为或请求路由错误。 该指令可用于 `http`、`server` 和 `location` 上下文,使其在 NGINX 配置的不同层级都非常灵活。重要的是确保所提供的正则表达式符合 NGINX 使用的语法,并且不会与服务器中已存在的路由冲突。
配置示例
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}确保正则表达式正确匹配应用程序所期望的 URI 结构;否则,您可能会丢失路径信息。
如果在不同上下文中定义了多个 `fastcgi_split_path_info` 指令,NGINX 可能会使用在最具体的上下文中定义的规则,从而可能导致混淆。
说明
`fastcgi_store` 指令用于定义 NGINX 在存储从 FastCGI 服务器接收的响应时的行为。当设置该指令时,它指示 NGINX 将 FastCGI 应用的响应主体保存到磁盘上的文件,从而提高对相同 FastCGI 资源的重复请求的处理效率。 指定时,第一个参数应为响应应被存储的有效文件路径或 URI。该功能支持各种文件系统能力;例如,它可以是基于请求变量动态生成的文件路径,或是静态路径。存储方式还可以涉及根据所需配置设置文件权限——在为从 FastCGI 响应提供静态文件而设置文件权限时非常有用。 此外,该指令对缓存有影响,因为它将响应作为文件存储,从而比标准的内存缓存提供更持久的缓存机制。然而,在配置这些存储文件的存储路径、权限和清理策略以在运行期间适当管理磁盘空间时,需要谨慎考虑。
配置示例
location /example {
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_store on;
fastcgi_store_access user:rw group:rw all:r;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}确保存储路径对 NGINX 进程是可写的;否则,响应将无法正确存储。
注意磁盘空间;随着文件累积,可能需要监控和清理策略以防止磁盘过度使用。
在存储中使用动态路径时,如果变量格式不正确,可能导致意外行为。
说明
'fastcgi_store_access' 指令指定使用 FastCGI 模块存储的文件的访问权限。该指令允许操作人员根据客户端的 IP 地址定义哪些客户端可以访问存储的文件,使用 allow 或 deny 规则。它最多可以接受三个参数,每个参数表示根据指定的 IP 地址生效的不同访问规则。该指令在可能将敏感数据存储于 FastCGI 响应生成的文件的场景中特别有用,因此必须严格控制访问以防止未授权访问。 当设置此指令时,NGINX 会将传入请求与指定的访问规则进行比对。如果客户端的 IP 与任何 'allow' 规则匹配,则授予访问;如果匹配 'deny' 规则,则拒绝访问。如果没有规则适用,则由默认配置决定访问行为。该指令提供了灵活的控制,允许管理员根据应用需求精细调整访问级别。例如,可以配置为仅允许来自特定网络或 IP 地址的访问,同时拒绝其他访问,从而增强存储的 FastCGI 响应的安全性。
配置示例
location /store {
fastcgi_store on;
fastcgi_store_access user:rw group:rw all:r;
fastcgi_pass backend;
}请记得在 allow/deny 规则中指定正确的 IP 地址;配置错误可能导致非预期的访问。
如果没有规则匹配,则会应用默认访问策略;如果该策略未被充分定义,可能导致非预期的行为。
说明
当 `fastcgi_buffering` 指令设置为 `on` 时,它会在将响应发送给客户端之前对来自 FastCGI 服务器的响应进行缓冲。该缓冲机制允许 NGINX 通过先将来自 FastCGI 服务器的整个响应体读取到缓冲区,然后再转发给客户端,从而更高效地处理响应。相反,当设置为 `off` 时,响应在接收后会立即传递给客户端,这可以提高响应速度,但可能以资源管理为代价,尤其是在高负载下。 当该指令设置为 `on` 时,NGINX 使用若干预设的缓冲区大小,这些大小可以使用诸如 `fastcgi_buffers` 和 `fastcgi_buffer_size` 等其他指令进行调整。总体的缓冲策略可以降低客户端的延迟,因为一旦完整响应被获取,NGINX 可以更快地发送更大的数据块,这对较大的响应体尤其有用。然而,缓冲需要谨慎管理;过度缓冲可能导致内存使用增加。 该指令可以在 `http`、`server` 或 `location` 上下文级别进行配置,根据具体需求实现灵活配置。理解两种设置(`on` 与 `off`)的影响对于基于应用需求对 NGINX 进行性能优化至关重要。
配置示例
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_buffering off;
include fastcgi_params;
}将 `fastcgi_buffering` 设置为 `off` 可能导致更高的 CPU 使用率,因为响应在不经过缓冲的情况下直接传递给客户端。
建议在使用 `fastcgi_buffering on` 时监测内存使用情况,因为大型响应可能会消耗大量内存资源。
说明
在 NGINX 中,指令 `fastcgi_request_buffering` 允许管理员在 FastCGI 模块处理请求时启用或禁用对请求体的缓冲。默认情况下,当该指令设置为 'on' 时,NGINX 会在将请求体传递给 FastCGI 进程之前缓冲整个请求体。这可以提升性能,尤其是在应用需要在处理前获得完整请求数据的场景中。 但是,将 `fastcgi_request_buffering` 设置为 'off' 允许请求直接流式传输到 FastCGI 应用,而无需在 NGINX 中进行中间缓冲。对于处理大文件上传或应用实时处理数据的情况,这尤其有用。使用此设置后,数据可以在接收时开始被处理,可能降低内存消耗并提高大型有效载荷或长时间运行请求的响应性。 该指令可以在 `http`、`server` 或 `location` 上下文级别指定,从而根据特定位置或 `server` 块的需要对请求处理行为进行细粒度控制。
配置示例
location /upload {
fastcgi_pass 127.0.0.1:9000;
fastcgi_request_buffering off;
}禁用请求缓冲可能会导致小请求的性能下降,因为流式处理会产生额外开销。
某些应用可能期望请求主体被完全缓冲,当此指令设置为 off 时,可能会导致意外行为。
说明
`fastcgi_ignore_client_abort` 指令是 NGINX 中的一个配置选项,用于管理通过 FastCGI 接口处理的请求的行为。启用时(设置为 'on'),即使发起请求的客户端在响应完全发送之前断开连接,NGINX 仍会继续处理来自后端 FastCGI 服务器的响应。相反,如果将该指令设置为 'off',当客户端断开连接时 NGINX 将终止 FastCGI 请求;在需要优先考虑资源节约的某些用例中,这一点尤为重要。该指令可用于控制在客户端可能放弃请求的情况下资源如何被使用,从而有可能减少正在进行的后端处理带来的成本。 需要注意的是,如果您有预期即使在客户端断开后仍需完成的长时间运行的 FastCGI 请求,启用此指令可能会有利。但在响应是动态生成并且与客户端会话相关的场景中,保留默认值(off)可能更为谨慎,以避免不必要的处理和资源分配。此指令可以在 `http`、`server` 或 `location` 上下文中设置,从而决定客户端断开连接行为的作用范围。
配置示例
location /api {
fastcgi_pass 127.0.0.1:9000;
fastcgi_ignore_client_abort on;
}将该指令设置为 'on' 可能会导致资源浪费:如果客户端断开连接,NGINX 仍会继续处理可能已不再相关的请求。
请务必仔细评估何时使用 'on',因为在高负载下这可能会对性能产生影响。
说明
`fastcgi_bind` 指令在 NGINX HTTP 服务器中用于指定在处理请求时 FastCGI 服务器应绑定的地址或套接字。该指令可以接受一个或两个参数。第一个参数是地址(IPv4 or IPv6)或 Unix 套接字路径,表示 FastCGI 服务器可以在该处监听连接。可选的第二个参数可以指定要绑定的端口,从而允许对 FastCGI 进程使用的网络接口和端口进行更细粒度的控制。 当使用 Unix 套接字时,语法通常仅为套接字的路径,不带任何端口指定。对于可能运行多个 FastCGI 服务器的场景,该绑定机制至关重要,因为它允许 NGINX 将流量定向到正确的 FastCGI 实例。然后可以根据提供的绑定有效地分配 FastCGI 服务器,从而通过减少不必要的网络开销来提升性能。 在将依赖 FastCGI 的应用部署到 NGINX 时,正确配置 `fastcgi_bind` 指令至关重要,它可确保根据应用的需求正确分配服务器资源并保持对客户端请求的响应能力。作为参考,该指令可在 `http`、`server` 或 `location` 块中使用,这为在 NGINX 安装的不同部分配置 FastCGI 处理器提供了很大的灵活性。
配置示例
location ~ \.php$ {
fastcgi_pass 127.0.0.1; # Example FastCGI server address
fastcgi_bind 127.0.0.1:9000;
}确保指定的地址正确且可被 NGINX 工作进程访问。
避免绑定到未分配给服务器的地址,因为这可能导致“地址已被占用”的错误。
使用 Unix 套接字时,确保套接字路径具有 NGINX 可访问的适当权限。
说明
`fastcgi_socket_keepalive` 指令可用于控制是否应保持与 FastCGI 服务器的持久连接。设置为 'on' 时,NGINX 会在请求处理完成后保持 FastCGI socket 打开,从而允许额外的请求重用现有连接,而不是建立新的连接。通过减少 socket 创建和销毁的开销,特别是在对同一 FastCGI 服务器发起大量请求的高负载情况下,这可以提升性能。 该指令可以在 `http`、`server` 或 `location` 上下文中指定,因而非常灵活,可以全局应用或应用于特定的 server 块或 location。该标志也可以设置为 'off',如果禁用 keepalive 行为,则每个对 FastCGI 服务器的请求都会建立新的连接。调整此设置时需仔细考虑 FastCGI 服务器处理持久连接的能力以及可能影响性能的任何超时配置。
配置示例
http {
server {
location / {
fastcgi_pass 127.0.0.1:9000;
fastcgi_socket_keepalive on;
}
}
}启用 keepalive 可能导致意外行为,如果 FastCGI 服务器未正确支持 keepalive,建议进行测试。
如果未妥善管理,过多的 keepalive 连接可能导致 FastCGI 服务器的资源耗尽。
说明
The `fastcgi_connect_timeout` 指令指定 NGINX 在连接到 FastCGI 服务器之前等待的最长时间,然后才会使请求失败。这个超时在你的 FastCGI 服务器负载很高或响应较慢时尤为关键,因为它有助于防止 NGINX 在等待建立连接时无限期挂起。如果在指定的时间范围内无法建立连接,请求将被中止,并向客户端返回 504 Gateway Timeout 错误。 此指令在 `http`、`server` 或 `location` 的配置上下文中设置,允许全局配置或针对某些 server 块或 location 路径进行特定配置。`fastcgi_connect_timeout` 的值以秒为单位指定,可以设置为正整数。根据 FastCGI 服务器的预期响应时间选择合适的值很重要,既不能太长(会导致不必要的延迟),也不能太短(会导致过早超时)。
配置示例
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_connect_timeout 30s;
include fastcgi_params;
}将值设置得过低可能会导致在正常负载情况下频繁超时。
确保其他超时设置(例如 `fastcgi_read_timeout`)与此指令不冲突。
必须遵守配置上下文的限制;在无效上下文之外设置此指令会导致错误。
说明
`fastcgi_send_timeout` 指令指定 NGINX 等待 FastCGI 服务器发送响应的最长时间。如果超过此限制,NGINX 将终止与 FastCGI 服务器的连接并向客户端返回错误。该值以毫秒为单位指定,可帮助防止由无响应的 FastCGI 应用引起的延迟。该指令可以在 `http`、`server` 或 `location` 块级别设置,根据具体用例实现灵活配置。 在配置 `fastcgi_send_timeout` 时,应根据 FastCGI 后端的预期响应时间设置适当的值。超短的超时可能会对正常请求导致不必要的错误,而超长的超时可能会延迟对无响应请求的处理。可以配合 `fastcgi_read_timeout` 和 `fastcgi_buffering` 等指令进一步细化此指令的行为,从而有效地同时控制响应处理和超时策略。
配置示例
location /app {
include fastcgi_params;
fastcgi_pass backend;
fastcgi_send_timeout 30s;
}将超时值设置得过低可能会导致对合法请求的过早终止。
未将此指令与 `fastcgi_read_timeout` 一起配置可能会在长时间处理期间导致行为不一致。
说明
`fastcgi_send_lowat` 指令用于通过为发送数据指定阈值来优化 NGINX 向 FastCGI 服务器发送数据的方式。当待发送数据的总字节数低于该阈值时,进程可以在不阻塞的情况下发送更多数据,从而在高负载情况下提高性能。该指令在低延迟至关重要的场景中很有用,例如依赖于 FastCGI 后端频繁且较小响应的 Web 应用程序。 `fastcgi_send_lowat` 的参数是一个表示字节数的单一整数值。当设置该值后,如果排队准备发送到 FastCGI 服务器的数据量超过此阈值,NGINX 将开始阻塞或限制后续发送操作。这样可以确保在不使服务器过载的情况下,网络资源被更合理地利用,从而维持连接效率。根据应用需求和后端的性能特性对该值进行微调通常尤其有益。
配置示例
location /api {
fastcgi_pass 127.0.0.1:9000;
fastcgi_send_lowat 16384;
}将此值设置得过低可能导致过度阻塞和吞吐量降低,尤其在负载较高时。
请参考性能指标,为您的应用和环境适当地调整此值。
说明
`fastcgi_buffer_size` 指令指定用于从后端服务器读取 FastCGI 响应头部的缓冲区大小。当 NGINX 与 FastCGI 应用通信时,会缓冲响应头以在传输主体之前有效处理它。适当大小的缓冲区可以通过确保头部可以放入缓冲区而不需要多次读取,从而减少延迟,提升 NGINX 配置的性能。 缓冲区大小在 `http`、`server` 或 `location` 块上下文中定义,允许根据所需配置级别进行细粒度控制。它接受一个指定大小值的参数,例如 `16k` 或 `32`。如果缓冲区不足以容纳头部数据,NGINX 可能会切换到用于主体的单独缓冲区,这可能导致响应时间或资源使用增加。确保 `fastcgi_buffer_size` 与 FastCGI 应用的预期响应大小一致,对于获得最佳性能至关重要。
配置示例
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_buffer_size 32k;
include fastcgi_params;
}如果指定的缓冲区大小过小,NGINX 在分多次读取响应时会导致额外开销。
在未经过测试的情况下调整缓冲区大小可能会对性能产生不利影响;务必对更改进行基准测试。
说明
'fastcgi_pass_request_headers' 指令用于 NGINX 配置中,用来决定是否将来自客户端请求的头部转发给 FastCGI 服务器。该指令接受一个布尔标志作为参数,允许你启用或禁用这些头部的传递。当设置为 'on' 时,NGINX 会传递来自客户端请求的所有头部,包括那些可能被中间代理或其他服务修改或添加的头部。相反,将其设置为 'off' 则表示不会向 FastCGI 服务器发送任何请求头。 有效使用此指令对于依赖某些头部才能正常工作的应用程序(例如 `HTTP_REFERER` 或 `USER_AGENT`)至关重要。不传递这些头部可能会导致期望特定请求头的 Web 应用或内容管理系统出现问题。同时,还应考虑转发某些头部的安全影响,因为这可能暴露客户端请求中的敏感信息,从而被滥用。 该指令可以在 http、server 或 location 上下文中设置,使其能够根据你的配置需求灵活应用。在将 NGINX 与 FastCGI 应用集成时,正确使用和理解此指令,特别是在性能和安全方面的影响,是关键。
配置示例
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_pass_request_headers on;
include fastcgi_params;
}启用头信息时请谨慎,因为它们可能包含敏感信息。
确保你的 FastCGI 应用能够正确处理所传递的头信息。
说明
在 NGINX 配置中,指令 `fastcgi_pass_request_body` 用于指定是否将客户端 HTTP 请求的请求体发送到 FastCGI 服务器。该指令可接受一个标志作为参数,取值可以是 'on' 或 'off'。当设置为 'on' 时,请求体会作为请求处理的一部分被转发到后端 FastCGI 服务器。相反,当设置为 'off' 时,请求体不会被发送,等同于忽略客户端在请求体中提交的任何数据。 当请求的处理不需要来自请求体的任何输入数据时(例如 GET 请求,或在使用 FastCGI 服务器处理某些不处理输入数据的操作时),该指令尤其有用。正确使用可以在 NGINX 与 FastCGI 后端之间实现高效的数据处理和响应管理,减少不必要的数据传输。该指令通常与其他 FastCGI 指令(例如 `fastcgi_pass`)结合使用,以确保根据定义的请求上下文联系到合适的服务器。
配置示例
location /example {
fastcgi_pass 127.0.0.1:9000;
fastcgi_pass_request_body off;
}确保根据 FastCGI 应用是否需要请求体来设置此指令;当需要请求体时将其设置为 'off' 会导致数据丢失。
请记住,该指令只适用于通过 FastCGI 处理的请求;在其他上下文中使用可能不会产生任何效果。
说明
`fastcgi_intercept_errors` 指令通过控制 NGINX 如何处理 FastCGI 服务器返回的任何错误(例如 4xx 或 5xx HTTP 状态码)来与 FastCGI 协同工作。 当设置为 'on' 时,NGINX 会捕获这些错误响应,允许你定义自定义错误页面或执行额外处理,而不是直接将原始 FastCGI 错误响应返回给客户端。这在希望显示用户友好的错误信息或实现特定错误恢复机制的场景中特别有用。 该指令接受一个布尔标志作为参数,可以是 'on' 或 'off'。当为 'on' 时,来自 FastCGI 服务器的任何错误响应(例如状态码在 400 或 500 范围内的响应)可以由在 NGINX 配置中定义的特定错误页面配置处理。设置为 'off' 时,默认行为允许 NGINX 原样返回 FastCGI 响应,包括任何错误消息。该指令可以在 'http'、'server' 或 'location' 上下文中使用,根据所需的错误处理范围提供灵活的放置位置。
配置示例
location /app {
fastcgi_pass backend;
fastcgi_intercept_errors on;
fastcgi_index index.php;
include fastcgi_params;
}在拦截错误时请记得定义自定义错误页面,否则用户可能会收到空内容或默认错误消息。
此指令不影响非 FastCGI 响应;如适用,请确保为不同类型的后端配置其他错误处理。
说明
`fastcgi_read_timeout` 指令用于指定 NGINX 在发送请求后等待来自 FastCGI 服务器响应的时长。这在 FastCGI 处理可能比预期更长、且希望避免过早关闭仍可能最终返回响应的连接时非常有用。该超时对每个请求单独生效,并可以在诸如 `http`、`server` 和 `location` 块等不同上下文中指定。 该指令的参数是一个时间值,可以用秒 (s)、分钟 (m)、小时 (h) 或天 (d) 指定。如果超过超时时间且未收到响应,NGINX 将终止与 FastCGI 服务器的连接,并可能向客户端返回错误。调整 `fastcgi_read_timeout` 对于需要更长处理时间的应用(例如执行复杂数据库查询或文件操作的应用)而言,可能对性能优化至关重要。 需要注意的是,将此值设置得过低可能导致不希望的连接关闭,而设置得过高可能会使客户端在永远不会到来的响应上不必要地等待过久。因此,建议根据应用的性能特性对该值进行平衡设置。
配置示例
location /api {
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 120s;
}将超时设置得很短可能会导致在处理时间较长时合法请求失败。
如果您将超时设置高于 PHP 的最大执行时间,超时仍将根据本指令生效;因此,您的应用程序可能需要调整这些设置以保持一致。
说明
`fastcgi_buffers` 指令对于配置 NGINX 如何处理来自 FastCGI 服务器的响应至关重要。它定义了 NGINX 在读取响应时使用的缓冲区数量以及每个缓冲区的大小。该指令通过管理在将数据发送到客户端之前可以一次性从 FastCGI 后端读取的数据量来优化性能和内存使用。 当你用两个参数指定 `fastcgi_buffers` 时,第一个参数表示缓冲区的数量,第二个参数指定每个缓冲区的大小。NGINX 将按指定分配总缓冲区空间,这有助于有效缓存较大的响应,从而防止过早向客户端发送部分响应。缓冲区可以容纳来自 FastCGI 服务器的完整响应大小,从而提升针对生成较大响应的应用(例如数据处理密集的 Web 应用)的性能。 还应注意,`fastcgi_buffers` 的值应根据应用可能产生的响应大小适当设置。将该值设置得过低可能导致性能下降或额外开销,因为 NGINX 可能需要比完成响应所必需的更频繁地从 FastCGI 后端读取。
配置示例
fastcgi_buffers 16 8k;
确保缓冲区大小与响应大小相匹配;否则,NGINX 可能无法高效处理大型响应。
在高流量情况下注意服务器内存消耗,因为较大的缓冲区会增加内存使用。
在暂存服务器上测试不同的缓冲区大小,以为您的应用找到最佳性能。
说明
在 NGINX 中,`fastcgi_busy_buffers_size` 指令定义了可用于处理响应的 FastCGI 缓冲空间的最大大小。该内存分配对于管理 FastCGI 在将来自上游服务器的数据传回客户端之前如何缓冲这些数据至关重要。当达到 `fastcgi_busy_buffers_size` 指定的大小时,NGINX 会根据配置的设置,要么开始将已缓冲的响应发送给客户端,要么以其他方式处理流量。 该指令接受一个参数,指定繁忙缓冲区的大小(以字节为单位)。如果分配的缓冲区不足,NGINX 可以配置为延迟处理或以其他方式管理数据流动,以确保响应的顺序和成功传递。该指令会影响性能,尤其是在高负载情况下,缓冲区过小可能导致响应时间下降和延迟增加,因为 NGINX 可能需要频繁地刷新缓冲区以容纳传入数据。 为获得最佳性能,在配置此指令时应考虑来自上游服务器的预期最大响应大小以及 NGINX 服务器的典型负载。配置不当可能导致性能瓶颈,因此监控和测试对于为您的具体应用找到合适的缓冲区大小至关重要。
配置示例
http {
server {
location /api {
fastcgi_pass 127.0.0.1:9000;
fastcgi_busy_buffers_size 16k;
include fastcgi_params;
}
}
}将大小设置得过低会导致延迟增加,因为 NGINX 更频繁地刷新缓冲区。
与 `fastcgi_buffer_size` 冲突的设置可能导致内存使用效率低下。
未根据典型负载调整缓冲区大小可能导致性能问题。
说明
`fastcgi_force_ranges` 指令在 NGINX 中用于处理发送到 FastCGI 后端的字节范围请求。默认情况下,一些 FastCGI 应用可能无法正确支持字节范围,导致对部分请求的内容传递不正确。当此指令启用(设置为 'on')时,NGINX 将确保字节范围请求被正确解释并由 FastCGI 服务器处理,强制其在指定范围有效的情况下以 `206 Partial Content` 响应。 在实际应用中,该指令对通过 HTTP 提供视频或音频内容尤其重要,因为客户端可能会为流式播放功能请求特定的字节范围。通过指示 FastCGI 服务器确认这些字节范围请求,NGINX 提高了兼容性和内容传递效率。该指令可以全局应用,也可以在特定的 server 和 location 上下文中使用,为各种网站配置提供灵活性。 `fastcgi_force_ranges` 指令接受一个标志:可以设置为 'on' 或 'off',其中 'off' 禁用强制响应行为。启用时,NGINX 会直接与 FastCGI 服务器交互以协商和管理字节范围,确保客户端接收它们请求的适当数据段。此行为增强了最终用户体验,尤其适用于富媒体应用。
配置示例
server {
location /api {
fastcgi_pass backend;
fastcgi_force_ranges on;
}
}确保 FastCGI 服务器支持范围请求,因为并非所有服务器都能正确实现此功能。
无差别地使用此指令可能导致意外后果,例如由于请求处理不当而增加服务器负载。
说明
'fastcgi_limit_rate' 指令用于控制分配给 FastCGI 响应的带宽,提供了一种限制 NGINX 到 FastCGI 后端发送数据速率的方法。这有助于在特定 FastCGI 应用可能产生过多流量的情况下(尤其是在高峰期)管理服务器负载并优化资源分配。设置该指令时,它指定可以发送到 FastCGI 服务器的最大每秒字节数。如果超过此速率,NGINX 将暂时暂停发送头部,并且仅在数据速率降至指定阈值以下时恢复发送。 需要注意的是,'fastcgi_limit_rate' 接受单个参数,通常以每秒字节为单位指定,也可以使用诸如 'k' 或 'm' 的后缀,分别表示千字节和兆字节,从而便于配置带宽限制。该指令可以放在 'http'、'server' 或 'location' 上下文中,灵活地根据应用或站点结构的范围应用不同的限制。管理员可以微调分配给 FastCGI 处理的带宽,以在不同条件下实现更好的性能管理。
配置示例
location /fastcgi {
fastcgi_pass 127.0.0.1:9000;
fastcgi_limit_rate 100k;
}确保在适当的上下文中设置 'fastcgi_limit_rate';如果使用不当,可能无法按预期生效。
注意所设置的值,避免无意中使 FastCGI 后端进程得不到足够资源。
说明
`fastcgi_cache` 指令指定用于存储 FastCGI 响应的共享内存区,从而有效地缓存它们,以降低服务器负载并改善对经常请求内容的响应时间。当 FastCGI 服务器生成响应时,该响应可以根据请求参数被缓存,允许随后的相同请求从缓存中提供,而无需再次查询后端服务器生成新的响应。 该指令需要一个参数,表示使用 `fastcgi_cache_path` 指令预先定义的缓存区域的名称。它可以在诸如 `http`、`server` 和 `location` 块等各种上下文中使用,从而能够对不同位置如何处理缓存进行精细控制。结合像 `fastcgi_cache_key` 这样的相关指令,管理员可以确定什么构成唯一的缓存项,从而根据应用需求调整缓存机制的行为。 缓存行为还会受到相关指令的影响,例如 `fastcgi_cache_valid`,它定义缓存条目的有效时间;以及 `fastcgi_cache_bypass`,它允许动态控制何时绕过缓存,从而确保在必要时仍能提供已更新的数据。
配置示例
http {
fastcgi_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m;
server {
location / {
fastcgi_pass backend;
fastcgi_cache my_cache;
fastcgi_cache_valid 200 1h;
}
}
}确保使用 fastcgi_cache_path 指令定义缓存区域;否则该指令可能无法按预期工作。
注意缓存失效;如果配置不当,可能会返回过期的数据。
检查用于缓存存储的目录是否设置了适当的权限。
说明
指令 `fastcgi_cache_key` 在确定在存储或检索缓存的 FastCGI 响应时应使用哪个唯一键方面起着关键作用。通过形成缓存键,NGINX 能够根据请求的具体信息区分不同的缓存项。该键可以由多个变量组合而成,从而使动态内容能够高效地存储和检索,确保缓存命中准确并且与正在发起的具体请求相关。 在定义缓存键时,你可以使用 NGINX 中可用的各种变量,这些变量可以表示诸如请求的 URI、请求方法或其他头信息等属性。该配置支持定制化的缓存策略,以优化性能和资源使用。该指令在 `http`、`server` 和 `location` 等上下文中有效,为 NGINX 配置的不同层级提供了灵活性。 需要注意的是,错误配置 `fastcgi_cache_key` 可能会导致缓存不匹配,从而向用户请求返回不正确的响应。因此,必须谨慎构造缓存键,以充分利用 NGINX 的缓存能力并避免出现意外行为。
配置示例
fastcgi_cache_key "$scheme$request_method$host$request_uri";
确保缓存键包含所有必要的变量以防止缓存冲突。
避免在缓存键中使用敏感数据以增强安全性。
在使用复杂表达式或多个变量时要注意性能影响。
说明
`fastcgi_cache_path` 指令用于在 NGINX 中定义 FastCGI 缓存的存储配置。该指令在 `http` 块中指定,建立了缓存文件存放的路径,并包含缓存区大小、键以及其他参数的设置。它基本上创建了一个目录来保存来自 FastCGI 服务器的响应数据,通过提供缓存内容而不是每次将请求转发到后端服务器,可以显著加快响应时间。 该指令至少需要两个参数:缓存路径和缓存区配置字符串,后者通常包含缓存的名称和大小。缓存区是 NGINX 用来划分和管理缓存响应的地方。还可以包含像 `inactive` 或 `max_size` 这样的附加参数,分别用于指定项目在缓存中保留的时长或缓存的最大大小。该指令的重要性不可低估,正确配置 FastCGI 缓存能够提升性能并减少后端服务器的负载。
配置示例
http {
fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2 keys_zone=fastcgi_cache:10m inactive=60m max_size=1g;
}确保指定路径具有适当的权限,以便 NGINX 能写入缓存文件。
如果缓存大小超过指定的 max_size,NGINX 将开始删除最近最少使用的缓存文件,如果配置不当,这可能会影响性能。
说明
`fastcgi_cache_bypass` 指令是 NGINX HTTP 模块的一部分,用于控制 FastCGI 缓存机制。配置该指令时,可指定一个或多个条件(变量或客户端请求属性),用于决定何时 NGINX 应跳过缓存的响应并从上游服务器获取新的响应。它在需要根据请求或某些条件(例如特定的头、cookie 或查询参数)确保向客户端返回最新数据而不是缓存数据的场景中尤其有用。 该指令可以在 `http`、`server` 或 `location` 上下文中设置,提供了应用范围的灵活性。通常,你会使用像 `$arg_argname` 这样的变量来引用特定的查询参数,使用 `$http_cookie` 来处理 cookie,或者使用自定义的应用专用头来构造合适的绕过条件。它可以通过在适当情况下允许返回过期数据来优化资源使用,同时在必要时确保提供最新数据。 当与其他与 FastCGI 缓存相关的指令(例如 `fastcgi_cache` 和 `fastcgi_cache_key`)组合使用时,它可以提供一种强健的缓存策略,以在提升性能的同时根据用户交互和数据敏感性保持内容的新鲜度。
配置示例
location / {
fastcgi_pass backend;
fastcgi_cache my_cache;
fastcgi_cache_bypass $http_cache_bypass;
}确保指定的条件与预期的请求属性正确匹配;否则,缓存可能无法在需要时被绕过。
使用过多的条件可能导致性能问题,因为会产生过多的缓存未命中并增加后端服务器的负载。
说明
`fastcgi_no_cache` 指令用于告诉 NGINX 是否缓存来自 FastCGI 服务器(例如 PHP 处理器)的响应。该指令可接受一个或多个变量或条件来决定缓存策略。例如,如果某个变量的值为 true,NGINX 将不缓存响应,从而允许动态内容生成,而不会因缓存命中而导致性能问题。它与 `fastcgi_cache_bypass` 指令配合使用,以基于相似条件实现一致的缓存行为。该指令必须在 NGINX 配置文件的 `http`、`server` 或 `location` 上下文中设置,通常与缓存相关设置配合使用以获得最佳性能。在需要在特定情况下执行缓存失效的应用中它尤其有用,例如用户已登录时,或响应内容根据请求参数发生显著变化时。通过有效管理动态内容,`fastcgi_no_cache` 有助于保持应用数据的新鲜度并改善 Web 应用的用户体验。
配置示例
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_no_cache $http_cache_control;
}确保缓存条件定义清晰,以避免对 FastCGI 服务器造成不必要的负载。
使用不正确的变量名可能导致意外的缓存行为或错误的响应。
说明
`fastcgi_cache_valid` 指令定义了缓存的 FastCGI 响应被视为有效的时间段,也就是说在此期间可以在不再次查询后端服务器的情况下直接提供该响应。该指令接受一个时间间隔以及一个特定的响应状态码或状态码范围。例如,使用 `fastcgi_cache_valid 200 10m;` 表示将 200 OK 响应缓存 10 分钟。可以为该指令定义多行,以为不同的状态码指定不同的有效期。 需要注意的是,该指令应放在合适的上下文中,例如 http、server 或 location 块,并与 `fastcgi_cache` 指令配合使用。当提供有效缓存时,可以使用 `fastcgi_cache_bypass` 指令有条件地绕过缓存。这在需要时能灵活保证内容的新鲜度,同时在重复请求时仍能受益于缓存。
配置示例
fastcgi_cache my_cache; fastcgi_cache_valid 200 10m; fastcgi_cache_valid 404 1m;
在使用此指令之前,请确保已定义 fastcgi_cache。
配置错误可能导致过期的缓存响应在超过预期有效期后仍被返回。
如果未正确指定状态码,可能会发生缓存错误。您可以为不同的响应状态码定义多个有效期设置。
说明
`fastcgi_cache_min_uses` 指令指定在缓存某个 URI 的响应之前,需要对该 URI 发起的相同请求的最小次数。 这对于避免为低流量端点缓存响应特别有用,从而确保只有常被访问的内容才被存储到缓存中。 该指令的值应为正整数,因为它表示在考虑缓存响应之前,同一资源的请求必须被接收多少次。 当针对特定 URI 的请求次数达到或超过 `fastcgi_cache_min_uses` 所定义的数量时,该响应会触发缓存机制。这有助于优化缓存机制,防止不常见或不相关的响应占用缓存空间。该指令可以在 `http`、`server` 或 `location` 上下文中设置,根据应用需求实现细粒度控制。 通过减少来自很少访问的 URI 的潜在缓存污染,可以提高应用程序的性能以及缓存存储的效率。这在涉及动态内容的场景中尤其有用,因为某些响应不应被缓存,除非它们被频繁请求。
配置示例
http {
fastcgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m;
server {
location /api {
fastcgi_pass 127.0.0.1:9000;
fastcgi_cache my_cache;
fastcgi_cache_min_uses 5;
}
}
}将该值设置过高可能导致缓存未被充分利用,因为不频繁的请求可能根本不会被缓存。
如果对低使用率的 URI 禁用了缓存,请确保你的后端能够处理相应的请求量。
请确保已启用缓存以使其生效;否则,该指令不会起作用。
说明
`fastcgi_cache_max_range_offset` 指令定义了当客户端对由 FastCGI 缓存提供的资源发起范围请求时,作为偏移量可以指定的最大字节数。该指令有助于优化缓存行为和对部分下载资源的响应,确保当客户端仅请求文件的特定部分时,服务器不会过度提供过时或过多的数据。 将此指令设置为数值可以让您控制对缓存内容的范围请求响应的粒度。如果偏移量超过指定值,NGINX 可能会选择拒绝该范围请求或根据 FastCGI 模块的实现和现有的缓存策略对其进行不同处理。在需要尽量减少带宽使用的场景中,或在处理经常按部分访问的大文件时,这一点尤其有用,可提供更高效的响应。 此指令可以在 NGINX 配置文件的多个上下文中使用,包括 http、server 和 location 块,从而在不同的使用场景和服务器配置中具有灵活性。
配置示例
http {
fastcgi_cache_path /var/cache/nginx/fastcgi_temp levels=1:2 keys_zone=my_cache:10m;
server {
location / {
fastcgi_pass backend;
fastcgi_cache my_cache;
fastcgi_cache_max_range_offset 1048576; # 1 MB
}
}
}将偏移量设置得过高可能在检索部分内容时导致不必要的带宽消耗。
如果未设置且出现具有较大偏移量的范围请求,NGINX 可能会拒绝该请求或返回 416 错误。
请确保所指定的大小与所提供内容的预期范围大小一致,以避免性能问题。
说明
`fastcgi_cache_use_stale` 指令允许 NGINX 在特定条件下提供过期的缓存响应,通过在服务器出现问题时减少停机或延迟来改善用户体验和性能。你可以为多种情形启用此指令,包括 'error'、'timeout'、'invalid_header' 或 'updating'。当请求遇到这些问题时,NGINX 可以不返回错误,而是提供最近一次成功缓存的响应。这种行为对于需要在后端服务出现临时问题时仍维持用户参与度的高可用部署尤其有用。 该指令可以在多个上下文中指定:`http`、`server` 和 `location`,因此在不同配置中很灵活。你提供的每个参数都必须指定在何种情形下应返回过期数据。如果指定了多个条件,只要满足其中任何一个条件就会返回过期内容。该指令与 `fastcgi_cache` 指令配合工作,有效增强了缓存机制的鲁棒性,从而减轻上游中断或响应缓慢对客户端体验的影响。
配置示例
location /api {
fastcgi_pass backend;
fastcgi_cache my_cache;
fastcgi_cache_use_stale error timeout;
}应谨慎管理陈旧的响应,以确保不会向用户提供过时或不正确的数据。
在没有适当的缓存过期和失效策略的情况下使用此指令可能导致陈旧数据问题。
请确保所指定的使用场景与您的应用需求相关。例如,在所有错误情况下都提供陈旧数据可能并不适合所有应用。
说明
fastcgi_cache_methods 指令在 NGINX 配置中用于指定在使用 FastCGI 时应缓存哪些 HTTP 方法(例如 GET 或 POST)。默认情况下,NGINX 仅缓存对 GET 请求的响应,这适用于不经常变化并可以直接从缓存提供的页面。然而,在某些场景中,应用可能会对 POST 请求做出可受益于缓存的响应,以提高性能并减轻后端服务器负载。该指令允许管理员根据应用需求自定义缓存行为。 该指令接受一个或多个 HTTP 方法作为参数。例如,指定 "GET POST" 允许同时缓存 GET 和 POST 请求。必须考虑请求的性质及其关联的响应;并非所有 POST 请求都应被缓存,因为它们通常涉及状态更改。对这类请求的不当缓存可能导致应用行为不正确或向用户提供过时的内容。 在实现该指令时,可以将其放在 http、server 或 location 上下文中,从而根据所需控制的粒度实现灵活的缓存配置。如果指定的方法与应用的预期行为不一致,可能会无意中导致性能瓶颈或缓存失效的情况。
配置示例
location ~ \.php$ {
fastcgi_pass backend;
fastcgi_cache my_cache;
fastcgi_cache_methods GET POST;
}在缓存 POST 响应时要小心,因为它们可能会更改应用程序状态。
请考虑在响应中缓存敏感数据的影响,因为这可能导致安全问题。
确保 backend 能够适当地处理已缓存的 POST 响应。如有必要,使用单独的 cache keys。
说明
'fastcgi_cache_lock' 指令可用于防止多个请求并发生成相同的 FastCGI 响应。启用时,如果对同一已缓存资源发起两个或更多请求,只有第一个请求会继续生成 upstream 响应。后续请求将被排队,直到响应生成并缓存,从而使它们能够使用缓存的响应,而不是触发多个 upstream 请求。 本指令接受一个标志('on' 或 'off')。设置为 'on' 时,NGINX 将应用锁定机制,允许仅有一个请求生成响应,其余请求则等待。设置为 'off' 则禁用此行为,对于同一资源的所有请求都可能同时生成新的 upstream 请求,这可能在高流量环境中导致负载增加和性能问题。 需要注意的是,在可能发生缓存风暴的场景中使用 'fastcgi_cache_lock' 可以提高效率,但应结合合适的缓存策略,以确保在最大化缓存使用的同时保持性能最佳。
配置示例
location /api {
fastcgi_pass 127.0.0.1:9000;
fastcgi_cache my_cache;
fastcgi_cache_lock on;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
}启用缓存锁定可能导致排队请求的响应时间增加,因此应在负载条件下进行测试以找到最佳设置。
如果启用了'fastcgi_cache_lock',请确保也对缓存过期设置进行调整,否则可能会比预期更长时间提供陈旧的响应。
说明
`fastcgi_cache_lock_timeout` 指令配置了当另一个请求正在处理该缓存条目时,请求在尝试获取 FastCGI 缓存锁时将等待的持续时间。这在请求在尝试存储相同缓存内容时可能发生冲突的场景中特别有用。如果在获取锁之前超时到期,锁请求将失败,从而避免并发请求可能出现的长时间等待,并允许它们继续执行而不会无限期阻塞。 此指令可帮助提高应用的响应时间,尤其是在高负载时。通过设置 `fastcgi_cache_lock_timeout`,您可以精确控制一个请求等待另一个请求的允许时间,降低延迟并在高峰流量期间改善整体用户体验。它必须在适当的上下文中设置,例如 `http`、`server` 或 `location`,并接受一个指定超时时长的单个参数。 当配置的超时达到时,任何后续请求可能会收到替代响应,或根据应用的内部处理逻辑以不同方式被处理。因此,在决定此指令的值时应谨慎,以在锁定行为与整体性能之间取得平衡。
配置示例
location /api {
fastcgi_pass backend;
fastcgi_cache my_cache;
fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 10s;
}将超时设置得过低可能导致频繁获取锁失败,这可能会使多个请求同时被处理,并可能导致缓存击穿问题。
用户必须确保启用 `fastcgi_cache_lock` 指令,以便有效使用 `fastcgi_cache_lock_timeout`。
过长的超时值也可能导致性能下降,因为请求可能会被阻塞较长时间。
说明
NGINX HTTP 模块中的 `fastcgi_cache_lock_age` 指令定义了在缓存已被另一个请求锁定时,请求应等待 `FastCGI` 缓存锁可用的最长秒数。当对同一资源发起多个请求,并且由于另一个请求正在处理相同内容导致缓存被锁定时,该指令可以防止请求无限期挂起。相反,指定的等待时长(由此指令设定)允许请求在一定时间后重试。这有助于优化用户的响应时间,并通过避免过度等待来提高整体服务器性能。 `fastcgi_cache_lock_age` 的参数以秒为单位,并接受整数值。例如,如果该指令设置为 10,任何遇到缓存锁的请求将在放弃获取锁并发起新的请求之前最多等待 10 秒。设置过高会导致响应延迟,而设置过低可能导致不必要的缓存未命中。管理员应根据应用的预期缓存访问模式和对终端用户可接受的延迟来平衡 `fastcgi_cache_lock_age` 参数。
配置示例
location /app {
fastcgi_pass 127.0.0.1:9000;
fastcgi_cache my_cache;
fastcgi_cache_lock on;
fastcgi_cache_lock_age 10;
}将值设置得过高可能导致响应时间延长,尤其在高流量且缓存经常被锁定时。
如果未启用 `fastcgi_cache_lock`,`fastcgi_cache_lock_age` 将不会生效。
说明
'fastcgi_cache_revalidate' 指令在 NGINX 中允许对来自 FastCGI 后端的缓存响应的重新验证进行更细粒度的控制。当该指令设置为 'on' 时,NGINX 将基于缓存内容使用 'If-Modified-Since' 或 'If-None-Match' 头发出有条件请求。这样可以确保当后端内容发生变化时,会相应地将更新后的响应返回给客户端。该行为有助于在减少不必要的后端请求的同时保持缓存内容的新鲜度,从而在动态内容不经常变化的环境中提升性能。 相比之下,当设置为 'off' 时,NGINX 将在不查询后端更新的情况下提供缓存响应,这可能导致在底层数据发生变化时提供过时的内容。该指令在处理更新频率不可预测的内容时特别有用,因为它在提供缓存内容与确保用户接收最新响应版本之间取得了平衡,同时不丧失缓存带来的效率优势。
配置示例
http {
fastcgi_cache_path /var/cache/nginx/fastcgi_tmp levels=1:2 keys_zone=my_cache:10m;
server {
location /fastcgi {
include fastcgi_params;
fastcgi_pass backend;
fastcgi_cache my_cache;
fastcgi_cache_revalidate on;
}
}
}确保您的后端 FastCGI 应用支持条件 GET 请求,以使该指令生效。
在内容变化非常频繁的情况下使用该指令可能导致过多的后端请求,抵消缓存带来的好处。
说明
指令 `fastcgi_cache_background_update` 是一个布尔标志,用于控制当访问的内容已过期时,NGINX 是否在后台更新缓存的 FastCGI 内容。当设置为 `on` 时,它允许在发起新请求以获取更新内容的同时并行提供现有的缓存响应,这在高流量情况下尤其有用,因为等待缓存刷新可能导致延迟和更长的加载时间。这意味着用户将继续接收缓存版本,而耗时的后端请求将在后台处理。 相反,如果该指令设置为 `off`(默认值),请求过期缓存响应的用户将不得不等待发起新的请求来获取更新版本,从而产生额外的延迟。这在用户体验和资源利用方面效率较低。该指令可以应用于 `http`、`server` 或 `location` 上下文,从而根据应用或特定路由的需求灵活控制缓存行为。 正确设置此指令可大幅提升严重依赖 FastCGI 缓存的 Web 应用的响应性和速度,因为它能最小化缓存内容更新时的负载和等待时间。然而,必须谨慎处理缓存失效,以防长时间提供过期内容,尤其是在数据频繁变化的动态应用中。
配置示例
location /api {
fastcgi_pass backend;
fastcgi_cache my_cache;
fastcgi_cache_background_update on;
}确保后端能够高效地处理并发请求,以避免性能问题。
注意缓存过期时间设置,以防止无限期提供过期数据。
说明
`fastcgi_temp_path` 指令定义了 NGINX 在 FastCGI 处理过程中存放临时文件的路径。这对处理大响应或 FastCGI 输出被缓冲的情况尤其有用。指定的路径必须对 NGINX 工作进程可写。你可以指定最多四个用空白字符分隔的目录路径;NGINX 会使用第一个可用目录来存放临时文件,这样可以在需要时将负载分散到多块磁盘上。 当处理 FastCGI 请求且响应超过某些缓冲限制时,NGINX 会将数据写入指定的临时文件,直到整个响应处理完毕再发送给客户端。这样可以让 NGINX 有效管理内存使用,从而提高整体性能并避免因内存消耗过大而导致的失败。可能需要事先创建目录结构,并设置适当的权限以避免访问问题。
配置示例
fastcgi_temp_path /var/tmp/nginx/fastcgi_temp;
确保指定的路径存在并且对 NGINX 工作进程可写,以避免错误。
如果使用多个路径,请注意顺序很重要;NGINX 会按顺序检查这些路径,直到找到一个可写的位置。
监控临时目录的存储容量,以防空间耗尽,这可能导致请求失败。
说明
指令 'fastcgi_max_temp_file_size' 指定由 NGINX 为缓冲 FastCGI 响应数据而创建的临时文件允许达到的最大尺寸。如果响应的大小超过此限制,NGINX 将返回 502 Bad Gateway 错误并拒绝该请求。此设置对于管理服务器资源尤其有用,可防止过大的 FastCGI 响应耗尽所有可用磁盘空间。 该指令可应用于多个上下文,包括 'http'、'server' 和 'location',根据使用情况提供灵活的配置。其值以字节为单位定义,应根据预期的 FastCGI 响应量谨慎设置。过小的值可能导致错误率上升,而过大的值则可能在高负载时导致磁盘使用过多。 在应用此指令时,需要考虑应用的工作负载特性和可用磁盘空间。随着响应大小随时间或用户负载模式变化,可能需要监控并调整此配置,以确保应用在意外流量激增时仍能保持性能和弹性。
配置示例
location /cgi-bin {
fastcgi_pass 127.0.0.1:9000;
fastcgi_max_temp_file_size 16m;
}如果 FastCGI 响应超过限制,设置的值过低可能会导致频繁出现 502 错误。
并非所有 FastCGI 应用都会遵守临时文件限制,这可能导致意外行为。
在使用较大限制值时,请确保服务器有足够的磁盘空间可用于临时文件。
说明
`fastcgi_temp_file_write_size` 指令在 NGINX 中用于定义 FastCGI 模块在处理请求时可以写入的临时文件的最大大小。该指令在处理大响应时尤其有用,因为它有助于有效地管理内存和磁盘使用,降低服务器过载的风险。通过设置此指令,管理员可以根据预期的 FastCGI 响应大小增大或减小允许的尺寸。 该指令接受单个参数,即一个大小值(字节)。如果响应的大小超过指定的限制,响应将被写入临时文件而不是直接写入内存。这样可缓解内存使用峰值,并在必要时通过利用磁盘空间让服务器更高效地处理更多请求。 该指令可以在任何上下文中设置:http, server, 或 location,使其在各种配置中都很灵活。然而,在配置此指令时必须考虑可用磁盘空间以及写入磁盘对性能的影响。应根据应用的正常负载和 FastCGI 响应的特性选择适当的值。
配置示例
http {
fastcgi_temp_file_write_size 16k;
}将此值设置得过低可能导致频繁写入磁盘,从而降低性能。
如果设置得过高且磁盘空间不足,可能导致写入失败或服务中断。
说明
'fastcgi_next_upstream' 指令允许你指定在何种条件下,对 FastCGI 服务器的请求应在配置的 upstream 组中重试到后续服务器。该指令可以接受一个或多个参数,这些参数对应特定情形,例如超时、非 2xx 响应和连接错误。启用此指令后,NGINX 可以通过尝试使用备用服务器处理请求来更优雅地处理潜在的服务器错误,从而提高 Web 应用的弹性和可靠性。 例如,典型的使用场景是部署多个用于 PHP 处理的 FastCGI 服务器。通过在配置中包含带有 'error' 和 'timeout' 等参数的 'fastcgi_next_upstream' 指令,如果原始服务器发生错误或在一定时间内未响应,NGINX 将尝试将失败的请求重发到另一个已配置的 FastCGI 服务器。在需要维持高可用性的重要的负载均衡环境中,此功能特别有用。 完整的参数集合包括诸如 'error'、'timeout'、'invalid_header'、'http_500' 等选项,允许对哪些错误条件应触发重试进行精细控制。基于错误的重试功能有助于缓解单个服务器故障相关的问题,保持无缝的用户体验并提供高可用性。然而,应谨慎配置此指令,以避免在错误情况下造成额外的开销。
配置示例
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_next_upstream error timeout invalid_header;
include fastcgi_params;
}在使用此指令时,如果参数过多,可能会导致意外行为,因此务必了解每个参数的含义。
请确保下一个 upstream 服务器已正确配置以处理请求;否则它也可能失败,从而导致重试循环。
如果 upstream 服务器经常不可用,过度使用可能导致性能下降。
说明
指令 `fastcgi_next_upstream_tries` 指定在 FastCGI 请求不成功时应尝试的上游服务器数量。通过设置此指令,NGINX 可以在后端 FastCGI 服务器之间实现负载均衡:如果初始服务器失败,则尝试在指定数量的其他服务器上重试请求。在对高可用性有严格要求的场景中,这尤其有用,可确保即使一个或多个上游服务器宕机,应用仍能继续运行。 在指定该指令的值时,可以在 http、server 或 location 上下文中定义,从而根据不同的应用需求进行细粒度调整。例如,可以在更容易发生失败的 location 中设置较高的值,而在更稳定的区域保持较低的值。所指定的值必须是正整数,如果设置为 0,则实际上禁用该功能,这意味着 NGINX 不会尝试在其他上游服务器上重试。 值得注意的是,该指令会与其他与 FastCGI 相关的指令交互,尤其是 `fastcgi_next_upstream`,后者决定何种情况下会发生重试。将两者结合使用可以全面控制 NGINX 如何处理后端故障和故障转移。
配置示例
location /api {
fastcgi_pass backend;
fastcgi_next_upstream_tries 3;
}将该值设置为零会完全禁用重试机制,如果初始 FastCGI 服务器不可用,可能导致更频繁的错误。
确保 FastCGI 服务器能够处理重试;否则,在下一次尝试时可能会发生相同的失败。
说明
`fastcgi_next_upstream_timeout` 指令定义了在初始请求失败时对后续 FastCGI 请求的超时时间。该指令允许精细控制在首次尝试失败后服务器在放弃 FastCGI 上游之前将等待多长时间。 在对响应时间要求严格、且服务器可能会将请求重试到不同后端以获取更快响应的应用场景中,指定该超时非常关键。该超时可以在不同上下文中设置,包括 http、server 和 location 块,从而根据配置需求提供灵活性。 该指令接受一个时间值作为参数,通常以秒为单位。如果在指定超时时间内未从上游 FastCGI 服务器收到响应,NGINX 将中止该请求并以相同方式处理下一个上游。这种行为保证服务器保持响应性并能够优雅地处理来自 FastCGI 应用的失败。开发者有时可能需要根据应用性能和必要的故障切换策略调整此超时,以确保更高的可用性和更低的请求延迟。
配置示例
location /api {
fastcgi_pass backend;
fastcgi_next_upstream_timeout 10s;
include fastcgi_params;
}确保将超时设置为合理的值,以避免重试时出现过长的延迟。
如果上游服务器响应较慢,使用非常短的超时可能会导致频繁的请求失败。
说明
在 NGINX 配置中使用 `fastcgi_param` 指令来设置传递给 FastCGI 服务器的环境变量。默认情况下,它可在诸如 `http`、`server` 和 `location` 等上下文中使用,从而允许针对不同应用路由灵活配置 FastCGI 行为。该指令接受两个或三个参数:第一个参数为变量名,第二个为其值,可选的第三个参数用于指定该值是否应从请求头中获取。 当使用 `fastcgi_param` 指令时,它本质上是传达与 FastCGI 请求处理相关的信息。例如,可以设置像 `SCRIPT_FILENAME` 这样的参数,用于指示要在 FastCGI 服务器上执行的脚本。该指令可确保必要的变量可供 FastCGI 应用使用,以正确响应用户的请求。当需要明确指定某些变量应如何被 FastCGI 应用的逻辑处理时,它尤其有用。 值得注意的是,`fastcgi_param` 会覆盖配置中已设置的同名参数,这使得可以对传递给 FastCGI 处理器的环境进行精细控制,从而避免变量值冲突或产生意外行为。
配置示例
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}确保变量名有效且正确指定,因为拼写错误可能导致意外行为。
在覆盖现有参数时要谨慎;如有需要,确保显式设置为预期的值。
说明
'fastcgi_pass_header' 指令允许您定义应包含在发送给客户端的响应中的、从 FastCGI 服务器接收到的哪些 HTTP 头部。该指令可以在同一上下文中多次指定,从而允许传递多个头部。当处理请求且 FastCGI 服务器返回头部时,NGINX 会根据 'fastcgi_pass_header' 提供的配置筛选这些头部。只有与该指令中指定的头部匹配的头部会被包含在最终发回客户端的输出中,所有其他头部将被忽略。这对于控制哪些元数据或指令被传回客户端特别有用,可以提高安全性或仅关注相关数据。 'fastcgi_pass_header' 指令可以在 'http'、'server' 和 'location' 上下文中定义,使其在各种配置中具有灵活性。通过使用此指令,管理员可以确保敏感头部不会被暴露,或防止无关头部使响应杂乱。需要注意的是,该指令与 FastCGI 配置配合使用,并且需要 'fastcgi_pass' 指令将流量定向到 FastCGI 服务器。 配置的一个重要方面是要理解头部名称不区分大小写,但其值是否区分大小写可能取决于应用程序。因此,在定义要传递的头部时,应确保值的拼写和大小写保持一致,以确保正确的运行完整性。
配置示例
location /some_location {
fastcgi_pass 127.0.0.1:9000;
fastcgi_pass_header X-My-Custom-Header;
}确保你要传递的头部确实存在于 FastCGI 响应中;否则不会发送任何内容。
如果 FastCGI 服务器未被正确配置以发送预期的头部,则此指令无效。
在此指令中指定的头部必须拼写正确,并且其大小写应与 FastCGI 服务器发送的保持一致。
说明
'fastcgi_hide_header' 指令在 NGINX 配置中用于指定哪些来自 FastCGI 服务器响应的头不应发送给客户端。该指令可以因为安全或运行方面的原因阻止特定头被暴露,从而通过对客户端隐藏不必要或敏感的信息来帮助保持清晰的接口。它接受一个参数,即你希望隐藏的 HTTP 头的名称。例如,指定 'fastcgi_hide_header X-Powered-By;' 会阻止 'X-Powered-By' 头返回给客户端,即使 FastCGI 应用在其响应中包含该头。 该指令可以放在包括 'http'、'server' 和 'location' 在内的多个上下文中,使其在配置上具有灵活性,取决于你想在哪里应用头抑制。当在 FastCGI 响应中出现指定的头时,NGINX 将在最终发送给客户端的 HTTP 响应中不包含该头,从而避免暴露可能敏感的信息。当处理会泄露可用于指纹识别攻击的信息的应用程序,或在考虑特定安全需求的配置时,此功能尤其有用。
配置示例
location /api {
fastcgi_pass 127.0.0.1:9000;
fastcgi_hide_header X-Powered-By;
}请谨慎,避免隐藏客户端在功能实现或调试时可能需要的必要头部。
请确保指定的头部名称正确且没有拼写错误,因为头部名称区分大小写。
该指令不会影响由 NGINX 自身修改或生成的头部;它仅适用于从 FastCGI 后端返回的头部。
说明
`fastcgi_ignore_headers` 指令用于指定在 NGINX 处理响应时应忽略哪些来自 FastCGI 响应的头。默认情况下,NGINX 会将所有 FastCGI 响应头传回给客户端。但在某些情况下,您可能希望抑制某些头,以防止它们被发送到客户端,例如某些与安全相关的头或修改缓存行为的头。 该指令接受一个或多个头名称作为参数。当 FastCGI 响应中存在在此指令中指定的头时,NGINX 将完全忽略该头并不转发给客户端。这在保护应用程序安全以及在不修改上游应用行为的情况下管理某些响应的处理方式时特别有用。例如,忽略 `X-Powered-By` 可以帮助避免暴露正在使用的服务器技术。 `fastcgi_ignore_headers` 指令可以在 `http`、`server` 和 `location` 上下文中使用,允许在不同配置中灵活应用。您可以指定任意组合的要忽略的头,从而对向客户端暴露的信息进行细粒度控制。
配置示例
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_ignore_headers X-Powered-By;
include fastcgi_params;
}在忽略可能影响缓存或客户端行为的 HTTP 头部时要小心。
确保指定用于忽略的 HTTP 头部不包含您的应用所需的关键信息。
如果敏感的 HTTP 头部被不必要地暴露,配置错误可能导致安全风险。
说明
'fastcgi_catch_stderr' 指令在 'http'、'server' 和 'location' 等上下文中使用,用于管理由 FastCGI 应用程序产生的错误消息的处理。启用时,任何由 FastCGI 应用程序发送到标准错误的消息都会被 NGINX 捕获并记录,从而便于调试,并通过 NGINX 错误日志直接查看应用问题的情况。默认情况下,该指令设置为 off,这意味着除非显式开启,否则 NGINX 只捕获标准输出。 该指令接受一个参数:'on' 或 'off'。将其设置为 'on' 后,开发者可以获得有价值的错误信息,这些信息对于诊断 FastCGI 应用程序的问题(尤其是在生产环境中)可能至关重要,因为查看这些日志可预先指出代码执行中的潜在错误。需要注意的是,如果应用产生大量错误输出,过多的日志记录可能会导致性能下降,因此建议谨慎管理日志级别。 正确使用 'fastcgi_catch_stderr' 可以通过 NGINX 将错误日志集中化,从而提高 FastCGI 应用的可维护性,并为开发者提供对可能在其他地方看不到的运行时错误的清晰洞察。然而,在使用此指令时,应权衡在高流量条件下提高日志详细程度对性能的影响。
配置示例
location /api {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_catch_stderr on;
}确保你的 FastCGI 应用程序配置为将错误输出到 stderr;否则,此指令将无效。
请注意,启用此功能可能会增加日志量,从而在高负载时导致性能下降。
说明
NGINX 中的 `fastcgi_keep_conn` 指令,可在 http、server 和 location 上下文中使用,是一个标志,用于决定在请求完成后是否在 NGINX 与 FastCGI 服务器之间维持持久连接。默认情况下,请求处理完毕后与 FastCGI 服务器的连接会被关闭。但是,将该指令设置为 'on' 会在后续请求中保持连接打开,从而降低后续请求的延迟,并可能在多个请求发送到同一 FastCGI 服务器的高流量环境中提高性能。 启用 `fastcgi_keep_conn` 后,连接会被重用,而不是不断地打开和关闭,这可以节约资源并提升吞吐量。它对在连续多个请求很常见的托管场景(如 PHP 或类似技术的动态内容生成)特别有用。然而,保持连接打开会占用服务器资源,因此应根据应用的行为和服务器的整体负载能力谨慎使用。
配置示例
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_keep_conn on;
}启用 `fastcgi_keep_conn` 可能导致资源耗尽,尤其是在过多未被使用的连接被保持打开时。
如果 FastCGI 服务器对并发连接数有限制,请确保启用此指令不会超过该限制。
说明
`flv` 指令在 NGINX 配置的 location block 中使用,用于指定在提供内容时是否处理 FLV (Flash Video) 文件。启用后,NGINX 会配置自身以正确处理对 FLV 文件的请求,使视频能够以 FLV 播放器期望的正确头部和行为进行流式传输。该指令不接受任何参数;只需包含它即可在该上下文中启用 FLV 处理功能。NGINX 源代码中的实现确保对 FLV 文件应用特定的响应头和缓冲规则,以便提供流畅的流式传输体验。 该指令可以放在希望提供 FLV 内容的 location block 中。如果在没有具体 location 的 server block 中使用该指令,则会被忽略,除非已明确定义了用于 FLV 文件的 location。在以正确的 MIME type 提供文件时,使用 `flv` 指令可确保 NGINX 适当地处理请求并优化以获得更好的流式传输性能。需要注意的是,该指令在很大程度上已被弃用,因为 Flash 的使用量已显著减少,现代替代方案更适合用于视频流式传输。
配置示例
location /videos {
flv;
root /var/www/videos;
}确保你正确地以合适的 MIME type 提供 `.flv` 文件;否则流可能无法正确播放。
检查 location block 是否已正确定义,以确保该 directive 生效。
说明
`geo` 指令用于创建将客户端 IP 地址映射到变量的映射表,这些变量可在各种 NGINX 配置中使用。它在根据地理位置配置访问控制和管理请求路由时尤其有用。该指令可以定义 IPv4 和 IPv6 地址,并且可以嵌套在 `http` 上下文中。每条映射规则由一个地址(或地址范围)和一个可选变量组成,该变量可以包含一个值(例如用于允许或拒绝访问的 '1' 或 '0'),或者对于不匹配的地址设置为 'default'。 在 `geo` 块内,您可以指定单个 IP 地址、CIDR 表示法或地理范围。NGINX 将按照规则定义的顺序将客户端的 IP 地址与这些规则进行匹配。如果找到匹配项,NGINX 将相应地设置指定的变量。如果没有任何规则匹配某个地址,则会应用 `default` 指令设置的值。这使得 `geo` 成为创建基于不同客户端 IP 响应的动态配置(无论是用于负载均衡、访问控制还是应用配置)的强大工具。 需要注意的是,`geo` 指令必须在 `http` 块中定义,并且它不会在自身内部直接接受其他相关指令,这在复杂的 NGINX 配置中可能导致混淆。此外,该指令在 HTTP 层运行,并在根本上依赖于传入请求的网络细节,因此需要根据客户端请求的预期特征正确使用。
配置示例
geo $remote_addr {
default 0;
192.168.1.0/24 1;
10.0.0.0/8 2;
}确保 `geo` 块位于 `http` 上下文中;放在其他地方会导致错误。
使用 CIDR 表示法时,请确保语法正确以避免意外匹配。
请记住定义的顺序很重要;第一个匹配到的项将决定变量的值。
说明
`geoip_country` 指令允许您将 NGINX 指向用于基于客户端 IP 地址执行地理定位的 GeoIP 数据库。配置后,NGINX 可以为请求分配地理信息,例如来源国家/地区。此信息随后可用于访问控制或内容定制,确保服务器能够根据用户的地理位置调整其响应。 该指令接受一个或两个参数:GeoIP 数据库文件的路径和可选的 'country' 选项。如果提供,则可启用或禁用特定的国家查找功能,或更改有关数据库使用的行为。当组织需要执行基于区域的策略、投放定向广告或提供本地化内容时,此功能至关重要,因为它有助于准确识别传入请求的来源位置。 通过与 GeoIP 模块集成,它使服务器能够动态识别用户的国家/地区,从而允许将规则绑定到特定的地理位置。注意:这需要一个外部数据库,必须定期更新以保持地理定位映射的准确性。
配置示例
geoip_country /path/to/geoip.dat;
确保 GeoIP 数据库文件对 NGINX 工作进程可访问,否则它将无法加载。
该指令必须在 http 上下文中设置,且不允许在 server 或 location 上下文中使用。
如果 GeoIP 数据库路径不正确或文件缺失,NGINX 会记录错误并将该指令覆盖为 'off'。
说明
`geoip_org` 指令是 NGINX HTTP Core 模块的一部分,通过使用 GeoIP 数据来确定与给定 IP 地址关联的组织,从而便于实现访问控制。通过利用 GeoIP 数据库,NGINX 可以根据发出请求的客户端的组织身份动态允许或限制访问。该指令使服务器能够根据 GeoIP 派生的组织信息采取相应措施,允许管理员基于发出请求的实体实施自定义路由、日志记录或访问策略。 该指令可以接受一个到两个参数:要么是表示 GeoIP 数据库名称的单个字符串,要么是用于与传入请求匹配的特定组织名称。这些参数的存在允许灵活配置,管理员可以根据 IP 地址所暗示的组织条件自定义流量处理方式。如果仅提供组织名称,NGINX 将在其内部 Lookup 中使用该名称来识别连接;而可选的 DB 路径参数则便于关联自定义或第三方 GeoIP 数据库。 总体而言,`geoip_org` 通过利用 GeoIP 技术将请求与组织数据关联,在增强 NGINX 的访问控制能力方面发挥关键作用,使流量管理决策更加有依据。
配置示例
geoip_org /path/to/geoip/db GeoIP Org Name;
确保 GeoIP 数据库已正确安装,且指定的路径正确。
使用过时或损坏的 GeoIP 数据库可能导致组织识别不正确。
该指令需要数据库文件具有正确的权限才能正常工作。
说明
`geoip_city` 指令旨在通过访问 GeoIP 数据库来增强 NGINX HTTP 服务器基于客户端 IP 地址作出地理判断的能力。通过指定 GeoIP 城市数据库的路径,该指令使 NGINX 能够根据传入请求的地理位置确定并设置变量。 当在 `http` 上下文中使用 `geoip_city` 指令时,它接受一个或两个参数:GeoIP 城市数据库文件的路径,以及可选的第二个参数,用于指定处理格式错误 IP 地址的标志。该指令处理传入请求,将客户端的 IP 与指定 GeoIP 数据库中的条目匹配,并使城市级别的地理数据(如城市名、区域和国家)可在配置中使用。然后,这些地理信息可以用于访问控制规则、日志文件格式化,甚至用于内容个性化。 此指令通常对需要基于用户地理位置进行定向内容投放的应用有益,例如本地化广告或遵守当地法规。重要的是确保 GeoIP 数据库文件保持更新,因为 IP 与位置的映射可能经常变化。错误或过时的数据可能因地理定位粒度不准确而导致糟糕的用户体验。
配置示例
http {
geoip_city /usr/share/GeoIP/GeoIPCity.dat;
server {
location / {
if ($geoip_city) {
add_header X-City $geoip_city;
}
}
}
}确保指定的 GeoIP 数据库文件存在并且 NGINX 用户可以访问它。
使用过期的 GeoIP 数据库可能导致地理位置信息不准确。
如果使用基于变量的访问控制,请确保已设置适当的条件以处理未返回任何地理位置信息的情况。
说明
`geoip_proxy` 指令为 NGINX 提供了一种利用 proxy protocol 获取客户端原始 IP 地址的方法,从而通过 GeoIP 数据库提高地理定位的准确性。尤其在请求从一个代理服务器转发到另一个代理服务器的环境中非常有用,因为请求中的地址可能无法准确反映客户端的实际地理位置。配置后,NGINX 会从指定的头部读取客户端的原始 IP 地址,而不是直接从客户端连接中读取。 该指令接受一个参数,指定要查找的头部名称,通常包含客户端的原始地址(例如 `X-Real-IP`)。在使用此指令时,必须确保上游代理正确填充该头部并提供有效的 IP,以便进行准确的 GeoIP 查询。配置不当可能导致在日志记录或访问控制时记录不正确的地理数据。 此指令在 HTTP 上下文中生效,允许它在 server 块之间全局适用或在特定 location 块中使用。对头部的正确评估在收到请求时执行,因此在部署中需要在任何中间代理之间保持一致的配置。
配置示例
http {
geoip_proxy X-Forwarded-For;
}确保你的上游代理包含正确的头部,否则 NGINX 可能会读取错误的 IP 地址。
配置错误可能导致安全漏洞,因为对 IP 的不当处理可能会使你的应用程序暴露于 IP 欺骗等攻击。
此指令仅在 GeoIP module 已在 NGINX 中编译并启用时才有效。
说明
在 NGINX 的 `http` 上下文中使用 `geoip_proxy_recursive` 指令来控制启用 GeoIP 的代理请求的行为。当设置为 'on' 时,该指令允许模块对客户端的地理信息执行递归查找。这在客户端通过多个代理连接的场景中特别有用,可在确定地理位置时保留原始客户端的 IP 地址。该指令确保 GeoIP 模块从客户端的真实 IP(而不是最后一个代理的 IP)获取数据。 当启用该指令时,NGINX 会检查诸如 `X-Forwarded-For` 或 `X-Real-IP` 之类的头以检索真实的客户端 IP 地址。如果这些头包含多个地址,NGINX 会遍历它们以查找始发 IP 地址,从而为 GeoIP 查找提供准确的位置数据。该功能对需要基于地理位置提供目标内容或实施基于地理位置的安全措施的应用至关重要。 该指令被解释为一个标志,意味着它具有二元状态。要么激活(设置为 'on'),要么不激活(设置为 'off')。其行为与 NGINX 在开启或禁用指令之间切换的整体设计一致,根据环境配置的具体需求提供灵活性。
配置示例
http {
geoip_proxy_recursive on;
geoip_country /path/to/GeoIP.dat;
}确保已安装并正确配置 GeoIP 模块。
在不了解代理如何影响 IP 地址头的情况下使用此指令,可能导致地理数据不准确。
在未正确设置头部的情况下,代理顺序错误可能导致用于 IP 查找的值丢失。
说明
`grpc_pass` 指令专门用于在 NGINX 内路由 gRPC 请求。它定义了一个后端服务器,gRPC 请求会被转发到该服务器。该指令以 URL 作为参数,该 URL 可以指定由 `upstream` 指令定义的上游服务器组或直接的服务器地址。当 NGINX 收到 gRPC 请求时,它会将该请求转换为适当的格式并转发到指定的后端,同时处理 gRPC 通信所需的二进制协议。 在 NGINX 配置的上下文中,`grpc_pass` 指令用于 `location` 块,使其在定义应映射到特定后端服务的 URI 区段时至关重要。响应头的正确处理、连接管理以及二进制的编码/解码机制由 NGINX 自动管理,开发者可以专注于应用逻辑而不是 gRPC 通信的细节。重要的是要确保上游服务器支持 gRPC 并已适当配置以处理从 NGINX 转发的请求。 因为 gRPC 使用 HTTP/2,`grpc_pass` 指令本质上要求 NGINX 的构建包含对 HTTP/2 的支持。这意味着服务器需要适当配置以监听 HTTP/2 连接,当与 `grpc_pass` 配合使用时,将能实现对 gRPC 流量的完整支持。
配置示例
location /gRPC {
grpc_pass grpc://localhost:50051;
}确保 NGINX 已编译以支持 HTTP/2,从而能够通过 grpc_pass 正确处理 gRPC。
不要将 grpc_pass 与修改 HTTP 协议的指令一起使用,例如用于 HTTP/1.x 的 proxy_set_header,因为这可能导致协议不匹配。
在指定后端 URL 时,确保以 'grpc://' 或 'grpcs://' 开头以指明正确的协议。在定义 grpc_pass 指令后,其他配置(例如超时)也可能需要相应设置。
说明
`grpc_bind` 指令在 NGINX 中用于定义服务器将绑定以处理 gRPC 请求的本地地址和端口。该指令可以在 `http`、`server` 和 `location` 上下文中设置,允许根据流量路由需求进行灵活配置。它接受一个或两个参数;第一个参数是地址(IPv4 或 IPv6),第二个参数是可选的端口号。如果不指定端口,则默认使用 gRPC 的标准端口(通常为 50051)。 配置 `grpc_bind` 指令后,NGINX 会在指定的地址和端口上监听传入的 gRPC 请求,并将它们转发到配置中定义的上游 gRPC 服务器。这样,应用可以高效处理 gRPC 流量,利用 NGINX 作为反向代理来管理连接、负载均衡以及其他功能,例如限流或身份验证。应注意确保所指定的地址和端口未被占用,以避免绑定冲突,从而导致服务中断。
配置示例
grpc_bind 0.0.0.0 50051;
确保地址和端口未被其他进程占用,以避免绑定错误。
如果指定 IPv6 地址,请确保系统支持 IPv6 并且地址格式正确。
说明
`grpc_socket_keepalive` 指令用于启用或禁用 NGINX 处理的 gRPC 连接的 TCP keepalive 功能。当启用时,该指令通过定期发送 keepalive 探测包来确保空闲的 TCP 连接保持活跃。这对于维护长连接至关重要,gRPC 在服务间通信中通常使用长连接。默认情况下,许多操作系统可能未启用 TCP keepalive,这可能导致连接在长时间空闲后被关闭并中断通信。 该指令接受一个标志值,即可以设置为 'on'(启用)或 'off'(禁用)。当设置为 'on' 时,NGINX 会为套接字配置 keepalive 相关选项,使其根据系统中定义的设置(例如 `tcp_keepalive_time`、`tcp_keepalive_intvl` 和 `tcp_keepalive_probes` 选项)发送 keepalive 包。因此,亦需在系统级别调整这些参数以确保 keepalive 按预期工作。请注意,在没有适当服务器设置的情况下启用此功能可能会导致性能问题或不必要的网络流量,尤其是在高规模环境中。
配置示例
server {
listen 80;
grpc_socket_keepalive on;
location /myservice {
grpc_pass grpc://backend;
}
}确保操作系统的 TCP keepalive 设置已适当配置,因为 NGINX 依赖它们来管理 keepalive 数据包。
不要在短连接上启用 keepalive,因为这可能导致性能开销而没有显著收益。
说明
`grpc_connect_timeout` 指令指定用于与 gRPC 后端服务器建立连接的最大允许时间,单位为毫秒。此超时对于确保长时间或无响应的连接不会在很长时间内延迟客户端请求的处理非常重要。当在成功建立连接之前达到超时时间时,NGINX 将中止连接尝试并向客户端返回错误,从而使您的应用能够优雅地处理连接失败。 该指令可以放在 `http`、`server` 或 `location` 上下文中,允许管理员根据应用架构的具体要求定义连接超时。超时时间可以设置为任意正整数;如果设置为 0,则会完全禁用超时功能,但在对客户端响应性要求较高的生产环境中通常不推荐这样做。将 `grpc_connect_timeout` 最有效地用于在连接延迟与应用性能之间取得平衡,以便在后端服务无响应时快速重试或启用替代故障转移。
配置示例
http {
server {
location / {
grpc_pass grpc://backend;
grpc_connect_timeout 500ms;
}
}
}将超时设置得过短可能导致频繁的“连接被过早中止”错误,影响用户体验。
禁用超时(设置为 0)在后端服务无响应时可能导致错误报告长时间延迟。
说明
`grpc_send_timeout` 指令在 NGINX 中设置服务器在处理完请求后向客户端发送 gRPC 响应的最长时间限制。该指令对确保客户端应用不会无限等待响应非常重要,有助于管理资源并维护应用性能。该指令可在不同上下文中使用,例如 `http`、`server` 和 `location`,允许你根据应用的具体需求设置不同的超时值。 当定义的超时时间到期时,NGINX 会终止连接并生成表示超时错误的 gRPC 状态码。在微服务众多的环境中,这尤其有用,因为快速失败响应通常比对严重延迟的服务无限期等待更可取。所指定的超时仅用于服务器开始向客户端发送响应之后的发送过程,这意味着它不影响请求本身的处理时间,只影响发送最终响应数据包的时间间隔。 该指令的语法为 `grpc_send_timeout time;`,其中 `time` 可以用多种格式指定,例如 `30s`(三十秒)或 `1m`(一分钟)等。选择超时时间时需在给予响应足够时间和防止无响应服务阻碍整体功能之间取得平衡。
配置示例
location /api {
grpc_pass grpc://backend_service;
grpc_send_timeout 30s;
}将超时设置得过低可能导致过早断开连接,从而对合法请求产生不必要的错误。
确保该超时不会与其他超时设置(例如 `client_body_timeout` 或 `send_timeout`)冲突,否则可能导致意外行为。
说明
NGINX 中的 `grpc_intercept_errors` 指令允许您管理 gRPC 服务如何处理错误。启用时,NGINX 会捕获 gRPC 的错误响应,并根据配置中定义的行为将其替换为自定义响应。这对于提供更友好的错误信息或统一发送给客户端的错误响应格式尤其有用。 该指令接受一个布尔参数,取值为 'on' 或 'off'。当设置为 'on' 时,NGINX 会拦截来自上游 gRPC 服务的错误,并允许进一步配置以定义如何在返回给客户端之前处理或转换这些错误。例如,您可以记录该错误或将某些错误代码映射为更具描述性的消息。如果设置为 'off',NGINX 将直接传递后端 gRPC 服务的错误代码和消息,不进行任何拦截或修改。 该指令可用于多种上下文,包括 `http`、`server` 和 `location`,这允许针对每个位置或每个服务器进行细粒度控制,从而在应用的不同部分根据需要采用不同的错误处理策略。
配置示例
http {
server {
location /some-grpc-service {
grpc_pass grpc://backend_service;
grpc_intercept_errors on;
}
}
}确保已配置适当的错误处理;否则,用户可能会收到意外的默认错误消息。
注意某些 gRPC 错误代码可能无法很好地转换为 HTTP 响应,因此请谨慎配置。
说明
grpc_buffer_size 指令对于优化通过 NGINX 提供的 gRPC 应用的性能至关重要。当 NGINX 作为 gRPC 的反向代理时,它需要高效地从上游服务器读取响应。该指令决定用于读取这些响应的缓冲区大小,从而可以控制内存使用和吞吐量。较大的缓冲区可以容纳更大的响应但可能占用更多内存,而较小的缓冲区可能会加快内存分配速度,但如果响应超过缓冲区大小,可能导致需要更多的读取操作。 该指令可在 http、server 或 location 上下文中配置,提供了应用上的灵活性。管理员可以根据其 gRPC 服务的具体需求调整缓冲区大小。例如,如果你的 gRPC 响应通常较大,增大缓冲区大小可以减少 NGINX 向上游服务器请求数据的次数,从而改善整体延迟和 gRPC 服务的性能。 该指令的参数包括一个表示缓冲区大小的单一值(以字节为单位),或者也可以使用诸如 `k`、`m` 之类的大小后缀来指定千字节或兆字节。建议根据上游 gRPC 服务的预期响应大小谨慎调整。
配置示例
http {
grpc_buffer_size 64k;
server {
location /grpc {
grpc_pass backend;
}
}
}将缓冲区大小设置得过小可能会导致延迟增加,因为需要更频繁地从上游服务器读取。
将缓冲区大小设置得过大可能会导致内存使用过高,尤其是在高流量情况下。
说明
`grpc_read_timeout` 指令定义了在建立连接后 NGINX 等待来自 gRPC 后端服务器响应的最大时间间隔。此超时对于控制服务器在放弃并关闭连接之前应等待回复的时长至关重要。它允许管理员通过避免请求无限挂起的长时间停滞来微调服务器的响应性和资源管理。 此指令可在三种上下文中指定:`http`、`server` 和 `location`。其值以时间格式指定(例如 '30s' 表示 30 秒)。指令的值必须是有效的时间跨度,可以以秒、分钟或小时为单位指定。如果在指定的超时时间内未收到响应,NGINX 将向客户端返回错误,从而在可能出现延迟的服务中提供更好的容错能力。 在生产环境中为 `grpc_read_timeout` 设置合适的值至关重要,尤其是当 gRPC 服务的响应时间可能随负载而变化时。超时时间过短可能导致不必要的重试或失败,而超时时间过长则可能降低应用的响应性,因为请求可能会不必要地长时间挂起。
配置示例
location /example {
grpc_pass grpc://backend;
grpc_read_timeout 30s;
}确保以正确的格式指定 timeout(例如,'30s')。
将 timeout 设置得过短可能导致频繁的错误和重试。
如果未设置,默认的 60 seconds 可能不足以完成某些 gRPC 操作。
说明
在 HTTP、server 或 location 块的上下文中使用 `grpc_next_upstream` 指令,用于定义在何种条件下 NGINX 会尝试将请求发送到为 gRPC 协议处理配置的下一个 upstream 服务器。该指令接受一个或多个参数,用于指定各种失败条件,例如超时、连接失败或其他错误。当发生定义的失败时,NGINX 会自动在 upstream 块中对下一个服务器重试该请求,从而通过允许对暂时性问题的自动恢复来提高 gRPC 服务的可靠性和可用性。 `grpc_next_upstream` 指令的行为既提供了细粒度的控制,又具有较强的灵活性。例如,如果请求超时或后端服务器不可达,该指令使 NGINX 能够无缝地尝试其他服务器。可以根据应用的要求设置该指令的参数,允许服务器管理员微调故障处理策略。这在分布式系统中特别有用,因为每个服务组件的可用性特性可能不同。 该指令与 NGINX 的整体负载均衡策略密切相关,可用于实现复杂的模式,例如主动健康检查和服务不可用时的处理。重要的是将此指令与 upstream 块设置一并配置,以确保对客户端和后端服务器情形做出一致的响应,最终改善使用 gRPC 进行实时通信的应用的用户体验。
配置示例
upstream grpc_backend {
server backend1.example.com:50051;
server backend2.example.com:50051;
}
location / {
grpc_pass grpc://grpc_backend;
grpc_next_upstream error timeout; # Retry on error or timeout
}确保上游服务器已正确定义并且可访问,以避免在没有实际解决方案的情况下进行不必要的重试。
使用过多的参数可能导致意外行为;请谨慎,仅定义相关的失败情况。
说明
`grpc_next_upstream_tries` 指令指定在上一个服务器未能响应的情况下 NGINX 应尝试联系多少个上游服务器。在处理 gRPC 请求时,如果第一个上游服务器返回错误,NGINX 可以根据该指令的值将请求重试到后续服务器。该指令在负载均衡环境中很有用,通过在遇到问题时回退到备用服务器来确保客户端与服务器通信的可靠性。重试机制对短暂性故障有益,但应权衡可能导致的客户端响应时间增加。 该指令在 `http`、`server` 和 `location` 上下文中生效。`grpc_next_upstream_tries` 的值必须为正整数,表示在上游请求失败时允许的重试次数。如果将该指令设置为 0,则完全禁用重试,第一次联系上游服务器后即失败。默认行为由服务器管理员的配置决定,可根据应用需求在性能和可靠性之间进行权衡和调整。
配置示例
grpc_next_upstream_tries 3;
将该值设置为 0 会禁用重试,这可能导致在上游错误期间立即失败。
确保在适用时,上游服务器已正确配置以处理重试请求。
说明
`grpc_next_upstream_timeout` 指令指定在 gRPC 请求期间,当前一个上游服务器失败时,等待连接到下一个上游服务器的最长时间。该超时在多个上游服务器可能参与处理客户端请求的场景中至关重要。如果初始上游服务器发生错误,所配置的超时时间决定了 NGINX 在操作超时之前,会尝试连接栈中下一个可用上游服务器的时长。 `grpc_next_upstream_timeout` 的参数以毫秒为单位定义,这允许在主要服务器无响应或响应缓慢等不利情况下对响应生成速度进行细粒度控制。它直接影响服务的效率和响应性,尤其是在上游服务器故障率或延迟较高的情况下。通过配置此指令,管理员可以在等待服务器响应与故障切换到替代服务器之间取得平衡,从而优化用户体验和资源使用。 此指令可以在 `http`, `server` 和 `location` 等多种上下文中设置,使其在不同级别的配置中都具有通用性。将其与 `grpc_pass` 或 `proxy_next_upstream` 等相关指令结合使用,能够进一步增强服务器的功能和可靠性。
配置示例
location /api {
grpc_pass grpc://my_upstream;
grpc_next_upstream_timeout 500ms;
}确保所指定的时间适合您的应用程序的性能需求;过短的 timeout 可能导致过多的 failovers,而过长的 timeout 可能会延迟响应。
该指令仅在使用 gRPC 时生效;请确保您的 upstream server 已相应配置。
说明
`grpc_set_header` 指令允许您为传递到后端服务器的 gRPC 请求添加或修改 HTTP/2 头。这在微服务架构中尤其有用,当需要随请求发送特定元数据时。该指令接受两个参数:第一个是要设置的头名称,第二个是要赋给该头的值。这允许根据请求的上下文或预定义变量动态生成头的值。 当在特定上下文 (http, server, or location) 中使用 `grpc_set_header` 指令时,它会在该配置级别应用这些头。例如,如果在 server block 中声明,则由该 server 处理的所有 gRPC 请求都会携带指定的头。如果在 location block 内声明,则只有匹配该 location 的请求会被设置这些头。也可以在指令中使用变量来动态设置头值,从而提高将元数据传递给后端服务的灵活性。
配置示例
location /rpc {
grpc_pass grpc://backend;
grpc_set_header api-key $api_key;
grpc_set_header user-id $http_user_id;
}确保请求头设置正确且没有拼写错误,因为 gRPC 对请求头名称非常敏感。
避免使用可能被 gRPC 协议或后端服务器过滤的不受支持的请求头名称。
说明
`grpc_pass_header` 指令用于指定应从传入请求传递到上游 gRPC 服务器的哪些头。该指令在 gRPC 代理中起着关键作用,尤其在 gRPC 服务在运行时需要特定头时。当在适当的上下文 (http, server, location) 中设置时,它允许对头转发进行细粒度控制,使服务能够从客户端接收必要的元数据。 此指令的一个主要特点是它接受一个参数,该参数是要转发的 HTTP 头的名称。该参数不区分大小写,这意味着指定 `example-header` 或 `Example-Header` 将产生相同的结果。该指令可以重复使用以转发多个头,从而有助于在服务边界之间保持重要的元数据。 在需要保留并随 gRPC 调用一并传递身份验证令牌、跟踪 ID 或其他形式元数据的场景中,使用此指令尤其有用。它增强了依赖细微头信息进行操作的服务之间的互操作性,从而改善整体 API 功能。
配置示例
location /api {
grpc_pass backend;
grpc_pass_header Custom-Header;
}确保请求头名称拼写正确并与上游 gRPC 服务器所期望的名称一致;该指令不区分大小写。
在转发时应谨慎,除非确有必要,否则不要暴露敏感请求头。
说明
grpc_hide_header 指令用于控制 NGINX 提供的 gRPC 响应中应被省略的头部。该指令可以通过隐藏可能被暴露的头部来帮助管理敏感信息或控制客户端交互。它接受一个参数,用于指定要隐藏的头的名称。设置该指令后,任何来自 gRPC 服务器且包含指定头的响应都会在到达客户端之前被 NGINX 过滤掉。
配置示例
location /grpc {
grpc_pass grpc://backend;
grpc_hide_header X-My-Header;
}确保头部名称拼写正确,并且与响应中头部的大小写匹配。
在隐藏可能对客户端功能至关重要的头部时要谨慎,因为这可能导致意外行为。
说明
grpc_ignore_headers 指令允许用户指定一个在请求处理期间应被忽略的 gRPC 头列表。该指令接受一个或多个头名作为参数,任何与所列名称匹配的头都将被 NGINX 服务器排除在处理之外。这在某些场景下很有用,例如特定头可能会干扰应用逻辑,或安全策略要求从客户端请求中排除特定头。 该指令可用于 http、server 或 location 上下文,这意味着其作用可以限定为整个服务器、某个特定的虚拟主机,或甚至某个特定的 location 块。使用此指令的灵活性允许对 gRPC 流量管理进行细粒度控制。如果未指定任何头,则默认不忽略任何头,意味着默认情况下会处理所有头。 在使用此指令时,重要的是确保您选择忽略的头不会破坏 gRPC 应用程序的预期功能。忽略关键头可能导致应用出现意外行为,因为服务器可能无法接收处理请求所需的必要数据。
配置示例
location /grpc {
grpc_pass grpc://backend;
grpc_ignore_headers
x-grpc-status
x-user-header;
}确保不要忽略必要的请求头,因为这可能导致应用错误。
注意使用 grpc_ignore_headers 的上下文;如果将其放在错误的上下文中,可能会导致意外行为。
说明
`grpc_ssl_session_reuse` 指令用于配置通过 NGINX 服务器建立的 gRPC 连接的 SSL 会话重用。它可以设置为一个标志值;启用时,gRPC 客户端可以重用现有的 SSL 会话来建立新连接,从而优化资源利用并提升性能。当该指令设置为 'on' 时,NGINX 在后续连接上可能减少 SSL 握手所需的时间,因为如果重用了现有会话则可以跳过握手。相反,将其设置为 'off' 会禁用此功能,这可能导致重复连接时延迟增加,因为每次都需要完整的 SSL 握手。 该指令可在多种上下文中使用,包括 `http`、`server` 和 `location`,根据需要重用会话的 gRPC 服务范围提供灵活性。请注意,虽然会话重用可以显著提高性能,但它要求服务器和客户端之间有适当的配置与兼容性才能正确工作。SSL 会话 ID 必须在服务器和客户端之间共享才可成功重用,这有时需要在多个服务器实例之间进行会话缓存的额外考虑。
配置示例
server {
listen 443 ssl;
grpc_ssl_session_reuse on;
ssl_certificate /path/to/cert;
ssl_certificate_key /path/to/key;
# other configurations...
}确保 SSL session IDs 在服务器实例之间被正确管理和共享,以实现正确的 session reuse。
并非所有 gRPC 客户端都支持 SSL session reuse;在启用此功能之前请验证客户端兼容性。
如果 SSL sessions 未被频繁重用,性能提升可能微乎其微;建议进行测试。
说明
`grpc_ssl_protocols` 指令允许配置由 NGINX 处理的 gRPC 连接可用的 SSL 和 TLS 协议。用户可以指定服务器在安全通信中接受的协议列表,通过排除过时和易受攻击的协议版本来提高安全性。该指令可以在诸如 `http`、`server` 或 `location` 等不同上下文中定义,根据应用需求提供配置灵活性。 该指令的有效参数通常包括常见的 SSL/TLS 版本,例如 `TLSv1`、`TLSv1.1`、`TLSv1.2` 和 `TLSv1.3`,允许管理员对应用使用的安全标准进行精细控制。此外,在 `http` 上下文中定义此指令将使设置在整个服务器范围内生效,而在 `server` 或 `location` 上下文中定义则可实现更细粒度的控制,可能为不同的 gRPC 服务启用不同的协议设置。关键在于以满足安全要求和客户端兼容性考虑的方式排列所指定的协议。
配置示例
server {
listen 443 ssl;
grpc_ssl_protocols TLSv1.2 TLSv1.3;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
}使用像 SSLv3 这样的过时协议可能导致安全漏洞,例如 POODLE 攻击。
配置不当可能导致客户端兼容性问题,例如当客户端不支持指定的协议时。
说明
`grpc_ssl_ciphers` 指令在 NGINX 中配置可用于 gRPC 应用的安全连接的密码套件。当 gRPC 服务配置为使用 SSL/TLS 时,需要在客户端和服务器之间建立安全的通信通道。`grpc_ssl_ciphers` 指令允许您显式指定服务器在协商 SSL/TLS 连接时应接受哪些密码,从而根据应用的需求确保兼容性和安全性。该指令适用于 `http`、`server` 和 `location` 上下文,因此在为全局或特定用例定义密码套件时提供了灵活性。 该指令接受一个参数,该参数是以冒号分隔的密码列表。列表中的每个密码必须符合 NGINX 所使用的 SSL/TLS 库(通常为 OpenSSL)的有效性要求。当指定多个密码时,建立安全连接时将按列出的顺序进行评估,从而允许优先选择密码。在配置密码套件时务必考虑应用的安全性,因为使用弱或已弃用的密码可能会使系统暴露于漏洞之中。此外,该指令与其他与 SSL 相关的指令协同工作,以为 gRPC 通信建立一个安全的环境。
配置示例
server {
listen 443 ssl;
grpc_ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256';
}确保您指定的 ciphers 与您的 SSL/TLS 库版本兼容。
使用过时或弱的 ciphers 会导致安全漏洞;请根据最佳实践定期更新您的 cipher list。
说明
grpc_ssl_name 指令在 NGINX 配置中用于设置在 gRPC 连接的 SSL 握手期间将在 Server Name Indication (SNI) 扩展中发送的主机名。当 NGINX 作为多个 gRPC 服务的反向代理,而这些服务托管在同一个 IP 地址上但基于客户端请求的主机名需要不同的 SSL 证书时,这一点尤为重要。 当设置该指令时,NGINX 在处理 gRPC 请求时会用指定的值替换 SSL 上下文中的主机名。通过确保针对每个特定的 gRPC 服务请求呈现正确的证书,它提高了 SSL 连接的安全性和可靠性。该指令可用于 http、server 和 location 上下文,根据服务结构允许灵活配置。 该指令的参数必须是一个单独的字符串,用于定义 SSL 主机名。如果省略该指令,NGINX 默认使用客户端请求的原始主机。对于涉及虚拟主机或处理多个 gRPC 后端的部署,正确配置 grpc_ssl_name 至关重要。
配置示例
server {
listen 443 ssl;
server_name grpc.example.com;
grpc_ssl_name backend.grpc.example.com;
location / {
grpc_pass grpc://backend;
}
}确保 hostname 正确,并且与覆盖该 hostname 的 SSL 证书相对应。
在使用 grpc_ssl_name 与多个 server blocks 一起时,如果配置不当,可能会导致冲突。
说明
在 NGINX 配置中,`grpc_ssl_server_name` 指令用于在 gRPC 连接的 SSL 握手中包含服务器名称。这使 NGINX 能够满足客户端的 Server Name Indication (SNI) 要求,帮助根据指定的主机名将连接正确路由到相应的后端服务器。启用此指令后,服务器可以在相同的 IP 地址上托管多个 SSL 站点,并通过各自的域名进行区分。 该指令可以在多种上下文中指定,包括 `http`、`server` 和 `location`,在整个配置文件中提供灵活的应用方式。将此指令设置为 'on' 后,NGINX 服务器会使用 gRPC 请求中包含的服务器名称用于其 SSL 配置,从而能够正确选择与域名匹配的 SSL 证书集合。在多个 gRPC 服务托管于同一服务器的环境中,这一点尤其有用。 需要注意的是,启用 `grpc_ssl_server_name` 可能需要对 SSL 证书进行仔细管理,以确保它们为 SNI 正确配置。如果使用多个域,请确保它们使用有效的 SSL 证书妥善保护,以实现可靠的通信。该功能强调了与期望 SNI 支持以正常工作的 gRPC 客户端的互操作性。
配置示例
server {
listen 443 ssl;
grpc_ssl_server_name on;
ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/key.pem;
}
确保为每个服务器名称安装并配置正确的 SSL 证书,以避免握手失败。
如果在 NGINX 前使用负载均衡器,请验证其是否支持 SNI 并正确转发服务器名称。
此指令在纯 HTTP 环境中不受支持,仅适用于启用 https 的配置。
说明
`grpc_ssl_verify` 指令在 NGINX 服务器配置中使用,用于控制对 gRPC 后端服务器的 SSL 证书验证过程。该指令接受一个标志参数,用以指定在 gRPC 请求期间是否执行 SSL 证书验证。 当设置为 'on' 时,NGINX 会将上游 gRPC 服务器提供的 SSL 证书与系统中配置的 CA 证书进行验证,确保证书有效,从而保证连接安全并验证服务器身份。 该指令可以放在 `http`、`server` 或 `location` 上下文中,根据请求层级实现灵活配置。如果启用验证且服务器证书无效或无法验证,NGINX 将拒绝建立连接。相反,将该指令设为 'off' 会禁用验证过程,这在测试时可能有用,但在存在中间人攻击风险的生产环境中会带来安全隐患。 请注意,当启用 `grpc_ssl_verify` 时,它依赖于 NGINX 构建中可用的 CA 证书,这些证书可以通过指定 `ssl_trusted_certificate` 指令来定制。因此,正确配置受信任证书对于该指令的正常运行以及与 gRPC 服务的安全通信至关重要。
配置示例
location /api {
grpc_pass grpc://backend-grpc;
grpc_ssl_verify on;
}启用验证时,请使用 `ssl_trusted_certificate` 指令提供正确的 CA 证书。
禁用验证 ('off') 可能使服务暴露于安全风险;仅在受信任的环境中使用。
说明
在 NGINX 配置中,`grpc_ssl_verify_depth` 指令用于指定在处理 gRPC 请求时 SSL 验证链中允许出现的中间证书的最大数量。该指令在处理基于 SSL 的 gRPC 时尤为重要,因为它有助于控制证书验证过程,防止验证过程中出现循环或过深的证书链。通过设置此指令,管理员可以在保证安全性的同时兼顾运行性能,确保客户端连接到预期的服务器。 该指令采用一个整数值,定义 SSL 证书验证允许的最大深度。例如,如果设置为 '3',则在到达信任锚点之前,证书链最多可以包含三个中间证书。在颁发多个证书且需要管理证书链深度以防超出既定要求的配置中,这一点很有用。此外,如果验证深度超过此限制,NGINX 将终止连接,从而在不对验证过程造成过大负担的情况下加强安全策略的执行。 此指令可以在多个上下文中指定,包括 `http`、`server` 和 `location`,根据配置的作用域实现细粒度控制。应根据服务器端和客户端已知的证书结构调整该值。
配置示例
http {
server {
location / {
grpc_pass grpc://backend;
grpc_ssl_verify on;
grpc_ssl_verify_depth 3;
}
}
}根据证书链深度适当设置该值,以避免不必要的连接失败。
请记住将 `grpc_ssl_verify_depth` 与 `grpc_ssl_verify on;` 配对使用,以实现有效的证书验证。
仅在必要时设置更高的深度,以防潜在的性能问题。
说明
`grpc_ssl_trusted_certificate` 指令在 NGINX 中用于指定包含受信任根证书的文件,以便在建立安全的 gRPC 连接时使用。这在 gRPC 服务通过 TLS 运行时尤为重要,因为它确保客户端能够验证服务器的 SSL 证书的真实性。所指定的证书文件通常包含被信任用于签署服务器证书的证书颁发机构 (CAs) 的公钥证书,从而使 NGINX 在建立安全连接时能够检查信任链。 在配置此指令时,应以其参数形式提供证书文件的路径。该文件应为 PEM 格式,并包含用于验证所需的完整证书链。还应确保该文件的权限允许 NGINX 读取。如果在 server 或 location 上下文中定义了这些指令,它们将应用于这些块处理的所有 gRPC 连接,从而确保所有通过这些块的 gRPC 流量进行一致的 SSL/TLS 验证。
配置示例
server {
listen 443 ssl;
grpc_ssl_trusted_certificate /etc/nginx/certs/ca.crt;
# Additional configuration...
}确保指定的路径正确,并且 NGINX 对证书文件具有读取权限。
证书文件应为 PEM 格式;其他格式将无法正确处理。
如果使用自签名证书,请确保它们已包含在信任链中。
说明
`grpc_ssl_crl` 指令用于 NGINX 配置中以指定 Certificate Revocation List (CRL) 文件,服务器在 gRPC 连接期间使用该文件来验证客户端 SSL 证书的有效性。这在确保通信通道安全方面尤为重要,因为它使服务器能够拒绝在到期日前已被吊销的证书。该指令可在 `http`、`server` 和 `location` 上下文中使用,便于在配置的不同部分范围内灵活设置。 当客户端尝试连接到服务器时,NGINX 将查阅指定的 CRL 文件,对客户端提供的证书进行检查。如果客户端的证书出现在 CRL 中,NGINX 将拒绝连接,从而通过确保被吊销的证书不能用于建立信任来增强安全性。必须保持 CRL 文件的更新以反映证书的当前状态,CRL 通常由管理签名和吊销的 Certificate Authority (CA) 提供。 该指令接受一个参数,指向 CRL 文件的路径,且必须与其他 SSL 指令(例如 `ssl_certificate` 和 `ssl_certificate_key`)配合使用,作为完整 gRPC SSL 配置的一部分。
配置示例
server {
listen 443 ssl;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
grpc_ssl_crl /etc/ssl/crl/my_crl.pem;
}
确保 CRL 文件格式正确并且可被 NGINX 工作进程访问,否则在启动 NGINX 时可能导致错误。
如果 CRL 文件过大,可能在进行客户端连接检查时影响性能;请考虑其大小和更新频率。
说明
`grpc_ssl_certificate` 指令在 NGINX 中用于指定将在 HTTPS 上用于加密 gRPC 通信的 SSL 证书文件的路径。该指令对于确保通过 gRPC 连接传输的数据安全至关重要,为在网络上传输的敏感数据提供加密。当设置此指令时,NGINX 在处理传入的 gRPC 请求时会使用指定的 SSL 证书。 该指令可以放在 `http`、`server` 或 `location` 上下文中,允许在服务器架构的不同粒度级别上灵活配置 SSL。该配置期望一个参数,该参数应为指向 PEM 编码证书的有效文件路径。如果指定的文件无法读取或不是有效的证书,NGINX 将无法启动,从而强制执行严格措施以确保通信安全。此外,应与适当的 SSL 设置(例如 `grpc_ssl_certificate_key`)一起使用此指令,以在会话期间正确建立并保护 SSL 握手。
配置示例
server {
listen 443 ssl;
grpc_ssl_certificate /etc/ssl/certs/my_cert.crt;
grpc_ssl_certificate_key /etc/ssl/private/my_key.key;
location /grpc {
grpc_pass grpc://backend_service;
}
}确保证书文件路径正确,否则 NGINX 将无法启动或重新加载。
证书应为 PEM 格式,非 PEM 格式的证书会导致错误。
始终将此指令与 `grpc_ssl_certificate_key` 配合使用,以建立有效的 SSL 配置。
说明
`grpc_ssl_certificate_key` 指令用于定义建立安全 gRPC 连接所需的私钥文件。该指令在服务器需要使用 SSL/TLS 向客户端进行身份验证时尤其关键。所提供的参数应为 PEM 编码文件的路径,该文件包含与 `grpc_ssl_certificate` 指令定义的 SSL 证书关联的私钥。当 gRPC 客户端尝试连接时,会使用 SSL 证书和私钥来建立安全连接,确保传输的数据被加密且安全。 该指令可在 `http`、`server` 或 `location` 级别使用。此灵活性允许根据 Web 服务器不同部分的需求对 SSL 配置进行细粒度控制。需要注意的是,如果未指定有效的证书及对应的私钥,客户端可能无法建立连接,导致通信失败。因此,对于通过 SSL/TLS 加密要求保密性和完整性的 gRPC 服务,正确设置该指令至关重要。
配置示例
server {
listen 443 ssl;
grpc_ssl_certificate /etc/ssl/certs/server.crt;
grpc_ssl_certificate_key /etc/ssl/private/server.key;
}确保私钥文件路径正确且 NGINX 进程可以访问。
私钥必须与由 grpc_ssl_certificate 指令指定的 SSL 证书相匹配。
如果文件权限过于严格,NGINX 可能无法读取密钥文件,导致启动错误。
说明
NGINX 中的 grpc_ssl_certificate_cache 指令旨在通过缓存 SSL 证书来提高 gRPC 通信的效率。它允许管理员指定一种缓存机制,用于存储在 gRPC 连接中经常使用的 SSL 证书,从而减少对这些证书的重复加载和解析的需求。通过缓存,这可以显著改善延迟和性能,因而将重复建立安全连接的开销降到最低。 该指令可以接受 1 到 3 个参数:缓存大小、用于缓存证书的 TTL (Time To Live) 和可选的最大尺寸。第一个参数设置缓存大小,通常以 bytes (e.g., 10m for 10 megabytes) 表示。TTL 决定证书在缓存中保持有效的时长,超过该时长后证书将被移除并重新加载。管理员可以根据其特定的服务器负载和性能要求调整这些参数。该指令的灵活性允许配置以适应各种 gRPC 应用的需求,确保安全且高效的服务交付。
配置示例
grpc_ssl_certificate_cache 10m 2m 1h;
确保证书缓存大小满足您的应用需求。
注意 TTL;将其设置得过短可能会因为频繁重新加载证书而导致性能问题。
如果缓存失败,请验证缓存目录的权限。
说明
`grpc_ssl_password_file` 指令用于 NGINX 配置中,从指定文件读取密码。该密码在处理加密的 SSL 证书时非常重要,这类证书通常用于安全的 gRPC 连接。配置后,NGINX 会在 SSL 上下文初始化期间访问该密码,从而相应地解密 SSL 证书。密码文件的路径应作为该指令的参数提供。 就上下文而言,`grpc_ssl_password_file` 指令可以放置在 NGINX 配置文件的 `http`、`server` 或 `location` 块中。该指令的使用在依赖安全通道的 gRPC 应用中至关重要。如果指定的密码文件丢失或无法读取,NGINX 将无法启动,并会记录错误,指出 SSL 证书初始化的问题。 还必须确保证书密码文件具有适当的文件系统权限以避免未经授权的访问,因为它包含对安全 gRPC 通信运行至关重要的敏感信息。在生产环境中,管理此类文件的安全性对于维护 SSL 通信的完整性和机密性至关重要。
配置示例
server {
listen 443 ssl;
grpc_ssl_password_file /etc/ssl/private/grpc_password.txt;
ssl_certificate /etc/ssl/certs/grpc_cert.pem;
ssl_certificate_key /etc/ssl/private/grpc_key.pem;
}确保密码文件的路径正确;否则,HTTPS 连接将会失败。
密码文件必须具有正确的权限,以便 NGINX 工作进程能够读取。
以明文文件存储敏感密码可能带来安全风险;请考虑妥善保护该文件。
说明
grpc_ssl_conf_command 指令用于在 NGINX 中为 gRPC 通信设置特定的 SSL 参数。该指令可以包含在 http、server 或 location 上下文中,便于灵活配置。它接受两个参数,分别表示要执行的命令及其对应的值。该指令的一个关键方面是它能够专门修改 gRPC 连接的 SSL 设置,独立于标准的 HTTP 配置,这对于在依赖 gRPC 的微服务架构中维护安全通信通道至关重要。 在使用 grpc_ssl_conf_command 时,你指定的每个命令都会影响传入 gRPC 请求的处理方式,并以感知上下文的方式生效。这意味着根据层级级别(http、server、location),这些命令的作用可以更细粒度或更全局,从而允许管理员根据 NGINX 不同部分的不同安全需求微调 SSL 操作。该指令对于默认 SSL 参数无法覆盖的自定义配置特别有用,因此对于希望增强其 gRPC 部署的用户来说非常重要。 需要注意的是,必须提供正确的值以确保最佳运行;错误的参数可能导致 SSL 配置不当,从而危及连接安全或导致服务故障。因此,在使用该指令时,建议仔细参考 NGINX 的 SSL 文档和 gRPC 的相关要求。
配置示例
grpc_ssl_conf_command valid_commands value;
确保所提供的命令有效且受支持,以避免配置错误。
注意上下文的限制;命令在不同上下文(http、server、location)中可能表现不同。
请参阅 gRPC SSL 文档,将内部 SSL 要求与配置的命令相匹配。
说明
`gunzip` 指令在 NGINX 中用于控制服务器是否在将响应发送给客户端之前自动解压缩 gzip 压缩的 HTTP 响应主体。启用时,NGINX 会解压内容,使不支持 gzip 压缩的客户端能够正确解析响应,而无需在客户端进行额外处理。该指令对于确保与可能无法正确处理 gzip 编码的各种客户端的兼容性非常重要。 `gunzip` 指令以标志作为参数,`on` 启用解压缩,`off` 禁用。该指令可以在 `http`、`server` 和 `location` 上下文中使用,从而根据不同配置对何时解压响应进行精细控制。应谨慎使用此指令;例如,对某些可能被压缩的资源所在的 `location` 开启它可以减少带宽并提高加载速度,但对于非常小的文件可能会引入额外开销。 由于 NGINX 使用 `Content-Encoding` 头来判断响应是否被压缩,`gunzip` 指令与控制压缩过程的 gzip 相关指令配合工作。如果响应未被压缩(即未包含 `Content-Encoding: gzip` 头),`gunzip` 设置不会生效,这意味着无论该指令处于何种状态,原始内容都会按原样发送。启用 `gunzip` 时,用户必须确保上游服务器或应用程序正确设置了用于压缩的头部,以使其完全生效。
配置示例
server {
listen 80;
server_name example.com;
location / {
gunzip on;
proxy_pass http://backend;
}
}确保上游服务器发送正确的 `Content-Encoding` 头;否则,`gunzip` 将不会生效。
不要在网络较差的情况下使用 `gunzip`,因为解压可能增加 CPU 开销,导致性能问题。
不要对特别小的文件启用 `gunzip`,因为解压的开销可能抵消带宽节省带来的任何收益。
说明
`gunzip_buffers` 指令指定用于保存来自 HTTP 响应的解压数据的缓冲区数量和大小。该指令在处理发送给客户端的 Gzip 压缩内容时尤其有用,因为它允许 NGINX 高效地管理解压数据的内存分配。第一个参数定义缓冲区的数量,第二个参数指定每个缓冲区的大小(以字节为单位)。在处理 Gzip 压缩的响应时,NGINX 会使用这些缓冲区在将数据发送给客户端之前临时存储解压后的数据。 使用 `gunzip_buffers` 指令可以通过优化解压过程中的内存使用来提高性能。默认情况下,该指令可能未设置,这意味着 NGINX 将使用内置的缓冲区大小来处理解压数据。管理员可能希望根据应用的特性调整这些参数,尤其是在处理大文件或高流量时,合适的缓冲区大小可以防止性能瓶颈。总之,当涉及 Gzip 压缩内容时,该指令用途广泛,能够提高 NGINX 在响应处理上的效率。
配置示例
http {
gunzip on;
gunzip_buffers 8 16k;
}确保缓冲区大小足够应对预期的最大解压后响应大小。
在设置非常大的缓冲区大小时要谨慎,因为这可能导致内存使用量增加。
如果未启用 `gunzip`,则此指令不会生效。
说明
NGINX 的 HTTP Core 模块中的 'gzip' 指令用于控制发送给客户端的响应的 gzip 压缩。启用该指令后,NGINX 会使用 gzip 算法对响应进行压缩,这可以显著减小传输数据的大小并改善客户端的加载时间。服务器会检查允许的内容类型和客户端的能力(例如是否存在 'Accept-Encoding: gzip' 头)来决定是否以压缩数据响应。 该指令可取布尔值:设置为 'on' 时启用 gzip 压缩,设置为 'off' 时禁用。此外,NGINX 提供了若干配置参数以进一步细化 gzip 压缩的行为,例如 'gzip_types' 用于指定要压缩的 MIME 类型,'gzip_vary' 用于指示是否向响应添加 Vary 头以表明对不支持 gzip 的客户端存在不同版本。使用 gzip 有助于降低带宽成本并提升用户体验,尤其对 HTML、CSS 和 JavaScript 等基于文本的文件效果明显。 需要谨慎使用 gzip 压缩,因为并非所有内容类型都适合压缩,过度使用可能会在服务器端引入不必要的 CPU 开销。
配置示例
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}确保在编译 NGINX 时包含 gzip 模块,因为在某些构建中它可能被排除。
对已压缩的文件(例如 JPEG 图像)进行过度压缩不会带来任何好处,甚至可能增加文件大小。
请记得检查客户端兼容性;某些客户端可能不支持 gzip,因此其响应将不会被压缩。
说明
gzip_buffers 指令指定在 NGINX 发送的响应上使用 gzip 压缩时,为存储压缩数据而分配的缓冲区的数量和大小。该指令接受两个参数:第一个指定缓冲区的数量,第二个指定每个缓冲区的大小。例如,配置 `gzip_buffers 16 8k;` 表示将分配 16 个每个 8 千字节的缓冲区。 这些缓冲区用于在将压缩输出发送到客户端之前保存数据,优化这些值会显著影响性能,尤其是在负载较高时。选择更大的缓冲区大小可以减少对输出的写入次数,从而在提高吞吐量的同时增加内存使用;相反,较小的缓冲区可能导致更频繁的写入但降低内存占用。 需要注意的是,缓冲区的总大小还取决于分配的总内存,这可能受到系统设置或应用程序内存占用的限制。错误配置这些值可能导致内存使用效率低下或性能瓶颈,尤其是在处理大响应或高流量时。
配置示例
gzip on; gzip_buffers 16 8k;
设置过大的缓冲区大小可能会浪费内存并导致内存管理效率低下。
如果响应较大且需要超过指定的缓冲区数量,减少缓冲区数量可能会在高负载下引发性能问题。
说明
NGINX 中的 `gzip_types` 指令用于定义一个 MIME 类型列表,当启用 `gzip` 模块时这些类型应被压缩。该指令可以更精细地控制哪些文件类型会被压缩,从而优化特定内容类型的传输,同时可能排除那些压缩后不会显著减小体积的类型。该指令接受一个或多个 MIME 类型作为参数。通过指定这些类型,可以确保只有预期的内容类型(例如文本文件)会被压缩,从而提升加载速度并节省带宽,同时避免对非相关文件类型进行不必要的处理。 当启用 gzip 模块时,它会将响应的 `Content-Type` 头与 `gzip_types` 中指定的 MIME 类型进行检查。如果匹配,则在发送到客户端之前对响应进行压缩。这一功能对基于文本的内容(例如 HTML、CSS、JavaScript 和 XML)尤其重要,可大幅减小大小,从而加快页面加载。然而,为了实现最佳效率,关键是列出所有希望压缩的相关 MIME 类型。此外,应注意理解特定文件格式的行为;例如,某些二进制格式可能已经被压缩,额外的 gzip 压缩可能效果不佳甚至适得其反。
配置示例
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml;
为了有效使用,请确保在 NGINX 配置中启用 gzip 模块。
如果某个 MIME 类型未列在 gzip_types 中,即使启用了 gzip,也不会被压缩。
对某些文件类型(例如图像或视频)进行过度压缩可能带来微乎其微的体积节省。
说明
NGINX HTTP Core 模块中的 `gzip_comp_level` 指令允许管理员指定在提供 gzip 编码内容时应用的压缩级别。有效值范围为 1 到 9,其中 1 表示最小的压缩量(处理速度最快),9 表示最高的压缩级别(CPU 负载更高)。 默认情况下,`gzip_comp_level` 设置为 1,这意味着内容将被轻度压缩。提高此值可以改善压缩比,从而节省更多带宽;但同时也会在压缩过程中增加 CPU 使用率。在权衡时需要谨慎考虑,尤其是对于高流量站点,过高的 CPU 负载可能会影响性能。另外,压缩级别仅适用于符合 gzip 压缩条件的数据,例如 HTML、CSS 和 JavaScript 文件,具体由其他 `gzip` 指令指定。 该指令具有上下文相关性,可以在 `http`、`server` 或 `location` 上下文中定义,便于根据具体需求进行灵活配置。在 `http` 上下文中设置将把指定的压缩级别应用于全局,而在 `server` 或 `location` 上下文中的设置可以覆盖全局设置以实现更细粒度的控制。
配置示例
http {
gzip on;
gzip_comp_level 5;
}将级别设置得过高可能会导致 CPU 使用量增加,进而可能影响服务器的性能。
并非所有文件类型都适用于 gzip 压缩;请确保已为内容类型配置了相应的设置。
说明
gzip_window 指令在启用 NGINX 的 Gzip 压缩时,配置 zlib 压缩算法所使用的滑动窗口的最大大小。它指定在压缩响应时可以保留在内存中的输入数据量。较大的窗口大小可以通过在处理输出的每个字节时引用更多数据来提高压缩效率,从而获得更好的压缩比。然而,这也会增加 NGINX 工作进程的内存使用,在内存受限的环境中可能是不利的。 该指令接受单个参数,应以字节为单位指定,这意味着您可能需要提供不带任何后缀的数字值。设置此参数后,指令会启用指定的窗口大小用于 Gzip 压缩,从而提升通过 HTTP 传输内容的整体性能和效率。如果未配置,则会应用默认设置,根据被压缩内容的类型和大小,默认值可能无法充分发挥 Gzip 算法的潜力。 在实际操作中,用户在增大此值之前应仔细考虑服务器的内存能力,尤其是在高负载场景或处理大型响应时,因为过度分配可能导致内存耗尽和性能下降。
配置示例
gzip on;
gzip_window 32k;
location / {
gzip_types text/plain text/css application/json;
# any other configurations
}将窗口设置得非常大可能导致每个连接占用更多内存,进而耗尽可用内存。
并非所有客户端都支持不同级别的 gzip 压缩,因此在更改后测试客户端兼容性至关重要。
说明
指令 `gzip_hash` 属于 NGINX 的 HTTP Core module,控制 NGINX 如何处理 HTTP 响应的 gzip 压缩。通过定义哈希方法,它可以优化已缓存内容的 gzip 参数的存储和检索,从而在高负载下提供更好的性能。 该指令可以配置为多种哈希算法,例如 `md5`、`sha1` 或 `crc32`,允许用户根据服务器的能力和预期内容类型调整 gzip 压缩的响应性与资源使用。哈希方法的选择可能影响存储的 gzip 标志的性能和大小,从而影响整体内存占用。NGINX 会检查压缩上下文,并根据配置的参数生成哈希值,以确保基于所选哈希函数为压缩内容生成唯一标识符。 指令 `gzip_hash` 可放置在 `http`、`server` 或 `location` 上下文中,提供配置上的灵活性。需要注意的是,选择更复杂的哈希函数可以提高条目的唯一性,但可能会消耗额外的 CPU 周期,因此在配置时应根据应用的具体需求及预期负载进行权衡。
配置示例
http {
gzip on;
gzip_hash sha1;
}确保所选择的哈希算法被您当前的 NGINX 版本支持。
使用复杂的哈希算法可能会增加 CPU 使用率,同时在压缩效率方面只带来微不足道的收益。
更改哈希算法会影响之前缓存的 gzip 响应的处理方式,可能需要重新生成这些缓存项。
说明
'postpone_gzipping' 指令在 NGINX 中指定是否应延迟对响应主体的 gzip 压缩,直到响应头被发送。默认情况下,响应数据序列化为 gzip 格式会立即执行。然而,当设置为 'on' 时,NGINX 会将压缩推迟到 HTTP 头发送之后,这在服务器需要优先快速向客户端发送头部而不是承担压缩开销时可能有利。此设置可以优化资源使用并改善感知延迟,尤其是对大体积响应。\n\n该指令可在多种上下文中使用,包括 http、server 和 location 块。应用时,它可以接受单个参数 'on' 或 'off'。如果设置为 'on',NGINX 将延迟 gzipping 过程,这允许在处理特定类型的响应或在请求处理的某些阶段时具有更大的灵活性。相反,将其设置为 'off' 或不指定该指令将导致 NGINX 立即执行 gzipping,在响应主体生成后立即应用任何已配置的压缩设置。
配置示例
http {
gzip on;
postpone_gzipping on;
}确保使用 'postpone_gzipping on' 不会对较大负载的响应时间产生不利影响。
请记住,此设置适用于 gzip 响应;请确保您的配置正确支持 gzip 压缩。
说明
`gzip_no_buffer` 指令在 NGINX 中用于控制对进行 gzip 压缩的响应的输出缓冲。当设置为 'on' 时,该指令允许 NGINX 在不先将整个响应缓存在内存中的情况下,直接将压缩后的输出发送给客户端。对于较大的响应或需要实时流式传输数据的场景,这种行为尤其有用,因为它通过在生成数据时即发送给客户端来减少内存使用并可能提高吞吐量。相反,将此指令设置为 'off'(默认值)会启用缓冲,使整个响应在压缩并发送之前保存在内存中,这在优化响应传递方式时可能有利,尤其是当服务器可以从数据去重和压缩效率中受益时。 该指令接受一个标志参数:'on' 或 'off'。启用时,响应会直接发送而不进行缓冲;保持关闭则采用标准的缓冲行为。需要注意的是,在特定场景下关闭缓冲可能会影响性能,尤其是在处理大量并发请求或大型响应时,因为动态压缩数据的开销可能会增加运行负载。
配置示例
http {
gzip on;
gzip_no_buffer on;
}启用此指令可能会导致资源使用量增加,特别是在许多客户端同时请求大文件时,因为响应不会被缓冲,可能会使服务器的 CPU 和内存资源不堪重负。
务必在启用此指令的情况下测试应用程序的行为,因为它可能会暴露出流式传输或大响应相关的问题,这些问题以前被缓冲掩盖了。
说明
`gzip_min_length` 指令控制在 NGINX 中响应主体达到多大尺寸才可进行 Gzip 压缩。当生成响应时,如果主体大小小于指定长度,则不会进行压缩。此项设置有助于优化性能,因为压缩较小的响应可能比直接发送未压缩的内容更耗费 CPU。 该指令接受一个以字节为单位定义最小长度的参数,并且可以在 `http`、`server` 或 `location` 上下文中设置。这允许在服务器层级的不同级别使用不同的配置。通过调整该值,管理员可以在压缩开销与网络带宽节省之间找到平衡。对于响应包含小型资源(例如图像或脚本)的场景尤其重要,因为这些资源可能不会从 Gzip 压缩中获得显著收益。 要设置此指令,只需提供一个表示阈值的数字(字节)。例如,设置 `gzip_min_length 1000;` 意味着任何小于 1000 字节的响应主体将以未压缩形式发送,而较大的主体将被压缩。该行为有助于减轻因处理大量小型压缩文件而导致的性能延迟。
配置示例
http {
gzip on;
gzip_min_length 1000;
}将值设置得过高可能导致小响应的带宽使用量增加。
如果存在多个配置,有效值可能会因其设置的上下文而有所不同。
说明
`gzip_static` 指令允许 NGINX 提供带有 `.gz` 扩展名的预先压缩文件,而不是在运行时即时压缩文件。启用后,当对压缩资源发出请求时,NGINX 会首先在指定位置检查对应的 `.gz` 文件是否存在。如果找到,则直接提供该文件,绕过 gzip 模块的运行时压缩。这些预先压缩的文件有助于提高性能,尤其是在高峰流量期间,因为它们减少了与动态 gzip 压缩相关的 CPU 开销。 `gzip_static` 指令接受一个参数,可为 `on` 或 `off`,用于指示启用或禁用该功能。设置为 `on` 时,NGINX 在处理请求时会检查文件的 gzip 压缩版本(通常以 `.gz` 为后缀)是否存在。如果没有找到此类文件,NGINX 会回退为提供常规文件(如果存在),如果两者都不存在则返回错误。此行为提高了资源传输的效率,尤其适用于 HTML、CSS 或 JavaScript 等文本类内容,因为 gzip 压缩通常能显著减小体积。 需要注意的是,为了使 `gzip_static` 有效运行,通常会将其与 `gzip` 指令配合使用,以确保在构建或部署阶段对必要的文件应用压缩。此外,还需要正确管理缓存头,以防在静态文件更新时提供过期的数据。
配置示例
http {
gzip_static on;
server {
location / {
root /var/www/html;
}
}
}确保 `.gz` 文件已正确生成并放置在预期目录中;否则,请求将无法返回压缩后的版本。
使用 `gzip_static` 不会自动压缩文件;功能要正常工作,原始文件和 `.gz` 文件都必须存在。
如果启用了 `gzip_static`,但没有配套的 `gzip` 指令用于实时压缩,那么未预压缩的文件的用户可能无法享受相应的好处。
说明
'expires' 指令用于为 NGINX 提供的静态资源设置过期时间。通过定义资源被视为有效的时长,它有助于浏览器缓存并通过减少发送到服务器的请求数量来优化加载时间。该指令接受一个时间值作为参数,可以用秒(例如 '30s')、分钟(例如 '5m')、小时(例如 '12h')或天(例如 '1d')来指定。还有额外选项,可指定 'max' 表示无限期过期,或 'epoch' 将其设置为过去的时间。 设置后,'expires' 指令会为客户端请求自动生成相应的响应头。它可以在多个上下文中配置,包括 'http'、'server' 和 'location'。值得注意的是,它也可以在 location 块内的 'if' 语句中使用以获得更细粒度的控制。通过在不同上下文中使用多个 'expires' 指令,可以针对不同类型的资源定制缓存策略,从而确保静态文件得到高效提供。
配置示例
location /images {
expires 30d;
}在不适当的上下文中使用 'expires' 可能导致意外行为。
不了解 'expires' 与 'cache-control' 响应头之间的区别,可能会导致缓存策略上的混淆。
确保 'expires' 不与 NGINX 中的其他缓存配置冲突。
说明
`add_header` 指令允许在 NGINX 发送的响应中包含特定的 HTTP 头。对于配置参数(如安全策略 (`Strict-Transport-Security`, `Content-Security-Policy`))或管理缓存行为(`Cache-Control`, `Expires`)特别有用。指定时,它会为定义的上下文 (http, server, or location) 设置这些头。\n\n可以使用多个 `add_header` 指令定义多个头,如果该头已存在,使用此指令可以修改其值。一个需要注意的关键行为是,`add_header` 不会覆盖已存在的头,除非使用 `always` 参数;使用 `always` 可以确保在响应代码指示错误(例如 4xx 或 5xx 响应)时也包含所添加的头。这允许在不受底层应用逻辑响应影响的情况下管理头的可见性。
配置示例
server {
listen 80;
server_name example.com;
add_header X-Frame-Options "DENY";
location / {
add_header Content-Security-Policy "default-src 'self'";
}
}如果忘记指定 'always',响应头可能不会包含在错误响应(4xx/5xx)中。
在嵌套上下文(例如 location)中添加的响应头会覆盖在父级上下文(例如 server)中定义的响应头。
注意重复的响应头 — 在重新定义时只有最后定义的值会生效。
说明
`add_trailer` 指令用于指定包含在 HTTP/2 和 HTTP/3 响应的 response trailer 部分的自定义 header 字段。Trailers 是在消息体之后发送的额外 HTTP 头。这对于在主负载发送完成后才能确定的元数据或状态信息很有用。 该指令接受 2 到 3 个参数:第一个参数是要添加的 header 的名称,后续参数是与该 header 关联的 values。values 可以包含 variables,使该指令在处理动态 header 内容时更灵活。如果指定了多个 values,它们将用逗号连接。 需要注意,并非所有 clients 都能良好处理 trailers,因此开发者应确保其 applications 能正确处理包含 trailer 信息的响应。此外,使用该指令时应谨慎,因为它可能会根据添加的 headers 影响 caching 和 client 行为。
配置示例
server {
location /example {
add_trailer X-Custom-Trailer "Trailer Value";
}
}并非所有客户端都支持响应尾部(trailers),这可能会限制 `add_trailer` 指令的可用性。
确保格式正确并使用有效的头部名称,以避免由于不正确的 HTTP 头部而产生的问题。
说明
`add_header_inherit` 指令控制使用 `add_header` 设置的头部指令的继承。当指定此指令时,它允许在父上下文(例如 http 或 server)中定义的任何 `add_header` 指令被子上下文(如 location)继承。这对于确保在不同配置级别中的头部一致性特别有用,无需在每个上下文中重新定义头部,从而简化配置管理。该指令接受一个参数,用于指定是否启用此继承,其中 `on` 允许继承,`off` 禁止继承。 默认情况下,继承是禁用的,除非显式启用。当启用继承时,父上下文中添加的任何头部将自动包含在子上下文的响应中,从而允许服务器在配置的特定块中全局应用并保持一致的头部,例如安全头、缓存策略或自定义头。通过减少在多个上下文块或 location 中重复定义头部,这可以提高安全性和性能。
配置示例
http {
add_header X-Frame-Options "DENY";
server {
add_header_inherit on;
location /api {
# /api will inherit the X-Frame-Options header
}
}
}如果 `add_header_inherit` 设置为 `off`,在父级上下文中定义的响应头将不会被继承,可能导致响应中缺少这些响应头。
确保在正确的上下文级别定义 `add_header_inherit`,以实现预期的响应头继承行为。
说明
`add_trailer_inherit` 指令提供了一种机制,用于配置在代理服务器上下文中如何处理 trailer headers(即在主响应体之后发送的头)。设置后,它允许将这些 trailer headers 从被代理的 upstream 服务器响应继承到发送给客户端的响应中。当处理诸如 chunked 之类的传输编码时,这一点尤其有用,因为在响应结尾需要发送额外的头以向客户端提供必要的元数据。 该指令接受一个参数,值为布尔型:'on' 或 'off'。若设置为 'on',NGINX 将在发送给客户端的响应中包含从 upstream 服务器收到的任何 trailer headers。若设置为 'off',则不会包含这些头。必须认识到,继承 trailer headers 可能会影响客户端的行为,特别是在涉及 HTTP/1.1 chunked 传输的场景中。因此,在使用此指令时应仔细考虑 upstream 服务器的配置和客户端的期望。
配置示例
http {
server {
location /example {
proxy_pass http://upstream_server;
add_trailer_inherit on;
}
}
}确保上游服务器实际发送 trailer headers;否则,启用此指令不会生效。
过度使用 trailer headers 可能会导致客户端出现意外行为,尤其当客户端不能正确处理它们时。
说明
`image_filter` 指令是 NGINX 图像过滤模块的一部分,该模块通过定义的过滤器提供处理图像文件的功能。您可以在 `location` 块中使用此指令,以启用例如调整大小、裁剪和更改由 Web 服务器提供的图像格式等操作。 该指令接受一到三个参数:过滤器类型、其参数和可选的配置标志。过滤器可以包括例如将图像调整为特定尺寸或修改格式以优化加载时间并减少资源使用的选项。根据指定的过滤器及其配置,NGINX 在图像被请求时动态处理图像文件,而不是提供静态副本,这可以显著提升性能和灵活性。 该指令通过允许实时图像处理而无需外部处理工具,从而提升整体用户体验。这可以减少服务器负载并提高响应速度,尤其适用于需要为不同设备类型提供各种图像尺寸或格式的应用。
配置示例
location /images {
image_filter resize 800 600;
image_filter_jpeg_quality 85;
image_filter_cache on;
}
确保在 NGINX 构建中包含 image_filter 模块;否则该指令将无法工作。
过滤选项可能会根据所指定的过滤器类型而有所不同;请参阅文档以获取有效参数。
注意缓存设置;不当的缓存管理可能导致提供过时的图像。
说明
`image_filter_jpeg_quality` 指令允许你在通过 NGINX 的图像过滤模块处理时指定 JPEG 图像的质量。它接受单个参数,表示所需的质量级别,范围从 1 到 100。较小的数值会导致更高的压缩率和更低的图像质量,而较大的数值则会产生更好的图像质量但文件体积更大。 当你在 `http`、`server` 或 `location` 上下文中设置该指令时,NGINX 会将指定的质量设置应用到所有由图像过滤模块处理的 JPEG 图像。这对于通过在文件大小和视觉保真度之间取得平衡来优化图像传输特别有用,这可以改善加载时间并为 Web 应用节省带宽。需要注意的是,只有在你的 NGINX 配置中包含并启用了图像过滤模块时,该指令才会生效。 该指令的一个特殊注意点是,如果你在一个需要快速加载时间的网站上提供图像,可能需要试验该质量设置以找到既满足性能又满足外观要求的最佳平衡。此外,对该指令的修改需要重新加载 NGINX 配置才能生效。
配置示例
http {
location /images {
image_filter jpeg;
image_filter_jpeg_quality 85;
}
}将质量值设置得过低可能导致图像质量明显下降。
该指令仅在使用 image filter 模块时生效;请确保该模块已启用。
对该指令所做的更改需要重新加载 NGINX 配置。
说明
`image_filter_webp_quality` 指令用于定义在 NGINX 中使用 image_filter 模块时生成的 WebP 图像的质量级别。该指令接受一个参数,该参数为整数,用来指定输出 WebP 图像的质量(0 到 100),其中 100 表示最高质量和最低压缩,0 则表示最低质量和最大压缩。该指令必须在配置文件的 `http`、`server` 或 `location` 上下文中包含,因为它用于控制图像的处理和提供方式。 配置后,`image_filter_webp_quality` 通过将传入图像转换为 WebP 格式来增强 NGINX 的图像提供能力,WebP 通常相比 JPEG 或 PNG 等其他格式体积更小,而不会显著降低视觉质量。如果客户端支持 WebP(通过检查 HTTP 请求中的 `Accept` 头确定),此转换会在运行时进行。适当设置质量参数可让开发者根据应用的具体需求在图像清晰度和文件大小之间进行权衡,从而改善以图像为主的网页的加载时间和性能。
配置示例
location /images {
image_filter png;
image_filter_webp on;
image_filter_webp_quality 85;
}确保 image_filter 模块已启用并正确配置,因为此指令仅在该上下文中生效。
在图像处理时使用超出 0-100 范围的值可能导致错误或意外行为。
请记住,将质量设置为较高值(接近 100)会生成更大的文件大小,可能影响加载速度。
说明
'image_filter_sharpen' 指令用于在 NGINX HTTP 服务器中,对由图像过滤模块处理的图像应用锐化效果。该指令可以通过增强边缘和细节处的对比度来改善图像的外观。它接受一个参数,用于指定锐化强度,控制滤镜增强图像清晰度的程度。数值越高,图像越锐利,但过度锐化可能会产生伪影。 正确配置时,'image_filter_sharpen' 指令可放在不同的上下文中,例如 http、server 和 location 块。该指令应与处理 NGINX 所提供图像文件的图像过滤模块配合使用。如果图像未被处理或滤镜模块未启用,则该指令不会生效。锐化效果的显著程度也会根据原始图像质量而有所不同。 用户应提供数值(通常范围为 0 到 100)来微调应用于图像的锐化量。根据视觉输出的需求适当设置该值,可以在保持自然外观、避免过度锐化的同时显著提高图像清晰度。
配置示例
location /images {
image_filter brighten 0.1;
image_filter_sharpen 10;
}确保在你的 NGINX 构建中包含图像过滤模块,否则该指令将无法工作。
使用过高的锐化值会导致图像看起来不自然并出现可见的伪影。
该指令仅适用于通过图像过滤模块处理的图像;未经过处理直接提供的静态图像不会受影响。
说明
'image_filter_transparency' 指令允许用户指定由 NGINX 图像过滤模块处理的图像的透明设置。该指令接受一个布尔标志,当启用时,会指示 NGINX 在渲染图像时应用透明设置。对于需要保持透明背景(例如标志或图标等网站资源)的图像,这一功能特别有用,可确保图像文件中设定的任何透明度在传输过程中被保留。 当该指令设置为 'on' 时,图像过滤器会根据图像文件的 alpha 通道处理图像,以保留或应用透明区域。该设置有助于网页开发者在不同浏览器和平台上优化图像显示效果。它作为一个简明的开关,改变图像数据的存储和传输方式,而无需在客户端进行额外的处理或操作。该指令影响图像的渲染方式,但不允许在启用与禁用之外对透明度级别进行更细粒度的配置。 在上下文中,该指令可以在 http、server 或 location 块中指定,从而允许在不同配置作用域中灵活应用。将此指令与图像过滤模块中的其他指令正确搭配使用,可以显著影响 NGINX 实例所提供图像的视觉质量,从而提升 Web 应用的整体用户体验。
配置示例
location /images/ {
image_filter on;
image_filter_transparency on;
try_files $uri =404;
}确保图像过滤模块与 NGINX 一起编译;否则此指令将不会生效。
在错误的上下文中使用此指令(例如,在 'http' 或 'server' 中,而它应该在 'location' 中)可能会导致配置错误或警告。
除非图像本身支持透明度(例如 PNG 文件),否则透明效果可能不可见。
说明
image_filter_interlace 指令用于控制如何将图像提供给客户端,尤其是与渐进渲染相关的情况。启用交错时,图像以允许它们逐步加载和显示的方式发送到浏览器,从而在较慢的连接上提升大图像的用户体验。该指令接受一个布尔标志:'on' 启用交错,'off' 禁用交错。这意味着开发者可以根据具体用例和性能考虑选择是否以支持渐进显示的格式提供图像。 该指令可在 http、server 或 location 上下文中配置,从而可以全局应用或更精确地针对特定位置应用。例如,在网站提供画廊图片时启用此指令特别有益,因为它允许用户在图像加载时先看到低分辨率版本,而无需长时间等待高分辨率图像完全渲染。需要注意的是,交错通常仅被某些图像格式(例如 PNG 和 JPEG)支持,并且并非对所有图像类型或场景都有益。在图像加载性能是关注点的环境中,可能需要测试两种场景以确定哪种提供最佳的用户体验。
配置示例
location /images/ {
image_filter on;
image_filter_interlace on;
}隔行扫描主要影响支持渐进加载的图像,例如 JPEG 和 PNG;其他格式可能不会受益。
某些浏览器可能无法以最佳方式呈现隔行扫描图像,具体取决于连接速度和其他因素。
说明
`image_filter_buffer` 指令配置在使用 NGINX 图像过滤模块处理图像时分配的内存量。该指令在处理大图像时至关重要,因为它能够实现高效的处理并避免可能导致性能下降的过度内存分配。缓冲区大小允许 NGINX Web 服务器在发送给客户端之前将图像数据临时保存在内存中,以便执行诸如缩放、裁剪或修改图像的操作。 此指令可以在 `http`、`server` 或 `location` 上下文中设置。指定时,它接受一个单一参数,表示缓冲区的大小(以字节为单位)。如果指定的大小不足以处理某个图像,NGINX 可能会返回错误或无法按预期处理图像。因此,必须根据所提供或处理图像的大小和类型适当设置缓冲区。 在实践中,该指令有助于在确保图像操作能够无缝执行的同时保持服务器资源的高效利用。在设置此值时,应考虑服务器的可用内存和预期流量,以在性能和内存使用之间取得平衡。
配置示例
location /images/ {
image_filter buffer 16k;
image_filter resize 200x200;
}使用过小的缓冲区在处理大型图像时可能导致错误。
缓冲区大小必须为二的幂,并且应与服务器的内存限制相对应。
说明
'index' 指令在 NGINX 中指定当用户请求目录时应返回的默认文件。该指令在以下情况下特别有用:当目录中不包含用户指定的 index 文件,或用户直接请求目录路径时。服务器会按列出的顺序查找指定的 index 文件,直到找到其中一个,或所有选项都被耗尽。这允许根据应用需求自定义默认行为。\n\n可以通过空格分隔来指定多个 index 文件,NGINX 会按给定顺序检查每个文件是否存在。如果没有找到任何指定的文件,NGINX 将根据配置设置返回 403 Forbidden 或 404 Not Found 错误。这种灵活性使得 'index' 指令成为 NGINX 无缝提供动态 Web 应用程序和静态内容能力的关键部分。
配置示例
location / {
index index.php index.html index.htm;
}确保指定的文件确实存在,否则在访问该目录时可能会发生错误。
请记住,如果未找到索引文件且已启用,可能会显示目录列表;请确认这是期望的行为。
当使用多个索引文件时,除非带引号,否则它们不应包含空格,因为空格是分隔符。
说明
'limit_conn_zone' 指令用于 HTTP 上下文中,定义一个内存区域,用于跟踪指定键(例如远程地址)的连接数量。它允许您为单个 IP 地址或任何其他参数设置并发连接数限制,帮助缓解因过多连接导致的滥用或资源耗尽。 该指令接受两个参数:第一个是键,通常使用诸如 '$binary_remote_addr'(引用客户端的远程地址)或 '$servername'(基于服务器名的限制)之类的变量。第二个参数定义共享内存区域的大小(例如 '10m' 表示 10 兆字节)。该内存区域用于存储指定客户端的连接计数,允许基于实时连接进行高效跟踪和限制。 与 'limit_conn' 指令结合使用时,管理员可以指定每个键允许的并发连接数,从而增强安全性和性能。所设置的内存限制确保此跟踪在不消耗过多资源的情况下有效。
配置示例
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 10;
}
}
}确保 zone 大小适合您的流量;过小可能导致错误的连接计数。
请记得在 server 或 location 块中定义 'limit_conn' 指令,以在设置 zone 后实际应用该限制。
说明
NGINX 中的 `limit_conn` 指令用于限制单个 IP 地址对特定 server 或 location 块发起的并发连接数。 这对于防止由于连接过多而导致的滥用或过载至关重要,这类情况会降低服务器性能。该指令接受两个参数:区域名称和每个 IP 地址允许的最大连接数。该指令与 `limit_conn_zone` 配合使用,后者定义用于跟踪来自 IP 地址的连接计数的共享内存区域。 当收到请求时,NGINX 会在定义的区域中将源 IP 的连接计数递增。如果连接计数超过指定限制,客户端将收到 503 服务不可用 错误。连接计数按 IP 地址管理,通常记录在内存中,从而可以高速检查连接限制,无需持久化存储。这有助于管理拥塞并确保服务器资源在用户之间公平分配。 要实现该指令,管理员必须在适当的上下文(http、server 或 location)中定义限制,并确保配置了相应的 `limit_conn_zone` 指令。根据预期流量在定义区域和设置限制之间取得平衡,是有效实施此指令的关键。
配置示例
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 1;
}
}
}确保在使用 `limit_conn` 之前定义 `limit_conn_zone` 指令,以避免配置错误。
对设置的限制要谨慎;过于严格的限制可能会阻止合法用户或流量。
考虑连接限制对应用行为的影响,尤其是对具有高用户交互的服务。
说明
`limit_conn_log_level` 指令用于定义当连接数超出由 `limit_conn` 指令指定的允许限制时的日志记录级别。这有助于调试和监控,因为管理员可以通过调整日志的详细程度来判断情况的严重性。 该指令接受一个表示日志级别的单一参数,该级别可以是预定义的 NGINX 日志级别之一,例如 `error`、`warn`、`info`、`notice` 等。根据所选级别,关于连接限制违规的记录信息量会有所不同,这对运营洞察和诊断很有帮助。 通过在不同上下文(例如 HTTP、server 或 location 块)中设置此指令,您可以对应用各个部分的连接限制问题的日志记录进行精细控制。这种有针对性的日志记录有助于在 Web 服务器架构的不同层面识别具体问题。
配置示例
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;
limit_conn_log_level warn;
# Other settings...
}确保您设置的日志级别适合当前环境,因为过于详细的级别可能会很快填满日志文件。
请注意,设置过低的日志级别可能会掩盖您在分析时可能需要的重要错误信息。
说明
NGINX 中的 `limit_conn_status` 指令指定当客户端请求超出在某一上下文 (http, server, or location) 配置的连接限制时返回给客户端的 HTTP 状态码。该指令允许管理员自定义响应行为,为可能不小心尝试建立超过 NGINX 配置允许的连接数的用户提供更有意义的提示。 当由 `limit_conn` 配置的限制被触发时,可以返回指定的状态码,而不是返回默认的 503 Service Unavailable 响应(该响应可能无法为用户提供有意义的反馈)。这可以更清晰地表明情况,帮助客户端应用处理错误。状态码必须是有效的 HTTP 码,通常应避免使用常见的成功或重定向状态码以免引起混淆。 要有效使用此指令,建议评估客户端应用在触发限制时的预期行为,因为除 503 之外的状态码可能改变客户端对容量问题的响应方式。例如,使用 429 Too Many Requests 状态可能更合适,表明用户因过度访问资源而被限速。该指令还可以与专门用于监控连接限制违规的日志结合使用。
配置示例
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;
limit_conn_status 429;
}确保状态码为有效的 HTTP 响应码,以避免出现意外行为。
在错误的上下文中使用该指令可能导致配置错误。
说明
`limit_conn_dry_run` 指令是一个功能,允许管理员在不实际拒绝连接的情况下测试其连接限制配置。设置后,服务器不会阻止超过定义限制的连接,但会记录那些在日志中本应被强制限制的实例。这对于在不影响用户体验的情况下调整和验证配置特别有用,允许管理员在完全应用限制之前收集有关限制可能影响的数据。 该指令可在 `http`、`server` 或 `location` 上下文中设置,并接受一个标志作为参数 (on/off)。启用后(设置为 'on'),NGINX 将模拟限制而不阻止超出的连接。需要注意的是,在该指令处于活动状态时,没有实际的连接会被拒绝,这可以在不造成中断的情况下清楚地反映出相对于限制的使用情况。 然而,管理员在生产环境测试时应对该指令保持谨慎,因为服务器仍会在日志中记录那些超过限制的情况,如果将该指令与强制执行的限制混淆,可能会导致观察结果出现误导。理想情况下,应在配置评估期间临时使用该指令。
配置示例
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
limit_conn addr 10;
limit_conn_dry_run on;
}
}在负载较高的生产环境中使用此指令可能导致误导性结论,因为它会记录超过限制的连接但不强制执行限制。
测试后务必禁用此指令以使实际限制生效。
说明
'limit_req_zone' 指令在 NGINX 配置的 http 上下文中使用,用于定义与请求速率限制机制关联的共享内存区。它接受三个参数:一个用于定义请求将被跟踪的上下文的 key(例如客户端 IP 地址或某个变量)、存放请求计数器的区域名以及该共享内存区的最大大小。\n\n正确配置后,NGINX 会基于所定义的 key 对进入的请求进行分组并随时间统计这些请求。例如,如果 key 是客户端的 IP 地址,NGINX 会跟踪每个 IP 发出的请求数量。这允许管理员防止滥用并限制对特定资源的过度使用。请求限制功能通过两个主要选项,burst 和 nodelay 来实现,可与 'limit_req' 指令一起指定以控制如何处理超额请求。\n\n所选参数必须反映部署需求,因为不同的应用可能需要更高或更低的速率限制,并可能受到用户同时请求突发的影响。因此,正确调整这些参数对于避免无意中限制合法用户同时有效缓解滥用至关重要。
配置示例
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
在定义区域时,确保正确指定键,以避免意外的限制行为。
避免使用过于严格的速率限制,这可能会阻止合法流量,尤其是在高流量环境中。
确保区域名称在配置中唯一,以防发生冲突。
说明
'limit_req' 指令用于在 NGINX 中限制客户端在指定时间内向服务器发起的请求数量。该指令属于 HTTP Core Module,可在多种上下文中使用,包括 http、server 和 location 块。此指令的主要目的是控制流量并防止客户端滥用(例如发送过多请求),以免影响服务器的性能和稳定性。 'limit_req' 指令接受一到三个参数: 1. **zone**(必需):存储请求速率限制配置的共享内存区域。 2. **burst**(可选):当短时超过限额时,允许处理一定数量的超额请求(无需延迟)。burst 值允许应对流量突增。 3. **nodelay**(可选):如果指定,超额请求在不超过 burst 限制时将立即被处理;否则将根据速率限制被延迟。 在使用 'limit_req' 之前,用户需要使用 'limit_req_zone' 指令定义一个共享内存区域。速率限制基于这些区域中定义的参数,这些参数决定在指定时间内来自特定键(例如 IP 地址)的请求数量。
配置示例
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
location /api {
limit_req zone=mylimit burst=5 nodelay;
}
}在使用 'limit_req' 之前,确保已使用 'limit_req_zone' 正确定义共享内存区域。
注意 'burst' 值,以免允许过多请求导致服务器过载。
如果未正确配置,使用 'nodelay' 可能导致流量出现剧烈峰值。
说明
`limit_req_log_level` 指令允许管理员指定记录请求限额违规事件的日志严重性级别。该指令可以在 `http`、`server` 或 `location` 上下文中定义,接受一个表示日志级别的单个参数。可用级别包括 `error`、`warn`、`info`、`debug` 等。默认情况下,如果未配置,NGINX 在请求限制日志中使用日志级别 `error`。\n\n当使用 `limit_req_zone` 指令定义的请求限制被超过时,NGINX 会根据指定的日志级别记录这些事件。这对于监控非常重要,允许您根据运行需求调整日志详细程度,或排查与流量限速相关的问题。在高流量环境中尤其有用,因为过多的日志可能会掩盖关键信息。该日志机制与 NGINX 的错误日志功能集成,您可以审查这些日志以识别模式并采取适当措施以优化请求处理。
配置示例
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req_log_level warn;
}将日志级别设置得非常高(例如 debug)会产生大量日志数据,可能会迅速占满磁盘空间。
如果未配置,默认的日志级别可能导致错过关于限流问题的重要信息。
说明
`limit_req_status` 指令属于 NGINX HTTP Core 模块,并与 `limit_req` 指令提供的速率限制功能配合使用。当客户端超过允许的请求速率时,针对被限流机制拒绝的请求会返回指定的 HTTP 状态码。这样可以使用自定义的信息,例如 503 Service Unavailable,来通知客户端请求被限速,而不仅仅是简单地未能处理其请求。 该指令接受单个参数:当请求超出限制时应在响应中发送的目标 HTTP 状态码。用户可以指定任何有效的 HTTP 状态码,以便根据其应用的需求灵活选择。常用的状态码包括 503(服务不可用)或 429(请求过多)。需要注意的是,该指令仅影响因限流而未被处理的请求,而不影响那些在限制范围内成功处理的请求。 作为配置指令,它可以在 `http`、`server` 或 `location` 上下文级别定义,从而可以根据应用的不同范围灵活地应用不同的状态码。开发人员应确保所指定的状态码在启用速率限制时与其应用的错误处理逻辑和用户期望相符。
配置示例
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one;
limit_req_status 503;
}
}使用无效的状态码可能导致客户端应用出现意外行为或错误。
如果未正确配置 `limit_req`,客户端可能无法接收到设置的状态,因为在没有启用实际限流的情况下,该指令无效。
说明
limit_req_dry_run 指令专为便于在 NGINX 中开发和测试限流配置而设计。启用时,它通过处理请求但不实际强制任何限制来模拟限流效果。这在管理员想要监控在超过速率限制时本可能被处理或拒绝的请求数量而不影响实时流量的情况下特别有用。 该指令接受一个二元参数——on 或 off。设置为 on 时,NGINX 会按照其他指令(例如 limit_req_zone)定义的规则执行限流检查,但不会基于这些限制拒绝请求。相反,日志会标明请求是否超限。这允许在全面部署前对限流参数进行微调并确保一切按预期工作。该指令具有上下文敏感性,可以在 NGINX 配置的 http、server 或 location 块中进行配置。 通过使用 limit_req_dry_run,管理员可以收集有关请求行为和模式的数据,这有助于在指令关闭后有效确定应应用的合适速率限制。然而,必须记住,启用模拟运行时,实际的预期限流不会生效,如果在开始强制执行后将限制设置得过高,可能会导致未被监控的流量激增。
配置示例
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one;
limit_req_dry_run on;
}
}
}在生产环境中未经仔细考虑就使用 limit_req_dry_run,可能会导致意外的大量流量通过且未被跟踪。
在最终部署之前,务必关闭 dry run 模式,以便强制执行限流并避免流量过载。
说明
'log_format' 指令在 'http' 上下文中使用,用于指定日志条目的格式。每个日志条目可以包含表示不同请求和服务器参数的变量,例如客户端 IP 地址、请求方法、响应状态等。默认情况下,日志条目以简单格式生成,但使用 'log_format' 指令可以进行自定义,以满足特定的日志记录需求。 该指令至少需要两个参数,包括日志格式的名称和指定日志输出布局的实际格式字符串。格式字符串可以包含各种变量(例如 $remote_addr 表示客户端 IP,$request_time 表示请求耗时)和静态文本。参数还可以包含条件值和特殊格式选项,以增强日志的详细程度。 此外,一旦定义了日志格式,就可以在 'access_log' 指令中引用该格式,'access_log' 控制日志的写入位置。在单个 NGINX 配置中可以定义多个日志格式,从而为各种日志场景提供灵活性。
配置示例
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; access_log /var/log/nginx/access.log main;
请确保在格式字符串中对任何特殊字符进行转义,以避免语法错误。
如果自定义格式包含诸如 $request_body 之类开销较大的变量,请注意其对性能的影响。
在相同的上下文中,日志格式应使用唯一的名称以避免冲突。使用相同的格式名称可能会导致意外结果。
说明
access_log 指令是 NGINX 服务器的重要组成部分,允许记录对服务器的所有请求。它可以配置为将日志消息写入文件,并可使用各种日志格式。该指令的主要参数包括日志文件路径以及可选参数,这些参数定义日志格式和日志级别。例如,在典型配置中,你可以使用 `access_log /var/log/nginx/access.log;` 来指定 NGINX 应将访问日志写入何处。
配置示例
http {
access_log /var/log/nginx/access.log;
}
server {
access_log /var/log/nginx/server_access.log main;
}确保要写入日志文件的目录存在,否则 NGINX 无法记录访问事件。
注意磁盘空间;如果不妥善管理,较大的访问日志可能会消耗大量服务器资源。
说明
`open_log_file_cache` 指令用于 http、server 和 location 上下文中,以提高访问日志文件的性能。通过缓存日志文件的文件描述符,它可以最小化文件访问开销,尤其是在并发写入日志时。该指令最多接受四个参数,可用于定义诸如缓存大小、超时以及允许的最大缓存条目数之类的设置。 参数按以下格式指定:`open_log_file_cache zone=name:size timeout=duration max=number;`。`zone` 参数为缓存使用的共享内存段定义名称和大小。`timeout` 参数决定在重新验证文件状态之前缓存有效的时长,而 `max` 参数限制可以缓存的文件项的最大数量。 正确配置后,使用此指令可以降低日志写入的延迟,尤其是在服务器负载高或大量并发写入操作时。但是,需要仔细考虑缓存大小和过期设置,以在性能与内存使用之间实现有效的平衡。
配置示例
http {
open_log_file_cache zone=logs_cache:10m timeout=30s max=1000;
}如果缓存大小过小,可能导致频繁的缓存未命中,从而抵消性能提升的好处。
如果超时值设置不正确,且日志文件描述符未能及时刷新,可能会导致日志条目变得过时。
说明
`map` 指令是 NGINX 中的一个强大功能,允许你定义一个变量,其值可以根据另一个变量的输入动态变化。该指令通过将输入值映射到输出值或设置,从而在配置块中实现条件逻辑。当你需要根据请求属性(例如 IP 地址、用户代理或其他请求属性)配置重定向、重写或设置头部等方面时,它尤其有用。 `map` 指令接受两个参数:第一个是将被计算的变量,第二个是一个块,用于定义可能的输入值及其对应的输出值。块中的每个条目可以指定一个具体的输入值以及应该赋给映射变量的结果值;这通过语法:`set $variable_name value;` 来完成。你还可以使用 'default' 提供一个默认值。如果没有任何指定的值匹配,则应用默认值。 这种灵活性使配置更清晰,并减少 NGINX 配置文件中其他位置条件指令的冗余。例如,通过使用 `map` 指令,你可以简化根据 IP 地址推导的用户国家代码设置头部的过程,从而消除对多个 if-else 构造的需求。
配置示例
map $http_user_agent $browser_type {
default unknown;
~*MSIE Internet Explorer;
~*Chrome Chrome;
~*Firefox Firefox;
};确保 'map' 指令在正确的上下文 (http) 中定义,以避免配置错误。
在使用 regex 模式时,请确保正确转义特殊字符,以防止出现意外行为。
请注意,如果未找到匹配项且未设置默认值,则 mapped variable 将为空。
说明
`map_hash_max_size` 指令用于设置存储 NGINX 映射中值的哈希表的最大大小。该指令与性能优化密切相关,允许对与基于哈希的查找操作相关的内存使用进行细粒度调整。哈希表结构可能会根据添加的条目数量而扩展,但如果超出指定的最大大小,可能会导致未定义的行为或在查找时性能下降。该指令中指定的值必须为正整数,直接对应哈希表的最大容量(以字节为单位)。 在配置 NGINX 服务器时,需要注意该指令的默认值可能会因 NGINX 的版本和系统环境的具体情况而异。谨慎设置此值可以在服务器规模增长和并发请求数量增加时(尤其在高负载下)改善请求处理能力。然而,设置过大也可能导致内存使用低效。为确保稳定性,管理员应监控内存使用情况与此处设置的最大值之间的关系,并在服务器扩展过程中相应地调整该值。
配置示例
http {
map_hash_max_size 1024;
}将最大大小设置得过低可能导致哈希表冲突并降低性能。
如果 `map_hash_max_size` 设置得过高,并且服务器不需要那么多空间,可能导致内存使用过多。
说明
`map_hash_bucket_size` 指令指定 NGINX map 结构中哈希桶的大小,这对于服务器配置中高效的键值映射至关重要。该指令有助于优化哈希表的构造方式,从而影响查找速度并减少可能的哈希冲突。当哈希桶大小相对于键的数量过小时,会导致冲突增多,从而降低性能。相反,设置过大则可能造成不必要的内存分配,因为每个桶都会占用内存,即使未被充分使用。 `map_hash_bucket_size` 的正确设置应考虑预期的键数量及其平均大小。合适的大小可以提升依赖映射的指令(例如 `map`)的性能,`map` 用于创建一个新变量,其值取决于已有变量的值。在 `http` 上下文中使用此指令,因为它在所有服务器配置中全局生效。哈希桶大小以字节为单位指定,从而在 NGINX 运行时实现对内存使用的精确控制。
配置示例
http {
map_hash_bucket_size 64;
}将桶大小设置得过小会因哈希冲突增多而导致性能下降。
将桶大小设置得过大可能导致内存使用过高,而不会带来性能提升。
该指令仅在 map 在配置中被使用时生效,也就是说,如果未使用 map 指令,则此设置无效。
说明
`memcached_pass` 指令允许 NGINX 服务器将对缓存数据的请求转发到指定的 memcached 服务器。在希望缓存页面或数据以加快访问并需要从 memcached 后端检索这些内容的场景中,此指令很有用。该指令接受单个参数,即 memcached 服务器的地址,可放在 location 块内或 location 中的 if 块内。
配置示例
location /cache {
memcached_pass 127.0.0.1:11211;
}确保 memcached 服务器正在运行,并且可以通过提供的地址访问。
不要在 `try_files` 块中使用 `memcached_pass`,因为它可能不会按预期工作。
配置错误可能导致 NGINX 无法与 memcached 服务器建立连接。
说明
'memcached_bind' 指令对于在 NGINX 中配置 memcached 服务器以监听特定的 IP 地址或接口至关重要。默认情况下,该指令绑定到通配地址 (0.0.0.0),允许来自任何入站地址的连接。但是,如果出于安全原因或为优化网络性能而希望限制访问,该指令可以指定一个或多个 memcached 要绑定到的地址。 该指令接受一个或两个参数。第一个参数是用于绑定的 IP 地址(或主机名),第二个参数是可选的端口说明。如果未提供端口,指令将使用标准 memcached 端口 11211。通过使用 'memcached_bind' 指令,管理员可以控制 memcached 服务器接受哪些套接字连接,从而提高安全性并确保请求来自受信任的客户端。 'memcached_bind' 指令的行为可在 http、server 或 location 上下文级别配置,使其在不同用例中具有灵活性。当提供多个地址时,NGINX 会监听所有指定的地址,从而为希望连接到 memcached 服务的客户端提供更广泛的可访问性。但是,需要注意的是,当服务不需要对外提供时,绑定到 localhost 地址 (127.0.0.1) 有助于防止未经授权的远程访问。
配置示例
memcached_bind 192.168.1.10 127.0.0.1;
指定 0.0.0.0 可能会使服务暴露于不希望的流量;在存在安全顾虑时,应优先绑定到特定的 IP。
如果未指定地址,且 NGINX 在受限网络环境中运行,服务可能会不可用。
说明
`memcached_socket_keepalive` 指令用于管理与 memcached 服务器连接的 TCP keepalive 设置。启用此指令后,NGINX 服务器会定期发送 keepalive 数据包,以确保与 memcached 服务器的空闲连接保持打开,防止因不活动而被关闭。这在 NGINX 处理大量请求且需要保持与 memcached 服务器的稳定连接以提升性能的场景中特别有用。该指令的使用具有上下文依赖性:可以在 `http`、`server` 或 `location` 级别设置,从而根据应用范围进行灵活配置。 该指令接受一个标志作为参数,可设置为 'on' 或 'off'。设置为 'on' 时会发送 keepalive 数据包,设置为 'off' 则禁用该功能。keepalive 的具体设置可能因底层操作系统的套接字选项而异,因此确保在客户端(NGINX)和服务器(memcached)两端都支持并正确配置 keepalive 十分重要,才能有效利用此功能。如果未设置,NGINX 将不会发送 keepalive 数据包,可能会导致在网络受限或长时间不活跃期间连接断开。
配置示例
http {
memcached_socket_keepalive on;
server {
location /cache {
memcached_pass 127.0.0.1:11211;
}
}
}启用 keepalive 可能会增加打开的连接数,如果不进行监控,可能耗尽系统资源。
并非所有版本的 memcached 都支持 TCP keepalive,使用前请确保兼容性。
操作系统上的 keepalive 配置可能需要调整以获得最佳性能。
说明
`memcached_connect_timeout` 指令指定 NGINX 在超时前为与 memcached 服务器建立成功连接所等待的最长时间(以毫秒为单位)。在对高性能和快速响应时间有严格要求的场景中这尤其重要,例如缓存频繁访问的数据以减少 Web 应用的加载时间。通过调整此超时,管理员可以在响应速度与应对较慢网络状况之间取得平衡。该指令接受一个表示超时时长的数值。 应根据 memcached 服务器的预期响应时间配置此超时,以防止在处理请求时出现不必要的延迟。如果连接经常超过该超时,则可能表明网络问题或 memcached 服务过载。在这种情况下,可能需要检查 memcached 后端的健康状况或考虑扩展。`memcached_connect_timeout` 可在 `http`、`server` 和 `location` 级别进行配置,从而根据具体应用需求灵活调整。
配置示例
memcached_connect_timeout 30s;
确保您指定的超时值与应用程序的性能需求相匹配。
超时时间过短可能导致应用程序出现频繁的连接失败和错误。
不要将此指令与 `memcached_read_timeout` 混淆,它们用于不同的目的。
说明
`memcached_send_timeout` 指令用于在 NGINX 配置中指定向 memcached 服务器发送请求的超时。它用于管理 NGINX 服务器在向 memcached 服务器发送数据时允许等待的最长期限,超过该时间后将关闭连接。此超时对于在网络问题或服务器无响应情况下避免无限等待至关重要,从而确保请求能够及时重试或终止。 \n\n该指令接受一个以秒为单位或以时间格式指定的单一参数,例如 `m` 表示分钟,`h` 表示小时等。当达到指定超时时间时,NGINX 将关闭与 memcached 服务器的连接。在响应时间可能波动的高负载场景下,这尤其有用,因为连接不应被不必要地保持打开,以免导致资源耗尽。 \n\n`memcached_send_timeout` 可在 `http`、`server` 或 `location` 上下文中使用,允许在服务器架构的不同层级进行灵活配置。设置合适的超时有助于维持依赖 memcached 缓存数据的应用程序的最佳性能和响应性。
配置示例
memcached_send_timeout 30s;
将此值设置得过低可能会导致在正常运行期间频繁发生过早超时,尤其是在高负载时。
请注意,此超时仅适用于发送请求;它不影响从 memcached 服务器接收响应。
说明
NGINX 中的 `memcached_buffer_size` 指令指定了用于存放从指定 memcached 服务器接收的响应的缓冲区大小。该缓冲区大小以字节为单位,对于优化性能非常重要,尤其是在处理大量数据或高流量时。通过优化缓冲区大小,用户可以确保响应能在分配的空间内正常存放,从而减少频繁的内存分配需求并提升数据检索过程中的性能。 当请求缓存数据时,memcached 的响应会先存放在该缓冲区,随后再进行处理并返回给客户端。如果响应超过了分配的缓冲区大小,可能会由于额外的处理和内存管理开销而导致性能下降或延迟增加。因而,设置合适的缓冲区大小可以提升吞吐量并降低响应时间。 该指令可在多个上下文中使用,包括 `http`、`server` 和 `location`,从而在 NGINX 配置层级的不同作用域中提供灵活的配置。妥善管理缓冲区大小在速度与效率至关重要的高负载环境中特别有用。
配置示例
memcached_buffer_size 32k;
将缓冲区大小设置得过小,在处理来自 memcached 服务器的大响应时可能导致性能问题。
相反,分配过大的缓冲区可能导致内存使用效率低下,尤其是当预期的响应大小始终较小时。
确保缓冲区大小与存储在 memcached 中数据的预期大小一致,以获得最佳性能。
说明
指令 `memcached_read_timeout` 设置 NGINX 等待从 memcached 服务器读取响应的最大时间(以秒为单位)。此超时对于确保应用在等待响应时不会无限期挂起至关重要。如果超过指定的超时,NGINX 将向客户端返回错误,从而更好地控制应用的响应时间和可用性。 该指令可以在 `http`、`server` 或 `location` 上下文中配置,根据希望应用超时设置的范围提供灵活性。指令中设置的值必须为以秒为单位的时间,实际定义了服务器在放弃接收响应前应等待的时长。适当的配置可以防止由于连接停滞而导致的过度资源消耗。 在调整此超时时,重要的是考虑 memcached 后端的预期响应时间。将超时设置得过低可能会在正常操作中导致频繁的读取超时,而设置得过高则可能因响应延迟而导致糟糕的用户体验。该指令允许根据应用的具体需求进行最佳性能调优。
配置示例
location /cache {
memcached_pass backend;
memcached_read_timeout 10s;
}将超时设置得太低可能导致频繁的读取失败,从而中断服务。
缺少或错误设置超时可能导致处理客户端请求时出现长时间延迟。
说明
`memcached_next_upstream` 指令是 NGINX 配置的重要组成部分,用于指定在 memcached 模块中在何种条件下将请求传递给下一个上游服务器。它用于 NGINX 被配置为缓存服务器并连接到一个或多个 memcached 服务器的场景。通过定义此指令,管理员可以指示 NGINX 在各种失败情况下重试或跳过特定请求,例如超时、连接被拒绝或其他运行时错误。 此指令接受一个或多个参数,用于描述在何类错误发生时继续尝试下一个上游服务器。例如,常见配置包括 `error`、`timeout` 和 `invalid_header` 等参数,它们指示 NGINX 无论失败性质如何都尝试下一个服务器。通过对这些行为进行细粒度控制,管理员可以优化缓存检索策略、提高服务可靠性,并优雅地处理上游服务器的瞬时故障。重要的是根据期望的故障处理行为来配置该指令,因为过多的重试可能导致延迟增加和资源消耗。 该指令可用于 `http`、`server` 和 `location` 环境,使其在各种配置架构中具有灵活性。本质上,对 `memcached_next_upstream` 的适当调优对于在高度依赖缓存机制的应用中实现性能与可靠性的平衡至关重要。
配置示例
location /memcached/ {
memcached_pass 127.0.0.1:11211;
memcached_next_upstream error timeout;
}确保适当地列出允许重试的条件;使用过多的条件可能导致性能问题。
注意所指定条件的顺序,因为它们会影响重试逻辑。
如果未设置任何条件,请求可能会在不尝试重试的情况下失败。
说明
NGINX 中的 `memcached_next_upstream_tries` 指令指定在与后端缓存通信时遇到某些定义的错误时将尝试的 memcached 服务器数量。该指令的主要目的是通过在当前服务器不可达或返回错误时允许 NGINX 尝试向其他 memcached 服务器发起请求,从而增强缓存访问的容错性。在具有多个 memcached 服务器以实现负载均衡和冗余的环境中,这一点尤其有用。 当对某个 memcached 服务器的请求因为连接问题或服务器错误而失败时,NGINX 会在其他 memcached 服务器上重试该请求,最多重试到本指令指定的次数。如果所有指定的尝试都失败,该请求最终将以错误返回给客户端应用程序。需要注意的是,该指令的有效运行依赖于在你的 memcached 配置中定义了多个 memcached 服务器,否则该指令不会产生任何影响。 该指令的参数是一个简单的整数值,表示重试次数。如果想禁用对备用服务器的尝试,可以将其设置为 `0`;要定义具体的重试次数,可设置为 `1` 或更高。过多的重试可能导致响应时间延长,而重试次数太少则可能在服务器对瞬时故障敏感时导致更频繁的失败。
配置示例
location /memcached {
memcached_pass 127.0.0.1:11211;
memcached_next_upstream_tries 3;
}将 retries 设置得过高可能导致响应时间延长,尤其在网络较慢或服务器繁忙的环境中。
如果未配置其他 memcached 服务器,则增加 retries 不会产生任何效果,因为没有可连接的备用服务器。
说明
memcached_next_upstream_timeout 指令用于 NGINX 中处理对 memcached 服务器的请求。它可以配置服务器在尝试重试对上游 memcached 服务器的失败请求之前将等待的时长。对于使用 memcached 做数据缓存的应用程序尤其有用,因为它有助于管理请求失败,并提供一种机制以避免因过快重试失败请求而使后端服务器过载。
配置示例
memcached_next_upstream_timeout 30s;
如果设置得过低,可能导致频繁的失败请求重试,从而增加 memcached 服务器的负载。
在未正确配置上游 memcached 服务器的情况下设置该指令,可能无法产生预期的结果。
说明
NGINX 中的 'memcached_gzip_flag' 指令在决定从 memcached 服务器检索到的响应在发送给客户端之前是否应该被压缩方面起着关键作用。该功能尤其有助于减少通过网络传输的数据大小,在响应较大时可能改善加载时间和性能。'memcached_gzip_flag' 指令接受一个参数,取值可以是 'on' 或 'off'。设置为 'on' 时表示 NGINX 应对来自 memcached 的响应进行 gzip 压缩,设置为 'off' 则禁用此行为。 在启用此指令的情况下,NGINX 在从已配置的 memcached 服务器获取数据时会根据其配置设置应用 gzip 压缩。需要注意的是,当响应被压缩后,请求这些响应的客户端可能需要以不同方式处理,例如确保相应的 Content-Encoding 头被正确设置。该指令放置在配置块(http、server 或 location)中的位置决定了其作用范围,从而为管理员在基于特定路由或过滤需求配置 gzip 压缩时提供灵活性。 gzip 压缩机制可以大幅减少带宽使用;然而,它确实会为压缩和解压缩过程引入额外的 CPU 开销。因此,仅在该功能能为整体应用性能带来可衡量的收益时才应谨慎启用。
配置示例
http {
memcached_gzip_flag on;
server {
location / {
memcached_pass 127.0.0.1:11211;
}
}
}为较小的响应启用 gzip 可能不会带来显著的好处,反而会增加不必要的 CPU 负载。
确保客户端支持 gzip 响应,以避免收到压缩不正确的内容。
说明
`mirror` 指令允许服务器向后端服务器发送原始请求的重复请求。这对于日志记录、性能监控或测试等用途很有用,同时不会影响原始用户体验。当此指令在 HTTP 上下文 (http, server, or location) 中使用时,它指定将处理镜像请求的上游服务器的 URL。 在实际使用中,当接收到请求时,NGINX 按常规处理该请求,然后并行地将该请求的精确副本发送到在 `mirror` 指令中定义的配置上游服务器。这意味着主请求的响应和镜像请求的响应可以独立运行。指定正确的上游服务器对于确保镜像请求按预期工作至关重要。 需要注意的一个重要方面是,`mirror` 指令不会等待镜像请求的响应;因此,上游服务器对镜像请求的任何反馈不会影响用户的原始请求。该特性会带来性能方面的考虑,因为镜像请求会有效地将流量加倍到指定的后端服务器。
配置示例
location /example {
mirror /backend;
}
location = /backend {
internal;
proxy_pass http://backend-server;
}镜像请求的目标必须正确指定;URL 不正确会导致镜像过程出现问题。
请注意,镜像请求不会影响原始响应;如果后端是有状态的,请谨慎。
说明
'mirror_request_body' 指令在 NGINX 配置中用于启用或禁用请求体的镜像。当设置为 'on' 时,它允许将当前请求接收的请求体作为新的镜像请求发送到由 'mirror' 指令定义的上游服务器。该功能在调试时尤其有用,或在需要在执行一些非侵入性操作时保留原始请求的场景下非常重要。镜像请求体会影响性能,因为它需要额外的内存用于缓冲,并且将请求体传输到上游服务器时会产生网络开销。
配置示例
location /api {
mirror_request_body on;
mirror /mirror_endpoint;
}确保镜像不会导致意外的请求处理或性能下降。
注意大型请求体,因为它们可能由于缓冲而导致内存使用增加。
如果管理不当,镜像的请求体可能会在处理原始请求时引入延迟。
说明
'mp4' 指令是 NGINX HTTP 模块中的一个配置选项,允许以快速启动功能提供 MP4 视频文件。当在 location 块中启用时,NGINX 会通过确保高效流式传输来为通过 HTTP 播放 MP4 文件做准备。这通过将必要的元数据放置在文件开头来实现,使视频在未完全下载完成之前就可以开始播放。该指令不接受任何参数,对于优先考虑流畅播放的媒体应用特别有用。 'mp4' 指令通过改变 NGINX 处理这些文件请求的方式来优化 MP4 文件的提供。一旦激活,NGINX 将对 MP4 格式文件的请求响应带有支持 Range 请求类型的头部,允许客户端请求文件的特定字节范围。此功能在减少视频播放期间的缓冲时间方面至关重要,从而改善用户体验。此外,它还允许在视频中寻址,使用户能够跳转到不同的时间戳,而无需事先加载整个视频。
配置示例
location /videos/ {
mp4;
root /var/www/html;
}确保 MP4 文件正确编码以避免播放问题。
仅使用 'mp4' 指令并不会配置缓冲或缓存的附加参数,而这些参数可能对于获得最佳性能是必要的。
请记得在服务器配置中为 MP4 文件设置正确的 MIME 类型。
说明
指令 `mp4_buffer_size` 定义了为通过 NGINX 流式传输时读取 MP4 视频文件而分配的内存缓冲区大小。该指令对于优化提供 MP4 内容的性能和响应性特别有用,尤其是在较慢的连接上。通过调整缓冲区大小,用户可以控制 NGINX 每次读入内存并发送给客户端的数据量,从而影响缓冲行为并可能改善流式传输性能。 `mp4_buffer_size` 的参数以字节为单位指定,其值应根据具体用例谨慎选择,因为过大的缓冲区可能会浪费内存,而过小则可能导致播放时延迟增加或卡顿。该指令可以在 `http`、`server` 或 `location` 上下文中使用,允许根据服务器架构和预期流量条件进行灵活配置。 为确保高效缓冲,建议将此值根据托管的 MP4 文件的平均大小以及客户端可用带宽来设置。在 NGINX 充当媒体服务器向最终用户流式传输 MP4 内容的场景中,此指令尤为重要,因此需要进行性能优化调整。
配置示例
location /video {
mp4_buffer_size 2m;
}将缓冲区大小设置得过小可能导致流媒体中断,尤其是在高流量期间。
如果设置得过大,可能导致不必要的内存消耗,从而影响服务器性能。
说明
`mp4_max_buffer_size` 指令指定 NGINX 在提供视频内容时用于缓冲 MP4 文件下载的最大大小(以字节为单位)。在提供大型 MP4 文件时,这一点尤其重要,以确保高效的缓存和流式传输性能。设置适当的缓冲区大小使 NGINX 能通过控制流式传输时的缓冲数据量来保持终端用户的平滑播放体验。 该指令可以在 `http`、`server` 或 `location` 上下文中设置,根据应用需求提供配置灵活性。如果指定的缓冲区大小过小,可能会导致播放过程中频繁缓冲,影响用户体验。相反,设置过大则可能导致内存消耗过高,尤其是在处理多个并发流时。该指令的值必须以字节为单位指定,语法为 `mp4_max_buffer_size size;`,其中 size 可以是表示字节的整数,或以 'k'、'm' 为后缀表示千字节或兆字节。根据服务器容量和预期流量测试不同大小的影响非常重要。
配置示例
http {
mp4_max_buffer_size 1m;
}
server {
location /videos {
mp4_max_buffer_size 2m;
}
}使用过小的大小可能会导致视频播放频繁缓冲。
设置过大可能会消耗更多内存,从而影响整体服务器性能。
请记得在预期的负载场景下测试不同的设置,以找到最佳大小。
说明
`mp4_start_key_frame` 指令是 NGINX HTTP MP4 模块的一部分,允许用户控制 MP4 文件中视频回放的起始点。当启用此指令时,NGINX 会在用户请求特定时间戳时,从视频流中最接近的前一个关键帧开始进行流式传输。该行为对需要无缝回放的流媒体应用尤为重要,因为它可以防止在非关键帧处开始播放,从而避免缓冲或回放问题。默认情况下此指令为关闭状态,这意味着播放可能从流中的任意位置开始,该位置不一定对应关键帧,可能影响性能和用户体验。
配置示例
mp4; mp4_start_key_frame on;
确保正在提供的 MP4 文件包含适当的 key frames,以实现无缝流式传输。
使用此指令可能会增加初始加载时间,如果 key-frame 离请求的 timestamp 较远。
说明
NGINX 中的 `proxy_pass` 指令用于将请求传递给代理服务器进行处理。它允许服务器将针对特定 URI 或 location 的流量重定向到另一台服务器,该服务器可以是配置中定义的上游服务器 或通过地址指定的外部服务器。 配置后,如果客户端发起的请求匹配包含 `proxy_pass` 指令的 location 块,NGINX 将向上游服务器发起请求。它通过获取原始请求并将其转发到指令中定义的服务器 URI 来完成此操作。`proxy_pass` 指令中提供的 URL 可以指定为协议和主机(例如 `http://example.com`)或完整的 URL。还可以提供选项来管理在代理过程中如何处理请求头和请求体。 `proxy_pass` 指令可以通过在多台服务器之间分配流量来显著提升 Web 应用的性能,从而实现负载均衡和容错。不过,必须正确配置附加指令(例如 `proxy_set_header`)以维护请求头的完整性,并启用诸如 WebSocket 支持和 HTTP/2 隧道等功能。
配置示例
location /api/ {
proxy_pass http://backend_server;
}确保上游服务器可达,因为连接失败会导致 502 Bad Gateway 错误。
如果 URL 未以 / 结尾,可能会意外附加所请求的 URI;因此需要谨慎管理路径。
缓存和头部转发配置错误可能导致客户端出现意外行为。
说明
`proxy_redirect` 指令用于 NGINX,调整来自被代理服务器的与重定向相关的 HTTP 头。当请求被代理时,响应可能包含通知客户端重定向目标的 `Location` 或 `Refresh` 头。然而,这些头可能仍然指向原始的上游服务器而不是面向客户端的 NGINX 服务器。这时 `proxy_redirect` 指令就派上用场了。它接受一个或两个参数:第一个指定需要被修改的 URL(上游服务器的 URL),第二个是可选的,指定应发送回客户端的新 URL。\n\n例如,如果被代理服务器发送了一个 `Location` 头,指向 `http://upstream-server/uri`,并且你设置了 `proxy_redirect http://upstream-server/ http://client-server/;`,NGINX 将把 `Location` 头修改为 `http://client-server/uri`。这确保客户端收到的重定向指向 NGINX 而不是被代理服务器。可以指定多个 `proxy_redirect` 指令,这允许在不同上游服务器需要不同重写的复杂路由场景中使用,从而在各种环境中提供高度的灵活性。
配置示例
location /api {
proxy_pass http://upstream-server;
proxy_redirect http://upstream-server/ http://localhost:8080/;
}注意尾随斜杠;它们会影响重定向 URL 的构建。
`proxy_redirect` 指令必须在适当的上下文中使用 (http, server, location); 在错误的上下文中使用会导致错误。
说明
`proxy_cookie_domain` 指令在 NGINX 担任反向代理时使用,专门用于修改由 upstream 服务器设置的 cookie 的 Domain 属性。该指令允许你指定一个新的域,当 cookie 被发送回客户端时这些 cookie 应该对该域可用。它接受一个或两个参数:第一个是 cookie 被设置时的原始域,第二个可选参数是要重写为的域。如果只指定一个参数,则用服务器的域替换该域;当 upstream 和 NGINX 位于相同域名下时,这很有用,可确保 cookie 能按预期被访问。
配置示例
location / {
proxy_pass http://backend;
proxy_cookie_domain example.com my-website.com;
}确保新域名设置正确;否则,cookies 可能无法正确发送回客户端。
如果只提供原始域名,NGINX 将默认使用服务器的域名,因此请确保它与您的要求一致。
说明
'proxy_cookie_path' 指令用于 NGINX 配置中,当响应被代理到后端服务器时使用。其主要功能是调整来自被代理服务器的 Set-Cookie 头中的 'Path' 属性。这样可以确保 Cookie 仅在特定路径下发送到期望的 URL,从而在被代理服务器的 cookie 路径与 NGINX 服务器的 URL 结构不一致的情况下提高安全性和功能性。 该指令可以接受一个或两个参数。第一个参数是原始的 cookie 路径,通常可在响应的 Set-Cookie 头中找到。第二个参数是应该替换原始路径的新路径。如果只提供一个参数,则表示所有具有该原始路径的 cookie 都应替换为新的默认路径。当同时指定两个参数时,只有与原始路径完全匹配的 cookie 会受到影响。该指令可在多个上下文中生效,包括 'http'、'server' 和 'location',使其在不同配置作用域中具有灵活性。 'proxy_cookie_path' 指令的行为还支持为不同路径使用多条指令,允许对特定路径进行多次声明并具有自定义行为,从而对来自后端服务器的 cookie 如何在前端 NGINX 服务器的 URL 路径下被处理提供细粒度控制。
配置示例
location /api {
proxy_pass http://backend;
proxy_cookie_path /myapp /;
}确保原始路径与要修改的 headers 的 Path 属性匹配。
使用不正确的路径可能导致 cookies 无法发送到浏览器,从而影响用户会话。
过度使用此 directive 可能导致混淆,尤其是在不同路径被不当修改时。
说明
NGINX 中的 `proxy_cookie_flags` 指令允许用户为从代理服务器设置在 HTTP 响应中的 cookie 指定标志。该指令可用于 `http`、`server` 或 `location` 上下文,并接受一到四个参数,分别对应应应用于 cookie 的具体标志。可用的标志通常包括 `Secure`、`HttpOnly` 和 `SameSite` 等选项,这些选项控制 cookie 在安全性和跨站请求方面的行为。 在配置中包含 `proxy_cookie_flags` 指令时,可以使 cookie 以更安全的方式传输。例如,设置 `Secure` 标志可确保 cookie 仅通过 HTTPS 连接发送,而 `HttpOnly` 标志可阻止 JavaScript 访问这些 cookie,从而增强对某些类型攻击的防护。参数以空格分隔的列表形式使用,NGINX 会根据指定顺序评估这些标志。用户应谨慎选择与其应用和所支持浏览器兼容的标志,因为配置不当可能导致可用性问题。 要实现 `proxy_cookie_flags` 指令,可以在配置中直接指定这些标志,并根据需要为不同的 location 或 server 进行调整。需要注意的是,虽然该指令可以解决部分安全问题,但它不会强制执行浏览器的默认设置,因此开发人员应始终结合应用需求和浏览器文档,确保对 cookie 的有效管理。
配置示例
location /api {
proxy_pass http://backend;
proxy_cookie_flags HttpOnly;
}Flags 必须与被代理的应用兼容;否则,cookies 可能无法按预期工作。
配置错误可能导致 cookies 在未正确使用 `Secure` 标志时通过 HTTP 以不安全的方式发送。
flags 的顺序很重要;请确保按预期的 cookies 行为指定每个 flag。
说明
`proxy_store` 指令在 `http`、`server` 或 `location` 块中使用,用于将来自代理服务器的响应存储到本地文件系统。当设置为 `on` 时,NGINX 会根据配置的 URI 将被代理请求的响应保存到指定的本地文件或目录中。 该指令需要一个参数,指定用于存放文件的目录路径。如果该目录不存在,NGINX 不会创建它,且在发起请求时会返回 404 错误。因此必须确保对指定目录具有写入权限。此外,该指令可以与其他设置(例如 `proxy_pass`)结合使用,在将请求路由到后端服务的同时,将响应保存到文件以便日后检索。 在使用 `proxy_store` 时,还需考虑目录结构管理和响应缓存的相关影响。如果不应用适当的哈希或自定义 URI 处理配置,响应将以扁平结构存储。因此,应谨慎设计 URI 的结构,以防止文件被覆盖并确保访问模式清晰。
配置示例
location /downloads {
proxy_pass http://backend;
proxy_store on;
proxy_store_path /var/www/stored_files;
}确保指定的存储路径存在并具有正确的权限。
如果多个请求映射到相同的 URI,响应会相互覆盖,除非正确处理。
请记住,`proxy_store` 无法很好地处理动态数据,因为它直接基于 URI 存储响应。
说明
`proxy_store_access` 指令在配置 NGINX 的代理功能时非常重要,尤其是在缓存或存储来自上游服务器的响应时。该指令可以指定适用于已存储文件的访问控制设置,这些设置可以包括用户、组和其他实体的权限。通过仅允许特定用户访问缓存的内容,可以确保一个精细且受控的环境,这对于安全性和运行效率至关重要。 您可以使用一到三个参数来定义访问设置:第一个用于用户权限,第二个用于组权限,第三个用于其他用户。每个参数接受一个指示权限级别的字符串,影响 NGINX 如何强制执行对已存储内容的访问。这样,如果通过 `proxy_store` 保存了文件,其可访问性就可以由 `proxy_store_access` 设置来决定,从而防止对重要或敏感文件的未授权访问。 该指令可以放在 `http`、`server` 或 `location` 上下文中,使其在配置文件中具有很强的灵活性。它不仅仅是控制存储后的访问,还涉及如何在代理响应中共享资源,最终影响服务器运行的完整性和安全性。
配置示例
location /download {
proxy_pass http://backend;
proxy_store on;
proxy_store_access user:group:r;
}确保设置正确的权限,以避免无意中暴露敏感数据。
如果访问控制与文件系统权限冲突,可能会出现不一致的行为。
记得在更改配置后重启 NGINX 以应用新设置。
说明
`proxy_buffering` 指令在 NGINX 中控制是否在将来自被代理服务器的响应发送给客户端之前对其进行缓冲。当设置为 'on' 时,NGINX 会缓冲来自被代理服务器的整个响应,这可以通过让 NGINX 以一次优化的网络操作将响应发送给客户端来改善性能。对于大型响应尤其有益,因为连接开销会显著影响性能。相反,将 `proxy_buffering` 设置为 'off' 则允许 NGINX 在接收响应的同时将其传输给客户端,这在需要直接流式传输数据或有低延迟需求(例如实时应用)时很有用。 该指令可以应用于诸如 http、server 和 location 等不同上下文,允许你根据具体性能需求灵活地对应用的不同部分使用缓冲。如果你有多个后端并且需要对每个后端使用不同的缓冲配置,可以分别调整 `proxy_buffering` 设置以适应这些场景。请注意,当启用缓冲时,NGINX 还会使用其他与代理相关的指令(例如 `proxy_buffers` 和 `proxy_buffer_size`)中定义的设置来管理在发送给客户端之前需要缓冲的数据量。
配置示例
location /api {
proxy_pass http://backend;
proxy_buffering off;
}禁用缓冲可能导致内存使用增加,尤其是在响应较大且发送缓慢的情况下。
当 proxy_buffering 被关闭时,客户端可能会在整个响应完全可用之前收到部分响应。
说明
NGINX 中的 `proxy_request_buffering` 指令决定了代理请求的请求主体如何处理,具体来说是是否在发送到上游服务器之前进行缓冲。默认情况下,当启用 `proxy_request_buffering`(通常是启用状态)时,NGINX 会在将请求转发到上游服务器之前将整个请求主体读取到内存或临时文件中,取决于其大小。这使得 NGINX 能更有效地处理某些场景,例如在代理之前根据配置重写头部或修改请求数据。 当设置为 `off` 时,请求主体缓冲被禁用,这意味着数据会在从客户端接收时按流传递给上游服务器。这在处理大文件或流式传输的场景中很有用,在这些情况下缓冲是不高效或不切实际的。然而,如果处理不当,可能会增加加载时间,并使错误处理复杂化,因为上游服务器在完全接收客户端的数据之前可能无法获得完整的请求数据。此外,在高负载下禁用缓冲可能导致资源受限,因为请求主体将作为持续流处理,而不是像启用缓冲时那样作为整个块。
配置示例
location /upload {
proxy_pass http://backend;
proxy_request_buffering off;
}如果禁用缓冲,请确保上游服务器能够处理流式请求。
请注意,禁用请求缓冲可能会使错误处理变得复杂,并在高负载下影响性能。
说明
`proxy_ignore_client_abort` 指令控制在客户端在服务器完成处理请求之前断开连接时 NGINX 如何处理这类情形。当设置为 'on' 时,NGINX 会继续处理该请求,仿佛客户端仍然保持连接,这可能使服务器端处理得以不被中断地完成。在服务器上有长时间运行操作且不希望因客户端操作而被过早终止的环境中,这会很有用。相反,将其设置为 'off' 则指示 NGINX 在客户端断开时停止处理该请求,这可以节省服务器资源并避免在客户端无法接收响应时进行不必要的处理。 此指令可以应用于 `http`、`server` 和 `location` 上下文,从而在配置层级的不同级别上灵活地影响请求处理。其行为由其参数决定,该参数可以是一个标志 —— 通常为 'on' 或 'off'。用户应注意该设置如何影响资源使用,尤其是在高负载场景中,大量处理可能会分配给未完成的请求。
配置示例
server {
listen 80;
location /long-processing {
proxy_pass http://backend;
proxy_ignore_client_abort on;
}
}如果许多客户端断开连接,将此指令设置为 'on' 可能导致服务器资源浪费。
请务必评估在高负载环境中让长时间运行的进程继续运行的影响。
说明
`proxy_bind` 指令在 NGINX 中用于指定在与被代理服务器建立外发连接时应该使用哪个本地 IP 地址。在一个接口被分配多个 IP 地址的环境中,这尤其有用,管理员可以控制 NGINX 发起外部请求时使用哪个 IP。该指令接受一个或两个参数:第一个参数是要绑定的本地 IP 地址,可选的第二个参数可指定要使用的端口。如果提供了第二个参数,NGINX 在连接上游服务器时将绑定到该特定端口。 当使用 `proxy_bind` 时,提供的 IP 地址会被设置到 `SO_BINDTODEVICE` 套接字选项中,从而影响外发数据包的路由。这可确保由 NGINX 发起到被代理主机的连接看起来来自指定的 IP 地址,而不是默认地址。必须确保该 IP 地址已分配到服务器的某个网络接口,否则连接尝试可能失败。此外,应注意使用错误的 IP 地址可能导致路由问题,特别是在存在多个网络接口的多宿主环境中。 总之,`proxy_bind` 是面向需要对服务器网络行为进行精细控制的用户的高级指令,尤其适用于复杂网络设置或与要求流量来自特定 IP 地址的外部服务集成的场景。
配置示例
location / {
proxy_pass http://backend;
proxy_bind 192.168.1.100;
}确保在 NGINX 服务器上配置了指定的 IP 地址。
如果使用端口,请确保该端口未被其他服务占用,以防出现绑定错误。
如果在没有适当流量监控的情况下使用 `proxy_bind`,可能会导致对流量路由的预期不一致。
说明
`proxy_socket_keepalive` 指令控制在 NGINX 中是否应为与代理服务器的连接启用 keepalive。当设置为 `on` 时,NGINX 会与 upstream 建立并保持持久连接以供重用,这可以显著减少为客户端后续请求建立新连接所带来的延迟。这对于访问 upstream 流量较高的环境尤其有益,因为它可以帮助降低资源使用并改善响应时间。 该指令可在 `http`、`server` 或 `location` 上下文中指定,允许根据希望的 keepalive 连接作用范围进行灵活配置。默认情况下,该指令为 `off`,这意味着除非显式启用,否则 NGINX 不会使用 keepalive 连接。启用 keepalive 还可以与如 `proxy_pass` 的其他指令协同工作,实现无缝集成而无需大量配置变更。 在使用 `proxy_socket_keepalive` 时,还应考虑 upstream 服务器端的设置,因为如果 upstream 不支持 keepalive 连接或其超时时间短于 NGINX,可能无法获得预期的性能提升。
配置示例
http {
server {
location / {
proxy_pass http://backend;
proxy_socket_keepalive on;
}
}
}确保上游服务器已配置为支持 keepalive 连接。
如果处理不当,过度设置 keepalive 可能导致服务器端资源耗尽。
说明
`proxy_connect_timeout` 指令指定从 NGINX 服务器到被代理服务器建立成功连接的时间上限。对于被代理服务器可能处于高负载或无响应的场景,这一点尤其有用。如果在指定的超时时间内无法建立连接,NGINX 将向客户端返回错误,从而有效避免客户端无限期挂起。 该指令可以在不同的上下文中定义,例如 `http`、`server` 和 `location`,从而在不同配置范围内对超时设置进行细粒度控制。设置此超时有助于改进故障切换处理并协助有效管理资源分配,确保 NGINX 不会在无响应的上游端点上浪费时间。超时值通常以时间单位格式指定(例如 `10s`、`1m`)。
配置示例
http {
proxy_connect_timeout 30s;
server {
location / {
proxy_pass http://backend;
}
}
}该超时仅适用于连接建立阶段,并不影响连接建立后数据传输所需的时间。
将超时设置得非常低可能导致过早断开连接,尤其是在上游服务器响应缓慢时。
说明
`proxy_send_timeout` 指令指定 NGINX 尝试将请求发送到代理服务器的时间段。该超时用于控制 NGINX 在超时前等待服务器接受请求的最长时间。如果超时被超过,NGINX 将关闭连接并记录错误。该值可以用多种格式指定,例如以秒为单位或带有时间后缀(例如 '30s' 表示 30 秒)。 该指令必须在三种上下文之一设置:`http`、`server` 或 `location`。它根据应用的需求,对针对代理请求的超时设置提供细粒度控制。对于响应时间可变的应用或处理高延迟网络时,可能需要调整此超时。如果将请求发送到代理服务器花费的时间过长并达到 `proxy_send_timeout` 阈值,NGINX 将记录错误并向客户端返回 502 Bad Gateway 响应。 `proxy_send_timeout` 的值应与被代理应用的预期行为相匹配。应根据应用的性能特征和预期负载来设置。如果设置过低,可能会导致合法请求失败;而设置过高可能会引起资源争用并影响服务器的响应能力。
配置示例
location /api {
proxy_pass http://backend;
proxy_send_timeout 30s;
}将超时时间设置得过低可能导致连接过早关闭并增加错误率。
未配置此指令可能导致使用默认超时,而这些默认超时可能与应用程序的需求不一致。
说明
'proxy_send_lowat' 指令用于 NGINX HTTP 服务器,用来配置代理模块发送缓冲区的低水位阈值,单位为 bytes。当发送缓冲区低于该指定阈值时,NGINX 工作进程会提高向客户端的数据传输速率,以避免网络连接未被充分利用。这有助于提高网络吞吐量,尤其是在流式传输数据和将请求代理到 upstream servers 的场景中。 该指令的参数必须以整数形式提供,表示在 NGINX 进程再次从缓冲区发送数据之前,发送缓冲区中应保留的最小 bytes 数量。为高延迟链路设置合适的值可以增强性能,因为它确保总有足够的数据准备好发送,从而保持连接的繁忙状态。相反,将该值设置得过低可能导致带宽利用率低下,因为 NGINX 可能会不断暂停以检查缓冲区状态,从而对性能产生负面影响。 该指令可在 'http'、'server' 或 'location' 区块的上下文中使用,使管理员能够在服务器架构的不同层级灵活配置行为。对该值进行适当调优可以显著改善响应时间,并在负载变化的应用场景中,特别是在代理设置下,优化资源使用。
配置示例
http {
proxy_send_lowat 16384;
}如果设置得过低,可能会导致非常频繁的发送操作,从而降低性能。
误解缓冲区上下文可能导致带宽未被充分利用,尤其在配置不当时。
说明
`proxy_intercept_errors` 指令在 NGINX 中允许用户指定服务器是否应该处理来自被代理服务器的错误响应。当该指令被设置为 `on` 时,NGINX 会拦截表示错误的 HTTP 响应(例如 404、500 等),并根据配置的错误处理设置进行处理。相反,如果将该指令设置为 `off`,从被代理服务器收到的任何错误响应将直接传递给客户端,不会被 NGINX 修改或处理。这对于实现自定义错误页面或根据特定错误重定向客户端很有用。 该指令可以在 `http`、`server` 或 `location` 上下文中设置,使其在各种配置场景中都很灵活。需要注意的是,将此指令设置为 `on` 可能会导致与预期不同的行为,因为客户端将看不到被代理服务器的原始响应,除非你专门配置了错误处理。根据你的应用架构以及你希望如何向用户呈现错误,正确设置此指令可能非常重要。
配置示例
location /api {
proxy_pass http://backend;
proxy_intercept_errors on;
error_page 404 /custom_404.html;
}如果已将 `proxy_intercept_errors` 设置为 `on`,请确保已定义自定义错误页面,以避免提供默认错误页面。
启用时,请确保您应用程序的错误处理策略与 NGINX 处理错误的方式一致。
说明
`proxy_set_header` 指令在 NGINX 中用于在代理上下文中更改或定义从 NGINX 服务器发送到上游服务器的头部。这对于传递额外信息(例如原始客户端信息)或在将请求转发到被代理的后端之前修改已有头部尤其有用。 该指令接受两个参数:要设置或修改的头部名称和要赋予该头部的值。您可以使用 NGINX 提供的变量,从而允许根据请求上下文生成动态的头部值。例如,您可能希望将 `X-Real-IP` 头设置为客户端的 IP 地址。您也可以根据需要覆盖现有头部的值。需要注意的是,如果同一个头名被设置多次,则以最后一次设置的值为准。 该指令可在多种上下文中使用,包括 `http`、`server` 和 `location` 块,为在服务器配置的不同部分如何处理头部提供灵活性。正确配置头部对于后端应用的正常运行至关重要,因为它们通常依赖 HTTP 头来进行路由、认证以及其他请求管理任务。
配置示例
location /api {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}使用 `proxy_set_header` 设置的头是累积的;如果一个头被定义多次,将使用最后定义的值。
确保在正确的上下文中(http、server 或 location)定义该指令,以避免配置错误。
在可能的动态场景中,使用简单值而非变量(例如固定字符串)可能不会得到预期结果。
说明
`proxy_headers_hash_max_size` 指令在 NGINX HTTP 服务器中用于在使用 `proxy_set_header` 指令时设置用于存储 HTTP 头键的哈希表的最大大小。这在 NGINX 作为反向代理运行时尤为重要,因为它有助于将入站头映射到相应的后端服务器头。 该指令的参数是一个数字,用于确定可创建的哈希条目数量。在可能设置或修改大量不同头的场景中,增大此值可以帮助防止哈希表冲突并提高性能。必须在两者之间取得平衡——将此值设置得过高会导致内存消耗增加,而设置得过低则可能导致哈希冲突,从而在检索头时引发问题。 该指令可在 `http`、`server` 和 `location` 上下文中使用,允许在 NGINX 层级的不同级别进行灵活配置。正确配置后,它可增强 NGINX 在管理代理头方面的能力,特别是在存在大量不同头类型且负载较高的情况下。
配置示例
proxy_headers_hash_max_size 1024;
将 `proxy_headers_hash_max_size` 设置得过低可能导致由于哈希冲突而造成性能下降。
增大该值可能会导致更高的内存使用,因此在扩展之前请考虑服务器的可用资源。
说明
`proxy_headers_hash_bucket_size` 指令指定在 NGINX 服务器中用于分配代理头的哈希桶大小。该指令的主要目的是优化维护这些头部的哈希表的性能和内存使用,尤其是在涉及大量代理头的场景中。较大的桶大小可以帮助防止冲突,从而在访问这些头部时提高查找速度。
配置示例
http {
proxy_headers_hash_bucket_size 64;
}将该值设置得过低可能导致因哈希冲突而出现性能问题。
过大的值可能会浪费内存,尤其是在头部数量有限的配置中。
说明
指令 `proxy_set_body` 用于更改传递给上游服务器的请求体。通常,当 NGINX 代理请求时,它会原样转发客户端的请求体。但是,在某些情况下你可能需要更改该请求体,例如在实现反向代理时,需要在将数据发送到下游之前转换请求数据。 你可以将要作为请求体内容的文本作为该指令的参数指定,该内容可以包含任意文本或数据并替换原始请求体。该指令可以放在多个上下文中,包括 `http`、`server` 和 `location`,从而允许在不同层级灵活地修改请求。当使用该指令设置了新的请求体时,它会覆盖原始请求体,并作为请求负载发送到上游服务器。 请记住,应确保新请求体内容与请求类型兼容。例如,如果上游服务器期望接收 JSON 负载,那么通过 `proxy_set_body` 设置的请求体应为有效的 JSON 字符串,以避免错误或意外行为。
配置示例
location /api {
proxy_pass http://backend;
proxy_set_body '{"key":"value"}';
}将请求体设为空可能导致被代理的服务器收到空的请求体。
确保请求体格式与上游服务器期望的一致,否则它可能会拒绝该请求。
说明
`proxy_method` 指令在 NGINX 中允许管理员指定代理在将客户端请求转发到被代理服务器时使用的 HTTP 方法。默认情况下,NGINX 使用与原始客户端请求相同的方法(例如,GET、POST)。然而,`proxy_method` 允许通过显式设置为某个方法来自定义这一行为,这对于满足特定应用需求或行为常常很有用。 此指令的使用取决于其定义的上下文:http、server 或 location。例如,在一个 location 块中,它可以指定如何处理与该 location 匹配的请求。该指令接收一个参数,表示期望的 HTTP 方法。因此,必须确保被代理服务器支持所指定的方法,以避免出现意外行为。 当请求被代理时,此指令将覆盖默认行为,并在该请求上强制使用指定的 HTTP 方法。在某些场景中,这一点尤为关键,例如某些操作(如 RESTful 交互)需要特定的方法,而客户端可能最初并未使用该方法,或者当请求必须符合由后端应用确定的某些路由规则或实践时。
配置示例
location /api {
proxy_pass http://backend;
proxy_method POST;
}指定不受支持的 HTTP 方法可能会导致被代理服务器出现错误。
如果没有能响应所指定方法的后端服务器,请求可能会返回 404 错误。
在某些情况下,客户端可能不期望方法被更改,从而导致与 API 交互的混淆。
说明
`proxy_pass_request_headers` 指令用于指定是否应将原始请求的入站头转发到被代理的服务器。此指令可以设置为 `on` 或 `off`。启用时,NGINX 从客户端接收到的所有头都会包含在发送到被代理的 upstream 服务器的请求中。这在需要保留客户端信息(例如认证令牌或 upstream 应用所需的自定义头)以确保其正常运行时尤其有用。 在实际场景中,它确保诸如 `User-Agent`、`Referer` 以及任何自定义头等字段被包含,这对于维持依赖这些值的应用行为可能至关重要。如果设置为 `off`,这些头将不会被传递,这可能导致依赖这些头的应用逻辑出现意外行为。该指令可在多个上下文中应用:http、server 和 location 块,从而根据不同的处理需求或上下文提供配置灵活性。 需要注意的是,尽管该指令允许对请求处理进行细粒度调整,但应小心避免将敏感信息传递给外部服务器,因为在某些配置下这可能会暴露用户数据或危及安全。
配置示例
location /api {
proxy_pass http://backend;
proxy_pass_request_headers off;
}请确保敏感标头不会无意中发送到被代理的服务器,尤其是在配置为 `on` 时。
该指令的行为会被在其设置之后显式清除或修改标头的指令所覆盖。
说明
`proxy_pass_request_body` 指令是一个布尔标志,用于 NGINX 配置中的 http、server 和 location 块。当该指令设置为 "on" 时,NGINX 在转发请求时会将请求体发送到被代理服务器。对于处理 POST 请求或包含请求体的任何请求(例如数据上传)这尤其重要。如果指令设置为 "off",请求体将不会发送到上游服务器,这可能会在应用依赖接收请求体时导致意外行为。 该指令允许在代理场景中微调请求处理,为不同后端应用提供优化。若未配置此指令,默认值为 "on",也就是说默认会转发请求体,除非被显式配置为其他值。对于期望在代理环境中处理数据的应用,这一点可能至关重要。 配置该指令很简单,除了用于启用或禁用该行为的标志外不需要额外参数。总体而言,它有助于控制请求数据的流向,对于依赖 NGINX 作为反向代理的 Web 应用的正常运行非常重要。
配置示例
location /api {
proxy_pass http://backend;
proxy_pass_request_body off;
}对于 POST 请求,如果后端需要请求体,请确保已将 `proxy_pass_request_body` 设置为 `on`。
将此指令设置为 `off` 可能导致被代理的服务器上的数据处理不完整。
在错误的上下文中使用(例如在 server block 内)会导致配置错误。
说明
`proxy_pass_trailers` 指令用于 NGINX 配置中,用以决定是否应将 HTTP 尾部字段(即在 HTTP 响应主体之后发送的附加首部)从上游服务器转发给客户端。默认情况下,尾部字段可能未启用,意味着它们不会在响应中被转发,这会影响那些需要尾部字段才能正确处理的客户端场景。 当该指令设置为 `on` 时,表示 NGINX 服务器应允许收集上游响应中的尾部字段并将其返回给客户端。这在尾部信息包含重要元数据或需要在接收响应主体后处理的响应详情的应用中尤为相关。该指令在 `http`、`server` 和 `location` 上下文中生效,便于在不同配置范围内灵活使用。 在性能方面,启用尾部字段处理可能会带来轻微开销,因此通常建议仅在绝对必要时启用。每个尾部字段在主体内容之后被添加到响应中,并且必须遵守 HTTP 标准,以确保与期望此类响应结构的客户端兼容。
配置示例
http {
server {
location /api {
proxy_pass http://backend;
proxy_pass_trailers on;
}
}
}确保后端服务器确实发送 trailers;否则,启用此指令不会产生效果。
注意不支持 trailers 的客户端,因为这可能导致兼容性问题。
说明
NGINX 中的 `proxy_buffer_size` 指令允许您定义用于保存从被代理服务器接收的响应第一部分的缓冲区大小。该指令在处理动态响应时尤为重要,例如由脚本(PHP、Python 等)生成的响应,因为它设置了在开始处理之前可以存储在缓冲区中的响应头的最大大小。如果响应大于指定大小,NGINX 将分配更多缓冲区,这可能会根据这些缓冲区的大小和服务器配置影响性能。 在参数指定方面,`proxy_buffer_size` 接受单个参数表示缓冲区大小,可用字节、千字节(k)或兆字节(m)来指定值。例如,`proxy_buffer_size 16k;` 将缓冲区大小设置为 16k(16 千字节)。该指令可放置在 `http`、`server` 或 `location` 上下文中,根据配置需求灵活使用。需要注意的是,实际生效的缓冲区大小可能会受其他指令(如 `proxy_buffers`)的影响,后者决定单个响应分配的缓冲区总数。 在配置 `proxy_buffer_size` 时,应考虑上游服务器响应的特性。如果上游服务器经常发送较大的头部,增加此缓冲区大小可以防止 NGINX 不必要地重新分配缓冲区,从而避免性能下降。因此,合理使用该指令可以通过减少响应时间来提高服务器效率和用户体验。
配置示例
location /api/ {
proxy_pass http://backend;
proxy_buffer_size 16k;
}将缓冲区大小设置得过低可能会导致响应头被截断,从而使应用程序行为不可预测。
注意服务器的内存限制;在大量并发连接发生时,过大的缓冲区可能会导致内存使用量过高。
说明
`proxy_read_timeout` 指令定义了从被代理服务器读取数据的超时时间(即 NGINX 转发请求的目标服务器)。如果被代理服务器在该时间内未发送任何数据,NGINX 会终止连接并向客户端返回错误。对于读取阶段可能出现长时间延迟的慢速后端,该超时时间至关重要。 该指令接受一个参数,表示超时时间。该值可以用秒指定,或使用时间后缀(例如 `m` 表示分钟,`h` 表示小时)。超时设置对优化应用性能很关键,应根据后端服务的预期响应时间来设置。如果连接空闲时间超过指定时长,NGINX 服务器会关闭该连接,以防资源被占用。 该指令可在多种上下文中配置,包括 `http`、`server` 和 `location`。指令应用的作用域会影响超时与其他代理指令(例如 `proxy_connect_timeout` 和 `proxy_send_timeout`)之间的交互。进行合理的配置可以确保更好的资源管理并提升通过 NGINX 处理请求的用户体验。
配置示例
location /api {
proxy_pass http://backend;
proxy_read_timeout 30s;
}将超时设置得太低可能导致有效连接被过早终止,从而对用户体验产生负面影响。
该指令仅影响响应的读取,而不影响建立连接或发送请求所需的时间。
请确保将此指令与其他超时指令协调,以便在NGINX配置中实现一致的超时处理。
说明
`proxy_buffers` 指令在反向代理过程中对 NGINX 与上游服务器的交互方式进行关键控制。它指定在将从被代理服务器接收的数据发送给客户端之前,用于保存这些数据的缓冲区的数量和大小。每个缓冲区用于存储响应的片段,使 NGINX 能够在传递之前高效地聚合数据。该指令接受两个参数:缓冲区数量和每个缓冲区的大小,以字节为单位。例如,配置 `proxy_buffers 8 16k;` 表示 NGINX 将分配 8 个缓冲区,每个缓冲区可容纳 16KB 的数据。 当向 NGINX 发出涉及上游通信的请求(例如与后端 Web 服务器通信)时,响应会在这些缓冲区中处理。如果上游响应超过所分配缓冲区的总大小,NGINX 会将多余的数据直接写入客户端,绕过缓冲区。这对于在高负载下维持性能至关重要,因为它通过控制一次缓冲的数据量来避免内存过载。此外,如果缓冲区不足以容纳数据,可能会导致过多地向客户端写入数据,从而影响吞吐量。
配置示例
location / {
proxy_pass http://backend;
proxy_buffers 8 16k;
}确保总缓冲区大小足以处理预期的响应大小;否则,较大的响应可能导致性能下降。
过大的缓冲区会导致内存使用增加,这在资源有限的环境中可能并不理想。
说明
在高负载期间,`proxy_busy_buffers_size` 指令对于管理 NGINX 如何处理来自上游服务器的响应至关重要。当 NGINX 向代理服务器处理请求时,它使用缓冲区来保存收到的数据,然后再发送给客户端。`proxy_busy_buffers_size` 特别用于确定在 NGINX 忙于处理并发请求时为这些缓冲区分配多少内存。其功能的一个关键方面是通过限制这些繁忙缓冲区所消耗的内存量来降低服务器过载的风险。 设置此指令有助于更有效地管理内存使用,尤其是在高流量场景下。通过为 `proxy_busy_buffers_size` 指定具体大小,管理员可以在性能和资源消耗之间取得平衡。如果该大小设置得过小,可能导致更频繁的缓冲区刷新,并因资源争用增加而延长响应时间。相反,设置得过大则可能导致内存使用过度,进而在负载较重时引起服务器不稳定。因此,根据服务器能力和预期的流量模式找到一个最优值非常重要。
配置示例
http {
proxy_busy_buffers_size 16k;
}将该值设置得过低可能会增加刷新操作的次数,从而降低性能。
将其设置得过高可能导致内存使用过多,尤其在高负载时。
说明
`proxy_force_ranges` 指令在设置为 `on` 时,指示 NGINX 对代理内容启用 Range 请求。该指令在上游服务器不支持 Range 请求时尤其重要,因为它通过允许 NGINX 在需要时操作 Range 头,确保仍能正确提供部分内容。这实际上允许客户端请求资源的特定部分,从而减少带宽使用并提高大型文件(例如视频或归档文件)的响应性。 启用该指令后,NGINX 完全控制来自客户端的 Range 请求,并将所需的范围转发给上游服务器。如果上游服务器不支持 Range 请求,NGINX 将对接收到的数据进行必要的分段处理,并像上游支持 Range 一样将其交付给客户端,从而即使上游服务能力有限也能确保无缝运行。这在处理大型数据集或媒体文件的场景中尤其能提升客户端体验。 需要注意的是,由于处理 Range 请求需要额外的处理,尤其是在代理完整内容且上游不直接处理 Range 请求的情况下,使用该指令可能会略微影响性能。此外,启用此指令会增加响应处理的复杂性,因为 NGINX 必须仔细管理客户端指定的字节范围以及从上游服务器接收的响应。
配置示例
location /files {
proxy_pass http://backend;
proxy_force_ranges on;
}确保上游服务器无法处理范围请求,否则可能导致意外行为。
启用时,该指令需要进行适当的测试,以确保不会因 NGINX 在管理范围请求时的开销而导致性能意外下降。
说明
`proxy_limit_rate` 指令为被代理的连接设置响应速率限制,使您可以控制某些请求的带宽使用。该指令特别适用于限制后端被代理服务器发送到客户端的数据量,从而防止客户端压垮服务器或消耗过多带宽。 速率可以用支持与其他 NGINX 指令类似的大小单位的语法来定义,例如使用 'k' 或 'm' 分别表示千字节或兆字节。该限制按每连接施加,这意味着该指令控制的是每个单独连接的最大带宽,而不是总体带宽。 在 `http`、`server` 或 `location` 环境中使用此指令,可以确保客户端以稳定且受控的速度接收响应,这有助于改善整体响应时间和用户体验,尤其是对于需要处理大文件下载或大量数据处理的应用。请注意,设置此指令并不限制所有客户端消耗的总带宽;每个连接仍按指定限速,但如果有许多客户端连接,整体带宽可能仍会很大。
配置示例
location /download {
proxy_pass http://backend;
proxy_limit_rate 100k; # Limits the response rate to 100 kilobytes per second
}设置严格的限制可能导致客户端下载速度变慢,尤其是在高延迟连接上。
此指令仅适用于代理连接;不影响与 NGINX 服务器的直接连接。
请务必测试您的配置,因为将此与其他速率控制指令结合使用可能会导致意外结果。
说明
'proxy_cache' 指令指定用于存储来自代理服务器的缓存响应的缓存区域。通过定义缓存,NGINX 可以存储响应,从而避免频繁向后端服务器发出请求,有效地加快终端用户的响应时间并减轻后端系统的负载。该指令可用于 HTTP、server 和 location 块的上下文中,使在配置的不同部分实现缓存策略具有灵活性。\n\n'proxy_cache' 指令的语法如下:'proxy_cache zone;',其中 'zone' 是已定义缓存区域的名称,必须使用 'proxy_cache_path' 指令事先创建。该指令控制响应的存储时长,并会影响后续请求的处理方式——是从缓存中返回还是转发到后端。此外,还可以设置其他指令以微调缓存行为,例如 'proxy_cache_valid'(根据响应状态码定义缓存时长)和 'proxy_cache_key'(根据请求参数自定义缓存键的生成方式)。\n\n还需注意,仅靠该指令本身并不能完整配置缓存行为。它必须与关于缓存区域、具体缓存策略以及共享内存分配的附加配置配合使用,这些配置决定了 NGINX 服务器中缓存的管理和优化方式。
配置示例
http {
proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
}
}
}确保先使用 'proxy_cache_path' 定义缓存区域,然后再在 'proxy_cache' 中引用它。
使用 'proxy_cache' 而没有适当的缓存控制可能导致向用户提供过时的数据。
对缓存键要小心,因为如果未通过 'proxy_cache_key' 正确设置,可能会导致意外行为。
确保文件系统权限允许 NGINX 向 'proxy_cache_path' 指定的目录写入。
说明
指令 `proxy_cache_key` 定义了 NGINX 如何为存储在代理缓存中的响应构建缓存键。默认情况下,它将协议、主机、URI 和查询字符串组合起来,为每个请求创建唯一的缓存标识符。通过自定义缓存键,可以修改缓存行为,并更精细地控制哪些内容被缓存。该键可以使用变量,从而根据请求参数、头部或其他上下文数据动态生成键。\n\n`proxy_cache_key` 的语法允许你定义一个自定义键字符串,该字符串可以由静态文本和变量组成。例如,你可以包含 `$request_uri`、`$remote_addr` 及其他变量来区分被缓存的内容。这种灵活性允许根据用户会话或其他条件缓存同一响应的多个版本,从而增强 Web 缓存的功能。注意,更改缓存键需要对被缓存内容及用户交互方式有充分理解,以避免不必要的缓存未命中或覆盖。
配置示例
http {
proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
}
}
}确保生成的自定义 cache key 不会导致过度的 cache fragmentation,因为过于细化的 cache key 会降低 cache hit rates。
如果在你的 cache key 中使用 variables,请注意性能影响,因为不必要的复杂性会为 cache lookups 增加开销。
说明
`proxy_cache_path` 指令在 NGINX 中定义了文件系统上的一个特定路径,用于存放缓存数据。该指令必须在 http 上下文中指定,并且可以接受多个参数,这些参数决定了缓存系统如何管理和存储缓存数据。 `proxy_cache_path` 的参数包括缓存目录的路径、用于缓存的子目录层级、用于管理缓存的 key zone,以及像 `inactive` 这样的可选参数,用于定义缓存项在被视为过期之前应保留多长时间。通过指定子目录层级,NGINX 可以更有效地管理用于缓存的存储空间,这对于高访问量环境下的性能至关重要。 当请求一个缓存的响应时,NGINX 会在指定的缓存路径中检查该响应是否已被缓存;如果已缓存,则直接返回缓存内容,跳过向上游的请求。这可以显著降低延迟和后端服务器的负载,同时改善客户端的整体响应时间。
配置示例
http {
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
}
}
}确保指定的缓存路径存在,并且可被 NGINX 工作进程写入。
注意缓存大小限制,因为超过 `max_size` 可能导致意外的缓存驱逐。
在缓存路径中使用不足的目录层级可能会由于过多的文件 I/O 而导致性能下降。
说明
`proxy_cache_bypass` 指令在 HTTP、server 或 location 上下文中使用,用于定义请求应在何种条件下绕过代理缓存。它接受一个或多个参数,这些参数可以是变量、nginx 内置变量或其他任何有效的标识符,在确定请求是否应跳过缓存时被求值为真。满足匹配条件时,NGINX 将直接从源服务器提供该请求,而不是返回缓存版本,从而允许针对特定请求返回动态响应,同时仍然为其他请求利用缓存。 当某些请求不应被缓存时(例如包含敏感的用户专属数据或频繁变化的动态内容的请求),此指令尤其有用。例如,当存在某些 cookies 或 request headers 时,可以将其设置为绕过缓存。这样可以对缓存行为进行细粒度控制并优化性能,确保只有适合的内容来自缓存,而其余数据仍可被缓存并高效提供。
配置示例
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_bypass $cookie_nocache;
}确保指定的变量或表达式被正确评估,以避免意外的缓存行为。
过于宽泛的条件可能导致过多的缓存未命中,从而影响性能和服务器负载。
说明
在 NGINX 的 proxy 模块中使用 `proxy_no_cache` 指令来控制上游响应的缓存行为。通过使用该指令,您可以指定条件来决定响应是否有资格被缓存。该指令允许使用布尔表达式(求值为 true 或 false),从而根据各种请求参数(例如请求头、Cookie 和变量)灵活管理缓存存储。当指定条件求值为 true 时,NGINX 将不会缓存该响应,从而跳过缓存存储。 该指令支持一个或多个参数,允许管理员根据应用的需求精确地定制缓存逻辑。实际上,您可能希望对已认证用户或特定请求类型阻止缓存;例如,当请求包含某个特定的 cookie 值或存在某个头时。其结果是一个有效机制,确保敏感或特定于用户的数据直接从后端服务器实时获取而不被缓存。
配置示例
location /api {
proxy_pass http://backend;
proxy_no_cache $http_cache_control;
}确保传递给 `proxy_no_cache` 的条件配置正确;否则,缓存行为可能无法按预期工作。
使用复杂的布尔表达式可能会使调试缓存问题变得困难。
当响应已经设置了缓存头时,此指令不适用;请确保正确管理响应头。
说明
指令 `proxy_cache_valid` 通过指定对某些 HTTP 状态码应保留缓存响应的时长来配置 NGINX 中的缓存机制。该指令在你希望根据被代理服务器返回的不同类型响应来控制缓存时长时尤其有用。例如,你可能希望将成功响应(HTTP 200)缓存的时间设得比错误响应(例如 HTTP 500)更长。默认情况下,除非在此指令中提供了特定的生存时间(TTL),缓存的响应将依据 `proxy_cache_use_stale` 和 `proxy_cache_revalidate` 设置。 该指令接受一个或多个参数对:HTTP 状态码和时间周期(可用秒、分钟、小时或天来指定)。例如,可以写 `proxy_cache_valid 200 1h;` 将 HTTP 200 响应缓存一小时。通过多行定义,你可以为不同的状态码指定不同的时间周期,从而对缓存行为进行细粒度调整以适应应用需求。需要注意的是,缓存行为还会受到如 `proxy_cache` 等其他指令的影响,`proxy_cache` 必须启用才能使 `proxy_cache_valid` 生效。
配置示例
location /api {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 1h;
proxy_cache_valid 404 10m;
}如果未启用 `proxy_cache`,此指令将不起作用。
如果在请求响应时没有正在提供的缓存,即使定义了此指令,响应也不会被缓存。
注意状态码;错误指定的状态码可能导致意外的缓存行为。
说明
`proxy_cache_min_uses` 定义了缓存响应必须从缓存中被提供的次数,达到该次数后才被视为有效并可有效地为后续客户端请求重用。在某些场景中,这尤其有用,例如响应是从上游服务器预先缓存的,但基于诸如缓存命中率或负载均衡设计等特性,可能需要达到某个可用性阈值。如果缓存响应被提供的次数少于指定的最少使用次数,则对该内容的请求将绕过缓存版本,可能会改为从上游服务器获取新的副本。 该指令可在多个上下文中使用,包括 `http`、`server` 和 `location`,允许在 NGINX 配置的不同部分灵活应用。该指令接受一个表示最少使用阈值的单个整数参数。通过优化该使用阈值,管理员可以更好地控制缓存效率并管理服务器负载,从而减少因缓存而提供过时或不够可靠内容的情况。
配置示例
location /api {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_min_uses 5;
}将此值设置得过高可能导致不必要的缓存未命中,从而增加上游服务器的负载。
相反,如果后端响应不经常变化,将其设置得过低可能会导致频繁提供过期数据。
说明
指令 'proxy_cache_max_range_offset' 用于 NGINX 配置的 http、server 和 location 块上下文中。它用于指定可以被接受的、由代理缓存提供的响应的最大范围偏移。默认情况下,NGINX 会允许任何不超过该指定偏移值的范围请求,这在处理大型媒体文件或其他内容的字节范围时,有助于优化缓存机制。
配置示例
http {
proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=1g;
server {
location /media {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_max_range_offset 1048576; # 1 MB
}
}
}请确保所指定的值适合将要提供的内容;值过高可能会导致大型媒体文件占用过多内存。
该指令仅在内容通过代理缓存提供时适用;必须先启用代理缓存。
说明
proxy_cache_use_stale 指令允许 NGINX 在满足特定条件时提供可能已过期的缓存响应,而不是从后端服务器获取最新内容。 这在高延迟或宕机情形下尤其有用,可提升响应速度并减轻后端负载。 该指令可以设置多个参数,用以指定在何种条件下应使用过期缓存数据。 例如,如果设置为 'error',当后端服务器返回任何错误状态时 NGINX 会提供过期内容。同样,'timeout'、'updating' 和 'http_500' 也可以作为提供过期数据的条件。多个条件可以在单个指令中使用,条件之间用空格分隔。 当指令以特定参数启用时,如果 NGINX 在尝试获取最新内容时遇到符合某一条件的情况(例如超时或服务器错误),它将自动提供与该请求对应的最后一条缓存响应,而不是向客户端返回错误。这能提高弹性和用户体验,尤其是对于频繁访问且即便略微过期仍可能有效的资源。
配置示例
location /api {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_use_stale error timeout;
}如果未根据应用程序的要求正确配置,使用此指令可能会无意中导致提供过时的内容。
过度使用此指令可能会掩盖后端问题而不解决根本原因,从而导致糟糕的用户体验。
说明
NGINX 中的 proxy_cache_methods 指令用于定义通过代理服务器处理请求时应被缓存的 HTTP 方法。默认情况下,通常只有 'GET' 和 'HEAD' 方法会被缓存,这是因为这些方法在典型使用场景下是安全的——重复请求不会改变资源状态。然而,某些应用可能需要对其他方法(例如 'POST' 或 'PUT')采用特定的缓存策略,例如在实施激进缓存策略或优化性能时。 该指令接受一个或多个 HTTP 方法名称作为参数,包括 'GET'、'HEAD'、'POST'、'PUT' 等。要启用对非默认方法的缓存,必须在此指令的参数中显式列出该方法。NGINX 会根据 proxy_cache_methods 中定义的方法过滤传入请求并适当缓存响应。需要注意的是,对非幂等方法进行缓存有其影响,如果管理不当可能导致意外行为。 使用该指令的重要一点是其上下文的灵活性,允许在 http、server 或 location 上下文中设置。可以根据应用需求在不同层级微调设置。在更改 HTTP 方法的缓存行为时应谨慎,因为这可能显著影响应用逻辑和资源交互。
配置示例
location /api {
proxy_pass http://backend;
proxy_cache_methods GET POST;
}缓存非幂等方法(例如 POST)可能导致意外的应用行为。
确保后端服务器支持对指定方法进行缓存,否则配置可能无法达到预期效果。
对敏感操作的缓存配置不当可能会无意中返回过期的数据。
说明
当将 `proxy_cache_lock` 设置为 on 时,NGINX 会使用锁定机制来防止多个并发请求在缓存中不存在同一资源时同时向上游发送请求。相反,最先到达的请求将获取该资源,随后到达的请求将在第一个请求完成并将内容写入缓存后等待,以便在缓存可用时从缓存中提供该内容。 该指令对于依赖后端服务的 Web 应用在性能和效率方面特别有用,尤其是在缓存未命中可能导致上游请求激增的场景中。通过启用 `proxy_cache_lock`,NGINX 将把对后端服务器的负载降到最低,并减少因多个请求同时请求同一项而压垮后端的风险。 您可以在 `http`、`server` 或 `location` 上下文中使用此指令。在流量较大的环境中,缓存对性能和资源管理至关重要,因此将此选项设置为 on 十分关键。
配置示例
http {
proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=1g;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_lock on;
}
}
}启用 `proxy_cache_lock` 可能会在等待第一个请求完成时对后续请求引入延迟。
在较低的 TTLs(生存时间)缓存设置下应谨慎使用此指令,因为在高流量情况下可能导致更长的等待时间。
说明
`proxy_cache_lock_timeout` 指令用于指定 NGINX 等待获取存储在缓存中响应的锁的最长时间。该指令在多个请求同时尝试检索相同内容的场景中非常有用。通过使用锁,NGINX 可以将这些请求串行化,使得只向后端发起一次请求,而其他请求则等待响应被缓存。此行为有助于减轻上游服务器的负载并提升整体性能。 `proxy_cache_lock_timeout` 的值以时间格式指定,例如 `10s` 表示 10 秒,也可以设置为 0 以禁用锁。当请求遇到缓存未命中时,如果锁可用,请求将继续从上游服务器获取内容。如果锁被其他请求占用且等待时间超过指定值,新请求将返回 502 错误,而不是无限期等待。 该指令可以在 `http`、`server` 和 `location` 上下文中声明,在需要对缓存进行细粒度控制的配置中提供了灵活性。应根据应用的响应时间和预期流量模式仔细选择超时时间,以避免不必要的请求失败。
配置示例
location /api {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_lock on;
proxy_cache_lock_timeout 10s;
}将超时时间设置得过低可能会导致在上游服务器响应缓慢时出现更多 502 Bad Gateway 错误。
请确保启用 `proxy_cache_lock`,以便锁定机制能正常工作。
说明
`proxy_cache_lock_age` 指令配置请求在等待由另一个正在处理的请求生成的缓存响应时会等待的时长。这有助于减少对同一资源的并发请求数量,只允许一个请求填充缓存,而其他请求要么等待该响应,要么在缓存可用后立即获取缓存响应。 当一个请求未命中缓存,而另一个针对相同内容的请求正在处理时,后来的请求将等待前一请求完成,最长等待时间由 `proxy_cache_lock_age` 定义。如果前一个请求在此时间内完成,等待的请求将获取缓存响应。如果在指定时间内锁未释放,等待的请求将返回 504 Gateway Timeout 错误。通过适当调整此指令,可以在避免对同时命中缓存的高并发请求造成不必要服务器负载的同时,优化用户的响应时间。 要配置 `proxy_cache_lock_age`,只需在 http、server 或 location 上下文中定义该指令,并指定所需的时间长度。平衡该值与预期负载和响应时间非常重要,以避免潜在的性能问题。
配置示例
location /api {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_lock on;
proxy_cache_lock_age 5s;
}将 age 设置得过低可能会导致频繁超时,因为并发请求可能无法足够快地完成。
如果不启用 `proxy_cache_lock`,则此指令将不起作用,因为缓存锁定机制未启用。
说明
`proxy_cache_revalidate` 启用时,当缓存已过期,会使 NGINX 向上游服务器发送条件请求以重新验证缓存条目。它通过在请求中发送 If-Modified-Since 或 If-None-Match 头来执行此验证,这会告知源服务器检查自上次获取以来缓存的资源是否已被修改。 此行为特别有助于在提供缓存内容时确保客户端收到最新版本的资源。如果上游服务器响应资源未改变(HTTP 304 Not Modified),NGINX 会向客户端提供过期但仍可用的缓存版本。若资源已改变,NGINX 则会获取新版本并相应更新其缓存。 将此指令与合适的缓存策略结合使用很重要,以避免向上游服务器发出不必要的请求,尤其是在缓存被频繁访问且资源不太可能被修改的情况下。但如果实时性对您的应用至关重要,启用此指令有助于维持内容交付的最新性。
配置示例
location /example {
proxy_pass http://example_upstream;
proxy_cache my_cache;
proxy_cache_revalidate on;
}在没有有效缓存策略的情况下使用此指令,可能会由于不断的重新验证请求导致上游服务器负载过高。
请确保上游服务器支持条件请求,否则客户端可能无法从此指令中受益。
请记住,启用此指令可能会在缓存过期后的首次请求中增加响应时间。
说明
'proxy_cache_convert_head' 指令用于 NGINX 配置中,以确定是否应基于相应的 GET 请求为 HEAD HTTP 请求提供缓存响应。该指令允许缓存系统在存在有效缓存版本时将 HEAD 请求在内部转换为 GET 请求,从而通过避免每次 HEAD 请求都从 upstream 重新获取数据来提升性能。对于大量使用 HEAD 请求的应用,这种行为尤其有用,使其能够受益于缓存,而无需 upstream 每次都生成新的响应。 当设置为 'on' 时,该功能会改变请求处理方式,可能使 HEAD 请求获得更快的响应。相反,如果设置为 'off',服务器不会为 HEAD 请求检索为 GET 请求生成的缓存响应,这可能导致 HEAD 请求的响应时间变长,因为它们需要直接访问 upstream。该指令可应用于包括 http、server 和 location 在内的多个上下文,在 NGINX 的不同 HTTP 配置中提供使用灵活性。
配置示例
http {
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_convert_head on;
}
}
}确保上游服务器正确地对同一资源处理 GET 和 HEAD 请求。
注意,过度依赖缓存的 HEAD 响应在某些情况下可能导致数据过时。
说明
'proxy_cache_background_update' 指令是 NGINX HTTP 模块中的一个标志,决定当向客户端提供过期资源时 NGINX 是否应尝试在后台获取该缓存资源的最新版本。默认情况下,当对已过期(即已超过其过期时间)的缓存项发出请求时,NGINX 通常会返回该资源的过期版本。如果将 'proxy_cache_background_update' 指令设置为 'on',NGINX 不仅会提供过期响应,还会在后台发起请求以获取该资源的更新版本,从而确保下一次对该资源的客户端请求能以最小的性能开销收到最新版本。
配置示例
http {
proxy_cache_path /tmp/cache levels=1:2 keys_zone=my_cache:10m max_size=1g;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_background_update on;
}
}
}如果与 'proxy_cache_use_stale' 一起使用,请确保正确配置以处理后台更新,避免在无意中提供过期内容。
将此指令设置为 'on' 可能会在大量对过期内容的请求同时发生时导致后端负载增加。
请注意,启用此功能在缓存刷新期间可能会导致与后端服务器的并发连接数增加。
说明
`proxy_temp_path` 指令指定了 NGINX 在处理代理请求时存储临时文件的目录。该指令对于管理在代理大响应或上游服务器响应缓慢时创建的文件至关重要。默认情况下,文件写入到由该指令定义的路径,从而帮助 NGINX 即使在响应超过正常内存限制时也能高效处理。 该指令最多可接受四个参数,用于定义存放临时文件的目录路径,且可以通过额外的选项指定 NGINX 应如何管理这些文件。在流量较高且内存使用成为问题的环境中,这一点尤为重要,因为它允许 NGINX 将大型 HTML 响应或二进制数据写入磁盘,而不会占用过多内存。通过设置 `proxy_temp_path`,管理员还可以精确控制临时文件的位置,这有助于管理磁盘空间或符合安全策略。 `proxy_temp_path` 的一个重要方面是它必须指向一个可写目录;否则,NGINX 可能无法正确处理请求并返回错误信息。如果 NGINX 无法创建或写入指定的临时目录,可能会导致请求处理出现问题并影响整体性能。
配置示例
http {
proxy_temp_path /var/tmp/nginx/proxy;
}确保该目录可被 NGINX 工作进程写入。
如果该目录不存在,NGINX 不会自动创建,并且可能会遇到错误。
在性能较差的文件系统上使用临时路径可能会降低代理响应速度。
说明
'proxy_max_temp_file_size' 指令用于控制在处理被代理服务器响应时创建的临时文件的最大尺寸。如果响应超过该指定大小,NGINX 将不会把响应存储到临时文件中,而是返回错误。这在处理较大响应时尤其有用,可以避免耗尽磁盘空间。该指令可以在 http、server 和 location 上下文中配置,以便根据服务器配置结构进行更细粒度的控制。 在配置 'proxy_max_temp_file_size' 时,可以以字节为单位指定值,或使用后缀以提高可读性:'k' 表示千字节,'m' 表示兆字节,'g' 表示千兆字节。需要注意的是,将此值设置得过低可能会导致当某些被代理响应大于允许值时错误增多;反之,将其设置得过高则可能在临时缓存大量大响应时导致磁盘存储问题。因此,建议在定义此限制时评估预期的响应大小。
配置示例
location /api {
proxy_pass http://backend_server;
proxy_max_temp_file_size 5m;
}将大小设置得过小可能会导致大型响应频繁出错。
在设置较高限制时不考虑磁盘空间,可能会耗尽可用存储。
说明
`proxy_temp_file_write_size` 指令在 NGINX 中指定可写入代理响应临时文件的最大数据大小。当来自被代理服务器的响应大于此大小时,NGINX 会将其缓冲到临时文件而不是内存中,这在高负载场景下管理内存使用非常重要。该指令通过控制在将数据转存到磁盘之前可驻留在内存中的响应数据量,帮助避免内存不足的情况。 该指令接受单个参数,用于定义大小限制,取值例如 '1m' 表示一兆字节,'512k' 表示半兆字节等。此指令的上下文包括 `http`、`server` 和 `location`,使用户能够根据代理设置的作用范围灵活配置。在调整此设置时必须考虑磁盘 I/O 的影响,尤其是在资源受限的服务器或频繁提供大文件的情况下。 实际使用中,如果响应大小超过配置的限制,代理服务器会开始将数据写入位于指定目录的临时文件,从而允许后续处理继续进行而不会压垮服务器内存。管理员应密切监控响应大小并相应调整此设置,以优化性能和资源管理。
配置示例
http {
proxy_temp_file_write_size 1m;
server {
location / {
proxy_pass http://backend;
}
}
}将 `proxy_temp_file_write_size` 设置得过低可能导致频繁写入磁盘,影响性能,尤其在高负载下。
确保系统为临时文件留有足够的磁盘空间;否则,可能在处理请求时导致错误。
在正在运行的配置中更改此指令可能不会影响正在进行的请求;可能需要重新加载或重启。
说明
`proxy_next_upstream` 指令在 NGINX 中对于管理故障并在使用 proxy module 时确保高可用性至关重要。它定义了在何种条件下当前的代理请求会在上游组中的下一个服务器上被重试。在微服务架构中,这一点尤其有用,因为可以通过将流量重新路由到另一台服务器来缓解单点故障,从而实现负载均衡和容错。 该指令接受一个或多个参数,用以指定会触发将请求传递到下一个上游服务器的错误条件。常见参数包括 'error'、'timeout'、'invalid_header' 和 'failed' 等。通过组合不同的参数,管理员可以微调重试请求的条件,从而优化用户体验,减少由于单个上游服务器的暂时性问题导致请求失败的可能性。 当上游服务器由于某个指定原因而失败时,NGINX 会尝试联系配置的 upstream block 中的下一台服务器。这有助于防止停机并提供无缝故障转移,对于维护服务连续性至关重要,因为客户端无需感知底层服务器的故障。然而,尽管该指令启用了自动重试,但仍需实施适当的监控和告警以在问题出现时及时发现它们。
配置示例
upstream myapp {
server backend1.example.com;
server backend2.example.com;
}
location / {
proxy_pass http://myapp;
proxy_next_upstream error timeout invalid_header;
}过度使用此指令可能导致延迟增加,因为 NGINX 在响应客户端之前会等待重试。
确保上游服务器之间具有兼容性,因为在使用不同版本或配置时,重试尤其可能导致意外行为。
说明
`proxy_next_upstream_tries` 指令指定 NGINX 在返回错误之前尝试与上游服务器通信的最大次数。它通过设置在向上游服务器发出的请求由于指定的失败情况而未成功时适用的重试限制,从而实质上有助于负载均衡。这些失败情况可能包括服务器不可用、超时或其他错误。 当设置该指令时,NGINX 会尝试将请求重试到定义的上游组中的另一台服务器,最多达到该指令指定的次数。如果达到最大尝试次数,NGINX 将向客户端返回错误消息。此功能可以增强服务的可用性和弹性,尤其是在某些服务器可能暂时无响应的集群部署中。 该指令的行为受 `proxy_next_upstream` 指令的影响,后者定义了哪些失败场景应触发重试。在资源受限的环境中平衡重试次数非常重要,因为过多的重试可能会因对上游服务器造成不必要的负载而导致性能下降。
配置示例
location /api {
proxy_pass http://backend;
proxy_next_upstream_tries 3;
}将该值设置为非常大的数字可能导致延迟增加和资源消耗上升。
如果没有与适当的 `proxy_next_upstream` 设置配合,重试可能不会按预期进行,原因是失败条件配置不正确。
说明
在 NGINX 中,`proxy_next_upstream_timeout` 指令用于指定在先前连接尝试失败后,等待下一个上游服务器的最长允许时间。这在跨多个后端服务器进行负载均衡时尤其有用,因为它决定了在遇到特定错误条件或超时后,NGINX 在上游块中重试另一个服务器之前会等待多久。 当请求由于超时或其他定义的条件失败时,NGINX 可以自动尝试连接其他上游服务器。`proxy_next_upstream_timeout` 指令允许管理员控制此类重试的最长尝试时间。通过调整该超时时间,可以优化应用的响应性,在等待可能较慢的服务器与快速切换到健康服务器之间取得平衡。 超时时间以 NGINX 支持的时间格式指定,例如秒、分钟或小时(例如 '30s' 表示 30 秒)。在不同上下文(如 `http`、`server` 或 `location`)中设置此指令可以根据应用需求提供更细粒度的控制。
配置示例
location /api {
proxy_pass http://backend;
proxy_next_upstream_timeout 5s;
}确保超时时间足够让上游服务器响应,否则可能会经常发生超时。
注意 `proxy_next_upstream_timeout` 与其他相关指令(例如 `proxy_connect_timeout`)之间的相互影响。
未设置该值可能导致默认行为,而该默认行为可能不适合您的应用需求。
说明
`proxy_pass_header` 指令用于 NGINX 配置文件中 `http`、`server` 或 `location` 块的上下文中。该指令允许用户指明在响应由被代理服务器生成时,应包含在从 NGINX 服务器返回给客户端的 HTTP 响应中的特定 HTTP 头。默认情况下,NGINX 会将来自上游服务器的某些头传递给客户端,但 `proxy_pass_header` 指令为用户提供了根据需要添加或限制特定头的灵活性。这对于管理安全性、缓存行为或根据环境定制响应尤其有用。 在使用 `proxy_pass_header` 时,可以指定多个头,从而微调需要传递的头。例如,如果被代理服务器设置了客户端需要接收的自定义头,此指令可以确保该头与响应一起转发回原始客户端。相反,如果有出于安全或隐私考虑不应共享的头,此指令可以用于控制该行为。了解操纵头的影响非常重要,尤其是在安全上下文、缓存和客户端兼容性方面。
配置示例
location /api {
proxy_pass http://backend;
proxy_pass_header X-Custom-Header;
}确保上游服务器响应中存在指定的头部;否则这些头部将不会被传递给客户端。
使用过多的头部会增加响应大小,因此仅传递必要的头部。
说明
`proxy_hide_header` 指令指示 NGINX 在将上游服务器的响应发送给客户端之前移除特定的 HTTP 响应头。这对于安全或隐私目的很有用,可以防止敏感信息在响应头中被泄露。该指令可以在 `http`、`server` 或 `location` 上下文中定义,根据 NGINX 服务器不同的作用域提供配置灵活性。该指令的参数由需要从响应中省略的头名组成。 在使用 `proxy_hide_header` 指令时,重要的是将有效的头名作为参数包含进来。如果指定的头在上游服务器的响应中不存在,则不会产生不良影响;NGINX 只会简单地省略该头,不会报错。该指令可以多次使用以隐藏多个头,从而全面控制返回给客户端的信息。用户在配置此指令时必须谨慎,确保不会无意中移除对应用功能至关重要的头,否则可能导致意外行为。
配置示例
location /api {
proxy_pass http://backend;
proxy_hide_header X-Powered-By;
}确保头部名称正确并与响应中的头部大小写一致,因为在 HTTP 中头部是不区分大小写的,但在配置文件中可能会区分大小写。
此指令可以使用多个实例;请确保检查拼写错误,以避免隐藏头部出现令人困惑的行为。
在隐藏包含重要安全或应用信息的头部时要小心,这些信息可能是客户端正常工作所必需的。
说明
`proxy_ignore_headers` 指令指示 NGINX 从转发给客户端的响应中省略指定的响应头。这在控制返回给用户的信息时很有用,尤其是在处理敏感响应头或需要强制特定缓存行为时。你可以提供一个或多个响应头作为参数,NGINX 会在通过代理传递的响应中忽略这些响应头。 该指令可以在多种上下文中设置,包括 `http`、`server` 和 `location`,从而可以根据服务器设置的具体需求进行灵活配置。指定要忽略的响应头时,可以使用诸如 "Cache-Control"、"Expires" 等头部名称。如果指定多个响应头,应以空格分隔。该指令不会修改被代理服务器的配置,它仅改变 NGINX 本身返回给请求者的内容,确保在到达客户端之前过滤掉可能不需要的信息。
配置示例
location /example {
proxy_pass http://backend;
proxy_ignore_headers Cache-Control Expires;
}忽略头部可能导致意外行为,尤其是在缓存方面;请确保被忽略的头部对预期的客户端行为并非关键。
对可能保护用户免受攻击的安全相关头部,应谨慎处理,不要随意忽略。
说明
'proxy_http_version' 指令允许您设置 NGINX 在代理请求时与后端服务器连接时应使用的 HTTP 协议版本(例如 HTTP/1.0 或 HTTP/1.1)。协议版本的选择会影响连接行为及可用的可选功能,例如 keep-alive 连接,具体取决于被代理服务器的能力。
在 NGINX 配置中,该指令可在 'http'、'server' 或 'location' 上下文中指定,允许对配置中的特定区域进行细粒度控制,以决定 NGINX 如何与上游服务器交互。例如,当使用 HTTP/1.0 时,如不使用 keep-alive,每个连接只能发送一个请求,这可能会根据请求的处理方式影响应用的性能。
该指令的语法为 'proxy_http_version
配置示例
location /api {
proxy_pass http://backend;
proxy_http_version 1.1;
}将 'proxy_http_version' 设置为 '1.0' 会默认禁用 keep-alive 连接。
确保上游服务器支持所选的 HTTP 版本,以避免错误。更改该版本可能会改变连接的预期行为。
说明
指令 `proxy_ssl_session_reuse` 指定在代理 SSL 连接时 NGINX 是否应尝试重用 SSL 会话。默认情况下,SSL 会话重用通过减少建立新 SSL 连接时的性能开销,允许更快的重新连接。如果将此指令设置为 'on',NGINX 在与被代理服务器建立 SSL 连接时会利用缓存的 SSL 会话,从而可能提高响应时间并降低客户端和服务器两端的 CPU 负载。相反,如果设置为 'off',则不会重用 SSL 会话,每个被代理连接都需要完整的握手,这可能会对性能产生负面影响,尤其是在高负载情况下。 该指令在与后端服务器频繁建立连接且需要通过 SSL 进行保护的场景中尤其有用。它可以在 `http`、`server` 或 `location` 上下文级别进行配置,从而根据不同的路由需求灵活管理 SSL 性能优化。要启用此指令,请确保您的上游服务器支持 SSL session IDs,以实现最大效率,因为这是会话重用功能有效的前提条件。
配置示例
location /api {
proxy_pass https://backend;
proxy_ssl on;
proxy_ssl_session_reuse on;
}SSL 会话重用只有在上游服务器支持时才有效。
将此指令设置为 'off' 可能导致 SSL 握手负载增加,从而影响性能。
此指令会与 SSL 缓存设置交互;如果缓存配置不当,可能无法按预期发生会话重用。
说明
proxy_ssl_protocols 指令用于定义 NGINX 服务器在通过安全通道连接到被代理后端服务器时将接受哪些版本的 SSL 和 TLS 协议。支持多种协议,例如 TLSv1、TLSv1.1 和 TLSv1.2(或更高版本),可确保代理在所需的安全标准范围内运行。通过指定这些协议,管理员可以通过仅允许与上游服务器通信时使用安全版本来增强 NGINX 配置的安全合规性。 该指令可以放置在 http、server 和 location 上下文中,从而提供配置上的灵活性。例如,某个 NGINX 服务器在为不同服务器上的多个应用提供服务时,可以根据应用需求强制使用不同的 SSL 协议版本。管理员应注意,随着更新的 SSL/TLS 版本发布,弃用更旧且不那么安全的版本被认为是良好做法,以保护敏感数据。该指令的参数是一系列 SSL/TLS 协议版本,至少必须提供一次;如果省略将导致配置无效。
配置示例
location /secure {
proxy_pass https://backend.example.com;
proxy_ssl_protocols TLSv1.2; # Only allow TLSv1.2 for backend connections
}指定过时或不安全的协议可能会使您的应用程序面临漏洞风险。
所接受的协议必须同时被 NGINX 和上游服务器支持;否则,安全连接可能会失败。
只有在为代理配置了 SSL/TLS 时,此指令才生效。]
请确保在更改后重启或重新加载 NGINX 以使更改生效。
说明
当 NGINX 作为 SSL/TLS 连接的反向代理时,`proxy_ssl_ciphers` 指令对于建立安全连接至关重要。通过指定该指令,管理员可以控制在与上游服务器进行 SSL 握手时使用哪些密码套件。该功能不仅通过允许使用强密码套件来增强安全性,还可以满足特定客户端要求或合规性要求以实现兼容性。 `proxy_ssl_ciphers` 指令接受的值是一个密码套件列表,可遵循 OpenSSL 密码套件字符串格式。它可以包含具体的密码套件和密码套件组,应根据期望的安全性和性能级别来定义。在配置该指令时,确保该列表是最新的并尽量减少不安全的密码套件以防范旧算法中的漏洞非常重要。 该指令可以放在包括 `http`、`server` 和 `location` 在内的不同上下文中,允许根据 NGINX 配置层级的不同,在广泛或细粒度上控制 SSL 配置。对该指令的调整通常需要重启或重载 NGINX 服务才能生效。
配置示例
server {
location / {
proxy_pass https://backend;
proxy_ssl_ciphers 'HIGH:!aNULL';
}
}确保所指定的密码套件被 NGINX 使用的 OpenSSL 版本支持。
使用弱密码套件可能会使应用程序暴露于安全漏洞之中。
测试更改对 SSL/TLS 连接建立的影响对于避免服务中断至关重要。
说明
proxy_ssl_name 指令用于 NGINX 的 HTTP 模块,用于设置代理 SSL 请求中 'Host' 首部的值。当后端服务器使用 SNI (Server Name Indication) 扩展来处理 SSL 时,该主机值非常重要,SNI 允许在同一 IP 地址上提供多个 SSL 证书。 通过配置 proxy_ssl_name,可以确保在发起请求时向后端服务器发送正确的主机名。该指令接受一个参数,即 NGINX 在转发 SSL 请求时使用的主机名。它可以放在 http、server 或 location 上下文级别,从而在配置的不同作用域中实现对 SSL 行为的细粒度控制。 例如,如果你有多个 upstream 服务器,需要不同的 SSL 设置或主机名来成功完成 TLS 握手,则可以在每个上下文中为 proxy_ssl_name 指定适当的值。如果未设置,NGINX 将发送来自客户端请求的原始 Host 首部,这对于 upstream 服务器的设置可能并不总是正确,可能导致安全连接失败。
配置示例
location /api {
proxy_pass https://backend.example.com;
proxy_ssl_name backend.example.com;
}确保所提供的 hostname 与 backend server 上的某个 SSL 证书匹配,以防止 SSL 握手失败。
如果在 SSL 通信中使用不正确的 hostnames,配置错误可能会导致安全漏洞。
说明
`proxy_ssl_server_name` 指令控制在 NGINX 代理到另一台服务器的 SSL/TLS 请求中是否包含 Server Name Indication (SNI) 字段。当设置为 `on` 时,NGINX 会在 SSL 握手中包含来自 `Host` 请求头的主机名,这对于在同一 IP 地址上为不同主机名使用多个 SSL 证书的服务器来说是必需的。在使用共享 IP 在单台服务器上托管多个域名的场景中,这尤其重要;可以根据客户端提供的 SNI 信息选择正确的证书。 `proxy_ssl_server_name` 指令可用于多个上下文:`http`、`server` 和 `location` 配置块,并且期望接收一个标志作为参数。将此指令设置为 `on` 会启用 SNI,设置为 `off` 则会禁用 SNI。默认情况下,该指令为 `off`,这意味着除非显式启用,否则不会使用 SNI。需要注意的是,如果后端服务器不支持 SNI,可能无法提供正确的证书,从而导致 SSL 连接错误。 当后端服务器上存在多个 SSL 证书时,该指令特别有用,因为它允许 NGINX 根据请求的主机名动态选择合适的证书,从而确保证书正确终止并增强被代理连接的整体安全性。
配置示例
location /api {
proxy_pass https://backend.example.com;
proxy_ssl_server_name on;
}确保后端服务器支持 SNI;否则,将该指令设置为 'on' 可能会导致 SSL 错误。
如果启用了该指令,将请求代理到无法正确处理 SNI 的旧服务器可能会引发问题。
说明
指令 `proxy_ssl_verify` 在 NGINX 中用于指定在与被代理服务器建立连接时是否应执行 SSL 证书验证。该指令可以接受一个标志参数,'on' 启用验证,'off' 禁用验证。默认情况下,如果未指定此指令,SSL 验证为关闭('off')。启用时,NGINX 将使用系统的 SSL 库将目标服务器的 SSL 证书与受信任的证书颁发机构(CAs)进行验证,以确保证书的有效性。这一步对于依赖安全连接的应用非常关键,因为它确保证书有效且未被篡改或吊销,从而保护用户免受中间人攻击。 在配置此指令时,还应考虑信任链 —— 即从服务器证书到受信任根 CA 的路径。如果验证过程需要中间 CA 证书,应在相应的配置中提供它们。如果 SSL 验证失败,NGINX 将拒绝与被代理服务器的连接并记录错误信息,便于管理员采取相应措施。因此,在生产环境中使用 `proxy_ssl_verify` 时,建议仔细管理 SSL 证书及其信任链。
配置示例
location /api {
proxy_pass https://backend-server;
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
}确保已安装并正确配置相关 CA certificates,以便 SSL 验证成功。
如果 SSL 验证失败,NGINX 将拒绝连接,如果处理不当,可能导致服务中断。
在将设置从 'off' 切换到 'on' 时要小心,以避免意外的验证失败。测试时始终验证证书。
说明
当 NGINX 作为具有 SSL 证书的后端服务器的反向代理并与 SSL/TLS 连接配合使用时,会用到 `proxy_ssl_verify_depth` 指令。该指令专门用于控制在验证过程中,通向有效且受信任的根证书的证书链中可以包含多少个中间证书。 当客户端通过 HTTPS 连接到服务器时,SSL 证书验证可能包含多层证书,例如根证书、中间证书等。`proxy_ssl_verify_depth` 指令允许管理员定义在验证失败之前可遍历的这些中间证书的最大数量。如果将值设置为 `0`,则表示只验证终端实体证书而不验证任何中间证书。 该指令对于建立安全连接至关重要,因为它有助于确认上游服务器所提供的 SSL 证书的合法性,并有助于防止中间人攻击。正确配置验证深度可确保证书链仅在有效时被接受,从而维护被代理连接的完整性和安全性。
配置示例
location /api {
proxy_pass https://backend;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
}将 verify depth 设置得过低可能会允许不受信任的证书通过验证,尤其当它们距根证书只有几层时。
该指令本身并不配置证书验证;请确保也使用 `proxy_ssl_verify on;` 以使其生效。
说明
`proxy_ssl_trusted_certificate` 指令在 NGINX 中用于设置包含受信任的证书颁发机构 (CA) 证书的文件路径。在通过 SSL/TLS 与上游服务器建立安全连接时,这一点尤其重要,因为它确保证书的客户端可以验证服务器证书的真实性。通过指定此指令,可以增强代理连接的安全性,确保它们仅与受信任的服务器通信,从而降低中间人攻击的风险。 当您配置此指令时,NGINX 在向上游服务器发起 SSL 连接时会加载文件中指定的证书。重要的是该文件只包含 PEM-encoded 的 CA 证书。如果该文件格式不正确或不包含所需的证书,NGINX 可能无法建立 SSL 连接,从而导致应用出现错误。此指令可以在 `http`、`server` 或 `location` 块中定义,因此适用于配置的不同作用域。 请记住,在修改受信任证书后,您需要重新加载 NGINX 配置以应用更改。该指令没有默认值,这意味着必须显式设置它以启用对被代理连接的 SSL 验证。
配置示例
http {
proxy_ssl_trusted_certificate /etc/nginx/certs/ca.crt;
}确保证书文件存在并且格式正确(PEM-encoded)。
在高流量环境中使用此指令时要小心,因为它会为SSL验证增加开销。
在更新证书文件后,务必 reload 或 restart NGINX。
说明
在 NGINX 配置中,`proxy_ssl_crl` 指令用于指定包含证书撤销列表 (CRL) 的文件。该 CRL 对于建立安全的代理连接至关重要,尤其是在处理 SSL/TLS 证书时。它允许 NGINX 将服务器的 SSL 证书与撤销证书列表进行比对,从而通过阻止使用被妥协的证书来增强安全性。该指令接受一个参数,参数应为 CRL 的文件路径,且以 PEM 格式保存。\n\n该指令可以在 `http`、`server` 或 `location` 上下文中设置,因而对于不同层级的应用架构具有很强的灵活性。每当 NGINX 与被代理服务器建立 SSL 连接时,都会进行 SSL 证书验证过程。如果在 CRL 中发现服务器的证书,则连接会以错误终止,从而避免使用被撤销证书带来的潜在安全风险。
配置示例
location /api {
proxy_pass https://backend;
proxy_ssl_crl /etc/nginx/crl.pem;
}确保 CRL 文件定期更新,以避免使用过时的吊销数据。
文件路径必须为绝对路径;相对路径可能导致错误。
确保 CRL 文件采用正确的 PEM 格式。
说明
`proxy_ssl_certificate` 指令用于 NGINX 配置中,用于定义在建立 SSL/TLS 连接时应发送到上游服务器的 SSL 证书文件的路径。该指令在 NGINX 作为 HTTPS 连接的反向代理以在客户端和服务器之间提供安全通信的场景中尤为重要。通过指定客户端证书,NGINX 可以向后端服务器进行自我认证,从而实现双向 SSL/TLS 身份验证。 该指令可在不同上下文中使用:`http`、`server` 和 `location`,因此在 NGINX 配置的不同作用域中具有很强的适用性。所指定的证书应为 PEM 格式,这是 SSL 证书的标准格式,确保与 SSL/TLS 协议的兼容性。客户端证书通常会伴随一个私钥,该私钥通过 `proxy_ssl_certificate_key` 指令设置,以便与后端服务器建立安全连接。 必须确保证书文件对运行 NGINX 进程的用户可正确读取。如果由于权限问题导致 NGINX 无法访问证书文件,则会导致启动或重载失败,从而中断服务。此外,可能还需要与该指令一起配置 SSL 会话设置以获得最佳性能和安全性,例如指定 SSL 协议和密码套件,以完全保护通信通道。
配置示例
location /api {
proxy_pass https://backend.example.com;
proxy_ssl_certificate /etc/ssl/certs/client-cert.pem;
proxy_ssl_certificate_key /etc/ssl/private/client-key.pem;
}确保证书文件为 PEM 格式;否则 NGINX 将无法使用它。
检查证书文件的权限以确保 NGINX 用户可以读取它;权限不当可能导致启动错误。
记得还要指定 `proxy_ssl_certificate_key` 指令来提供客户端证书对应的私钥。
说明
`proxy_ssl_certificate_key` 指令定义了与用于与上游服务器建立安全代理连接的 SSL 证书关联的私钥的文件路径。这在 NGINX 作为反向代理、终止 SSL 并将请求转发到后端服务的场景中尤为重要。通过提供正确的私钥路径,NGINX 能以证书向上游服务器证明自身,从而确保通过 SSL/TLS 的安全通信。 `proxy_ssl_certificate_key` 指令可用于诸如 `http`、`server` 和 `location` 等上下文。它接受一个参数:私钥文件的路径。如果你的配置使用启用 SSL/TLS 的上游,包含此指令对于确保代理连接安全是必需的。私钥文件应可被 NGINX 进程读取,并应妥善保护以防止未授权访问。 当指定此指令时,通常需要与 `proxy_ssl_certificate` 指令配合使用,后者指定对应的 SSL 证书文件。两者都是在代理配置中启用 SSL 通信的重要组成部分。正确配置这些指令对于在传输过程中保持数据的机密性和完整性至关重要,尤其是在处理敏感信息或安全 API 时。
配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
proxy_ssl_certificate_key /etc/nginx/ssl/example.key;
location / {
proxy_pass https://backend-server;
}
}确保私钥文件对 NGINX 用户可读。
请确保使用与 SSL 证书对应的私钥的正确路径。
如果私钥被加密,可能需要额外配置以便进行口令管理。
说明
`proxy_ssl_certificate_cache` 指令用于 NGINX 配置中,用来指定在建立被代理的 SSL 连接时如何缓存 SSL 客户端证书。该指令可以显著提升性能,通过避免在新连接上反复加载证书所带来的开销。该指令接受最多三个参数,用于定义缓存的大小和缓存机制的超时设置。第一个参数设置缓存大小(以字节为单位),而第二个和第三个可选参数定义证书在缓存中保留的超时参数。 设置后,NGINX 会存储用于代理到后端服务器的客户端证书。正确理解缓存大小和超时设置至关重要,因为错误的配置可能导致过高的内存使用或频繁的缓存未命中,从而降低性能。同样重要的是,这些行为依赖于上下文;该指令可以放在 `http`、`server` 或 `location` 上下文中,以便根据不同的路由或处理规则提供细粒度的缓存控制。 要建立基本的缓存,管理员可以将缓存大小定义为 10 MB 或更大,并根据预期的使用模式设置适当的超时时间。在生产环境中监控缓存的有效性是必要的,因为客户端连接的高度可变性可能需要调整这些参数。
配置示例
http {
proxy_ssl_certificate_cache 10m 30s;
}确保缓存大小设置得当,以防止内存溢出。
根据证书预计的使用频率设置超时,以在不占用过多内存的情况下提高性能。
将指令放在正确的上下文(http、server、location)中对于实现预期行为至关重要。
说明
`proxy_ssl_password_file` 指令用于定义一个文件,该文件包含在 NGINX 作为反向代理时用于 SSL 客户端认证的私钥密码。具体来说,当 NGINX 必须使用用密码保护的 SSL 客户端证书向后端服务器进行身份验证时,此指令非常有用。 指定此指令后,NGINX 在向上游服务器发起 SSL 连接时会从所提供的文件中读取密码。在需要处理敏感操作且手动输入凭据不现实的场景中,这对于实现安全和自动化流程至关重要。该指令通过整合必要的密码安全处理和自动检索,帮助简化整体架构中的更高层次安全协议,以支持 SSL 通信。 需要注意的是,密码文件应安全存储并设置受限权限,以确保未授权用户无法访问潜在的敏感信息。此外,`proxy_ssl_password_file` 指令可以在多个上下文中使用,例如 `http`、`server` 和 `location`,从而根据配置层级对 SSL 密码管理进行更精细的控制。
配置示例
http {
server {
location /example {
proxy_pass https://backend;
proxy_ssl_certificate /path/to/client_certificate.crt;
proxy_ssl_certificate_key /path/to/client_key.key;
proxy_ssl_password_file /path/to/password_file.txt;
}
}
}确保密码文件的权限设置安全,以防止未授权访问。
路径必须指向有效的文件;否则,NGINX 在启动时会抛出错误。
如果该文件包含敏感信息,请确保对其进行适当加密或以其他方式保护,以保持机密性。
说明
`proxy_ssl_conf_command` 指令允许用户在 NGINX 作为反向代理时为 SSL 专门设置配置参数。它接受两个参数:命令名称和命令值。此功能使得可以按代理定制 SSL 参数,允许对 SSL 行为(例如验证设置)进行调整并应用于特定的上游服务器,而不是在所有连接上全局生效。 命令名称必须对应于 OpenSSL 库中有效的 SSL 配置命令,命令值是该命令的参数。该指令可在 `http`、`server` 和 `location` 上下文中使用,根据服务器块的结构和请求的具体路由,具有很强的灵活性。值得注意的是,这可以增强与上游服务器的 SSL 握手的安全性和性能,从而为 NGINX 使用 SSL/TLS 与后端服务交互提供更细粒度的控制。
配置示例
location /example {
proxy_pass https://backend;
proxy_ssl_conf_command 'SomeSSLCommand' 'SomeValue';
}确保 NGINX 使用的 OpenSSL 版本支持该 SSL 命令。
错误的命令名称或值可能导致运行时错误。
使用该指令需要对 OpenSSL 命令有充分了解,否则可能导致配置错误。
过多的 SSL 命令配置如果管理不当,可能会降低性能。
说明
'random_index' 指令在 location block 中使用,用于修改目录列表的行为。当该指令设置为 'on' 时,NGINX 将从指定目录中随机选择一个文件进行提供,而不是以静态顺序列出所有可用文件。这在目录包含大量文件的场景中尤其有用,能够使用户在多次访问中遇到不同的文件,从而在某些情况下改善浏览体验。 'random_index' 的语法很简单,只接受一个标志参数(flag argument)。该指令在请求目录时会影响内部处理器的输出,并在 location block 的上下文中进行评估。它有助于降低文件提供的可预测性,可能有利于在更偏好动态结果而非静态文件列表的内容交付策略中使用。实际上,将 'random_index' 集成到配置中只需将其添加到服务器配置中的相应 location block 即可。 一个重要的注意事项是,只有在启用了目录索引(通常通过 'autoindex' 指令)时,该指令才会生效。因此,它与其他指令协同工作,确保伴随配置的正确设置对于实现所需功能至关重要。
配置示例
location /files {
autoindex on;
random_index on;
}确保已启用 'autoindex';否则 'random_index' 将无法工作。
如果用户频繁刷新,随机文件选择可能导致意外行为。
说明
`set_real_ip_from` 指令用于 NGINX 中定义一系列受信任的地址。这些地址在服务器位于反向代理或负载均衡器之后时用于识别客户端的真实 IP 地址。该指令对于确保基于真实客户端 IP(而非反向代理或负载均衡器的 IP 地址)的日志记录、分析和访问控制的准确性至关重要。 该指令通过允许你指定一个或多个 IP 地址或 CIDR(无类域间路由)网段作为受信任的来源来工作。收到请求时,NGINX 会将源地址与该列表进行比对。如果请求来自列出的某个地址,NGINX 将信任包含真实客户端 IP 的 `X-Forwarded-For` 或 `X-Real-IP` 头。否则,NGINX 将使用连接的原始源 IP 地址。 该指令可以放在 `http`、`server` 或 `location` 上下文中,提供配置上的灵活性。这在 NGINX 用作网关或反向代理的环境中尤其有用,尤其是当上游代理也配置为转发真实客户端 IP 时。
配置示例
http {
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 10.0.0.1;
real_ip_header X-Forwarded-For;
}如果未正确配置此指令,您的日志中可能会记录错误的 IP 地址。
请确保仅指定受信任的 IP 范围;否则,可能会使您的应用程序暴露于 IP 欺骗攻击。
使用多个 `set_real_ip_from` 语句可能会导致混淆;务必清楚地记录它们的用途。
说明
`real_ip_header` 指令用于定义当 NGINX 服务器位于反向代理或负载均衡器之后时,哪个 HTTP 头应包含客户端的真实 IP 地址。该指令对于准确记录和处理客户端请求非常重要,因为它允许 NGINX 提取原始客户端 IP,而不是转发请求的代理的 IP。 配置后,NGINX 会检查传入请求中指定的头,并使用其中的值替换从 socket 得到的值。这在存在多个代理的场景中特别有用,能够确保应用正确识别最初发起请求的客户端 IP。 该指令接受单个参数,通常是像 `X-Forwarded-For`、`X-Real-IP` 或您基础设施使用的自定义头这样的头。该指令可以放置在 `http`、`server` 或 `location` 上下文中,根据您的架构提供灵活性。
配置示例
http {
real_ip_header X-Forwarded-For;
}确保代理或负载均衡器配置为发送用于真实客户端 IP 的正确 HTTP 头部。
不正确的配置可能导致伪造,使不受信任的客户端能够将该头部设置为任意值。
使用多个反向代理可能需要为头部转发进行额外配置。
说明
`real_ip_recursive` 指令告诉 NGINX 在存在 `X-Forwarded-For` 或 `X-Real-IP` 头时,递归地遍历受信任地址列表以查找真实的客户端 IP。 这在使用多级代理的场景中特别有用,可让 NGINX 检索客户端的原始来源 IP。当启用时,如果该头包含多个 IP 地址,NGINX 会解析这些地址并根据其受信任代理的配置确定客户端的实际 IP。 当将 `real_ip_recursive` 指令设置为 'on' 时,NGINX 会将头部值与指定的受信任地址进行比对,只有当匹配其中某个地址时才替换客户端的真实 IP。相反,如果该指令设置为 'off',NGINX 将仅使用直接客户端的 IP 地址,忽略通过其他代理的进一步处理。该行为对于确保在分布式架构(例如负载均衡环境)中访问控制和日志能够准确反映真实客户端来源至关重要。
配置示例
http {
set_real_ip_from 192.168.1.0/24;
real_ip_recursive on;
}确保使用 `set_real_ip_from` 正确配置受信任的 IP 地址。配置不当可能导致客户端的 IP 被错误识别。
在存在多个代理的环境中,未启用此指令可能会导致记录的 IP 或用于访问控制的 IP 错误。
说明
`valid_referers` 指令用于指定一组可以访问你 NGINX 配置中某个资源或位置的有效 referer URL。当对某个资源发起请求时,NGINX 会将 HTTP `Referer` 头与指定的有效 referer 列表进行比对。如果 referer 不在指定列表中,依据配置的行为(通常通过 `deny` 指令)可能会拒绝该请求。 该指令接受多个参数,允许你根据需要指定任意数量的有效 referer 模式。referer 可以指定为完全限定的域名、使用通配符的模式(例如 `*.example.com`),或者是 IP 地址。如果 referer 未列出或不匹配任何已定义的模式,NGINX 可以根据 referer 的存在与否配置为允许或拒绝该请求。 通常与 `deny` 和 `allow` 指令配合使用,`valid_referers` 在基于请求来源控制访问方面非常重要,有助于防止盗链或对资源的未授权访问。
配置示例
location /protected {
valid_referers none blocked;
valid_referers https://www.example.com https://example.com;
# Optionally deny requests without a valid referer
if ($invalid_referer) {
return 403;
}
}在使用通配符时要小心,因为它们可能无意中匹配到比预期更多的 URL。
确保已为没有 referer 的请求配置好处理,尤其是在将 'blocked' 作为参数时。
如果希望在没有 referers 的情况下允许访问,请记得包含 'none'。
说明
`referer_hash_max_size` 指令在 NGINX 中用于定义用于存储来自传入请求的 referer 信息的哈希表的最大大小。该指令在内存管理和与 referer 处理相关的性能调优中起重要作用。当客户端发出请求时,NGINX 可以将其 referer 用于访问控制或记录目的。该哈希表本质上是 NGINX 在运行期间维护的一组已存储的 referer。 为 `referer_hash_max_size` 设置的值决定了哈希表可以容纳多少条条目。如果超过最大大小,NGINX 可能会开始移除使用最少的条目或阻止添加新条目,这可能会影响使用 referer 信息的应用。将表大小设置为合适的值可以帮助避免性能下降,尤其是在应用具有大量不同 referer 值时,因为这可确保查找保持高效。 该指令可以在 `server` 和 `location` 上下文中设置,允许基于不同的虚拟主机或特定 URL 路径对 referer 处理进行细粒度控制。建议通过分析访问日志并根据观测到的 referer 数据多样性调整该值,以优化内存使用并保持性能。
配置示例
http {
referer_hash_max_size 64;
}将值设置得非常低可能会导致合法的 referer 请求在超过存储限制时被忽略。
将此值增加过多可能会导致不必要的内存消耗。
请确保不要在不适当的上下文中设置此指令,以避免配置错误。
说明
`referer_hash_bucket_size` 指令是管理 NGINX 中 referer 头存储的一个重要配置选项。它决定用于存储 referer 的哈希表的桶大小,这在高流量环境中特别有用,因为请求头的大小会显著影响性能。通过优化桶大小,可以提高哈希函数查找的效率,尽量减少冲突,确保 referer 条目更快地被处理。 该指令可以在 `http`、`server` 或 `location` 上下文中设置,根据应用需求提供灵活配置。指定的值应为 2 的幂,或接近适合预期 referer 数量的最优大小。为了获得最佳性能,该值必须根据系统架构和预期流量模式谨慎选择,因为不当的值可能导致内存使用增加或哈希表操作效率低下,从而影响整体性能。 在分析服务器性能后调整此指令可能至关重要,尤其是遇到大量唯一 referer 头时。`referer_hash_bucket_size` 在 referer 处理相关的内存管理和响应速度方面发挥着关键作用,增强了 NGINX 作为 Web 服务器的稳健性。
配置示例
http {
referer_hash_bucket_size 128;
}
将桶大小设置得过小可能导致哈希冲突,从而降低性能。
为了获得最佳效率,值理想情况下应为2的幂。
在高流量已经建立后未经充分测试就更改此值可能会影响在线服务。
说明
`rewrite` 指令在 NGINX 中用于根据特定的正则表达式模式更改传入请求的 URI。该指令在 URL 重定向或重写 URL 以实现更简洁、用户友好的访问时尤其有用。该指令接受两个或三个参数:第一个是将与传入请求 URI 匹配的正则表达式模式,第二个是用于替换以更改 URI 的替换字符串,可选的第三个参数指定标志,该标志决定重写是在当前请求上下文中执行还是导致新的请求(也称为重定向)。 当执行 `rewrite` 指令时,NGINX 会将传入请求的 URI 与指定的正则表达式进行匹配。如果匹配成功,它会将匹配的部分替换为替换字符串,从而有效地改写 URI。如果使用了像 `last`、`break` 或 `redirect` 这样的重定向标志,NGINX 将根据该标志的行为处理后续流程。例如,`last` 将停止处理重写并继续使用新的 URI,而 `break` 将停止处理当前指令集,`redirect` 将发送 302 响应,强制客户端跳转到新的 URI。 错误配置的正则表达式或不正确使用标志可能导致意外行为或循环重写,因此在使用此指令时需要对语法和逻辑给予谨慎的注意。
配置示例
rewrite ^/oldpath/(.*)$ /newpath/$1 permanent;
请确保 regular expression 能准确匹配目标 URI,因为过于复杂的模式会导致性能下降。
使用 `redirect` 标志会触发完整的客户端 redirect,这可能不适合用于 internal rewrites。
应注意避免无限 rewrite 循环,确保 rewritten URI 不会再次匹配 rewrite rule。
说明
指令 `return` 是 NGINX 的一个多用途功能,允许你在服务器或 location 块的不同上下文中发送 HTTP 响应。它可以接受一或两个参数:第一个参数指定 HTTP 状态码(例如 200、404、301),可选的第二个参数可以提供用于重定向的 URL。当该指令执行时,会立即终止请求处理,丢弃后续的任何配置或处理步骤。这样可以在不需要复杂配置或逻辑的情况下简化响应。 如果只提供了状态码而没有 URL,则会向客户端返回带有指定状态码的简单响应。如果需要重定向,你可以像 `301`(永久移动)这样指定状态码,并提供新的 URL。该指令在给定上下文中处理,但在条件语句(即在 `if` 块内)中使用时也可以与其他指令链式组合。将 `return` 与条件结合,可以根据请求参数或头部实现更灵活的响应行为。
配置示例
location /old-path {
return 301 https://example.com/new-path;
}
location /not-found {
return 404;
}在 `if` 指令内部使用 `return` 时,如果结构不当,可能产生意外行为。注意 NGINX 对 `if` 块的处理方式。
当使用带相对路径的重定向时,确保 URL 以 `http://` 或 `https://` 开头,以避免不期望的行为,因为相对路径可能导致本地重定向,从而使客户端混淆。
说明
'break' 指令用于 NGINX 配置中的 location 或 if 块内,以停止对所有后续 rewrite 规则或嵌套 location 块的评估。触发时,它会有效地改变 request 处理的流程,使管理员能够控制请求是否应继续沿额外规则或处理器的路径执行。该指令对于基于特定条件(例如 URI 状态或请求参数)实现条件逻辑非常有用。 当在处理 request 的过程中遇到 'break' 指令时,NGINX 服务器会停止评估在相同上下文中跟随它的任何后续 rewrite 指令。调用 'break' 后,NGINX 会继续处理当前的配置块,但可能跳过其他已定义的行为或处理器,这些行为或处理器可能会影响当前的 request。它以受控的方式作为处理的突然终止,从而在复杂的 NGINX 配置中实现简化和清晰。 需要注意的是,'break' 指令不返回任何值,也不接受任何参数。它严格是一条修改控制流的命令。在配置文件中正确使用它不需要任何直接的参数或表达式,使其实现简单明了。然而,它主要适用于存在多个嵌套指令的场景,例如复杂的 location 匹配情形。
配置示例
location /example {
if ($arg_param = 'stop') {
break;
}
# Further processing can go here
}在嵌套的 if 块中使用 'break' 可能导致复杂的控制流,从而难以调试。
'break' 指令不会停止整个服务器配置处理,只会影响当前的请求周期。
将 'break' 放在意想不到的位置或上下文中,可能导致请求处理产生非预期的行为。
说明
'if' directive 在 NGINX 中是一个强大的控制结构,通过根据指定条件的求值来执行一组配置指令,从而实现条件化的配置。它可用于 server 和 location 上下文,这使得它在控制对特定资源或路径的访问或行为时非常灵活。语法使用布尔表达式来检查条件,如果表达式求值为 true,则块内的指令将被执行。可用的条件包括多种请求参数,例如头部、请求方法和客户端 IP 地址。 使用 'if' directive 时,必须确保条件构造正确,因为不当的配置可能导致意外行为。该指令可以包含嵌套或顺序的 'if' 块序列,这会进一步使逻辑流程复杂化。每个 'if' 块可包含多个在条件成立时执行的指令。然而,使用 'if' directive 时应格外谨慎,尤其要注意它与其他指令的交互,滥用可能导致配置问题或效率低下。一个常见的用例是拒绝某些 IP 区段的访问或根据头部或其他条件重定向请求。
配置示例
if ($http_user_agent ~ MSIE) {
return 403;
}
if ($remote_addr = 192.168.1.1) {
access deny;
}嵌套的 'if' 语句可能导致意外行为,应谨慎使用。
在 location 上下文中使用 'if' 可能对请求处理产生意想不到的影响。
基于 variables 的条件应仔细评估,以避免始终为 true/ false 的结果。
说明
'set' 指令在 NGINX 中允许你创建或修改变量。该指令可以在多个上下文中使用,例如 'server'、'location' 以及这些上下文中的 'if' 语句。语法由两个参数组成:第一个是变量名(以 $ 符号开头),第二个是要赋给该变量的值。例如,使用 'set $my_var 'some_value';' 会创建一个名为 'my_var' 的变量,其值为 'some_value'。该值可以是字符串、其他变量的拼接,或由 NGINX 的变量和设置派生的值。 'set' 指令的行为确保在指定的上下文中任何地方都可以访问已定义的变量,包括嵌套的配置中。需要注意的是,一旦变量被设置,后续的 'set' 指令可以改变其值,但这些更改仅在声明它们的上下文中生效。可以在 http 上下文中定义全局变量,而本地变量则限定在 'location' 或 'server'。除此之外,由于缺乏持久化存储,在一次请求中对变量所做的任何修改都不会影响另一请求,从而确保了请求隔离。
配置示例
set $my_var 'hello world';
server {
listen 80;
location / {
set $my_var 'example';
return 200 "$my_var";
}
}在 'if' 上下文中设置的变量可能具有有限的作用域,并且在该上下文之外可能无法按预期工作。
在变量名中使用带有 '$' 符号的正确语法很重要;忘记使用会导致配置失败。
确保变量名不要与内部 NGINX 变量冲突,以避免出现意外行为。
说明
rewrite_log 指令是 NGINX HTTP Core 模块的一部分,用于记录与请求重写处理相关的详细信息。当启用时,它可帮助开发人员和系统管理员通过提供对重写引擎操作的洞察来调试复杂的重写规则。这对于识别重写规则中的问题尤为有用,例如错误的重定向或 URL 处理中的意外行为。 该指令接受一个 flag 参数,将其设置为 'on' 可启用日志记录,设置为 'off' 则禁用。生成的日志包括每次重写周期的条目,以及正在应用的条件和替换。该功能通常在配置的开发和测试阶段使用,因为增加的冗长输出如果在生产环境中保持开启,可能导致性能下降。 当将其放置在适当的上下文(http、server、location 或这些上下文内的 if 语句)时,它会专门控制这些块的日志输出。但是,应谨慎使用,因为记录每个重写过程会迅速填满日志文件,并可能导致 I/O 开销。
配置示例
server {
listen 80;
server_name example.com;
rewrite_log on;
location /old-page {
rewrite ^/old-page/(.*) /new-page/$1 last;
}
}启用 rewrite_log 会增加日志文件的详细程度,这可能影响性能并导致生产环境中日志文件变得很大。
如果启用了 rewrite_log,请确保已设置日志轮换,以防止过度的磁盘使用。
说明
'uninitialized_variable_warn' 指令在 NGINX 中用于启用或禁用在访问未初始化变量时触发的警告。当该指令设置为 'on' 时,NGINX 会在错误日志中为在指令指定的配置块作用域内使用的每个未初始化变量记录一条警告信息。这在配置文件的开发和调试期间尤其有用,能确保与变量使用相关的潜在问题引起管理员的注意。 该指令有两个状态:'on' 和 'off'。当为 'on' 时,NGINX 会记录警告;当为 'off' 时,则不会为未初始化变量记录警告。该指令的作用域允许在多个层级定义,包括 'http'、'server'、'location',甚至在这些上下文中的 'if' 条件内。因此,用户可以根据 NGINX 配置的不同部分控制与未初始化变量相关的错误日志详细程度。 需要注意的是,将此指令设置为 'on' 可能会增加日志的详细程度,如果生成大量警告可能导致错误日志杂乱。用户在决定启用或禁用该指令时,应考虑其日志策略以及这些警告是否对其日常运行有用。
配置示例
http {
uninitialized_variable_warn on;
server {
location / {
# Other configurations
}
}
}将值设置为 'on' 可能在许多变量未初始化时生成大量日志条目,可能淹没错误日志。
在 'if' 语句中使用可能导致意外行为,尤其是在未正确理解该指令的作用域时。
说明
`scgi_pass` 指令在 NGINX 中用于将请求传递到 SCGI(Simple Common Gateway Interface,简单通用网关接口)后端。它通常用于将 HTTP 请求路由到通过 SCGI 协议通信的 Web 应用。当请求匹配定义了 `scgi_pass` 的 `location` 块时,NGINX 会创建一个 SCGI 请求,并将传入的 HTTP 数据转发到指定的 SCGI 服务器。 使用 `scgi_pass` 可以有多种配置。该指令的参数是 SCGI 服务器的地址,可以指定为 IP 地址和端口(例如 `127.0.0.1:4000`)或 Unix 套接字地址(例如 `unix:/var/run/scgi.sock`)。随后 NGINX 会根据目标服务器的要求构造 SCGI 请求,发送必要的头部并保持连接,直到收到响应或请求超时。 `scgi_pass` 可以放在 `location` 块内,甚至放在这些 `location` 块内的条件 `if` 块中,从而根据 URI 或其他条件灵活地路由请求。通常也会将它与其他指令结合使用以获得附加功能,例如缓冲或请求超时控制。
配置示例
location /app {
scgi_pass 127.0.0.1:4000;
include scgi_params;
}确保 SCGI 服务器正在运行,并且可从 NGINX 访问。
使用错误的协议(例如 HTTP 而不是 SCGI)可能导致通信错误。
如果使用 Unix sockets,请确保 socket 权限允许 NGINX 用户访问它。
说明
`scgi_store` 指令用于指定一个文件路径,用于保存来自 SCGI 服务器的响应主体。这对于缓存或调试特别有用,在需要对响应数据进行分析或后续访问时尤其如此。当设置此指令时,NGINX 会在将响应发送给客户端之前,将响应主体保存到指定的文件中。文件名可以使用变量动态定义,从而为存储过程增加灵活性。 `scgi_store` 指令接受单个参数,即用于存储响应主体的输出文件路径。如果指定的文件已存在,存储新响应主体之前将截断该文件。该指令在多个上下文中受支持,包括 `http`、`server` 和 `location`,这使其在 NGINX 配置的不同作用域中具有灵活性。此外,必须为指定的存储路径设置适当的权限,确保 NGINX 工作进程对该位置具有写权限。 在使用此指令时,考虑将其与 `scgi_pass` 指令一起使用以建立到 SCGI 后端的连接。由于它可能涉及文件系统操作,因此应考虑性能影响,特别是在响应较大或频繁时,因为这可能导致文件 I/O 在高流量场景中成为瓶颈。
配置示例
location /scgi {
scgi_pass 127.0.0.1:4000;
scgi_store /var/www/html/scgi_response.txt;
}确保 NGINX 的工作进程有权限写入指定的存储路径。
覆盖现有文件可能导致数据丢失;请确保已采取适当的文件管理措施。
通过变量动态生成的文件名应进行充分测试,以避免文件系统问题。
说明
`scgi_store_access` 指令在 NGINX 中用于管理对由 SCGI 响应创建的文件的访问权限。该指令可对哪些客户端地址被允许或被拒绝访问存储的文件提供细粒度的控制。您可以指定由 'allow' 和 'deny' 指令组成的一到三个访问控制规则,以基于客户端的 IP 地址或 subnet mask 来允许或限制访问。 该指令的工作方式是先评估传入请求的客户端地址,然后按定义的顺序应用这些规则。如果某条 'allow' 规则匹配客户端地址,则授予访问;如果某条 'deny' 规则匹配,则阻止访问。如果没有找到匹配规则,则应用默认的访问控制策略。此行为对于维护安全性并确保敏感文件仅被授权用户访问至关重要。规则按顺序处理,从而允许根据组织的需求进行细致的访问管理。
配置示例
location /some/location {
scgi_pass 127.0.0.1:9000;
scgi_store on;
scgi_store_access allow 192.168.1.0/24;
scgi_store_access deny all;
}确保根据你的访问控制策略同时定义 allow 和 deny 规则;否则,客户端可能会被无意中锁定。
IP 地址中的子网表示法不正确可能会导致访问被错误地授予或拒绝。
确保启用 scgi_store 指令以使访问规则生效,因为这些规则仅在响应存储处于激活状态时适用。
说明
'scgi_buffering' 指令控制 NGINX 在将来自 SCGI (Simple Common Gateway Interface) 服务器的响应发送给客户端之前是否进行缓冲。默认情况下,NGINX 会对这些响应进行缓冲,这可以通过一次性发送完整的响应数据来提高性能。如果启用了缓冲且响应大于配置的缓冲区大小,NGINX 会在超过该限制时将数据写入临时文件。相反,如果禁用缓冲,NGINX 会在从 SCGI 服务器接收到数据时立即将响应流式传输给客户端,这对于需要低延迟且响应较长或流式传输的应用是有利的。该指令接受一个标志参数,其值可以是 'on' 或 'off'。
配置示例
server {
location /app {
scgi_pass 127.0.0.1:9000;
scgi_buffering off;
}
}禁用缓冲可能会在高负载下导致性能下降,因为流式响应可能不如缓冲的响应高效。
当禁用缓冲时,确保 SCGI 服务器能够处理 NGINX 发送的即时响应。
说明
`scgi_request_buffering` 指令用于指定是否启用或禁用对 SCGI 请求体的缓冲。当启用缓冲(设置为 `on`)时,NGINX 会在将请求体传递给 SCGI 服务器之前将整个请求体读取到内存中。这可以通过让 NGINX 在一次操作中处理请求体来提升性能。但是,这也会增加内存使用,因为较大的请求体可能会超出可用内存限制,或在大量并发请求时消耗过多资源。 当禁用缓冲(设置为 `off`)时,NGINX 会在接收时将请求体分块传递给 SCGI 服务器。这可以将内存使用降到最低,适用于客户端发送大量数据的场景(例如文件上传),因为它允许服务器在开始接收数据后立即开始处理。为该指令选择合适的设置取决于应用的特性及所处理请求的类型。 该指令可在多个上下文中使用,包括 `http`、`server` 和 `location`,允许基于特定路由或处理规则进行灵活配置。正确使用 `scgi_request_buffering` 对于优化资源管理并保证应用的响应性能至关重要。
配置示例
location /scgi {
scgi_pass 127.0.0.1:4000;
scgi_request_buffering off;
}如果存在内存限制,可能需要禁用缓冲,但要注意这会影响性能。
不正确地设置此指令可能会导致意外结果,尤其是在那些依赖在发送任何响应之前处理整个请求体的应用程序中。
说明
在 NGINX 配置中,`scgi_ignore_client_abort` 指令用于指定当发往 SCGI 后端的请求在处理过程中客户端连接中断时服务器的行为。将其设置为 'on' 时,NGINX 会继续处理该请求并向后端服务器响应,即使客户端已断开连接。这在后端处理不应受到不再感兴趣的客户端影响的场景中很有用,可改善后端服务器的资源利用率。将其设置为 'off' 时,NGINX 在检测到客户端中止连接后会停止处理该请求,这可以减少资源使用,但可能导致在客户端过早断开连接的请求出现后端处理不完整的情况。 该指令接受单一参数,'on' 或 'off',使用户可以轻松切换该行为。它可放置在 'http'、'server' 或 'location' 上下文中,根据所需配置范围提供灵活性。评估此指令与 NGINX 配置中的其他设置(特别是与请求处理和后端响应管理相关的设置)如何互相作用是很重要的。
配置示例
server {
listen 80;
location /scgi {
scgi_pass backend;
scgi_ignore_client_abort on;
}
}将此指令设置为 'on' 可能会在大量客户端中断连接时给后端带来不必要的负载。
确保后端能够在没有客户端反馈的情况下处理请求,因为它可能无法正确处理不完整的请求。
说明
`scgi_bind` 指令定义了 NGINX 用来与 SCGI 应用服务器通信的网络地址和端口。该指令对于配置传入的 SCGI 请求如何路由到相应的后端服务器至关重要。它可以接受 IP address 或 Unix socket path,从而为服务器拓扑提供灵活性。 需要注意的是,该指令可以在 `http`、`server` 或 `location` 上下文中指定,并且可以接受一个或两个参数。第一个参数是必需的,表示要绑定的地址;可选的第二个参数用于指定端口号。如果只提供一个参数且该参数是 Unix 套接字,则不需要端口号。另外,显式指定端口号对于 TCP/IP 通信很重要,以确保 SCGI 服务器在正确的端点可达。 在使用 `scgi_bind` 时,请确保所绑定的地址未被占用,并为 Unix 套接字文件设置适当的权限,因为这些文件会强制执行文件系统权限。配置错误可能导致连接失败或服务无法访问。
配置示例
server {
listen 80;
location / {
scgi_pass 127.0.0.1:4000;
scgi_bind 127.0.0.1 4000;
}
}确保指定的端口未被其他服务占用。
使用 Unix sockets 时,确保 socket 文件的权限已为运行 NGINX 的用户正确设置。
说明
'scgi_socket_keepalive' 指令用于 NGINX HTTP 核心模块中,管理 SCGI (Simple Common Gateway Interface) 协议的 keep-alive 连接。将此指令设置为 'on' 时,允许 SCGI 套接字与客户端保持打开的连接,从而使同一套接字可被重用于多个请求。这样可以通过减少连接开销来提升性能,尤其适用于频繁与 SCGI 后端服务器交互的应用。相反,若设置为 'off',每个请求都会建立新的连接,这可能由于连接建立和拆除的开销而增加延迟。 该指令可放置在 'http'、'server' 或 'location' 上下文中,根据应用需求提供灵活配置。一个常见用例是在用于提供由 SCGI 应用生成的动态内容的 location 中,在高流量场景下保持连接可能改善吞吐量并减少资源消耗。重要的是,该指令与所有 SCGI 命令兼容。 Keep-alive 设置会显著影响后端通信行为。因此,在启用此功能时,建议监控应用的流量模式和性能指标,因为如果大量连接同时被保持,可能会导致资源利用增加。
配置示例
location /app {
scgi_pass 127.0.0.1:4000;
scgi_socket_keepalive on;
}确保后端 SCGI 服务器支持 keep-alive 连接。
如果在没有适当的负载均衡策略的情况下使用 keep-alive,可能导致资源耗尽。
注意,如果太多连接长时间保持 keep-alive,可能会导致内存使用增加。
说明
`scgi_connect_timeout` 指令指定与 SCGI 服务器建立连接的超时时间。这是一个关键设置,用于确定 NGINX 在认为连接失败之前会等待多长时间以建立连接。如果在指定的超时时间内未能建立连接,NGINX 会向客户端返回错误。该超时以秒为单位设置,可以用纯数字表示,也可以使用包含时间单位的更可读格式(例如 '1s'、'100ms')。该指令可用于多个上下文,包括 `http`、`server` 和 `location` 块。 理解为 `scgi_connect_timeout` 设定合适的值对于确保应用保持响应性至关重要。过低的值可能会在高负载期间或当 SCGI 服务器压力较大时导致频繁的连接超时。相反,设置过高可能会导致延迟增加,尤其是在 SCGI 服务器宕机或无法访问时。管理员应监控服务器性能和连接成功率以确定最佳超时设置。可根据所使用的 SCGI 应用的特性和网络状况进行调整。
配置示例
http {
server {
location / {
scgi_pass 127.0.0.1:9000;
scgi_connect_timeout 5s;
}
}
}将超时设置得过低可能会在高流量期间或服务器负载较重时导致不必要的错误。
如果 SCGI 服务器无响应或连接缓慢,较高的超时可能会导致客户端响应变慢。
说明
'scgi_send_timeout' 指令指定向 SCGI (Simple Common Gateway Interface) 服务器发送请求的时间限制。该超时在 NGINX 作为反向代理对接 SCGI 后端的场景中非常重要。如果超过指定的时间限制,NGINX 将关闭与 SCGI 服务器的连接,从而终止该请求。该超时从 NGINX 开始发送数据的时刻开始计算,直到成功发送完所有请求的数据为止,因此在处理可能阻塞的长时间运行的请求或响应时至关重要。 该指令可以在 'http'、'server' 或 'location' 上下文中定义,从而允许在服务器配置中以不同的粒度级别灵活配置超时策略。该指令的参数为时间值,可以用多种格式表示,包括秒、分钟或二者组合,使用类似 's'、'm' 等后缀。管理员可以配置此指令以防止 SCGI 服务器无响应,从而优化资源使用,避免 NGINX 无期限等待可能永远不会到来的响应。 在设置超时时间过低时应谨慎,因为这可能导致对有效的、长时间运行的请求过早断开连接。相反,设置过高则可能导致不必要的资源消耗。建议在确定合适的超时值时考虑应用负载的性质和 SCGI 服务器的性能。
配置示例
location /api {
scgi_pass backend;
scgi_send_timeout 30s;
}将超时值设置得过低可能导致有效请求过早失败。
确保超时设置与 SCGI 服务器的预期响应时间相一致。
说明
NGINX 中的 `scgi_buffer_size` 指令对管理在进一步处理之前可以从 SCGI 服务器响应中缓冲多少数据至关重要。当 NGINX 与 SCGI 后端通信时,它期望响应以可管理的分块到达。通过指定 `scgi_buffer_size`,您可以控制为该响应初始部分分配的缓冲区,其中包括 SCGI 头部。有效管理该缓冲区大小可以大大影响应用的性能,尤其是在响应大小可变的情况下。 该指令接受一个参数,用于定义缓冲区的大小。如果服务器发送的响应超过该缓冲区大小,NGINX 将根据需要分配额外的缓冲区以容纳整个响应。重要的是要根据对应用产生的 SCGI 响应典型大小的了解来设置此值。缓冲区过小可能导致不必要的内存分配,而过大的缓冲区则可能浪费资源并降低性能。因此,根据实际使用模式调整此参数可以改善资源利用并提高性能稳定性。
配置示例
location /app {
scgi_pass 127.0.0.1:9000;
scgi_buffer_size 8k;
}将缓冲区大小设置得太小可能导致性能问题,因为会频繁进行内存分配。
如果将大小设置得过大,可能会浪费内存资源,尤其是在高负载情况下。
对该指令的更改可能在 NGINX 重新加载或重启之前不会生效,因此需要谨慎的部署实践。
说明
'scgi_pass_request_headers' 指令用于 NGINX 的 SCGI 模块,用来决定是否将来自客户端请求的请求头信息传递给 SCGI 后端服务器。当该指令启用(设置为 'on')时,NGINX 会将这些头转发到后端,这对于依赖这些头进行处理的框架或应用程序可能是必要的。相反,如果设置为 'off',NGINX 将不会向后端发送任何请求头,这在不需要请求头的情况下可能有助于优化性能。 该指令可以在多个上下文中使用,包括 'http'、'server' 和 'location'。默认情况下,该指令设置为 'off'。因此,除非管理员明确指定,否则头部不会被传递给后端 SCGI 服务器,如果这些头对所提供的应用程序至关重要,可能会导致意外行为。因此,在配置此指令时需要谨慎考虑,确保必要的头确实被转发,特别是对于依赖身份验证或特定客户端数据的应用程序。
配置示例
location /scgi {
scgi_pass your_backend;
scgi_pass_request_headers on;
}当后端应用需要特定的请求头时,忘记启用此指令。
在错误的上下文中使用此指令(例如 'if' 条件)可能会导致意外结果。确保将其放在 'http'、'server' 或 'location' 块中。在使用之前,请确保 SCGI 后端已正确配置以处理转发的请求头。
说明
`scgi_pass_request_body` 指令是用于 SCGI 服务器配置的一个标志。启用时,该指令表示应将整个请求主体转发到由 `scgi_pass` 指令指定的 SCGI 服务器。如果该指令被设置为 'off',则不会转发请求主体;在 SCGI 后端不需要请求主体的情况下,这有助于节省资源和带宽。 该指令可以在 http、server 或 location 块的上下文中使用。它接受一个参数(一个标志),可以将其设置为 `on`(传递请求主体)或 `off`(不传递)。当未指定该指令时,默认行为是根据请求的上下文以及其他相关指令的配置决定是否传递请求主体。 在使用该指令时,应仔细考虑 SCGI 应用的需求。有些 SCGI 应用可能需要请求主体进行处理,而另一些则可能不需要。配置错误可能导致 SCGI 后端对请求处理不当,从而引发数据处理或响应生成问题。
配置示例
location /scgi {
scgi_pass http://backend;
scgi_pass_request_body on;
}将 `scgi_pass_request_body` 设置为 `off` 可能导致意外行为,尤其当 SCGI 应用期望有请求体时。
在切换此指令之前,请确保 SCGI 应用在处理请求体方面的兼容性。
说明
`scgi_intercept_errors` 指令用于确定 NGINX 在处理客户端请求时是否应拦截 SCGI 服务器返回的错误响应。当设置为 'on' 时,NGINX 会在内部处理这些错误,并根据其他相关指令(如 `error_page`)的定义,返回适当的错误页面或自定义错误处理逻辑。 从行为上看,将此指令设置为 'off' 会使 NGINX 直接将错误响应原样传回客户端而不作修改。这在希望直接返回来自 SCGI 应用的原始错误信息(例如在调试环境中)时特别有用。相反,启用该指令可以通过提供更友好的错误提示来改善用户体验,并确保特定的错误代码会触发在 NGINX server 块中配置的指定错误响应。该指令与 SCGI 处理配置配合工作,其重要性在于控制来自后端应用到客户端的错误信息流向。
配置示例
location /scgi {
include scgi_params;
scgi_pass 127.0.0.1:9000;
scgi_intercept_errors on;
error_page 404 /404.html;
}确保已定义 `error_page` 指令以在将此指令设置为 'on' 时处理错误。
错误配置相关的 `error_page` 指令在拦截错误时可能导致意外结果。
说明
`scgi_read_timeout` 指令定义了从 SCGI(简化的通用网关接口)服务器读取响应的超时时间。该指令有助于避免在后端 SCGI 服务器响应缓慢或无响应时出现挂起连接,确保如果服务器在指定时间内没有发送数据,资源会被释放。超时时间可以用秒为单位指定,也可以带上 `m` 或 `h` 后缀,分别表示分钟或小时。 当超时发生时,NGINX 将终止与 SCGI 服务器的连接并向客户端返回错误。对于需要保持响应性并限制资源使用的高性能 Web 应用,这一点尤其重要。通过适当配置该指令,可以在为 SCGI 服务器提供足够处理时间与尽量减少终端用户请求延迟之间取得平衡。
配置示例
location /scgi {
include fastcgi_params;
scgi_pass 127.0.0.1:9000;
scgi_read_timeout 30s;
}如果指定的值过低,当 SCGI 服务器响应较慢时,可能会导致有效请求失败。
确保超时设置不超过整体请求超时配置,以避免不一致的行为。
时间格式必须正确指定,例如 '30s' 表示 30 秒。
说明
`scgi_buffers` 指令用于在 NGINX 中优化对 SCGI (Simple Common Gateway Interface) 响应的处理。它指定服务器在将来自 SCGI 服务器的响应传递给客户端之前,用于存储该响应的缓冲区数量及每个缓冲区的大小。通过适当配置缓冲区,可以在内存使用和性能之间取得平衡;较大的缓冲区有助于减少从 SCGI 服务器的读取次数,从而可能加快响应的传递,尤其是对于较大的响应。 该指令接受两个参数:第一个表示缓冲区的数量,第二个表示每个缓冲区的大小。缓冲区按每个请求分配,这意味着较大的数量可以使服务器更高效地处理多个并发连接。但应注意不要分配过多内存,否则可能导致内存消耗增加并出现性能下降。 `scgi_buffers` 指令可在 `http`、`server` 或 `location` 配置段中设置,便于根据应用的扩展需求和特定端点进行灵活配置。该指令与 NGINX 中其他与缓冲区相关的设置互为补充,可与它们一起调优以获得最佳性能。
配置示例
server {
listen 80;
location /app {
scgi_pass localhost:4000;
scgi_buffers 8 16k;
}
}如果将缓冲区大小设置得过小,当数据超过缓冲区大小时可能导致响应不完整。
如果设置过多的缓冲区,可能会导致内存使用增加,尤其在高负载情况下。
说明
`scgi_busy_buffers_size` 指令是一个重要的配置选项,用于确定为尚未发送给客户端的繁忙 SCGI 响应分配的缓冲区大小。在处理 SCGI 请求时,缓冲区非常关键,因为它们允许服务器在等待来自 FastCGI 或 SCGI 上游服务器的响应时高效地管理数据。缓冲区大小会影响服务器在高负载下的性能,尤其是在处理大负载或高请求率时。 当请求正在处理且上游响应未立即发送给客户端时,响应会临时存储在繁忙缓冲区中。`scgi_busy_buffers_size` 设置在指定上下文 (http, server, location) 中为处理请求分配的所有繁忙缓冲区的总大小。如果指定的大小被超出,将会启用其他机制,例如缓冲限制和可能的速率限制。应根据预期负载和服务器通常处理的响应大小来配置该指令,以确保性能保持最佳。 该指令的参数以字节为单位,并可以根据需要取值以适应预期的工作负载。值得注意的是,该指令与其他与 SCGI 相关的设置协同工作,其有效性取决于请求处理、超时和上游服务器行为的整体配置。
配置示例
http {
scgi_busy_buffers_size 32k;
}将缓冲区大小设置得过小可能导致请求丢失或过度缓冲,从而增加延迟。
较大的缓冲区大小会显著增加内存使用,因此需要在性能需求与可用资源之间取得平衡。
说明
在 NGINX 中,`scgi_force_ranges` 指令用于 SCGI 模块中,指定如何处理对部分内容的请求。启用该指令(设置为 'on')后,NGINX 会在 SCGI 响应中按照 HTTP/1.1 关于范围请求的规范,对客户端针对特定字节范围的请求做出响应。这在流媒体场景中特别有用,客户端可能只需获取文件的一部分而无需完整下载。 当 `scgi_force_ranges` 设置为 'on' 时,服务器会检查客户端请求中的 `Range` 头,并尝试解析所指示的字节范围。此行为对媒体文件、大型文档或任何返回全部内容不必要或效率低下的场景都很有用。如果该指令设置为 'off',NGINX 将不会处理客户端的 Range 请求,而是返回完整内容。 该指令可以放置在 `http`、`server` 或 `location` 等不同上下文中,根据所需的部分内容传递范围实现灵活配置。但是,需要确保上游 SCGI 应用也支持范围请求,否则当客户端发起范围请求而上游服务器未正确处理时,可能会出现意外行为。
配置示例
location /example {
scgi_pass 127.0.0.1:9000;
scgi_force_ranges on;
}确保你的 SCGI 应用支持 range requests;否则,此指令将无效。
请记住,如果某些客户端发起 range requests 而服务器未正确处理,它们可能会表现异常。
说明
scgi_limit_rate 指令用于在使用 SCGI 协议时控制发送给客户端的响应带宽速率。这对于管理资源、防止单个客户端占用过多带宽(可能对其他用户造成不利影响)特别有用。通过指定速率,可以确保服务器以受控的速度向客户端发送响应,从而提升整体性能和可靠性。 该指令接受一个参数,用于指定每个时间单位允许发送给客户端的最大数据量。指定的值可以包含单位后缀,例如用于千字节的 "k"、用于兆字节的 "m" 或者
配置示例
location /api {
scgi_pass backend;
scgi_limit_rate 200k;
}确保指定的值以字节为单位,或使用适当的单位后缀。
如果该指令在较低的上下文(例如 location)中设置,它将覆盖较高上下文的设置。
说明
`scgi_cache` 指令用于 NGINX 的 HTTP 服务器或 location 块的上下文中,启用对 SCGI (Simple Common Gateway Interface) 响应的缓存。当该指令设置为指向某个缓存区的路径时,来自上游 SCGI 服务器的所有响应都会被存储到该缓存中,从而在后续请求中降低延迟并减轻后端服务器的负载。缓存行为还可以通过额外的参数和指令进一步控制,例如 `scgi_cache_key`(决定缓存项的索引方式)和 `scgi_cache_path`(指定缓存存储位置和配置)。 该指令与其他 SCGI 相关配置配合工作。例如,指定 `scgi_pass` 将把流量定向到上游 SCGI 服务器,而 `scgi_cache_valid` 则可以根据 HTTP 状态码决定响应可以缓存多长时间。有效管理缓存大小和过期时间对于防止数据陈旧或内存使用过高至关重要。缓存可以显著提高性能,但需要细致的维护以确保有效性。
配置示例
http {
scgi_cache /var/cache/scgi;
server {
location /app {
scgi_pass backend;
scgi_cache my_cache;
scgi_cache_valid 200 1h;
}
}
}确保缓存路径对 NGINX 工作进程可写。
注意缓存失效策略;如果处理不当,可能会提供陈旧的数据。
不要将 'scgi_cache' 与 'proxy_cache' 混淆,它们适用于不同的协议。
说明
`scgi_cache_key` 指令用于为 NGINX 中的 SCGI(读作 'sggi')响应指定自定义缓存键。默认情况下,NGINX 使用基于请求 URI 和其它参数生成的键来在 SCGI 缓存中存储响应数据。自定义缓存键的能力可以通过确保将请求的特定方面或变量用于键生成来优化缓存性能,可能减少缓存未命中并改善响应时间。 该指令接受单个参数,该参数可以是定义键构建方式的字符串或变量。例如,你可以选择包含请求中的特定参数或省略某些不需要用于缓存区分的 URI 部分。通过精心设计缓存键,用户可以根据不同的标准优化要存储的响应,从而更有效地利用缓存内容。需要注意的是,由于缓存直接影响服务器的性能和效率,键应当经过慎重构造以避免意外的缓存冲突。 `scgi_cache_key` 指令在 `http`、`server` 和 `location` 上下文中有效,使其可以在配置的不同层级上使用。如果未指定,NGINX 将回退到其内部的默认键生成机制,这对于某些用例可能并不高效。
配置示例
location /api {
scgi_pass backend;
scgi_cache my_cache;
scgi_cache_key "$request_uri$request_method";
}确保构建的键足够唯一,以防止缓存冲突。
注意变量展开;在某些情况下,变量在键生成时可能不可用。
更改缓存键模式将使现有的缓存项失效。
说明
`scgi_cache_path` 指令在 NGINX 中用于指定 SCGI 响应的缓存位置,允许服务器将 SCGI 响应高效地存储并从该缓存提供服务。该指令接受两个或更多参数:缓存目录的路径、键区域(key zone),以及可选的缓存参数,例如最大大小和空闲时间。第一个参数定义了用于存放已缓存 SCGI 响应的文件系统路径,第二个参数指定 NGINX 用于确定缓存键及其他相关配置的区域。 当请求 SCGI 响应时,NGINX 会先检查已定义的缓存路径以查看响应是否存在。如果存在,则从缓存中提供响应,从而大幅提升响应时间并减轻上游 SCGI 服务器的负载。如果缓存中不存在该响应,NGINX 会将请求转发给上游 SCGI 服务器,在检索响应后将其缓存并同时将其返回给客户端以供后续请求使用。此外,缓存可以通过参数进行配置,这些参数用于指定缓存项的大小限制和过期时间,从而随着时间推移实现高效的内存使用。
配置示例
scgi_cache_path /var/cache/scgi_cache scgi_cache_zone 10m max_size=1g inactive=60m;
确保缓存目录对 NGINX 进程可写。
正确指定缓存区域以避免误配置。
监控缓存大小以防止磁盘占用过多。
说明
`scgi_cache_bypass` 指令用于定义在何种条件下应为特定请求绕过 SCGI 缓存。它接受一个或多个参数,这些参数可以使用变量(例如请求头或服务器变量)来确定是否应忽略缓存。当条件计算为非空值时,响应不会从缓存中提供,而是向 upstream 服务器发送新的请求。这样对于不应缓存的动态内容尤其有用,可确保用户获取最新数据。 该指令在 `http`、`server` 或 `location` 上下文中生效,允许根据应用需求对缓存行为进行细粒度控制。例如,如果你希望对包含特定 cookie 或请求头的请求绕过缓存,则可以使用此指令来指定该条件。在数据频繁变化或与用户相关的场景中,绕过缓存也可以提高性能,避免提供过期内容。 用户应谨慎使用该指令,因为过度绕过缓存可能导致 upstream 服务器负载增加并可能造成性能下降。这需要在缓存与实时访问需求之间进行谨慎的权衡。
配置示例
location /api {
scgi_pass backend;
scgi_cache my_cache;
scgi_cache_bypass $http_cache_bypass;
}在没有适当条件的情况下使用此指令可能导致意外的缓存行为。
如果绕过条件始终为真,就会完全抵消缓存的好处。
请务必在类似生产环境中测试这些条件,以避免性能问题。
说明
在 `http`、`server` 和 `location` 上下文中使用 `scgi_no_cache` 指令,用于指定在何种条件下 SCGI (Simple Common Gateway Interface) 响应不应被缓存。你可以使用该指令来设置需要绕过缓存机制的特定请求条件,从而使针对特定请求的行为更加动态化。 该指令接受一个或多个参数,这些参数可以是变量或用于决定何时禁止缓存的条件。提供的每个条件都会被评估,如果任一条件满足,SCGI 响应将不会被存储在缓存中。此功能在响应可能不稳定或与用户相关的场景中特别有用,例如数据频繁更新或返回敏感信息时。 `scgi_no_cache` 指令的放置位置会影响其作用。当放在 `location` 块中时,仅对该 `location` 处理的请求生效。如果在 `server` 块中定义,则影响该 `server` 内的所有 `location`;若在 `http` 块中,则在全局范围内对服务器生效。因此,该指令根据应用需求提供了对缓存行为的灵活控制。
配置示例
server {
location /example {
scgi_pass 127.0.0.1:9000;
scgi_no_cache $arg_nocache;
}
}请确保所指定的条件不会在某些响应需要缓存时无意中阻止缓存。
如果期望使用缓存,`scgi_no_cache` 指令配置错误可能会导致性能问题。
注意语法;不正确的条件可能会导致意外行为或错误。
说明
'scgi_cache_valid' 指令用于根据状态码配置 SCGI (Simple Common Gateway Interface) 响应的缓存行为。该指令允许管理员为不同的 HTTP 响应状态码指定不同的缓存时长,从而增强对缓存机制的控制。当响应被缓存时,指定的时间(以秒为单位)表示响应在被标记为过期并需要向上游服务发送新请求之前应在缓存中保存的时长。 该指令可以接受一个或多个参数,每个参数将一个 HTTP 状态码与一个缓存时长配对。例如,为成功响应(如 200)定义的缓存期可能与错误响应(如 404)不同。这种灵活性有助于优化缓存利用,确保用户在享受缓存带来的性能提升的同时获得新鲜的内容。 此外,'scgi_cache_valid' 用于 'http'、'server' 或 'location' 块中,可针对特定的路由或虚拟主机进行定制。它与 'scgi_cache' 指令配合使用,必须启用该指令才能使缓存生效。如果请求的响应匹配已定义的状态码并且未超过指定时间,NGINX 将返回缓存的版本,而不是向后端发起新的请求,从而提升性能并降低负载。
配置示例
http {
scgi_cache path/to/cache;
scgi_cache_valid 200 1h;
scgi_cache_valid 404 30m;
}确保启用 'scgi_cache',以保证缓存正常工作。
为动态内容设置较长的缓存时间时请谨慎,因为这可能会提供过期的数据。
该指令不能单独生效;它依赖于其他配套指令以实现完整功能。
说明
`scgi_cache_min_uses` 指令指定在将响应缓存之前,必须向指定 URL 发送的最小请求次数。该指令在高流量环境中特别有用:如果经常访问的响应未被存储,缓存机制可能成为瓶颈。通过设置阈值,可以避免缓存不常被重用的响应,从而提高服务器效率并减少不必要的缓存占用。 该指令接受一个参数,该参数为正整数。当某个请求达到或超过指定的访问次数时,响应将根据既定的缓存规则被缓存。如果未达到,则响应不会被存入缓存,从而允许实时数据检索。此外,当根据应用使用模式适当设置该数字时,它有助于优化资源使用,综合考虑与缓存相关的内存空间和磁盘 I/O 操作。 需要注意的是,该指令在更广泛的 `scgi_cache` 设置下运行。因此,为了利用 `scgi_cache_min_uses` 的优势,应同时定义 `scgi_cache` 指令以启用对 SCGI 响应的缓存功能。当这些指令有效组合时,可以降低重复请求的响应时间,从而提升依赖 SCGI 的应用程序的性能。
配置示例
scgi_cache_path /etc/nginx/scgi_cache;
scgi_cache_min_uses 3;
location /api {
scgi_pass backend;
scgi_cache scgi_cache;
}如果未启用 `scgi_cache`,则 `scgi_cache_min_uses` 不会生效。
将 `scgi_cache_min_uses` 设置得过高可能会导致缓存的项目过少,从而在高负载情况下影响性能。
确保在使用 `scgi_cache_min_uses` 时同时制定适当的缓存规则,以实现有效的缓存行为。
说明
`scgi_cache_max_range_offset` 指令指定在检索 SCGI 请求的缓存响应时允许的最大范围偏移量。该指令允许用户设置可从缓存中请求的特定字节范围,从而控制在对部分内容请求时可以发送的数据量。通过配置此限制,您可以有效管理带宽使用并根据内容类型和预期客户端使用情况优化缓存行为。 当客户端从缓存的 SCGI 响应请求字节范围时,NGINX 会检查所请求的范围是否超过 `scgi_cache_max_range_offset` 定义的限制。如果请求超过该限制,NGINX 可能会返回错误,或根据故障转移配置回退到获取整个资源。在某些场景下,该指令非常重要,例如当极大的缓存对象可能导致过度的资源使用,或需要对交付内容进行精确控制时。 此指令接受一个参数,指定以字节为单位的最大范围偏移量。它可在 `http`、`server` 和 `location` 等不同上下文级别设置,允许基于您的 NGINX 配置结构进行灵活实现。
配置示例
location /api {
scgi_pass unix:/var/run/scgi.sock;
scgi_cache on;
scgi_cache_path /tmp/scgi_cache levels=1:2 keys_zone=scgi_cache:10m;
scgi_cache_max_range_offset 100000;
}在设置非常高的偏移量时要小心,因为这可能允许客户端请求超出预期的数据,从而影响服务器性能。
如果未设置,当客户端请求的范围大于默认行为且没有有效处理时,客户端可能会接收到整个内容。
说明
'scgi_cache_use_stale' 指令控制 NGINX 在使用来自 SCGI 缓存的过期缓存数据响应请求时的行为。它允许您定义在何种特定情形下将把过期的缓存响应发送给客户端,而不是完全从后端服务器获取新的数据。其语法接受一个或多个参数来指定这些条件,例如 'error'、'timeout'、'invalid_header' 和 'updating'。启用此功能后,即使主数据源暂时不可用或响应缓慢,也能保证请求仍能被满足,从而改善用户体验。 设置后,如果发生所指定的任一条件,NGINX 将返回过期的缓存响应,而不是无限期等待新的响应。这在对可用性要求极高的高并发应用中尤其有用,因为它通过向客户端提供最后已知的有效响应而不是立即返回错误,来缓解延迟问题。该指令的灵活性意味着您可以根据具体的应用需求和对过期信息容忍度,选择在各种情形下允许使用过期数据。
配置示例
location /app {
scgi_pass backend;
scgi_cache my_cache;
scgi_cache_use_stale error timeout;
}在未正确配置缓存的情况下使用此指令可能会导致意外结果或错误。
如果后端服务器频繁返回错误,依赖陈旧的缓存可能会向用户提供过时的信息。
无法涵盖所有错误场景;请根据应用的行为定义 `error`、`timeout` 等。
说明
`scgi_cache_methods` 指令是使用 SCGI 协议的 NGINX 配置中缓存配置的一部分,通常用于与基于语言的 web 应用程序对接。通过定义应被缓存的 HTTP 方法(例如 GET 和 POST),该指令有助于优化缓存使用、提升应用性能,并通过为指定方法提供缓存响应来减少响应时间。 该指令接受一个或多个 HTTP 方法作为参数。默认行为是仅缓存 GET 和 HEAD 方法的响应,从而确保动态内容被正确处理。通过扩展以包含诸如 POST 的方法,管理员可以改进对使用这些方法的 APIs 或应用程序的缓存策略,尽管需要谨慎,因为缓存 POST 响应可能会导致有状态交互的问题。在设置缓存时,必须在缓存短暂数据与为获得更顺畅的用户体验所带来的性能提升之间取得平衡。 在语境上,`scgi_cache_methods` 指令可以在 http、server 或 location 块内使用,以针对应用的特定区域调整缓存行为。正确的配置需要清晰理解应用的数据流以及在应用逻辑上下文中对各种 HTTP 方法进行缓存的影响。
配置示例
location /api {
scgi_pass 127.0.0.1:9000;
scgi_cache my_cache;
scgi_cache_methods GET POST;
}缓存 POST 响应可能导致意外副作用,因为 POST 请求通常用于提交数据,且一般不应缓存。
确保你的应用逻辑正确处理缓存的响应,以避免向用户提供陈旧或不正确的数据。
说明
'scgi_cache_lock' 指令在 NGINX 中用于在缓存项正在重新生成时启用或禁用请求锁定。这意味着当某个进程正在为一个不在缓存中的请求生成响应时,后续对相同资源的请求必须等待首个请求完成,从而避免多个并发生成进程。该锁确保一次只有一个进程更新缓存,通过减少对后端服务器的负载来提高缓存完整性和用户体验。如果启用了锁且在响应生成期间收到并发请求,新请求将等待直到响应准备好,而不是直接查询后端。 该指令以标志作为参数,通常为 'on' 或 'off'。默认情况下,如果未指定,锁定行为默认为 'off',这意味着多个请求可能同时触发对后端的多次调用,可能导致后端压力增大或响应时间不一致。用户在决定是否启用此指令时,应谨慎评估其应用的并发需求。
配置示例
http {
scgi_cache_path /path/to/cache levels=1:2 keys_zone=my_zone:10m;
location /scgi {
scgi_pass backend;
scgi_cache my_zone;
scgi_cache_lock on;
}
}在大量并发请求发生时,使用 'scgi_cache_lock on' 会增加用户的响应时间,因为他们会等待第一个响应完成。
应谨慎使用锁定,因为启用它可能会导致响应时间延长,尤其是在后端处理缓慢时。
说明
`scgi_cache_lock_timeout` 指令在 NGINX HTTP Core module 中指定在尝试获取缓存的 SCGI 响应锁时的最大等待时长。这在多个针对同一资源的请求同时处理时特别有用。当发出请求且对应的缓存响应不可用时,会获取一个锁以防止其他请求同时为相同资源生成 SCGI 请求。这样可确保只有一个请求被发送到 upstream,而其他请求则等待。 如果达到指定的超时时间仍未获取到锁,待处理的请求将返回错误或过期的缓存版本(如果启用了此类行为)。因此,该指令有助于控制在发生缓存未命中时请求应被挂起等待的时间,并防止由于并发请求而压垮 upstream 服务器。 `scgi_cache_lock_timeout` 的值以秒为单位设置,可精确控制服务器在处理 SCGI 请求时与锁定相关的行为。定义这样的超时可以在高负载下显著提升性能并改善终端用户的响应时间。
配置示例
scgi_cache_lock_timeout 5s;
注意不要将超时时间设置得过高;在缓存未命中时,这可能导致请求的等待时间增加。
如果设置得过低,可能导致不必要的缓存未命中,因为请求在获取锁之前就会出错。
说明
在 NGINX 中,`scgi_cache_lock_age` 指令是在缓存 SCGI 响应时的一个重要参数。当向 SCGI 后端发出请求并发生缓存未命中时,NGINX 会尝试缓存该请求的响应以供后续相同请求使用。为了防止在原始请求仍在处理中时多个进程重复向后端发起相同的 SCGI 请求,该指令指定了在响应被获取并缓存之前,缓存锁应保持多长时间(以秒为单位)。通过设置该时长,你可以有效控制对同一缓存条目的请求并发性,确保在响应可用之前仅对该缓存条目处理一个请求。 `scgi_cache_lock_age` 的典型用例是避免惊群问题,即大量并发请求导致后端服务被压垮。通过在第一个请求完成之前对缓存条目加锁以阻止多个同时请求,NGINX 有助于缓解潜在的负载问题并提高整体响应效率。该参数接受以秒为单位的持续时间,应根据服务器负载和预期请求模式谨慎选择其值,以在优化性能的同时有效管理资源使用。
配置示例
location /api {
scgi_pass backend;
scgi_cache my_cache;
scgi_cache_lock on;
scgi_cache_lock_age 10s;
}如果 `scgi_cache_lock` 被关闭,`scgi_cache_lock_age` 指令将不会生效。
该指令应与缓存指令结合使用才能发挥作用。
配置错误可能导致在响应之前不必要地等待其他请求完成。
说明
`scgi_cache_revalidate` 指令在 NGINX 中用于 `http`、`server` 或 `location` 块的上下文中。它作为一个开关,用来指定是否在将缓存的响应提供给客户端之前,向 SCGI 服务器重新验证这些响应。当该指令设置为 `on` 时,NGINX 会在每次请求该资源时与后端 SCGI 服务器核验缓存响应的有效性,从而确保客户端接收到最新的数据。如果设置为 `off`,NGINX 将在不检查有效性的情况下提供缓存内容,若服务端内容已更改则可能返回过期的数据。 该指令与其他缓存指令配合使用,例如 `scgi_cache`(定义缓存区域),以及可用来在必要时提供过期内容的 `scgi_cache_use_stale`。`scgi_cache_revalidate` 的主要目的是在后端可能已更新内容且应反映给最终用户的场景中优先保证数据的新鲜度。如果未正确设置该开关,在实现了缓存但未优先执行重新验证的情况下,可能会导致提供过时的内容。
配置示例
scgi_cache_path /tmp/scgi_cache levels=1:2 keys_zone=my_cache:10m;
location /example {
scgi_pass backend;
scgi_cache my_cache;
scgi_cache_revalidate on;
}将 `scgi_cache_revalidate` 设置为 `off` 可能导致在未经校验的情况下提供过期的内容。
确保 `scgi_cache` 已正确配置,否则此指令将不会生效。
说明
`scgi_cache_background_update` 指令控制当请求已过期的缓存条目时 NGINX 是否应向上游服务器发起请求。如果设置为 'on',当缓存条目已过期时,NGINX 仍会将该过期条目返回给客户端,同时在后台从上游服务器获取一份新的副本,从而改善响应时间并保证下一次请求能获得新鲜数据。相反,如果设置为 'off',NGINX 只会返回该过期条目,直到它再次变为有效,而不会在后台更新。这对于降低对经常访问但不常变动的资源的请求延迟尤其有用。要使用此指令,可在 `http`、`server` 或 `location` 上下文中设置。根据应用的需求,启用后台缓存更新可以通过最小化获取新数据的等待时间,显著改善感知性能和用户体验。但在启用此功能时必须考虑上游服务器的负载,因为多个后台请求可能会导致上游服务的利用率升高,尤其在高流量情况下。
配置示例
location /app {
scgi_pass 127.0.0.1:9000;
scgi_cache scgi_cache;
scgi_cache_background_update on;
}启用后台更新可能会导致上游服务器负载增加,尤其是在多个客户端同时请求过期条目时。
确保缓存键配置正确,以避免无意间提供过时的数据。
说明
`scgi_temp_path` 指令指定了用于存放 SCGI 请求临时文件的文件系统路径。该路径用于在将数据发送到后端 SCGI 应用之前存储数据。当使用 SCGI 发起请求时,NGINX 可能需要缓冲请求体和元数据,为此它会在指定目录中创建临时文件。该指令可以接受多个参数(最多四个),其中可以包含基路径以及必要时的进一步配置。 该指令可以放在诸如 `http`、`server` 和 `location` 等不同上下文中,这使得根据服务器架构和特定路由需求可以进行灵活配置。通过自定义临时路径,管理员可以选择具有足够磁盘空间和合适访问权限的位置,以优化性能和安全性。它还允许为不同的虚拟服务器或 location 使用不同的临时存储位置(如果需要),从而保持文件管理的有序性。 请注意,如果指定的 `scgi_temp_path` 不存在或对 NGINX 进程缺乏适当权限,SCGI 请求可能会失败。因此,务必确保证路径已正确设置且可访问。此外,监控该路径的空间使用情况可以帮助避免性能问题,因为如果磁盘填满,请求处理可能会停滞。
配置示例
http {
scgi_temp_path /var/tmp/scgi_temp;
}确保指定的路径存在并且对 NGINX 用户可写。
临时文件可能占用大量空间;请定期监控其使用情况以防止问题。
如果使用共享文件系统,请考虑文件系统性能的影响。
说明
在 NGINX 中使用 `scgi_max_temp_file_size` 指令来控制处理 SCGI 请求时临时文件的存储。具体来说,该指令规定了这些临时文件的最大允许大小,这些文件是在请求主体超过某个限制时创建的。如果临时文件的大小超过该指令设置的值,NGINX 将返回错误而不是继续处理请求,从而有助于防止磁盘使用过多和潜在的性能问题。 该指令可以在 `http`、`server` 或 `location` 上下文中配置,便于根据应用需求灵活设置。设置时必须指定有效的大小单位,例如 bytes、kilobytes(`k`)、megabytes(`m`)等。如果未指定该指令,则使用默认值,实际上意味着除非另行配置,否则没有上限。 在 NGINX 服务器中适当使用此指令对于控制资源消耗至关重要。对于存储限制严格的环境(例如共享主机或资源受限的场景),它可以防止临时文件存储被滥用,从而提高整体可靠性。
配置示例
http {
server {
location /scgi {
scgi_pass 127.0.0.1:4000;
scgi_max_temp_file_size 10m;
}
}
}将此值设置得过低可能会导致频繁错误,尤其当您的应用生成的请求体超过允许大小时。
未配置此指令可能导致临时文件不受控增长,从而影响磁盘空间。
确保该大小适合预期负载;请检查您的应用的请求体大小。
说明
`scgi_temp_file_write_size` 指令指定在处理 SCGI(Scripting Common Gateway Interface)请求时为存储数据而创建的临时文件的最大尺寸。该指令在处理较大的响应主体或响应需要分块传输编码(chunked transfer encoding)时尤其重要,因为它会影响数据缓冲和写入临时文件的方式。设置该指令使管理员能够控制因临时文件过大而产生的磁盘空间使用和性能影响。 当 SCGI 响应的大小超过指定限制时,NGINX 将使用临时文件来处理多出的数据。应根据预期的响应大小和可用资源谨慎选择配置的大小,以防止性能下降或出现磁盘空间不足的错误。此外,如果该指令设置得过高,当临时存储成为瓶颈时可能导致写入时间延长;而设置得过低又可能因为响应被拆分成更小的写入而增加磁盘 I/O 操作的频率。 该指令可以在不同的上下文中使用,例如 `http`、`server` 或 `location`,从而在应用程序的不同部分按需对临时文件大小进行精细控制。理解具体用例并相应调整该值,对于优化 SCGI 处理中的性能和资源使用至关重要。
配置示例
http {
scgi_temp_file_write_size 128k;
}将此设置得过低可能会因磁盘写入频率增加而导致性能问题。
并非在所有上下文中都受支持;在不合适的块之外使用它可能会导致配置错误。
说明
`scgi_next_upstream` 指令用于诸如 `http`、`server` 和 `location` 等上下文,在 SCGI 模块中对请求重试逻辑的管理起着关键作用。当请求因指定的错误条件失败时,该指令允许管理员指定 NGINX 是否应尝试将请求发送到上游块中的下一个服务器。这些条件包括超时错误、连接被拒绝或网关错误响应。通过在服务器端出现问题时将请求重新路由到可用服务器,这有助于提高可靠性并为客户端提供更顺畅的体验。 该指令允许指定多个参数,形成一个逗号分隔的列表,用以指示 NGINX 在遇到特定错误时应如何处理。例如,你可能希望在超时情况下重试请求,但在 500 Internal Server Error 情况下不重试。理解指令中包含的每个条件的含义对于构建弹性应用程序至关重要。错误配置该指令可能导致不必要的重试(从而增加延迟),或者相反,在本应重试时却没有重试。 此外,还应注意默认值与指定参数如何交互。如果未定义任何值,NGINX 将不执行重试,将该指令与适当的 `scgi_pass` 配置相结合可以确保与 SCGI 应用的成功通信。
配置示例
location /some_url {
scgi_pass backend;
scgi_next_upstream error_code timedout http_500;
}确保正确定义上游服务器以避免路由错误。
注意不要过度使用重试;过多的重试可能导致性能下降或请求堆积。
参数的顺序很重要;要了解每个指定错误条件的影响。
说明
The 'scgi_next_upstream_tries' 指令用于配置当初始上游服务器未能正确响应时 NGINX 将向另一个 SCGI 上游服务器发起多少次尝试。它在 NGINX 配置中定义了多个 SCGI 服务器的情况下尤其有用,可提供容错并提高服务器可靠性。该指令可以接受一个单个整数参数,表示在放弃连接更多上游服务器之前应进行的重试总次数。\n\n设置后,如果 SCGI 请求因网络问题、超时或在处理请求期间识别的其他错误而失败,NGINX 将尝试将请求转发到 SCGI 块中指定的下一个上游服务器。此行为有助于分散负载并提高应用可用性。如果在耗尽所有指定尝试后仍未能建立成功连接,NGINX 将向客户端返回错误响应。\n\n应根据应用和服务器能力的具体情况谨慎配置此指令,以避免在请求处理过程中产生不必要的延迟,尤其是在高流量或上游服务器可能暂时不可用的情况下。
配置示例
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
location /scgi {
include fastcgi_params;
scgi_pass backend;
scgi_next_upstream_tries 3;
}
}如果上游服务器持续失败,设置过高的数值可能会导致响应时间大幅延长。
确保 'scgi_pass' 已正确配置;否则,该指令可能无法按预期生效。
说明
'scgi_next_upstream_timeout' 指令用于 NGINX 配置中,指定如果当前服务器未能响应,应等待下一个 SCGI 服务器响应的时长。在多个 SCGI 服务器并行运行的环境中,这个超时设置很重要,因为它允许 NGINX 在主服务器无响应时快速切换到另一个服务器,从而减少服务器停机时间。 该指令定义的时间对于依赖 SCGI 后端的 Web 应用性能和可靠性至关重要。当发出请求时,如果主 SCGI 服务器在指定超时时间内无法处理,NGINX 将尝试连接上游配置中列出的下一个服务器。如果该连接成功且服务器在超时时间内响应,则将下一服务器的响应返回给客户端。 通过调整此超时,管理员可以在性能和资源利用之间取得平衡。较短的超时可能导致更快的故障切换,但如果在短时间内发生过多故障切换,可能会导致多台服务器的负载增加。相反,较长的超时则可能在某台服务器响应缓慢时使应用显得更迟缓,从而导致较差的用户体验。因此,建议根据应用需求和服务器行为对该参数进行监控和调优。
配置示例
scgi_pass 127.0.0.1:9000; scgi_next_upstream_timeout 30s;
如果主服务器未能及时响应,将超时设置得太高可能会导致用户延迟增加。
将其设置得过低可能会使其他 SCGI 服务器不堪重负,因为快速的故障切换尝试可能导致振荡(反复切换)。
说明
`scgi_param` 指令在 NGINX 中用于定义在代理请求时传递给 SCGI (Simple Common Gateway Interface) 应用的参数。它允许传递变量和值,SCGI 服务器可以在处理请求时使用这些值。该指令可接受两个到三个参数:参数名、参数值,以及可选的标志,用于指示当参数值为空时是否从请求头中移除该参数。 `scgi_param` 使用时,你可以设置与所代理的 SCGI 应用要求相符的自定义参数。参数作为 SCGI 请求的一部分发送,使后端应用能够根据这些值动态响应。因此,必须确保参数名与 SCGI 应用期望的名称相对应,以避免请求处理中的问题。 一个常被忽视的方面是,当参数值为空字符串时,除非提供了可选的第三个参数并且其值为 'on',否则该参数不会被发送;该选项指示 NGINX 在请求中包含空参数。这个特性对于调试或确保接收方 SCGI 应用在某些参数未提供或为空时仍能按预期工作非常重要。
配置示例
location /example {
scgi_pass 127.0.0.1:9000;
scgi_param SCRIPT_NAME /example;
scgi_param QUERY_STRING $query_string;
scgi_param REQUEST_METHOD $request_method;
}确保参数名称与 SCGI 应用程序期望的一致。
除非通过 'empty' 选项明确指示,否则空参数不会被发送。
如果参数值包含需要编码的字符,应对参数值进行 URL-encoded。
说明
`scgi_pass_header` 指令在 NGINX 配置中用于控制将特定头部从 SCGI 服务器转发到客户端。配置后,NGINX 会确保包含在 SCGI 响应中的指定头部随同 HTTP 响应一并发送。这对于保留由 SCGI 应用提供的重要元数据尤其有用,例如内容类型或客户端可能需要的任何自定义应用头部。 该指令设计为接受单个参数,该参数表示要传递的头部名称。该指令可用于 `http`、`server` 或 `location` 上下文,根据配置范围灵活应用。如果需要多个头部,可以重复指定该指令,每个头部各用一次。此外,必须确保所指定的头部确实存在于 SCGI 响应中;否则它们不会被发送到客户端,从而导致提供的数据不完整。 在实际使用中,该指令通过拦截来自 SCGI 服务器响应中的头部来工作。通过指定要传递的头部,管理员可以精细控制客户端行为和数据管理,确保客户端获取所有必要信息,同时根据被服务的应用的具体需求进行调整。
配置示例
server {
listen 80;
location /myapp {
scgi_pass 127.0.0.1:9000;
scgi_pass_header X-My-Custom-Header;
scgi_pass_header Content-Type;
}
}请记住使用头部名称的精确大小写,因为在某些情况下 HTTP 头可能区分大小写。
如果该头部在 SCGI 响应中不存在,它将不会出现在客户端响应中,这可能导致混淆。
不必要地使用太多`scgi_pass_header`指令会导致性能开销,因为头部会被逐一处理并转发。
说明
`scgi_hide_header` 指令用于控制哪些来自上游服务器的响应头不应包含在返回给客户端的响应中。这使管理员能够出于隐私或安全原因管理某些响应头的暴露。它接受一个参数,用于指定要隐藏的响应头的名称。该指令可以放在 `http`、`server` 或 `location` 上下文中,根据应用架构提供灵活性。 当指定 `scgi_hide_header` 时,NGINX 服务器会在响应返回给客户端之前拦截该响应并从中移除该响应头。当您控制上游应用并希望对发送给客户端的响应头进行清理或简化,以防止敏感或不必要的信息被暴露时,这尤其有用。可以使用多个 `scgi_hide_header` 指令通过在不同的行或上下文中分别指定来隐藏多个响应头。 该指令旨在通过确保只发送相关且安全的响应头来优化客户端体验,并有助于生成更简洁的 API 响应。正确使用 `scgi_hide_header` 有助于通过控制应用的信息披露来遵循安全最佳实践。
配置示例
location /api {
scgi_pass 127.0.0.1:4000;
scgi_hide_header X-Powered-By;
scgi_hide_header Server;
}确保头部名称拼写正确,因为其区分大小写。
小心不要隐藏可能被客户端用于处理响应的必要头部。
对该指令的多次调用可能导致混淆;请确保按预期隐藏正确的头部。
说明
`scgi_ignore_headers` 指令用于 NGINX 配置中,用来控制来自 SCGI 服务器的某些响应头如何被处理。默认情况下,NGINX 会将 SCGI 响应中的所有头转发给客户端,这有时会导致意外的头暴露或冲突。该指令允许你指定一列应被忽略的头,从而使 NGINX 服务器与客户端之间的通信更加干净和可控。 该指令接受一个或多个头名称作为参数。每个指定的头在通过 NGINX 代理转发给客户端时都会从响应中被省略。这在某些场景下尤其有用,例如当特定头被认为不必要或可能泄露敏感信息时。头名称应以不区分大小写的方式输入,多个头可以用空格分隔。 使用 `scgi_ignore_headers` 指令可以通过确保只有相关的头对客户端可见来提高应用的安全性和性能。但是应注意不要忽略对客户端至关重要的头,例如 `Content-Type` 或可能对客户端处理必需的自定义头。
配置示例
location /app {
scgi_pass 127.0.0.1:9000;
scgi_ignore_headers X-Powered-By X-Server;
}确保不要忽略对客户端正常运行必需的头部。
头部不区分大小写,但按通常的写法来指定它们是一种良好实践。
忽略关键头部可能导致响应中重要元数据的丢失。
说明
'secure_link' 指令通过确保对某些资源的请求包含安全令牌,增加了一层保护。该令牌基于特定的 URL 和一个密钥生成,使服务器能够验证请求的真实性和有效性。此指令对需要限制未授权访问的媒体内容或下载文件特别有用。\n\n配置后,'secure_link' 指令会检查请求 URL 中是否包含安全链接。安全链接通常由一个哈希值构成,该哈希值使用请求资源的 URL 和密钥以及一个过期时间计算,确保链接不会被无限期重用。如果安全链接有效,请求将继续;如果无效或缺失,则拒绝访问。\n\n该指令的语法允许指定安全链接的格式以及用于生成链接的密钥。该指令可在 'http'、'server' 或 'location' 上下文中使用,以有效控制对资源的访问,增强应用的整体安全性。
配置示例
location /protected {
secure_link "$arg_md5$arg_time$uri";
secure_link_md5 "secret_key";
}确保用于哈希的密钥保持机密并妥善保管。
在设置过期时间时要谨慎,避免因链接过早或过晚过期而导致的拒绝服务攻击。
说明
指令 `secure_link_md5` 用于在 NGINX 中实现一种对文件的安全访问控制方法。它主要通过基于预定义的密钥、特定的请求 URI 和时间戳生成 MD5 哈希来保护资源,防止未授权访问。当对某个资源发出请求时,该指令会将生成的哈希与请求中提交的哈希进行比较,以验证链接的合法性和有效性。如果哈希匹配且时间戳在可接受范围内,则授予访问权限;否则拒绝访问。 `secure_link_md5` 的参数是一个字符串,应包含共享密钥、URI 和一个过期时间。过期时间决定生成链接的有效期,通过限制链接可使用的时长来增强安全性。这在需要访问敏感资源但不希望广泛开放的场景(例如文件下载或付费内容)中特别有用。 为了有效启用该指令,务必确保服务器端和客户端使用相同的哈希算法和参数,以保持生成的 MD5 哈希与提交的哈希之间的一致性和安全性。该指令可在多个上下文中配置,包括 `http`、`server` 和 `location`,从而根据应用结构实现灵活部署。
配置示例
location /private {
secure_link_md5 "$arg_md5$uri$time$remote_addr";
secure_link "";
if ($secure_link = 0) {
return 403;
}
# Protected resource access would follow
}确保在服务器和客户端实现中使用一致的哈希算法。
注意服务器和客户端之间的时间同步,以避免链接过早失效。
始终使用安全(https)连接以防止链接数据被截获。
说明
`secure_link_secret` 指令用于 NGINX 配置中,指定一个用于生成和验证安全链接的密钥。这对于保护敏感资源特别有用,因为它确保只有拥有正确签名的客户端才能访问链接,从而限制目标文件对未授权用户的暴露。 当创建安全链接时,链接由原始文件名和过期时间戳组成,这些内容会与 `secure_link_secret` 一起进行加密哈希处理。这使得链接防篡改,因为对链接的任何更改都会导致验证失败。当用户尝试访问安全链接时,NGINX 会使用 `secure_link_secret` 验证该签名,只有在哈希有效且未过期的情况下才允许访问。 该指令接受一个参数,用于指定共享密钥字符串。它应在 `http`、`server` 或 `location` 上下文中配置,使用此指令可启用与安全链接相关的功能,这可能还涉及使用 `secure_link` 指令来管理实际的链接生成和验证过程。必须妥善保管共享密钥以防止未授权访问资源。
配置示例
http {
secure_link_secret "1mVm0gfR1cuNzU3nXqRxVhbSe3";
}
server {
location /protected {
secure_link $arg_hash,$arg_time;
if ($secure_link = "0") {
return 403;
}
# Serve the protected content...
}
}确保共享密钥保密,不得向公众泄露,也不得以任何方式记录在日志中。
在链接发出后更改密钥会使这些链接失效,需要使用新密钥重新生成链接。
在开发过程中测试安全链接可能需要复杂的配置以确保密钥被正确设置。任何不匹配都会阻止访问。
说明
在 'http'、'server' 和 'location' 上下文中使用 `slice` 指令,可指定如何处理切片请求。此指令接受单个参数,指导 NGINX 根据定义的条件动态地对传入请求进行操作。对于大型响应特别有用,它将响应拆分为可管理的片段,便于更好的处理和可能的缓存机制。它还可以通过允许多个较小的请求并行处理来提高效率,从而优化资源使用和响应时间。 在使用 `slice` 指令时,可以定义多种参数来决定请求将如何被分割。该指令在细粒度级别上工作,允许用户为特定用例(例如媒体流或文件下载)自定义行为。通过指定生成响应头的条件,可以包含用于覆盖和控制片段大小的指令,并为不同切片确定缓存配置。请注意,当切片配置后,它们会按照配置文件中定义的指令以特定顺序执行,从而影响整体性能和用户体验预期。
配置示例
slice 1M;
确保定义有效的切片大小,因为不正确的值会导致错误。
使用过小的切片大小可能导致开销增加和性能下降。
在没有适当缓冲设置的情况下对大型文件进行切片可能导致性能下降。
说明
`split_clients` 指令可以在 `http` 上下文中使用,以便在多个后端或配置之间实现 A/B 测试和流量分配。基本上,它会根据客户端的哈希值(通常是客户端的 IP 地址)将请求分配到若干已定义的配置块之一。 当定义该指令时,它接受一个或多个百分比和对应的配置块。`split_clients` 的第一个参数指定应匹配第一个配置块生效的客户端请求百分比,随后是处理这些客户端的规则。每个后续的配置块可以定义额外的百分比,从而有效地创建多个“桶”或分组,使每个桶可以以不同方式路由流量。这在例如对一部分用户测试新功能、同时将其余用户定向到稳定版本时非常有用。 举例来说,如果 70% 的客户端被路由到某个应用版本,而剩余的 30% 接收另一个版本,`split_clients` 指令可以根据客户端 IP 的哈希来管理这种分流。这样,单个用户在整个会话期间会始终落在分配给他们的版本上,这使得在 A/B 测试和渐进发布中能够保持一致的用户体验。
配置示例
split_clients ${remote_addr} 70% { server server_v1; }
30% { server server_v2; };确保所有已定义块的百分比总和为100%。
用于哈希的变量(例如$remote_addr)应在请求之间保持一致,以确保用户留在相同的桶中。
避免使用复杂条件或高基数数据,以确保分布均衡。
说明
'ssi' 指令是 NGINX HTTP Core 模块的一部分,用于控制 Server Side Includes (SSI) 的使用,允许通过在 HTML 文件中嵌入服务器端指令来生成动态内容。此功能主要用于包含通用的页眉和页脚模板、插入动态内容,以及在需要在页面之间共享内容而不进行静态复制的其他场景。该指令接受一个标志作为参数,可通过 (on) 启用或通过 (off) 禁用在 HTTP、server 和 location 上下文中的 SSI 功能。 当启用 SSI 时,NGINX 会处理包含 SSI 指令的文件,在提供这些文件时对其进行解释。例如,可以在 HTML 文档中使用 `` 这样的指令来包含指定文件的内容。务必确保包含 SSI 指令的文件以支持 SSI 的媒体类型(例如 text/html)提供,以便正常工作。如果 SSI 未正确配置,NGINX 将原样提供未解析的内容,这可能导致混淆和意外输出。 此外,值得注意的是启用 SSI 可能会对性能产生影响,因为它会增加请求处理的开销。为优化性能,应在高流量场景中谨慎使用 SSI,并考虑缓存等措施以缓解由处理 SSI 指令引入的额外负载。
配置示例
location / {
ssi on;
ssi_silently on;
root /usr/share/nginx/html;
index index.html;
}确保在允许的上下文中使用 `ssi` 指令,例如 http、server 或 location。
使用 SSI 指令的文件必须具有 text/html 内容类型,才能被正确处理。
在高流量站点中使用 SSI 可能导致性能问题;可能需要采用缓存策略。
说明
'ssi_silent_errors' 指令是 NGINX 服务器配置的一部分,主要与 Server-Side Includes (SSI) 功能配合使用。当该指令设置为 'on' 时,在处理 SSI 指令期间发生的任何错误都不会作为响应的一部分返回给客户端。相反,NGINX 会抑制这些错误,从而允许服务器继续传递内容,而不显示由于缺失文件、无效指令或其他与 SSI 相关的错误可能引起的任何错误。如果将 'ssi_silent_errors' 设置为 'off'(这是默认行为),客户端将收到这些问题的标准错误消息,这在调试时可能有用,但也可能向客户端暴露内部服务器细节。 对于依赖 SSI 的 Web 应用,使用 'ssi_silent_errors' 可以通过确保非致命的 SSI 错误不会中断内容交付来改善用户体验。然而,开发人员应注意,虽然它对用户隐藏了错误,但可能会使故障排查变得复杂,因为服务器日志中会包含这些错误,而客户端则看不到。需要在调试时的错误可见性与良好的用户体验之间取得平衡。
配置示例
location /includes/ {
ssi on;
ssi_silent_errors on;
# Other configuration options
}将 'ssi_silent_errors' 设置为 'on' 可能导致在 SSI 处理过程中出现未被注意到的问题,从而影响内容生成。
当 'ssi_silent_errors' 启用时,请记得检查服务器日志中的错误,而不要依赖客户端反馈。
说明
该指令主要与 NGINX 中的 Server Side Includes (SSI) 功能相关。当设置为 `on` 时,该指令会指示 NGINX 在处理 SSI 时忽略已回收的缓冲区——特别是那些先前被其他请求使用过的缓冲区。此行为有助于确保 SSI 包含项被正确呈现,不会受到可能仍驻留内存中、来自先前请求的陈旧数据的影响。默认情况下,该指令设置为 `off`,这意味着如果遇到回收的缓冲区,它们可能会被使用,如果这些缓冲区中的数据与当前请求无关,可能导致意外的结果。 该指令可以放置在 `http`、`server` 或 `location` 上下文中,允许根据在 NGINX 配置中使用 SSI 的位置灵活配置。总之,使用 `ssi_ignore_recycled_buffers` 可以在高并发环境中(缓冲区回收更常见时)使 SSI 处理更安全、更可预测。
配置示例
location /example {
ssi on;
ssi_ignore_recycled_buffers on;
}将其设置为 `on` 可能会增加内存使用,因为会进行额外的分配,回收的缓冲区不会被重用。
在高吞吐量场景下,这可能会影响性能,因为管理额外内存分配所带来的开销。
说明
NGINX 中的 `ssi_min_file_chunk` 指令控制 SSI 在将文件包含到响应体时处理的文件块大小。该指令的主要目的是通过定义最小阈值来优化对 SSI 文件的处理。如果被包含的文件小于该指定大小,服务器会尝试一次性读取并处理该文件,而较大的文件则可能被拆分为多个块以便更高效地处理。因此,调整此值会影响性能,尤其是在处理大量并发请求或大型文件时。 该指令接受一个数值参数,表示以字节为单位的大小。典型用例是设置一个适中的块大小,确保过大的文件被适当地拆分以避免占用过多内存缓冲区,同时又避免过小的块导致处理开销增加。建议根据预期的工作负载和文件大小选择一个平衡值。该指令可以在 `http`、`server` 或 `location` 上下文中设置,根据站点或应用的不同需求提供灵活配置。
配置示例
http {
ssi on;
ssi_min_file_chunk 2048;
}将此值设置得过高可能会导致大型 SSI 文件占用大量内存。
如果未设置,默认处理行为可能会在非常小的文件上导致性能问题。
说明
`ssi_value_length` 指令在 NGINX 中用于配置 Server Side Includes (SSI) 变量值的最大长度(以字节为单位)。此指令在 SSI 命令可能返回较大值的场景中尤其有用,例如 ``。通过限制 value 的长度,可以有效控制服务器资源的使用,避免在处理过程中出现过度内存消耗。 当设置 `ssi_value_length` 指令时,其参数必须为正整数,表示 SSI 变量值允许的最大字节长度。如果指定的值超过此限制,NGINX 会将其截断到允许的长度。此行为有助于防止溢出问题并在通过 SSI 生成动态内容时确保服务稳定。用户可以在包括 `http`、`server` 或 `location` 块的不同上下文中设置该指令,从而在配置上获得灵活性。 正确使用 `ssi_value_length` 指令可以在保证通过 SSI 处理生成的内容可控的同时提升性能。然而,根据应用需求选择合适的值非常重要,以在优化性能的同时保持数据完整性。
配置示例
http {
ssi_value_length 128;
server {
location / {
ssi on;
}
}
}将值设置得太低可能会导致变量值被意外截断。
如果忽略配置此指令,在处理较大的 SSI 变量值时可能会导致资源消耗过大。
说明
'ssi_types' 指令用于定义在 NGINX 中哪些文件类型有资格进行服务器端包含 (SSI) 处理。默认情况下,仅对 HTML 和 SHTML 文件进行 SSI 处理,以避免不必要地解析不需要此功能的其他文件类型。此指令允许用户扩展文件类型集合,确保任何指定的文件类型都可以包含 SSI 命令。该指令接受一个或多个 MIME types 作为参数,可在 http、server 或 location 上下文中配置。例如,如果希望在这些类型的文件中包含 SSI,可以添加像 'text/xml' 或 'application/json' 之类的类型。 当 NGINX 服务器遇到具有 'ssi_types' 中指定的关联 MIME 类型的文件时,它会对该文件执行 SSI 指令处理。该指令在需要在各种格式中包含包含命令的动态 Web 应用中尤其有用。然而,在将 SSI 扩展到非 HTML 类型时应谨慎,因为这可能会通过解析可能不需要 SSI 的文件而增加服务器的处理负担。此外,应注意适当的内容协商,以确保正确的类型被提供并得到适当处理。
配置示例
location /includes {
ssi on;
ssi_types text/xml application/json;
}确保正确包含所需的 MIME 类型;拼写错误会导致无法处理。
请记住,对许多文件类型启用 SSI 可能会增加服务器负载和响应时间。
别忘了在 location block 中或全局启用 SSI 才能生效。
说明
`ssi_last_modified` 指令在 NGINX HTTP 核心模块中使用,用于控制 NGINX 是否应为由服务器端包含 (SSI) 嵌入并处理的文件发送 Last-Modified HTTP 头。当该指令启用(设置为 'on')时,NGINX 会检查被包含文件的时间戳,并根据这些文件中最新的修改时间生成相应的 Last-Modified 头。这对于缓存机制非常有用,能帮助客户端判断是否需要获取资源的新版本,或缓存的版本仍然有效。设置为 'off' 时,不会生成 Last-Modified 头,这可能在不关注缓存的某些用例中降低开销。
配置示例
location / {
ssi on;
ssi_last_modified on;
}确保启用 SSI 以使该配置生效,否则该指令将不会产生任何影响。
在不处理 SSI 的位置使用此指令会导致配置错误。
将此指令设置为 'on' 可能会导致不必要的开销,若包含的文件不经常更改。
说明
ssl_certificate 指令对于在 NGINX 服务器上启用 SSL 至关重要。它指定一个 PEM-encoded 的 SSL 证书文件的路径,该文件包含所运行服务器的公钥。该证书对于建立安全的 HTTPS 连接至关重要,因为它使客户端能够验证其正在连接的服务器的真实性。该指令可以在 http 或 server 上下文中定义,分别影响整个服务器配置或特定的 server 块。 通常,ssl_certificate 指令与 ssl_certificate_key 指令配合使用,后者指定证书对应的私钥。两个文件必须匹配,否则 SSL 握手将失败,无法建立安全连接。配置还需要包含与 SSL 相关的参数,例如 ssl_protocols 和 ssl_ciphers 指令,以控制连接过程中使用的安全协议和加密算法。 在使用此指令时,请确保指定的证书文件可访问且格式正确。证书可以从各种证书颁发机构获取,通常以 .crt 文件的形式提供。此外,如果使用证书链,文件应当将服务器证书与任何中间证书串联,以便客户端能够正确验证。
配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
location / {
# Other configurations
}
}确保证书文件路径正确且 NGINX 用户可访问。
确保 SSL 证书有效并由受信任的证书颁发机构正确签署。
如果使用通配符证书,server_name 必须正确匹配通配符格式,才能生效。
说明
ssl_certificate_key 指令是配置 NGINX 安全 HTTPS 连接的关键设置。该指令允许用户指定包含与在 ssl_certificate 指令中定义的 SSL 证书对应的私钥的文件。它确保 NGINX 能通过解密客户端发送的数据来建立安全的 SSL/TLS 会话,并为通过互联网传输数据提供安全层。 在实践中,ssl_certificate_key 指令接受一个参数,即私钥文件的路径。该指令可在 'http' 或 'server' 块中使用,可全局指定或针对每个虚拟服务器单独指定。必须确保证书私钥文件的权限正确:NGINX 进程需要能够访问该文件,但该文件也应对未授权访问保持安全,以防敏感信息泄露。 对该指令的错误配置可能导致 SSL 握手失败以及像 "SSL_CTX_use_PrivateKey_file() failed" 之类的错误。因此,务必确认私钥与所指定的证书相匹配,并且两者在 NGINX 的配置文件中已正确配置。
配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
}私钥必须与其对应的 SSL 证书匹配。
确保 NGINX 进程对私钥文件有读取权限。
使用受口令保护的私钥可能需要额外的配置。
说明
NGINX 中的 ssl_certificate_cache 指令用于配置 SSL 证书的缓存设置。当建立 SSL 连接时,NGINX 可以将 SSL 证书存储到缓存中以便重用。此缓存行为有助于提高性能,减少为相同连接或在会话管理期间反复加载 SSL 证书的需求。参数允许调整缓存大小和证书保留时长。 该指令可接受一到三个参数。第一个参数指定缓存大小,定义为缓存证书分配的内存量。它可以使用常见的大小后缀,如 'k'、'm' 或 'g',分别表示千字节、兆字节或千兆字节。第二个可选参数设置超时,定义证书在缓存中保持有效的时长,而第三个可选参数指定缓存条目的最大数量。如果未设置,证书将一直保留在缓存中,直到达到缓存大小限制,随后会驱逐最近最少使用的条目。 使用 ssl_certificate_cache 有助于优化 SSL 握手时间,因为 NGINX 可以从内存检索证书,避免文件系统 I/O。然而,管理员应当谨慎设置缓存大小和保留时长,因为它们会影响内存使用和证书刷新机制,尤其是在证书经常更换的环境中。
配置示例
http {
ssl_certificate_cache 10m 30s 100;
}确保缓存大小足以满足预期负载。
将超时时间设置得过高可能在发生更改时导致证书信息滞后。
不使用缓存会导致 SSL 握手时间增加。
说明
`ssl_ech_file` 指令用于指定包含 ECH (Encrypted Client Hello) 设置的配置文件的文件路径,这些设置为增强 SSL/TLS 连接初始握手的隐私性提供了一种机制。该指令属于 NGINX SSL 模块,对于旨在保护用户免受监控并确保网络体验完整性的 Web 服务器非常有用。 该指令的参数是一个字符串,表示存储 ECH 配置数据的文件路径。ECH 配置文件必须正确格式化并提供有效条目;否则,NGINX 将无法启动或正确加载配置。必须确保为该文件设置适当的权限,以便 NGINX 在启动时可以读取该文件。 当 NGINX 服务器启用 ECH 并运行时,它将在启动阶段读取指定的文件,确保将定义的 ECH 属性应用于支持此功能的客户端。这有助于提高用户隐私并为服务器提供更安全的通信通道。
配置示例
ssl_ech_file /etc/nginx/echn_config.conf;
确保所配置的文件路径对 NGINX 进程所属用户可访问,否则将无法读取配置。
ECH 配置文件的内容必须符合特定的预期格式,否则 NGINX 将无法识别这些设置。
说明
NGINX 中的 `ssl_password_file` 指令用于指定包含 SSL 证书私钥密码的文件位置。当私钥被加密并且需要密码短语访问时,此指令尤为有用。通过提供该文件,NGINX 可以自动读取密码,从而使服务器在不需要人工干预的情况下启动。该指令仅接受单个参数,该参数应为密码文件的路径。 该指令可以放在 `http` 或 `server` 上下文中,根据具体的服务器设置灵活配置。启动 NGINX 时,如果私钥受密码保护,引擎将从本指令指定的文件中读取密码。密码文件应安全存放,因为它包含敏感信息。因此应设置合适的权限以限制对该文件的访问,防止未授权用户读取密码。 如果找不到该文件或访问被拒,NGINX 将无法启动或重载,这可能导致服务中断。因此,确保路径正确且 NGINX 具有读取该文件的必要权限对平稳运行至关重要。
配置示例
server {
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
ssl_password_file /etc/ssl/private/password.txt;
}确保密码文件可被 NGINX 工作进程读取,通常设置为运行 NGINX 的用户。
如果密码文件不存在或指定错误,NGINX 将无法启动,导致服务器停机。
密码文件中的敏感信息需要严格的文件权限以防止未授权访问。
说明
NGINX 中的 ssl_certificate_compression 指令用于启用或禁用发送给客户端的 SSL/TLS 证书的压缩。证书压缩可以通过减少需在网络上发送的数据量来提高传输速度,特别是在带宽受限的情况下尤为有利。然而,启用此功能可能带来安全风险,因为它可能使压缩数据暴露于像 CRIME 这样的攻击。 该指令接受一个标志作为参数,将其设置为 'on' 可启用压缩,而设置为 'off' 则禁用压缩。默认情况下,该指令为 'off',这意味着 SSL/TLS 证书将按原样传输而不进行压缩。在使用此功能时需谨慎,尤其是在处理敏感数据时,因为压缩数据在传输过程中可能发生信息泄露,从而带来安全隐患。 要使用此指令,可将其放在 NGINX 配置文件的 http 或 server 上下文中。与其他配置选项一样,对该指令的任何更改都需要重启或重新加载 NGINX 服务器才能生效。
配置示例
server {
listen 443 ssl;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
ssl_certificate_compression on;
}启用 SSL 证书压缩可能会使服务器暴露于潜在的安全漏洞,例如 CRIME。
确保你的客户端支持该压缩功能,以避免兼容性问题。
在修改此指令后,请测试服务器的性能和安全性。
说明
`ssl_dhparam` 指令配置在 SSL/TLS 握手期间用于安全连接的 Diffie-Hellman (DH) 参数。DH 参数在建立服务器与客户端之间的安全密钥交换时至关重要,尤其是在使用需要它们的特定 cipher suites 时。使用自定义的 DH 参数文件允许管理员指定较强的密钥长度,从而增强对潜在攻击的抵御能力。该指令接受一个参数,该参数是指向包含 DH 参数的文件的路径,通常为 PEM 格式。 当设置了 `ssl_dhparam` 时,NGINX 将在所有需要 DH 密钥交换的新 SSL 连接中使用所给的 DH 参数。该指令可在 `http` 和 `server` 上下文中使用,使其能够在全局或按服务器的基础上应用 DH 参数。确保存放 DH 参数的文件已正确配置并且 NGINX 进程能够访问此文件非常重要,否则可能导致 SSL 握手失败。 在实践中,通常使用诸如 OpenSSL 之类的工具生成强健的 DH 参数文件,并建议定期更新这些参数以保持较高的安全水平。参数长度理想情况下应至少为 2048 位以满足现代安全需求,尽管更长的参数可能会在握手过程中增加计算负担。
配置示例
server {
listen 443 ssl;
ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/privatekey.pem;
ssl_dhparam /path/to/dhparams.pem;
}确保 DH parameters 文件存在且可被 NGINX 进程访问,以避免 SSL 握手错误。
使用强度不足的 DH parameters 可能导致漏洞;建议使用至少 2048 bits 的参数。
对 DH parameters 的更改需要重新加载 NGINX 才能生效。
说明
NGINX 中的 `ssl_ecdh_curve` 指令用于指定在 SSL/TLS 连接中首选用于 ECDH 密钥交换的椭圆曲线。ECDH 是一种密钥交换机制,允许双方在不安全的通信通道上建立共享密钥,该共享密钥随后可用于对称加密。此指令在配置安全连接时尤为重要,因为椭圆曲线的选择会影响安全性和性能。 `ssl_ecdh_curve` 的值可以是单个曲线名称或曲线列表。NGINX 支持多种标准曲线,服务器将使用列表中服务器和客户端均支持的第一个曲线。应选择强且广泛支持的曲线,以最大化兼容性和安全性。此指令可在 `http` 或 `server` 上下文中设置,影响该上下文内所有启用 SSL 的位置。配置错误,例如指定弱曲线,可能导致服务器建立的 TLS 连接存在漏洞。
配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate server.crt;
ssl_certificate_key server.key;
ssl_ecdh_curve secp384r1;
}在使用此指令之前请确保启用 SSL;否则它将不起作用。
使用不受支持的曲线可能导致连接失败,或回退到更弱的方法。
注意与可能不支持现代曲线的旧客户端的兼容性。
说明
'ssl_protocols' 指令在 NGINX 的 SSL 上下文中使用,用于定义允许用于安全连接的 SSL 和 TLS 协议版本。该指令通过允许管理员仅指定他们认为安全且必要的版本来增强安全性,从而有效禁用旧的、可能存在漏洞的协议,例如 SSLv2 和 SSLv3。协议选项包括 'TLSv1'、'TLSv1.1'、'TLSv1.2'、'TLSv1.3',可省略已弃用的选项以防止其被使用。此指令中提供的参数应反映当前的安全标准,因为使用已弃用的版本可能会使服务器暴露于各种漏洞中。
配置示例
server {
listen 443 ssl;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
ssl_protocols TLSv1 TLSv1.2;
}在禁用旧协议时,务必检查与客户端浏览器的兼容性。
如果使用 1.15.0 之前的版本,请不要指定 TLSv1.3,因为它不受支持。
请定期根据安全公告审查并更新允许的协议。
说明
`ssl_ciphers` 指令在 NGINX 中指定允许用于 SSL/TLS 连接的密码套件,允许管理员控制可用于安全通信的加密协议。该指令接受单个参数,即按 OpenSSL 或 NGINX 的文档指定格式的密码套件字符串列表。 密码套件的顺序很重要;服务器会按列表顺序尝试使用这些密码套件与客户端协商安全连接。如果客户端不支持任何所指定的密码套件,则无法与服务器建立安全连接。服务器管理员应选择既能提供足够安全性又为预期连接的客户端所支持的密码套件。通过设置此指令,可以减轻与较旧或较弱密码套件相关的漏洞,并限制针对安全连接的攻击范围。 对于更高级的配置,该指令还可以与其他与 SSL 相关的指令(如 `ssl_protocols` 和 `ssl_prefer_server_ciphers`)结合使用,以提高安全性。在使用此指令时,应进行适当的测试和验证,以确保达到所需的安全级别并维持与客户端应用的兼容性。
配置示例
ssl_ciphers 'HIGH:!aNULL:!MD5';
确保指定的密码套件受您所使用的 OpenSSL 和 NGINX 版本支持。
使用过时或弱的密码套件可能会使您的服务器暴露于安全漏洞。
请确保定期更新密码套件列表,以符合最新的安全标准。
说明
`ssl_buffer_size` 指令在 NGINX 中指定用于读取 SSL 握手消息的缓冲区大小。该缓冲区大小影响在握手和数据传输操作期间接收 SSL 数据的行为。默认情况下,NGINX 允许缓冲区大小根据所使用的特定 SSL 库的需求动态调整,但可以显式定义以便进行优化或满足特定的服务器行为。 使用该指令时,您需要指定一个缓冲区大小,该大小应符合您用例的预期。将此值设置得过低可能导致性能问题或无法正确处理较大的消息,而设置过高则可能浪费内存资源。该值在 NGINX 的 SSL 握手阶段—即协商安全连接的阶段—以及实际的 TLS 数据传输期间被内部使用,从而影响 SSL 操作的整体效率。 该指令可以放置在 http 和 server 上下文中,允许您在 NGINX 配置的不同层级灵活定义缓冲区大小。对于处理大量 SSL 流量的服务器,微调 `ssl_buffer_size` 可以提高性能并减少延迟。
配置示例
http {
ssl_buffer_size 16k;
}
server {
listen 443 ssl;
ssl_buffer_size 8k;
}
确保缓冲区大小适合预期的最大 SSL 记录大小,以避免消息被截断。
设置非常高的值时要谨慎,因为这可能导致不必要的内存使用。如果你的服务器处理大量连接,应权衡此设置。
说明
`ssl_verify_client` 指令在 NGINX 配置中用于指定在 SSL 握手期间对客户端 SSL 证书的验证。启用时,该指令会导致 NGINX 向客户端请求证书,并根据 `on`、`off` 或 `optional` 的设置,或者强制确认有效证书,或者在客户端未提供证书时允许其继续访问。该功能在需要增强安全性的场景中特别有用,例如部署了基于证书认证客户端的 mTLS。 该指令接受单个参数: - `on`:要求客户端提供有效证书;如果客户端无法提供,则认证失败。 - `off`:不请求客户端证书,并在认证过程中忽略客户端证书。 - `optional`:请求客户端证书,但即使客户端不提供也允许访问;如果提供了客户端证书,则会对其进行验证。 这种控制级别允许管理员为 NGINX 服务器环境中的不同端点微调安全策略。将此指令的使用与正确配置的 CA 和证书文件配合使用非常关键,以避免安全漏洞并确保 mTLS 的正常运行。
配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_verify_client on;
ssl_client_certificate /etc/nginx/ssl/ca.crt;
}确保用于客户端验证的 CA 证书已通过 `ssl_client_certificate` 正确设置。
如果不谨慎管理,使用 `optional` 而没有适当的客户端证书可能会导致未授权访问。
确保 SSL 设置被正确定义以支持客户端证书认证。不合适的设置可能会阻止验证成功。
说明
ssl_verify_depth 指令用于 NGINX 的 SSL 模块中,用于设置 SSL/TLS 客户端认证时允许的证书颁发机构(CAs)链的最大深度。此深度以整数值表示,指示客户端证书所呈现的信任链中可以包含多少个 CA 证书。如果连接提出的证书链长度大于此指令设置的值,则该连接将被拒绝。 该指令在需要客户端认证的环境中特别有用,可确保证书验证路径中只允许有限数量的中间 CA。通过强制最大深度,服务器管理员可以更好地控制信任关系并降低来自过深或不受信任证书链的潜在风险。 例如,将 ssl_verify_depth 设置为 1 表示服务器只会信任具有直接受信任颁发者(根 CA)或仅包含单个中间 CA 的链的证书。这有助于定义严格的 CA 层级,并能防止由深层信任链中可能包含的不受信任 CA 引发的潜在安全问题。
配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
ssl_client_certificate /etc/ssl/certs/ca.crt;
ssl_verify_client on;
ssl_verify_depth 2;
}确保该值设置不会过度限制信任;在确定深度之前请咨询您的 CA 层级。
比指定深度更长的证书链会导致连接被拒绝,如果配置错误可能会影响用户访问。
说明
ssl_client_certificate 指令用于 NGINX 配置中,设置指向包含受信任 Certificate Authority (CA) 证书的文件的路径,以便在 SSL/TLS 连接期间验证客户端证书。该指令通常用于需要 mutual TLS 身份验证的配置,在这种情况下,客户端必须出示由受信任 CA 签发的有效证书,才能与服务器建立连接。 配置该指令后,NGINX 会使用指定的证书颁发机构列表来验证在 SSL 握手期间出示的客户端证书。验证过程会检查客户端证书的签发 CA 是否包含在所提供的文件中。如果验证通过,客户端将被允许继续;否则连接可能被终止,或根据额外的配置设置采取其他操作。 请确保证明当前指定的文件包含有效的 CA 证书,且已设置正确的权限以便 NGINX 可读取该文件。该指令可以在 http 或 server 上下文设置,以适应应用的具体要求。注意,如果需要信任多个客户端证书,此配置可以指向包含所有必要 CA 证书的单个文件,从而为多个客户端身份提供无缝的验证过程。
配置示例
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_client_certificate /etc/nginx/ssl/ca.crt;
ssl_verify_client on;
}确保证书文件路径正确,并且可被 NGINX 进程访问。
检查 CA 证书文件的权限是否正确。
确保服务器上已正确配置 SSL,以便使用此指令。
说明
'ssl_trusted_certificate' 指令在 NGINX 的 SSL/TLS 配置中起着关键作用,它指定一个或多个证书颁发机构 (CA) 证书的路径,这些证书用于在双向 TLS 身份验证期间验证客户端证书。当配置后,NGINX 会从指定的文件中加载这些受信任的证书,并在 SSL 握手阶段使用它们来验证客户端证书的真实性。 在使用客户端认证时,该指令尤其重要,因为服务器需要确保证书由受信任的颁发机构签发。'ssl_trusted_certificate' 中指定的证书可以采用 PEM 格式,便于与其他受信任证书源进行集成。此外,如果指定的是合并的文件,应确保根 CA 的证书位于首位,随后是任意中间证书,以确保正确的证书链验证。 还值得注意的是,如果未设置该指令,或指定的证书文件无法加载,NGINX 将无法验证客户端证书,这可能带来安全风险。因此,务必始终正确配置并验证该指令所使用的证书文件的路径和权限。
配置示例
server {
listen 443 ssl;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
ssl_trusted_certificate /path/to/ca.crt;
ssl_client_certificate /path/to/client.crt;
ssl_verify_client on;
}确保 CA 证书采用正确的格式(PEM),并在配置中正确引用。
检查证书文件的权限是否设置为 NGINX 用户可读取,以避免加载错误。
请注意,不受信任或已过期的 CA 证书可能导致客户端认证失败。
说明
`ssl_prefer_server_ciphers` 指令在 NGINX 中指定在建立 SSL/TLS 连接时,是否应优先使用服务器首选的加密套件列表而不是客户端的偏好。默认情况下,SSL/TLS 握手过程允许客户端根据其偏好选择用于保护连接的加密套件。不过,某些安全策略可能要求服务器对实际选择的加密套件拥有最终决定权,尤其是为了强制使用更强或更稳定的加密方法。 当该指令设置为 'on' 时,NGINX 会忽略客户端支持的加密套件列表,而从服务器定义的列表中为连接选择最强的套件。若设置为 'off',服务器将尊重客户端的偏好,如果客户端偏好较弱的加密套件,可能会导致使用较弱的加密。该指令对于通过在握手过程中防止客户端降级到不太安全的加密套件,从而保持服务器的安全姿态非常有用。
配置示例
ssl_prefer_server_ciphers on;
确保你的密码套件列表已正确配置;否则,如果没有可用的兼容密码套件,可能会导致连接失败。
将此指令设置为 'on' 可能会导致客户端无法连接,尤其是在它们不支持你偏好的强加密算法时。
说明
NGINX 中的 `ssl_session_cache` 指令指定用于缓存 SSL 会话参数的机制,通过减少建立 SSL 连接的开销来提高性能。通过缓存 SSL 会话,客户端可以在不完成完整 SSL 握手的情况下恢复连接,从而加快过程,尤其对重复访问的用户更为显著。该指令可以在 `http` 和 `server` 上下文中配置,允许根据不同服务器或位置上应用 SSL 的方式灵活设置。 `ssl_session_cache` 的语法允许一个或两个参数:缓存类型和可选的缓存大小。缓存类型可以是 `shared` 或 `none`,其中 `shared` 表示缓存可被多个工作进程共享。如果指定,大小控制缓存中存储的会话参数的最大数量,这会显著影响内存使用和容量。该缓存机制的行为受 SSL 会话缓存的大小和管理方式影响,直接关系到最终用户的 SSL 连接性能。 当客户端重新连接并提供其会话 ID 时,NGINX 可以在会话尚未过期的前提下快速检索已缓存的会话参数,从而使服务器跳过建立新会话时耗费大量计算的步骤。这在高流量场景中特别有益,因为降低 SSL 连接的延迟至关重要。
配置示例
http {
ssl_session_cache shared:SSL:10m;
}确保缓存大小与您的流量相匹配;大小过小可能导致频繁的缓存逐出。
如果使用多个 server blocks,当需要在 origin servers 之间共享会话时,确保它们使用相同的 named cache。
说明
`ssl_session_tickets` 指令在 NGINX 中允许你为 SSL 连接启用(或禁用)会话票据的使用。启用时,NGINX 会使用会话票据安全地恢复 SSL 会话,从而在后续连接中减少客户端进行完整 SSL 握手的需求。该功能能在高流量且客户端可能频繁重新连接的环境中提升性能。 会话票据与 SSL 会话缓存协同工作,允许在不需要服务器为每个 SSL 会话维护状态的情况下进行会话恢复。当客户端首次连接服务器时,会收到一个会话票据,该票据可在将来的连接中提供给服务器。当服务器收到该票据时,可以对其解密以检索会话信息,而无需在内存或缓存中查找会话,从而加快客户端的 SSL 握手。 该指令接受一个标志参数:可设置为 'on' 或 'off'。设置为 'on' 时,NGINX 使用会话票据;设置为 'off' 时,会话票据被禁用。需要注意的是,必须在服务器端正确配置会话票据及相应的密钥以支持会话票据的安全加密和解密,这有助于防止重放攻击或滥用。
配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
ssl_session_tickets on;
}确保您的服务器为 session tickets 配置了适当的加密密钥,以有效保护它们。
禁用 session tickets 可能导致更长的 SSL 握手时间,因为客户端将无法轻松恢复会话。
确保定期轮换 session ticket key 以维持安全。
说明
`ssl_session_ticket_key` 指令对于在 NGINX 中启用和管理 SSL 会话票据支持至关重要。该指令指定用于加密和解密会话票据的密钥,允许客户端在无需完整握手的情况下恢复 SSL 会话。该指令要求特定的密钥长度以确保安全,理想情况下应与用于会话票据的加密算法相匹配。需要注意的是,该密钥应谨慎处理并保持机密,因为泄露或被破解可能导致 SSL 会话管理中的安全漏洞。 在服务器启动时,必须以安全的方式生成该密钥,其管理至关重要。如果服务器的会话票据密钥发生更改,使用旧密钥建立的任何会话都将失效,导致客户端无法恢复这些会话。因此,建议定期轮换会话票据密钥,但应以尽量减少对客户端中断的方式进行。`ssl_session_ticket_key` 指令可以在 `http` 和 `server` 两个上下文中使用,使其在任一作用域内都具有灵活性。 为了动态设置或修改会话票据密钥,NGINX 允许在不同上下文中对该指令进行多次声明并使用不同的密钥,尽管在配置间使用相同密钥可能不建议,除非有严格的控制。此外,如果在服务器启动后更改密钥,可能需要完全重启服务器才能使新密钥生效。
配置示例
ssl_session_ticket_key /etc/ssl/nginx/ticket.key;
确保密钥文件保持安全,且未经授权的用户无法访问。
更改密钥将使现有会话失效,导致客户端丢失会话数据。
密钥必须具有适当的大小和格式,与服务器的 SSL 设置兼容。
说明
`ssl_session_timeout` 指令用于指定服务器应缓存 SSL 会话的时间。当客户端使用 SSL 连接时,可能会建立一个会话,通过重用会话参数而不是重新协商新的参数,可以提高后续连接的性能。该指令允许管理员定义缓存会话在被视为过期并从缓存中移除之前可以保持有效的时长。时间可以用单位指定,例如 `s`(秒)、`m`(分钟)或 `h`(小时),缓存机制显著提升了 SSL 协商的效率,尤其对频繁连接服务器的客户端而言。 该指令可以放在 NGINX 配置的 `http` 或 `server` 上下文中,允许根据超时是应全局生效还是仅作用于特定 `server` 块来灵活配置。适当设置此指令可以确保有效管理资源并兼顾安全性,因为较短的超时时间可能在一定程度上提高安全性,但会以牺牲性能为代价。
配置示例
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_session_timeout 30m;
}将会话超时设置得过低可能导致频繁的 SSL 握手,从而引起性能下降。
在使用此指令时,请确保已启用 SSL 会话缓存,否则不会生效。
说明
在配置 SSL/TLS 时,`ssl_crl` 指令用于 NGINX,用以指定包含被撤销证书列表的文件。此功能对于维护安全通信至关重要,因为它允许服务器在建立连接之前验证客户端的 SSL 证书是否已被撤销。该指令可以放置在 NGINX 配置的 `http` 或 `server` 块中,确保在 SSL handshake 过程中引用所定义的 CRL。 当客户端出示其证书时,NGINX 会将该列表与其遵循的其他证书验证策略一起进行检查。`ssl_crl` 指定的 CRL 文件必须格式正确且对 NGINX 可访问。此指令有助于避免接受不再有效的证书,从而通过阻止可能使用被泄露凭证的攻击者来提高应用的整体安全性。如果找不到 CRL 文件或文件不可读,可能会导致 SSL handshake 期间出现错误,影响尝试访问该服务的用户。 重要的是,`ssl_crl` 指令只能接受一个参数——指向 CRL 文件的路径。建议保持该列表的更新并主动监控证书状态,以为终端用户提供更安全的环境。使用 CRL 也有一些缺点;例如,除非手动执行或设置为频繁更新,否则它们可能无法提供实时更新。
配置示例
http {
server {
ssl on;
ssl_certificate /etc/ssl/certs/server.crt;
ssl_certificate_key /etc/ssl/private/server.key;
ssl_crl /etc/ssl/crl/ca.crl;
}
}确保 CRL 文件格式正确并且 NGINX 可以访问。
如果为 `ssl_crl` 提供的路径不正确或文件不可读,SSL 连接可能会失败。
保持 CRL 文件为最新,以避免拒绝有效的证书。
说明
`ssl_ocsp` 指令用于指定在 NGINX 中是否为 SSL/TLS 证书启用在线证书状态协议 (OCSP)。当启用 OCSP 时,NGINX 会查询证书颁发机构 (CA) 以验证客户端提供的 SSL 证书的吊销状态,从而通过确保仅接受有效的客户端证书来提高安全性。该指令在 NGINX 配置的 `http` 和 `server` 上下文中均有效。 启用此指令后,NGINX 会在 SSL 握手过程中尝试检查证书的状态。这种检查对于检测 TLS 证书是否被吊销至关重要。如果发现证书已被吊销,可以根据服务器的配置设置适当终止连接。但是,需要谨慎实施此功能,因为依赖外部 OCSP 服务器可能会引入延迟,或在这些服务器不可用时导致站点的 SSL 性能出现故障。此外,在设置证书时应提供有效的 OCSP 响应者 URL。 `ssl_ocsp` 指令只接受一个参数,该参数表明是否启用或禁用 OCSP 检查。对于需要高安全性的应用,该指令尤其重要,因为它有助于在有效管理客户端连接的 SSL 状态时防止使用已被攻破的证书。
配置示例
server {
listen 443 ssl;
ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/private.key;
ssl_ocsp on;
}确保 OCSP 响应者 URL 已正确配置且可访问;否则 SSL 握手可能会失败。
请记得监控 OCSP 响应时间,以免因延迟影响用户体验。
在高负载服务器上启用 OCSP 时,请考虑其影响,因为频繁向 OCSP 服务器发起网络请求可能会带来性能开销。
说明
在 NGINX 中,ssl_ocsp_responder 指令用于定义在 SSL/TLS 握手过程中服务器出示的证书的撤销状态检查时应使用的在线证书状态协议(OCSP)响应者的 URL。当客户端连接到服务器并建立 SSL/TLS 会话时,该指令会指示 NGINX 验证客户端出示的证书是否仍然有效且未被证书颁发机构撤销。这对于维护 SSL 连接的安全性和完整性非常重要,可确保客户端不信任已被撤销的证书。 该指令可在 http 或 server 上下文中定义,从而允许其在全局或特定虚拟服务器级别应用。该指令的参数是一个单一的 URL,必须是有效的 OCSP 响应者端点。要实现此指令,要求 OpenSSL 库在编译时启用对 OCSP 的支持。NGINX 将在 SSL 握手期间在必要时利用该外部 OCSP 服务查询证书状态。来自 OCSP 响应者的响应有助于基于证书的当前状态决定是否接受或拒绝客户端的证书。
配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/privatekey.pem;
ssl_ocsp_responder http://ocsp.example.com;
}确保该 URL 可从运行 NGINX 的服务器访问。
确认你的 OpenSSL 安装支持 OCSP;否则,该指令将无效。
OCSP 响应者必须正确配置并在线,才能响应查询。
说明
`ssl_ocsp_cache` 指令允许你为 NGINX 中的 OCSP 响应指定缓存机制。当收到 OCSP 响应时,可以将其存储在缓存中,以减少发送到 OCSP 服务器的请求次数,从而提高性能和可靠性。该指令必须在 `http` 或 `server` 上下文中设置,并需要一个参数来定义缓存行为和持续时间。\n\n该参数以指定 OCSP 响应在缓存中保存时间的格式来定义缓存参数。一旦此持续时间到期,响应将被视为过期,并会向 OCSP 服务器发起新的请求以验证证书的吊销状态。这对于确保应用程序拥有所用 SSL/TLS 证书的最新状态信息至关重要。正确配置此指令可以在高负载环境中显著改善 SSL 性能,同时将频繁 OCSP 请求带来的开销降到最低。\n\n重要的是要监控缓存大小以确保其与服务器的内存容量相匹配,因为配置不当的缓存可能导致延迟增加或内存资源受限。
配置示例
ssl_ocsp_cache shared:ocsp_cache:10m;
cache zone 必须在使用此 directive 之前定义;否则,它将无法正常工作。
如果未启用 caching 或 cache size 过小,可能会导致过多的 OCSP 请求,从而影响性能。
说明
`ssl_stapling` 指令在 NGINX 中用于控制 OCSP stapling,这是一个机制,允许服务器直接向客户端提供带时间戳的 OCSP response。这样客户端就不需要连接到 OCSP responder 来验证证书状态,从而改善响应时间并增强隐私。该指令接受一个布尔标志作为参数,表示可以将其设置为 'on' 以启用 OCSP stapling,或设置为 'off' 以禁用它。 启用后,在 SSL 握手期间,当证书被呈现时 NGINX 会从 certificate authority 检索并缓存最新的 OCSP response。如果缓存的 response 有效,则会在发送给客户端的 SSL 握手消息中包含该 response。如果无效,服务器将向 OCSP responder 发出请求以获取新的 response。因此,谨慎管理服务器的缓存策略并确保 OCSP responses 不会过时非常重要。此外,OCSP stapling 的实现依赖于具有支持该功能的有效 SSL 证书,并且通常需要配置适当的 resolver settings 来解析 OCSP 服务器的 DNS。
配置示例
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
ssl_stapling on;
ssl_stapling_verify on;
}确保您的 SSL 证书支持 OCSP stapling;否则,启用此指令可能导致握手失败。
如果针对 OCSP responder 的 DNS 解析失败,客户端即使拥有有效证书也可能遇到 SSL 错误。
需要监控缓存;无效的 OCSP 响应可能导致客户端无法连接。
说明
NGINX 中的 `ssl_stapling_file` 指令通过提供包含 OCSP(Online Certificate Status Protocol,在线证书状态协议)响应的特定文件来启用 OCSP 附加。该指令可以放在 `http` 或 `server` 上下文中,从而对所有虚拟服务器或配置中定义的特定服务器生效。通过提供 OCSP 响应文件,NGINX 能将该响应附加到 TLS 握手中,从而减少需要在线检查的次数,提升 SSL 连接的性能。 `ssl_stapling_file` 指令的参数是单个参数,即包含序列化 OCSP 响应数据的文件路径。该文件应由 CA(Certificate Authority,证书颁发机构)或其他受信任的中介生成,并需定期更新,因为 OCSP 响应通常有有效期。确保 OCSP 响应保持最新非常重要,以便客户端在 TLS 会话期间能够有效地验证证书状态。如果文件路径不正确或内容无效,NGINX 将记录错误信息并为该服务器禁用 OCSP 附加。
配置示例
server {
listen 443 ssl;
ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/key.pem;
ssl_stapling on;
ssl_stapling_file /path/to/ocsp_response.der;
}确保 OCSP 响应文件定期更新;过期的响应可能导致客户端拒绝连接。
该文件必须具有 NGINX 可读取的正确权限;否则 NGINX 将无法加载 OCSP 数据并禁用 stapling。
确保响应文件按照 OCSP 规范正确格式化。格式不正确可能导致解析错误。
说明
'ssl_stapling_responder' 指令在 NGINX 中用于指定一个可从中获取 OCSP stapling 响应的 URL。该指令对于优化 SSL/TLS 证书验证过程至关重要,允许客户端以更简化的方式检查证书的撤销状态。通过定义响应者的 URL,NGINX 可以高效地获取 OCSP 响应,从而通过减少客户端为获取证书状态而向证书颁发机构(CAs)发起多次查询所花费的时间,提升受保护连接的性能。 在实践中,该指令提供的 URL 必须是有效的 OCSP 服务器端点。通常它是一个 HTTPS URL,因为 OCSP 响应通常涉及有关证书有效性状态的敏感信息。'ssl_stapling_responder' 的配置应位于 'http' 或 'server' 块中,其正确设置可以显著提升 SSL 性能,尤其是在高流量的 Web 环境中。同时还需确保 OCSP 响应者正常运行并可访问,以避免服务中断或连接延迟增加。
配置示例
server {
listen 443 ssl;
ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/privatekey.pem;
ssl_stapling on;
ssl_stapling_responder https://ocsp.example.com;
}确保提供的 URL 可访问并已正确配置为 OCSP 服务器。
使用 non-HTTPS URLs 可能在检索 OCSP 响应时暴露敏感数据。
错误配置的 OCSP 响应者可能导致 TLS 握手失败。
说明
`ssl_stapling_verify` 指令对于确保证书的完整性和有效性至关重要,它使 NGINX 能够在 SSL 握手过程中验证从 OCSP 服务器收到的 OCSP 响应。启用该指令后,NGINX 会执行额外检查,确保 OCSP 响应确实有效且未被撤销。
配置示例
server {
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/key.key;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8; # DNS resolution for OCSP server
}确保 resolver 已正确配置;否则,OCSP 检查可能会因无法解析 OCSP 服务器地址而失败。
如果 OCSP 服务器无法访问,客户端可能会因为用于验证的请求被阻塞而出现延迟或连接错误。
说明
在 NGINX 中,`ssl_early_data` 指令控制 TLS 1.3 连接中早期数据的处理。早期数据允许客户端在启动握手后立即发送数据,这对于客户端希望在握手完成前发送请求的场景特别有用,可能降低某些操作(例如 HTTP/2 和 QUIC)的延迟。启用后,客户端可以向服务器发送最多 2^14 字节的早期数据,前提是服务器已相应配置以处理这些数据。 将该指令设置为 'on' 会启用对早期数据的接受,但应谨慎配合以防范潜在的重放攻击,因为早期数据并不能保证所发送数据的新鲜度。可能需要实施如应用层幂等性检查等策略来缓解接受早期数据带来的风险。需要注意的是,并非所有客户端都支持或能正确处理早期数据,其有效性也会根据网站的流量模式和用例而变化。 该指令可用于 `http` 和 `server` 上下文,影响连接协商方式以及 TLS 会话期间早期数据的处理方式。
配置示例
server {
listen 443 ssl;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
ssl_early_data on;
}启用 early data 可能会使应用程序暴露于重放攻击;请确保 idempotency 得到妥善处理。
并非所有客户端都支持 early data,如果在不同的 user agents 中广泛使用,可能会导致行为不一致。
说明
ssl_conf_command 指令用于在 NGINX 的 server block 或 HTTP 上下文中自定义 SSL 配置。它接受两个参数:第一个是要执行的 SSL 命令,第二个是该命令对应的参数。该指令对于应用那些标准指令可能无法覆盖的特定 SSL 配置或根据应用需求微调 SSL 设置尤其有用。 该指令允许管理员直接使用 OpenSSL 命令,从而提供强大的自定义能力。其主要优点是可以灵活地动态操作 SSL 环境,以适应各种部署场景,而无需在配置文件中硬编码数值。正确使用此指令可以确保根据安全合规性和性能需求优化 SSL 设置。此外,在有效使用此指令时,理解相关 OpenSSL 命令及其影响至关重要。 开发人员应注意,错误使用此指令可能导致配置错误,从而影响安全或性能。因此,理解在该指令中使用的每个命令的影响尤为重要,尤其是在如 HTTP 或服务器级别设置等上下文中涉及 SSL 的情形。
配置示例
ssl_conf_command ssl_protocols TLSv1.2 TLSv1.3;
确保命令和参数受OpenSSL支持并与NGINX版本兼容。
错误的命令语法可能导致服务器启动失败或出现意外行为。
查看所使用的SSL命令的文档以避免安全漏洞。
说明
`ssl_reject_handshake` 指令提供了一种机制,用于管理当客户端尝试与服务器建立安全连接时发生的 SSL 协议握手。启用后,该指令会影响服务器在接收到 SSL 握手请求时的行为,具体表现为根据在服务器配置中设置的预定义规则或条件拒绝该握手尝试。 该指令可放置在 `http` 或 `server` 上下文中,并接收一个标志参数。该标志可以为 `on` 或 `off`,分别用于启用或禁用对 SSL 握手的拒绝。当该指令设置为 `on` 时,任何不符合指定条件的客户端请求都会被立即终止,从而阻止建立 SSL 连接。此功能对于希望通过根据客户端特征或行为控制哪些客户端可以发起 SSL 握手来增强安全性的服务器管理员尤其有用。 重要的是,应将此指令与其他访问控制指令(例如 `allow` 和 `deny`)结合配置,以充分利用其功能。这可确保只有经过授权的客户端能够继续握手过程,从而降低未经授权访问和在 SSL 协商期间可能出现的漏洞相关风险。
配置示例
server {
listen 443 ssl;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
ssl_reject_handshake on;
}确保在此指令所在的 server block 中已正确启用 SSL/TLS。
配置错误可能导致合法客户端被拒绝访问,因此在部署到生产环境之前请仔细测试配置。
在拒绝 SSL handshakes 时,请考虑对应用功能的影响。
说明
'stub_status' 指令提供了一种方式来公开 NGINX 的基本状态信息,包括活动连接数、被服务器接受的连接数、已处理的请求数以及已完成的请求总数。它需要在 server 上下文中定义一个 location 块以便可以访问,通常位于特定的 URI 下。当客户端访问配置的 URI 时,NGINX 会以纯文本格式返回当前的状态信息。 要使用 'stub_status',首先需要在 server 块内定义一个 location 块。在该 location 中以不带额外参数的方式启用 'stub_status'。可以使用访问控制指令(例如 'allow' 和 'deny')来限制对此页面的访问,从而确保只有特定客户端可以查询状态页。启用后,处理程序会处理对该 location 的请求并返回包含指标的响应,指标包括活动连接数、被服务器接受的连接数、已处理的请求数和总请求数,为监控和调试 NGINX 服务器的性能提供了有价值的洞见。
配置示例
server {
listen 80;
location /nginx_status {
stub_status;
allow 127.0.0.1; # Only allow local requests
deny all; # Deny all other requests
}
}确保访问控制('allow' 和 'deny')已正确设置;否则,状态页面可能会暴露给未授权的用户。
确认用于 'stub_status' 的 location block 已正确设置,且不会被其他 location directives 覆盖。
以安全的方式监控服务器的性能指标;不加限制地暴露 stub statuses 可能导致信息泄露。
说明
sub_filter 指令允许你在由 NGINX 提供的 HTTP 流量的响应体中动态替换字符串。这对于即时修改内容特别有用,例如根据环境调整链接或文本,或用于本地化。该指令接受两个参数:第一个是要在响应体中查找的字符串,第二个是要替换成的字符串。每当 NGINX 处理响应时,它会在输出中扫描指定的搜索字符串出现位置,并在将响应发送给客户端之前用指定的替换字符串替换它们。 需要注意的是,sub_filter 指令仅在响应体大小小于配置的缓冲区大小且响应状态码在 200-299 范围内时才会生效。此外,如果正确配置了 'sub_filter_types' 指令,sub_filter 支持使用正则表达式来匹配字符串。这有助于实现更复杂的替换,但在使用正则表达式时需要小心,确保模式正确转义并精心编写,以避免意外匹配或由于复杂模式中过度回溯而导致的性能下降。
配置示例
location /example {
sub_filter "example.com" "example.org";
sub_filter_once off;
}确保 'sub_filter_types' 指令包含需要进行替换的响应的 MIME types,否则该指令可能无法按预期工作。
只有当响应的 Content-Type 与 'sub_filter_types' 中指定的类型匹配且响应状态码在 200-299 范围内时,才会发生替换。
如果使用正则表达式,请确保模式格式正确,以避免产生无效匹配。
说明
'sub_filter_types' 指令允许你指定在 NGINX 中应使用 'sub_filter' 指令对响应体进行替换处理的 MIME 类型。默认情况下,特定内容类型的响应体可以根据用户定义的替换规则被修改,例如将某些字符串替换为其他字符串。当你希望限制或控制哪些类型的内容参与此类替换时,该指令就变得非常重要,这有助于优化性能和资源使用。 使用 'sub_filter_types' 可以避免对不需要替换的内容类型进行不必要的处理,从而提高 NGINX 服务器的效率。它接受一个或多个 MIME 类型作为参数。每个类型在指令中单独指定,可以包括诸如 'text/html'、'text/css'、'application/json' 等标准类型。'sub_filter_types' 中定义的类型将决定相应的 'sub_filter' 指令的作用范围,确保只有合适的响应被修改。
配置示例
http {
sub_filter_types text/html text/css;
}如果未定义任何 MIME types,默认行为可能会生效,导致意外的替换。
只有指定的 MIME types 会受到过滤;请确保为你的应用列出所有需要的类型。
替换仅发生在所选的 content types 上,这可能需要你仔细考虑要包含哪些类型。
说明
`sub_filter_once` 指令在 NGINX 的 `http`、`server` 或 `location` 上下文中使用,用于决定由 `sub_filter` 指令执行的子字符串替换的行为。当设置为 `on` 时,替换只会应用于响应正文中被指定字符串的第一次出现。相反,如果设置为 `off`,`sub_filter` 会处理该子字符串的所有实例,并在编译输出中对它们进行修改。这在处理存在多个相同字符串且只需一次替换而不想修改每个实例的场景中特别有用——从而避免对响应上下文造成意外更改。 该指令接受布尔值('on' 或 'off')。默认情况下通常设置为 `off`,即允许进行多次替换,除非另行指定。要启用 `sub_filter_once`,需要在 NGINX 中启用 `sub` 模块,这是该指令正常工作的关键。另一个需要注意的点是,还必须配置 `sub_filter` 以明确标识要替换的特定子字符串,然后再根据 `sub_filter_once` 的设置应用单次或多次替换。
配置示例
sub_filter 'old_text' 'new_text'; sub_filter_once on;
确保将 sub_filter 指令与 sub_filter_once 一起使用;单独使用时无效。
请注意,指令的顺序可能会影响最终输出,尤其是在复杂的响应体中。
在高流量场景中使用 sub_filter_once 可能会因为为检测替换出现所做的额外检查而带来性能影响。
说明
'sub_filter_last_modified' 指令是 NGINX 的 HTTP 核心的一部分,通常在 http、server 或 location 区块中使用。启用该指令后,NGINX 会在应用任何 sub_filter 替换后向其返回的响应追加 Last-Modified 头。该指令需要一个标志来决定如何操作该头。如果设置为 'on',它会在上游响应中添加或修改 Last-Modified 头,这在内容动态生成且需要为缓存机制添加时间戳时尤其有用。
配置示例
location /example {
sub_filter last_modified on;
proxy_pass http://backend;
}确保 'sub_filter' 指令已启用,因为 'sub_filter_last_modified' 仅在发生替换的响应中修改响应头。
错误配置该指令可能导致缓存行为不当;请务必测试响应中的头部值。
说明
`try_files` 指令在 NGINX 中用于指定一个文件路径列表,NGINX 会按顺序检查这些路径是否存在以响应请求。它可以接受多个参数,这些参数表示 NGINX 将按顺序尝试提供的文件路径或 URI。如果 NGINX 在某个指定路径上找到存在的文件,就会提供该文件。如果所有指定的文件都不存在,NGINX 可以回退到提供预定义的 URI,这对将请求路由到不同的处理器很有用。 语法至少需要两个参数:要检查的路径列表和至少一个回退 URI。该指令会按顺序检查每个路径,直到找到存在的文件。如果所有指定的文件都未找到,则使用最后一个参数(必须是 URI)。这允许通过回退到错误页面或重定向到不存在的路由来优雅地处理缺失的文件,例如用于 SPA 框架时。 `try_files` 指令在常见进行 URL 重写的位置表现尤为出色,例如 single-page applications 或动态管理的文件。通过利用传递给 `try_files` 的文件顺序,开发者可以根据磁盘上特定资源或指定 URI 的可用性创建灵活的响应。
配置示例
location / {
try_files $uri $uri/ /index.php;
}确保定义了回退 URI;如果未定义,当未找到任何文件时可能会导致 404 错误。
如果使用正则表达式,请注意匹配指令的顺序和组合。
请注意,`try_files` 一旦找到存在的文件就会停止检查,如果路径排序不正确,可能会导致意外结果。
说明
'hash' 指令在 'upstream' 上下文中用于定义一个用于将客户端请求分发到已定义上游服务器的 hash 算法。该机制允许 NGINX 基于键的哈希(通常是 IP 地址或其他指定数据)在多个后端服务之间进行负载均衡管理。 该指令可以接受一个或两个参数。第一个参数是要进行哈希的键,可选的第二个参数允许指定特定算法(例如 'consistent')。默认行为使用一个简单的哈希算法,但指定算法可以提供确定性的结果,从而提高会话持久性。 在使用 'hash' 指令时,应考虑各种因素,例如上游服务器的数量和会话亲和性要求,以获得最佳性能。该指令确保来自同一客户端的请求(基于 hash 键)会始终发送到相同的上游服务器,这对于依赖会话数据本地存储在特定服务器上的有状态应用尤其有益。
配置示例
upstream backend {
hash $remote_addr;
server backend1.example.com;
server backend2.example.com;
}使用非默认哈希算法时,请确保与上游服务器配置兼容。
会话持久性配置错误可能导致负载分配不均或延迟增加。
请记得审查客户端密钥的选择,以防止哈希冲突,这可能会对负载均衡行为产生不利影响。
说明
`ip_hash` 指令在 NGINX 配置的 `upstream` 块中使用,用于基于客户端 IP 地址提供一致的负载均衡。启用 `ip_hash` 后,NGINX 会对客户端的 IP 地址进行哈希,以确定 `upstream` 组中应由哪台服务器处理该请求。这意味着具有相同 IP 的用户在每个会话中都会被定向到同一台后端服务器,从而保持有状态会话,而无需通过 cookie 实现粘性会话。 请求路由是通过对客户端 IP 应用哈希函数来完成的,这确保了 IP 持续地解析到同一台服务器。如果请求来自不同的客户端(按 IP),则可能会被路由到 `upstream` 集合中的另一台服务器。该功能对于那些本身不管理会话且对服务器选择敏感的应用程序特别有用。需要注意的是,在客户端位于代理或负载均衡器后面的环境中,需要正确配置或处理 `real_ip`,以确保用于哈希的客户端 IP 是正确的。
配置示例
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}确保上游服务器能够独立处理会话,因为 `ip_hash` 不会在服务器之间共享状态。
使用 `ip_hash` 可能导致服务器之间负载分布不均,尤其是在某些 IP 发送的流量比其他 IP 多的情况下。
说明
NGINX 中的 `keepalive` 指令在 `upstream` 块上下文中使用,用于控制到 upstream 服务器的最大空闲 keepalive 连接数。当启用 keepalive 连接时,NGINX 可以重用到 upstream 服务器的现有连接以处理多个请求,而不是每次都建立新连接,这可以提高性能并降低延迟。该功能在处理高流量负载时尤其有用,因为它减少了频繁建立和拆除连接所带来的开销。 该指令接受一个参数,用于指定可维护到 upstream 服务器的最大空闲连接数。如果有请求超出该数量,NGINX 将关闭最近最少使用的空闲连接以腾出空间。根据服务器资源和预期流量模式调整此参数非常重要。将该值设置得过低可能会因频繁重连而导致效率低下,而设置得过高则可能导致资源耗尽。 总体而言,在涉及 upstream 服务器通信的 NGINX 配置中使用 `keepalive` 指令是一种推荐的做法,因为它有助于更好地利用资源并改善响应时间。在更改后监控性能影响也是谨慎的做法,以确保达到最佳设置。
配置示例
upstream backend {
server backend1.example.com;
server backend2.example.com;
keepalive 16;
}确保上游服务器支持 keepalive 连接;否则可能导致连接被断开。
数值设置过高可能会耗尽系统资源,从而导致性能问题。
说明
keepalive_time 指令指定在关闭之前,应维持到 upstream 服务器的空闲 keep-alive 连接的最长持续时间。这样可以通过防止未使用的连接无限期地闲置来优化资源使用,从而更好地管理服务器可用的最大连接数。当 keepalive_time 指定的时间到期时,连接将被关闭,这可以帮助释放资源以处理新请求。该指令在处理高流量和大量短连接的场景中特别有用,能够确保连接被高效重用而不会使服务器资源不堪重负。 通过使用 keepalive_time 指令,管理员可以在符合其应用需求的方式下平衡负载并维护连接状态。在确定该指令的值时,考虑性能影响非常重要——过短的超时可能会增加连接开销,而过长的超时可能导致资源未被充分利用。该指令接受单个参数,表示在空闲期间连接将保持的秒数。
配置示例
upstream backend {
keepalive_time 60;
}将 keepalive_time 设置得非常低可能会由于频繁打开和关闭连接而导致延迟增加。
如果未正确设置,可能会根据工作负载导致资源耗尽或未被充分利用。
确保所设置的超时与客户端对连接稳定性的期望一致。
说明
NGINX 中的 keepalive_timeout 指令对于管理 NGINX 服务器与上游服务器(例如应用服务器)之间的持久连接至关重要。通过配置此指令,管理员可以指定空闲连接在被关闭之前应保持打开的时长。这有助于优化服务器资源消耗,并通过减少为每个请求建立新的 TCP 连接的开销来提升应用性能。 该指令接受一个参数,表示长连接超时时间的时长(以秒为单位)。如果连接空闲时间超过该超时时间,连接将被关闭,从而允许服务器回收资源。在高流量环境中,有效管理长连接可以带来显著的性能提升。 在实践中,将此超时设置得过低可能会导致连接开销增加,因为客户端可能需要频繁重新建立连接。相反,设置得过高可能会导致资源耗尽,如果过多空闲连接被保持。建议根据您的具体应用和流量模式找到一个平衡值。
配置示例
upstream backend {
keepalive_timeout 65;
}确保超时值适合您应用程序的性能需求;过低可能会增加延迟,过高可能会耗尽资源。
并非适用于所有上游配置;如果使用特定模块,请检查兼容性。
说明
`keepalive_requests` 指令在 `upstream` 块的上下文中配置,允许你对通过单个持久连接(keepalive)发送到后端服务器的请求数量设定限制。这个功能有助于防止单个连接独占资源,并允许更高效的连接管理,尤其是在高负载且同时存在大量并发请求的场景中。 通过设置 `keepalive_requests` 的值,你可以定义在一个 keepalive 连接上允许的请求数量。例如,如果将其设置为 10,则在第 10 个请求完成后,NGINX 将关闭该连接,并可能为后续请求打开新的连接。这不仅有助于平衡资源使用,也能确保后端服务器不会被持续存在的连接压垮,导致性能下降。 该参数必须为正整数,选择其值时应根据应用的具体需求谨慎考虑。较小的数值可能导致更频繁的连接建立,但保留的资源较少;较大的数值可以提高吞吐量,但需要监控以防止潜在的资源耗尽或服务器压力。
配置示例
upstream backend {
keepalive 16;
keepalive_requests 100;
server backend1.example.com;
server backend2.example.com;
}将值设置得过高可能会导致后端服务器因打开过多连接而耗尽资源。
如果未正确使用 keepalive 连接或未正确配置 `keepalive_requests`,在高负载下可能会导致性能下降。
说明
'least_conn' 指令在 'upstream' 上下文中使用,用于实现一种负载均衡方法,将传入请求定向到活动连接数最少的服务器实例。该行为可确保负载在服务器之间更平均地分配,尤其在服务器处理能力不同或请求资源强度各异的场景中更为有利。对于用户需求波动较大的应用,此指令非常适合,可防止部分服务器过载而其他服务器闲置。与按顺序或随机方式分配请求的 round-robin 或其他方法不同,'least_conn' 会动态评估 upstream 块中每台服务器的当前状态,并根据活动连接数做出选择。\n\n当指定 'least_conn' 指令时,NGINX 不会考虑服务器的响应时间或请求的性质,而是仅根据连接数所反映的当前负载来优先选择。这是一种在 Web 集群中最大化资源分配效率的有效策略,尤其适用于长连接或会话时长差异较大的应用。
配置示例
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}确保上游服务器的健康状况得到适当监控;如果某台服务器宕机或不健康,可能不会在连接计数中被排除,导致负载分配效率低下。
在所有服务器具有相同连接数的场景中无效;你应考虑其他因素以有效地平衡负载。
说明
'random' 指令在 upstream 上下文中使用,允许 NGINX 通过从可用的 upstream 服务器池中随机选择将请求路由到哪台服务器来实现负载均衡。该指令有助于改善传入请求的分配,确保单台服务器不会因连续请求而被压垮。启用后,'random' 指令与配置中定义的现有 upstream 服务器一起工作,为每个请求随机选择其中一台。 该选择过程通过一个内部算法来实现,该算法利用随机数生成器在每次请求到达 upstream 区块时从服务器池中挑选一台服务器。该指令不接受任何参数,因此仅基于它在 upstream 定义中的存在来运行。另一个重要方面是该方法不考虑服务器负载或健康状态,因此在需要更智能的负载均衡方法(例如 'least_conn' 或 'ip_hash')的场景中可能不够理想。 因此,虽然在轻量工作负载下使用 'random' 指令可以帮助均匀分发请求,但在高负载且服务器性能差异显著的环境中,管理员必须注意其局限性。
配置示例
upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
random;
}在高流量场景中,如果服务器性能存在差异,使用 'random' 可能导致服务器负载不均。
请确保将 'random' 与 health checks 结合使用,以获得更具弹性的配置。
说明
'zone' 指令主要在 upstream 上下文中使用,帮助管理用于跨多个请求的变量的共享内存。它创建了一个可以被不同 NGINX 进程访问的共享内存区,这对于存储会话数据或连接相关信息至关重要。 该指令接受一个或两个参数:共享内存区的名称和可选的大小。分配的内存可以存储多种与会话相关的数据,这使得 NGINX 能更智能地处理诸如负载均衡和健康检查等功能。每个 zone 可以配置特定的大小以容纳可能同时发生的预期会话数。如果大小过小,可能导致会话被丢弃或处理不当,从而出现意外行为。 在定义 zone 时,NGINX 会从系统中分配指定数量的内存。该 zone 的内存在 worker 进程之间保持,从而使会话数据无论由哪个 worker 处理请求都能保持可用且一致。因此,'zone' 指令对需要高可用性和低延迟的应用特别有用,例如涉及粘性会话、缓存机制或其他共享状态场景的应用。
配置示例
upstream backend {
zone my_zone 64k;
server backend1.example.com;
server backend2.example.com;
}确保 zone 的大小满足应用的需求;过小的 zone 可能导致数据丢失。
每个上下文中只能定义一个 'zone' 指令,以避免冲突。
说明
'userid' 指令是 NGINX HTTP Core 模块的一部分,旨在配置工作进程处理请求时所使用的用户身份。该指令可以在 'http'、'server' 或 'location' 上下文中指定,从而允许对用户权限和安全性进行细粒度控制。当使用该指令时,NGINX 在执行请求时会将用户身份更改为指定的用户。这通过确保 Web 服务器在所需的最小权限下运行来增强安全性。例如,在非 root 用户下运行 NGINX 可以在发生安全漏洞时限制潜在的损害。 该指令接受一个以数字格式指定用户 ID 的参数。指定的用户必须具有访问应用程序所需资源的适当权限。此外,请注意,在处理请求期间更改用户 ID 如果配置不正确可能导致权限问题。为使 NGINX 无错误运行,指定的用户 ID 必须与服务器上已存在的用户匹配。
配置示例
http {
userid www-data;
}确保服务器上存在指定的用户。
当新用户访问文件或目录时,请注意可能出现的权限错误。
在处理请求时更改用户 ID,如果权限未正确设置,可能会导致问题。
说明
`userid_service` 指令旨在启用并配置用于为由 NGINX 处理的请求提供用户 ID (UID) 映射的服务。它在需要将用户身份从一个系统映射到另一个系统时尤其有用,常见于多租户配置,其中应用需要区分并支持多个用户。 在配置此指令时,您提供的主要参数之一是服务端点。该服务通常会与外部系统或服务交互,以根据提供的凭证对用户进行身份验证并检索其 UID。该指令可以在多种上下文中设置,包括 http、server 或 location 块,允许根据已部署应用的需求进行全局或特定配置。 需要考虑的一个潜在行为是,如果指定的服务不可到达或在检索 UID 时产生错误,NGINX 进程可能需要优雅地处理此类情况,以避免影响整体用户体验。因此,在生产环境中部署此指令时,适当处理并配置回退机制是必不可少的。
配置示例
http {
userid_service http://auth.example.com/get_user_id;
}确保服务 URL 可从 NGINX 服务器访问;否则请求可能会失败。
注意性能影响;对外部服务的调用可能会引入延迟。
正确处理服务可能返回错误的场景(例如重试、回退)。
说明
`userid_name` 指令在 NGINX 中属于 HTTP 核心模块的一部分,允许您在 HTTP 响应头中设置特定的用户名。此指令的主要用途是提供有关已认证用户的信息,这在记录日志或调试时尤其有用。它接受一个参数,该参数为将包含在响应头中的用户名。 当 NGINX 处理请求并使用了 `userid_name` 指令时,它会自动将指定的用户名附加到响应头中。对于需要跟踪用户操作的应用,或需要通过依赖 HTTP 头的服务来验证用户身份的实现,这一功能至关重要。该指令可在 `http`、`server` 或 `location` 上下文中设置,从而在配置的不同层级提供灵活性。 请注意,在定义此指令时应谨慎,尤其是在公开可访问的环境中,因为在响应头中泄露用户身份如果处理不当可能带来安全风险。务必考虑通过 `userid_name` 提供的信息是否适合您的应用及其用户。
配置示例
http {
userid_name "example_user";
server {
location / {
proxy_pass http://backend;
}
}
}确保所提供的用户名不会暴露敏感信息。
在向客户端的 HTTP 头中暴露用户名时,考虑其可能的影响。
将指令放在不适当的上下文中(http、server 或 location)可能会导致错误。
说明
`userid_domain` 指令在 NGINX HTTP 核心模块中使用,用于定义应与 `userid` 功能生成的会话 ID 关联的特定域。该指令适用于 `http`、`server` 和 `location` 上下文,允许网站管理员指定可用于 cookie 关联的域,确保跨不同子域或在特定域内正确处理会话管理。 当您设置 `userid_domain` 时,NGINX 会将指定域附加到会话 cookie,这对于依赖会话一致性和用户认证的应用非常关键。通过确保 cookie 的作用域限定在目标域内,该指令有助于有效管理用户会话,从而提高安全性并改善用户体验。指定的域必须是有效域名,可以包含子域,使其适用于各种部署架构。 该指令接受单个参数,即域名(例如 "example.com")。指定的域必须与实际用例相符,以避免会话管理问题,尤其是在用户跨子域访问时。该指令还直接影响用户会话的维护,是在 NGINX 上运行的应用安全模型的组成部分。
配置示例
http {
userid_domain example.com;
}确保指定的域名有效且格式正确。
未设置该指令可能导致会话 ID 问题或安全漏洞。
更改域名可能会中断现有用户会话。如果会话将被中断,请务必通知用户。部署前应进行充分测试。
说明
`userid_path` 指令在 NGINX 中主要用于定义存放用户会话文件的目录路径。当请求被处理且需要用户身份验证时,NGINX 会生成一个与经过验证的会话关联的唯一用户标识 (UID)。通过指定 `userid_path`,管理员可以控制这些会话文件在文件系统上的写入和存放位置,从而便于用户会话数据的管理、访问控制和组织。 该指令通常在包括 `http`、`server` 和 `location` 在内的配置上下文中使用。成功使用该指令取决于为其提供一个有效的文件系统路径作为参数。重要的是要确保 NGINX 进程对指定目录具有写权限,以避免与文件处理相关的运行时错误。此外,建议选择符合组织关于敏感数据存储和访问权限政策的路径。 此外,了解并发会话访问的影响以及过期会话文件的清理,有助于优化 NGINX 中用户会话处理的性能和可靠性。配置完成后,NGINX 将根据用户活动和会话生命周期设置自动创建并管理这些会话文件。
配置示例
userid_path /var/run/nginx/userids;
确保指定路径可由 NGINX 工作进程写入。
注意文件权限,防止未授权访问会话文件。
定期监控并清理已过期的会话文件以释放磁盘空间。
说明
在 NGINX 中,`userid_expires` 指令用于指定用户 ID cookie 的过期时间,这有助于在服务器重启后保持用户会话。该指令接受一个参数,表示 cookie 有效的持续时间。超过该时间后,用户 ID cookie 将失效,用户在返回网站时需要重新认证。此指令既影响会话管理,也影响安全性,因为确定合适的过期时间对于维持用户会话完整性并同时尽量减少陈旧会话的风险至关重要。 `userid_expires` 指令的值可以用多种时间格式指定,例如秒、分钟、小时或天,并且必须是一个正整数,后跟有效的时间单位。要实现该指令,可以将其放在诸如 `http`、`server` 或 `location` 等特定上下文中,以便在 NGINX 配置的不同部分进行定制化设置。需要注意的是,设置过长的过期时间可能会降低安全性,因为如果用户的 cookie 泄露,长期有效的过期时间可能会允许未经授权的会话访问。
配置示例
http {
userid_expires 30m;
}确保时间值被正确指定;格式不正确可能导致 NGINX 不接受该指令。
设置过长的过期时间可能会在 cookies 泄露时导致安全漏洞。
说明
`userid_flags` 指令用于控制 NGINX 中用户 ID 跟踪的行为。它允许用户指定各种标志,以决定在请求期间如何管理用户 ID。通过提供一到三个参数,用户可以根据用户 ID 微调其访问控制和请求日志记录策略。该标志可在 `http`、`server` 和 `location` 上下文中使用,从而在配置文件中应用位置上提供灵活性。 使用时,该指令的参数可以包含用于启用或禁用与用户 ID 跟踪相关的特定功能的选项。每个标志的确切含义可能依赖于特定的 NGINX 版本和构建选项,因此建议参考所使用版本的官方 NGINX 文档。正确使用此指令可以通过确保只有授权用户才能访问指定资源来增强用户会话的整体安全性和管理,这在处理敏感数据或需要用户身份验证的应用程序时尤为重要。
配置示例
http {
userid_flags log, track;
}
server {
location / {
userid_flags log;
}
}确保所使用的 flags 在您特定的 NGINX 版本中受支持。
错误使用 flags 可能导致用户跟踪出现意外行为。
必须确认该指令被放置在正确的上下文中(http、server 或 location)。
说明
`userid_p3p` 指令属于 NGINX HTTP Core 模块,可用于诸如 `http`、`server` 和 `location` 等上下文。它指示 NGINX 在 HTTP 响应中包含 P3P 头,提供有关如何使用诸如 cookies 等用户数据的信息。这对于隐私法规尤为重要,旨在让用户对其个人数据拥有更大的可见性和控制权。该指令接受单个参数:表示 P3P 策略定义的字符串。 当配置了 `userid_p3p` 指令时,NGINX 会在 HTTP 响应中生成 `P3P` 头。该头向用户代理(浏览器)传达站点的数据处理做法,可能会影响这些代理接受 cookies 的方式。指令的参数指定策略字符串,可能包含多个属性,用以描述有关用户识别和第三方访问的策略。 需要注意的是,尽管此指令有助于符合某些隐私标准,但由于各浏览器对 P3P 的采纳和支持有限,P3P 已逐渐被弃用。因此,仅依赖此指令来保障用户隐私应谨慎,并辅以更现代的隐私措施。
配置示例
userid_p3p "CP="CAO PSA OUR";";
确保策略字符串格式正确,以防止生成格式错误的头部。
请注意,许多现代浏览器并不完全支持 P3P,可能导致行为不一致。
应在不同浏览器上进行测试,以验证对 cookies 的预期处理。
说明
'userid_mark' 指令允许管理员定义一个将与用户会话关联的字符串。该标识符可用于跨多个请求跟踪用户交互或状态。该指令对于分析用户行为、管理会话或与分析工具集成特别有用。通过设置此唯一标识符,NGINX 可以在各种应用中(例如 Web 应用或跟踪工具)保持用户连续性。 配置后,'userid_mark' 将被附加到 NGINX 处理的每个请求的头部。它可接受一个参数,该参数指定标记本身,并且可以包含在 'http'、'server' 或 'location' 上下文中以控制标识符生效的范围。这种配置灵活性允许实现全局和局部的用户跟踪。 此外,由于此指令处理用户标识符,应该考虑隐私和用户数据保护方面的敏感问题。应采取适当措施以确保标识符为匿名且不会暴露可识别个人身份的信息(PII)。
配置示例
http {
userid_mark "$session_id";
server {
location / {
# additional configuration
}
}
}确保传入的参数不包含空白字符,因为这可能导致意外行为。
如果在多个上下文中设置了 'userid_mark',请注意其层级和覆盖性,因为更具体的配置可能会覆盖全局配置。
说明
`uwsgi_pass` 指令在 NGINX 配置中用于指定 uWSGI 服务器的地址,从而使 NGINX 与 uWSGI 应用之间能够通信。当收到与指定 location 块匹配的请求时,NGINX 会根据所指定的地址格式,使用 TCP 套接字或 Unix 域套接字将请求数据转发到指定的 uWSGI 服务器。这允许对用 Python、Ruby 或其他 uWSGI 支持的语言编写的 Web 应用进行无缝集成。 该指令可带一个参数,参数形式可以是 IP 地址和端口(用于 TCP 通信)或 Unix 套接字路径。例如,`uwsgi_pass 127.0.0.1:8000;` 将请求路由到在本地主机 8000 端口上运行的 uWSGI 服务器。或者,可以使用 `uwsgi_pass unix:/path/to/socket;` 通过 Unix 套接字发送请求,这相比 TCP 由于开销更小可提高性能。 使用 `uwsgi_pass`,还可以配置其他参数,例如设置超时以及通过 NGINX 向 uWSGI 应用传递变量。至关重要的是,uWSGI 服务器必须根据应用的规范正确配置以处理传入请求,包括路由和请求处理逻辑,因为在此上下文中 NGINX 仅充当反向代理。
配置示例
location /app {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}确保 uWSGI 服务器正在运行并且在指定的 URL 上可访问。
如果使用 Unix 套接字,请确保 NGINX 进程有权限访问该套接字文件。
别忘了包含 `uwsgi_params`,以便正确地将必要的参数传递给 uWSGI 服务器。
说明
'uwsgi_modifier1' 指令用于 NGINX 配置的上下文中,在将请求代理到 uWSGI 服务器时设置特定的修饰符,从而增强 NGINX 与 uWSGI 应用之间的交互。该修饰符对 uWSGI 的内部机制有用,允许用户传递关于请求的额外信息,uWSGI 服务器在处理时可以利用这些信息。 该指令接受单个参数,通常是指定要设置的修饰符的数值。当包含在 location、server 或 http 上下文中时,该设置适用于由该上下文处理的所有 uWSGI 请求。 默认情况下,如果未指定修饰符,则其值为零 (0),意味着不会随请求发送额外的修饰符。必须将此配置与 uWSGI 端的预期处理逻辑相匹配以确保正常运行。配置不当可能导致在请求处理期间应用逻辑出现意外行为或错误。
配置示例
location /myapp {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9000;
uwsgi_modifier1 1;
}确保所使用的值被 uWSGI 应用支持并被正确解释,以避免不可预见的行为。
使用不正确的值可能导致 uWSGI 端的请求处理错误或应用程序故障。
说明
`uwsgi_modifier2` 指令用于影响发送到 uWSGI 后端应用的某些响应属性的方式。具体来说,它允许管理员设置一个自定义的修饰符值,该值可以被 uWSGI 服务器或应用程序解释。该修饰符控制诸如应用行为和状态等多种功能,从而在 NGINX 与 uWSGI 之间提供更有针对性的通信。 在实践中,此指令可在 http、server 或 location 等上下文中设置,使其可以在配置层级的不同级别进行定义。`uwsgi_modifier2` 的典型参数是一个数值,通常在 0 到 255 之间。设置后,该值会随 uWSGI 请求一起发送,可能改变后端应用或中间件处理这些请求的方式。 `uwsgi_modifier2` 指令与其他与 uWSGI 相关的指令(如 `uwsgi_pass` 和 `uwsgi_param`)配合使用,允许对发送到应用的头部设置进行详细控制。应注意确保后端应用能够识别并适当利用该修饰符值以实现预期行为。
配置示例
location /app {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9000;
uwsgi_modifier2 2;
}确保后端应用程序被设计为能够处理指定的修饰符值;否则可能会导致意外行为。
只能使用有效的数值 (0-255);否则 NGINX 可能无法正确启动或重新加载。
说明
`uwsgi_store` 指令用于 NGINX 配置中,用于指定应将来自 uWSGI 服务器的响应内容存储到文件系统的某个位置。该指令接受一个参数,用于标识保存响应的文件路径。此功能对于缓存或记录 uWSGI 响应的输出特别有用,允许服务器重用内容而无需重复向上游服务器查询。 当请求到达 NGINX 中包含 `uwsgi_store` 指令的指定位置时,NGINX 会将请求转发到指定的 uWSGI 服务器。在收到响应后,NGINX 会将内容写入 `uwsgi_store` 参数中指示的文件。此机制通过减少 uWSGI 应用生成相同内容的次数来减轻其负载。然后,存储的文件可以由 NGINX 直接提供,或根据需要进一步处理。 所提供的文件路径必须具有 NGINX 写入的必要权限。如果提供的路径无效或 NGINX 缺乏写权限,则该指令在处理请求时会导致错误。因此,在使用 `uwsgi_store` 时,确保文件系统权限和路径有效性配置正确非常重要。此外,需要注意文件覆盖处理,因为这可能影响先前存储的响应。
配置示例
location /example {
uwsgi_pass 127.0.0.1:9000;
uwsgi_store /var/www/html/response.txt;
}确保路径中指定的目录存在并且可被 NGINX 写入。
注意文件被覆盖;如果文件已存在,将在没有警告的情况下被替换。
验证 uWSGI 服务器已正确配置以适当处理请求。
说明
在 NGINX 中,`uwsgi_store_access` 指令主要用于在与 uWSGI 应用配合时控制缓存响应的可访问性。该指令允许管理员定义哪些客户端 IP 地址被允许或拒绝访问服务器上已存储的响应。通过指定允许或拒绝的指令列表,用户可以微调对缓存内容的访问控制,从而增强响应的安全性和管理。
配置示例
location /app {
uwsgi_pass unix:/tmp/app.sock;
uwsgi_store on;
uwsgi_store_access allow 192.168.1.0/24;
}确保指定的 IP 地址格式正确且可访问,以防出现意外的访问问题。
使用过于宽泛的地址范围可能会无意中将敏感的缓存数据暴露给未授权的客户端。
说明
该 `uwsgi_buffering` 指令用于 NGINX 中,用以确定来自上游 uWSGI 服务器的响应如何被处理。当设置为 'on' 时,NGINX 会在将来自 uWSGI 应用的整个响应发送给客户端之前将其缓冲。这样可以通过让 NGINX 在内部处理响应来优化内容传递,从而减少发送给客户端的 TCP 包数量并提高连接处理的效率。 相反,当设置为 'off' 时,NGINX 会在从 uWSGI 应用收到响应时将其实时流式传输给客户端。对于逐步生成输出的应用或需要实时响应的场景(例如 long-polling 或 server-sent events),此设置可能更有利。 该指令很灵活,可在 `http`、`server` 或 `location` 上下文中使用。其值为一个标志,接受 'on' 或 'off'。默认情况下,如果未显式设置,则对 uWSGI 响应启用缓冲。应根据应用的性能特性和需求在缓冲与非缓冲之间谨慎选择,以避免对响应时间或资源利用产生潜在的不利影响。
配置示例
location /myapp {
uwsgi_pass myapp;
uwsgi_buffering off;
}注意,将 buffering 设置为 'off' 可能导致资源使用增加,因为 NGINX 会维持更多的打开连接。
当 buffering 被禁用时,NGINX 可能无法有效压缩响应,因为它会按收到的方式发送数据。
如果应用程序响应缓慢,流式传输大型响应可能会导致客户端看到响应的延迟。
说明
'uwsgi_request_buffering' 指令在 NGINX 中对于控制与 uWSGI 应用交互时如何处理请求体非常重要。启用时,NGINX 会在接收完整的请求体后才进行缓冲,从而让上游服务器一次性访问完整的负载。这对于处理大文件上传或上游服务器需要在处理前对整个请求体进行验证的场景尤其有用。 另一方面,在高并发或请求体较小的场景下,禁用请求缓冲可以降低内存使用并提高性能,因为 NGINX 会将请求体以流式方式直接传递给 uWSGI 应用而不进行缓冲。该 'uwsgi_request_buffering' 参数接受一个标志,其值可以是 'on' 或 'off'。设置为 'on' 时启用缓冲;设置为 'off' 时禁用缓冲。 理解该指令对应用性能和后端处理选择的影响非常重要。在需要实时流式传输数据(例如文件上传)或当响应需要在请求的部分内容可用时立即发送的场景中,禁用缓冲通常是首选。相反,对于复杂的负载或请求完整性至关重要的情况,启用此选项可确保在处理前对整个请求进行完整分析。
配置示例
server {
listen 80;
server_name example.com;
location / {
uwsgi_pass 127.0.0.1:8000;
uwsgi_request_buffering off;
}
}如果使用 'off',当发送较大的负载时可能导致更高的资源消耗,因为它们会直接流式传输到 upstream,且不会进行缓冲。
如果 upstream 应用无法处理部分请求(即期望完整的请求主体),请将其设置为 'on'。
说明
'uwsgi_ignore_client_abort' 指令用于确定 NGINX 是否应该在客户端已断开连接的情况下仍继续处理到 uWSGI 服务器的请求。当设置为 'on' 时,NGINX 会忽略任何提前的客户端中止,这意味着它会继续将请求发送到 uWSGI 应用并等待处理完成,而不考虑客户端的连接状态。这对于需要确保应用完成所有业务逻辑的长时间运行请求很有用,即使响应可能不会被传回客户端。 默认情况下,NGINX 的行为是,如果客户端在服务器处理请求完成之前断开连接,它会终止与后端服务器的连接,可能会中断任何正在进行的处理。使用 'uwsgi_ignore_client_abort on;' 后,服务器在这种情况下仍会继续处理,这可能有助于避免不必要的资源处理并在某些用例中提高应用吞吐量。这有助于确保由客户端发起的任务(例如文件上传或密集计算)能够完全完成。 该指令可以在 'http'、'server' 和 'location' 上下文中指定,依据配置中预期处理请求的位置提供灵活性。它适用于 uWSGI 模块特定的配置,但不影响其他类型的上游模块,例如 HTTP 或 gRPC 代理。
配置示例
location /long-request {
uwsgi_pass 127.0.0.1:9000;
uwsgi_ignore_client_abort on;
}如果同时未正确管理 'uwsgi_ignore_client_abort' 和连接超时设置,当客户端频繁断开时,可能导致资源浪费。
在未考虑系统资源的情况下使用 'on' 选项,可能导致不必要地执行长时间运行的进程,从而影响整体性能。
说明
`uwsgi_bind` 指令是 NGINX 配置的一部分,用于管理与 uWSGI 服务器的连接,uWSGI 常用于提供 Python 应用。该指令允许你指定 NGINX 应向 uWSGI 后端发送请求的 IP 地址和端口(或 Unix 套接字)。默认情况下,uWSGI 监听 `127.0.0.1:8000`,但该指令允许你根据基础设施需求自定义该地址。 该指令接受一个或两个参数。第一个参数是 uWSGI 服务器的地址,可选的第二个参数在使用 TCP 套接字时可指定端口。如果指定了 Unix 域套接字,地址应为该套接字的路径。此特性可实现高效通信,因为它完全绕过了 TCP 栈。`uwsgi_bind` 指令可在包括 `http`、`server` 和 `location` 在内的多种上下文中使用,使其在 NGINX 配置的不同层级中具有灵活性。 当定义多个 `uwsgi_bind` 指令时,NGINX 会监听所有指定的地址,以便在多个 uWSGI 进程或服务器之间实现可伸缩性和负载均衡。请确保将连接设置与 uWSGI 应用配置正确匹配,以避免连接问题,特别是与套接字权限相关的问题。
配置示例
location / {
include uwsgi_params;
uwsgi_bind 127.0.0.1:8000;
uwsgi_pass myapp;
}确保 uWSGI 服务器已正确配置以在指定的地址和端口上监听。
使用 Unix 域套接字时请注意权限;确保 NGINX 对该套接字文件具有访问权限。
如果使用多个 `uwsgi_bind` 指令,请验证它们之间不存在冲突。
说明
`uwsgi_socket_keepalive` 指令用于 NGINX 配置中,用以控制是否在 uWSGI 套接字连接上启用保活功能。当启用保活时,NGINX 会定期通过该套接字发送保活探测,以确保连接保持活动状态,防止因空闲而被关闭。这在长连接的 uWSGI 环境中尤其有用,否则连接可能在 HTTP 请求完全处理完之前就超时断开。 该指令以布尔标志作为参数。将其设置为 'on' 可为 uWSGI 连接启用保活,设置为 'off' 则禁用此功能。默认情况下,保活为禁用(off)。启用保活可提高性能和可靠性,尤其是在高流量应用中频繁重用连接的情况下。不过,需要注意的是并非所有服务器或网络配置都能很好地响应保活设置,可能需要进行细致的调优以达到最佳效果。 该指令可在 `http`、`server` 或 `location` 上下文中设置,根据应用需求提供配置灵活性。通常建议在负载下测试保活连接,以确保它们在不影响应用性能或行为的前提下提供预期的好处。
配置示例
location /app {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_socket_keepalive on;
}确保你的 uWSGI 服务器支持 keepalive 连接;socket 配置可能需要调整。
在启用和禁用 keepalive 的情况下测试应用程序性能,以确定针对你的工作负载的最佳配置。
说明
`uwsgi_connect_timeout` 指令指定 NGINX 在与 uWSGI 服务器建立成功连接前将等待的时长。如果在建立连接之前指定的超时时间已过,NGINX 将终止尝试并返回错误。该参数在与 uWSGI 应用交互时非常重要,尤其是在延迟或服务器不可用可能导致连接尝试延长的环境中。该指令的值以秒为单位,接受整数(表示秒数)或时间格式,例如 '30s' 表示 30 秒。它可以在 http、server 或 location 上下文中进行配置,从而根据不同应用需求实现集中或细粒度的配置设置。 对 `uwsgi_connect_timeout` 的错误配置可能导致微妙的问题,例如响应变慢或出现不希望的超时,从而影响用户体验。管理员必须确保其设置与应用的性能要求和预期负载场景相符。应对该指令的使用进行适当记录,以确保在运营反馈的基础上,特别是在高流量应用中,可以对其进行后续调整。
配置示例
http {
server {
location / {
uwsgi_pass 127.0.0.1:9000;
uwsgi_connect_timeout 30s;
}
}
}将超时时间设置得过短可能导致在高延迟环境中请求失败。
在低负载的应用中配置较长的超时时间可能会在尝试连接时导致不必要的资源消耗。
说明
`uwsgi_send_timeout` 指令在 NGINX 中指定向 uWSGI 服务器发送请求的时间上限。该指令对于确保 NGINX 不会无限期地等待 uWSGI 服务器返回响应特别有用。如果在指定的超时时间内未收到响应,NGINX 将关闭连接并向客户端返回错误响应。 该指令接受一个参数,表示超时值,可以用多种时间单位指定,例如秒或毫秒。将此值适当设置非常重要,以避免对用户体验造成负面影响,例如在高负载情况下的长时间等待。该指令可以放在不同的上下文中,包括 'http'、'server' 或 'location'。 默认情况下,如果未显式设置 `uwsgi_send_timeout`,则不会应用超时,这意味着 NGINX 将无限期等待。然而,指定此指令可以更好地管理资源并提高 Web 服务器的响应性,尤其是在处理可能较慢的后端 uWSGI 应用时。
配置示例
location /app {
uwsgi_pass 127.0.0.1:9000;
uwsgi_send_timeout 30s;
}将超时时间设置得过低可能会在高峰负载期间导致请求被丢弃,从而给用户带来错误。
如果后端 uWSGI 应用的响应时间不稳定,可能需要微调该值以获得最佳性能。
说明
NGINX 中的 `uwsgi_buffer_size` 指令控制为缓冲来自 uWSGI 服务器的初始响应而分配的内存量。该指令在与通过 uWSGI 协议通信的应用配合使用时非常重要,特别是涉及如何检索数据并将其返回给客户端时。指定的值将定义一个缓冲区的大小,该缓冲区在从 uWSGI 应用接收到响应后用于保存响应头。 更大的缓冲区可以更灵活地处理较大的响应头,从而无需多次从 uWSGI 协议读取,减少潜在的性能问题。值得注意的是,如果 uWSGI 服务器发送的响应头大于指定的缓冲区大小,NGINX 可能会产生错误或截断头部。因此,在配置时应仔细考虑应用生成的响应头的预期大小。 该指令接受单个参数,即要分配的缓冲区大小。大小可以用字节指定,或使用诸如 `k`(千字节)、`m`(兆字节)之类的后缀。有效使用此指令有助于依赖 uWSGI 的 Web 应用平稳运行。
配置示例
uwsgi_buffer_size 8k;
如果头部超出指定大小,将缓冲区设置得过小可能会导致错误。
如果应用不需要那么大的缓冲区,使用过大的缓冲区可能会导致内存浪费。
说明
'uwsgi_pass_request_headers' 指令指定是否将传入请求头传递给 uWSGI 后端。 这是一个标志指令,接受 'on' 或 'off'。 当设置为 'on' 时,来自传入请求的所有头部都会转发到 uWSGI 服务器,这在后续处理请求时保留原始 HTTP 请求信息时可能至关重要。 如果设置为 'off',则不会将这些头部发送到后端,这在希望最小化发送的数据量或后端不需要这些头部的情况下可能更合适。 在正确的上下文 (http, server, or location) 中使用此指令对于其正常工作至关重要。 它有助于在可能受资源限制的环境中控制 uWSGI 请求的行为,从而高效地管理传输的数据。 操作模式会极大地影响应用行为,尤其是在处理可能与特定头部相关的变量(例如认证和会话管理)时。
配置示例
location /app {
uwsgi_pass 127.0.0.1:9000;
uwsgi_pass_request_headers on;
}如果您选择传递 headers,请确保您的 uWSGI 应用已配置为处理这些 headers。
将此指令设置为 'off' 可能导致依赖 headers 进行处理的某些应用缺失关键信息。
说明
`uwsgi_pass_request_body` 指令是一个标志,用于决定在使用 `uwsgi_pass` 转发请求时是否应将请求主体发送到 uWSGI 服务器。 当设置为 `on` 时,请求主体会被传输到后端的 uWSGI 应用,使其能够处理诸如表单提交、文件上传或包含在 HTTP 请求主体中的其他负载等数据。 相反,当设置为 `off` 时,请求主体不会被发送,这在只需要头信息且可以忽略请求主体的场景中可能有用,从而通过减少传输的数据来提高性能。 该指令可以在 `http`、`server` 或 `location` 上下文中配置,因此适用性强、适用于各种配置。 它在处理通常包含主体的 HTTP 方法(如 POST 或 PUT)的应用中特别重要。 该指令的行为会直接影响 uWSGI 服务器如何与接收到的请求交互;例如,如果在 `uwsgi_pass_request_body` 为 `off` 时发送了需要主体的请求,uWSGI 应用将收到缺少主体数据的通知,如果未正确处理,可能导致错误。
配置示例
location /api {
uwsgi_pass unix:/tmp/myapp.sock;
uwsgi_pass_request_body off;
}确保后端应用在设置为 'off' 时能够处理没有请求体的请求。
使用 'off' 可能会导致对于通常需要请求体的 HTTP 方法(如 POST)出现问题。如果应用需要请求体,应避免使用 'off'。
说明
`uwsgi_intercept_errors` 指令在启用时(设置为 'on')允许 NGINX 拦截来自 uWSGI 服务器的特定错误响应,并根据预定义策略进行处理,而不是直接将其传递给客户端。这通常包括诸如 404 和 500 之类的标准 HTTP 错误代码,使用户能够配置自定义错误页面、日志记录及其他在遇到此类响应时的行为。相反,当设置为 'off' 时,NGINX 会将 uWSGI 的响应不加修改地返回给客户端,这可能无法为错误请求提供用户友好的体验。 此指令可以在 `http`、`server` 或 `location` 上下文中使用,使其在应用特定需求和部署配置中具有灵活性。在开发者希望即使后端应用出现错误也能保持一致用户体验的场景下,将此指令设置为 'on' 是有益的,它可以在发生错误时为用户提供更专业且定制的响应,例如提供 HTML 错误页面而不是应用返回的原始错误信息。 此指令接受的参数包括布尔值,即 'on' 用于启用错误拦截,'off' 用于禁用。需要注意的是,该指令专门应用于 uWSGI 响应,其控制的行为对有效管理面向用户的错误非常重要。
配置示例
location /myapp {
uwsgi_pass myapp_backend;
uwsgi_intercept_errors on;
error_page 404 /custom_404.html;
error_page 500 502 503 504 /custom_50x.html;
}如果该指令设置为 'off',自定义错误处理将无法工作,来自 uWSGI 的原始响应可能会使用户感到困惑。
在拦截错误时,确保定义了合适的错误页面,以避免显示默认的 NGINX 错误页面。添加自定义错误页面时,确认这些页面已存在且引用正确。
说明
`uwsgi_read_timeout` 指令指定了 NGINX 等待来自 uWSGI 服务器响应的时长。如果服务器在该时间范围内未响应,NGINX 将关闭连接并向客户端返回错误。该参数对于可能需要更长时间处理请求的应用程序特别有用,可防止 NGINX 无限期地保持连接打开。 超时值可以用多种时间格式指定,例如秒、分钟,或更细粒度的格式如毫秒。其主要用途是通过避免对无响应后端的长时间等待来提升性能。管理员可以通过在 `http`、`server` 或 `location` 块中设置该指令,为不同上下文配置不同的时间限制,从而根据具体需求提供灵活性。 如果超过了 `uwsgi_read_timeout` 限制,NGINX 将返回 504 Gateway Timeout 错误,向客户端表明连接由于 uWSGI 服务器未在分配时间内响应而失败。因此,建议分析应用的响应时间并设置一个在允许充分处理时间与避免让客户端等待过久之间取得平衡的值。
配置示例
location /app {
include uwsgi_params;
uwsgi_pass unix:/path/to/socket;
uwsgi_read_timeout 30s;
}将此超时时间设置得过低可能会导致在应用响应较慢时合法请求失败。
如果未谨慎设置,客户端在处理长时间运行的请求时可能会遇到超时,并且缺乏适当的错误处理。
说明
`uwsgi_buffers` 指令定义了在 NGINX 中为读取来自 uWSGI 服务器的响应时将分配多少个缓冲区及每个缓冲区的大小。 这对于控制 NGINX 在处理发送到 uWSGI 服务器的请求时的内存占用非常重要。 每个缓冲区能够保存响应数据,如果数据超过已分配的缓冲区大小,NGINX 就需要进行额外的内存分配,可能导致性能下降。 该指令接受两个参数:缓冲区数量和每个缓冲区的大小。可以根据预期的 uWSGI 响应大小调整这些参数,以优化性能和内存使用。例如,如果预计 uWSGI 返回较大的响应,建议增大缓冲区的数量和大小。相反,如果响应通常较小,减小这些值可以帮助节省内存。 `uwsgi_buffers` 的行为与上下文相关;可在 `http`、`server` 或 `location` 上下文中设置,从而根据特定应用需求灵活配置。对 `uwsgi_buffers` 的适当调整可以在使用 uWSGI 提供 Python 应用或类似部署的环境中提升性能。
配置示例
uwsgi_buffers 8 16k;
不正确的大小设置可能导致内存浪费或频繁分配,从而可能降低性能。
在高流量应用中将 `uwsgi_buffers` 设置得过小可能增加内存分配压力并影响延迟。
说明
`uwsgi_busy_buffers_size` 指令定义了 NGINX 与 uWSGI 服务器通信时用于保存数据的缓冲区的最大大小。在处理大响应时,这一点对于维持性能尤其重要。如果 uWSGI 服务器生成的响应大小超出此限制,NGINX 会采用额外机制来处理溢出,这可能导致额外的资源使用并影响整体性能。 为 `uwsgi_busy_buffers_size` 指定的大小应与其他相关缓冲区设置一起慎重考虑。当有多个 uWSGI 响应同时处理时,该缓冲区可能很快被填满,因此 NGINX 通常会缓存前 `uwsgi_busy_buffers_size` 字节并开始处理它们,同时继续处理后续数据。该指令可以在 HTTP、server 或 location 上下文中设置,从而允许对不同范围的 NGINX 实例进行灵活配置。 在真实场景下测试不同缓冲区大小的影响至关重要,以避免诸如延迟增加或资源争用等不良行为。应根据具体工作负载和 uWSGI 响应大小进行高级调优,以在资源消耗与性能之间找到合适的平衡。
配置示例
http {
uwsgi_busy_buffers_size 32k;
}
server {
location / {
uwsgi_pass unix:/var/run/uwsgi.sock;
uwsgi_busy_buffers_size 64k;
}
}将此值设置得过低可能导致额外开销,因为 NGINX 在处理较大响应时可能需要执行更多的上下文切换。
过高的值可能耗尽系统内存,尤其在高负载下。请谨慎使用。
说明
`uwsgi_force_ranges` 指令是 NGINX 中的一个配置选项,用于影响 uWSGI 应用的范围请求如何被处理。当该指令被启用(设置为 'on')时,NGINX 将忽略针对相关 server 或 location 块收到的任何范围请求,返回完整资源而不是部分响应。这种行为在提供部分内容可能导致应用逻辑或客户端预期产生问题的场景中特别有用。 具体来说,该指令应用于 HTTP、server 和 location 块上下文,允许灵活配置。启用时,它会修改响应的生成过程。通常情况下,范围请求可能要求服务器仅传送资源的特定字节范围。然而,当 `uwsgi_force_ranges` 设置为 'on' 时,NGINX 将以发送整个资源的方式处理请求,从而简化请求处理,并可能避免为期望接收完整内容的应用引起的意外行为。 该指令以标志作为其参数。使用 'on' 值会激活该行为,而设置为 'off'(或未设置,因为该指令默认为 'off')则允许采用标准的范围请求处理方式。
配置示例
location /myapp {
include uwsgi_params;
uwsgi_pass myapp;
uwsgi_force_ranges on;
}确保底层 uWSGI 应用程序兼容接收完整响应;否则可能导致性能问题或增加加载时间。
如果设置为 'on',通过范围请求期望接收部分内容的客户端会改为收到完整资源,这可能导致客户端出现意外行为。
说明
在 NGINX Web 服务器环境中,`uwsgi_limit_rate` 指令用于控制发送给客户端响应的最大传输速度。通过以字节/秒为单位指定速率,管理员可以实施带宽限速,这有助于管理服务器资源并确保单个客户端的使用不会对其他客户端产生不利影响。该指令专为与 uWSGI 一起使用而设计,uWSGI 是一种用于服务 Python Web 应用程序的网关接口协议。 当设置了 `uwsgi_limit_rate` 时,NGINX 将限制发送给客户端的数据速率,并调整输出以匹配定义的限制。该指令接受一个参数,即数据应发送的最大速度(例如 `200k` 表示每秒 200 千字节)。它可以放在不同的上下文中,包括 `http`、`server` 或 `location`,从而能够对其适用的请求进行细粒度控制。 请记住,在限制速率时,可能会影响由 uWSGI 提供服务的应用性能,尤其是在高负载或大响应体的情况下。该指令在存在多个同一服务器资源的消费者或需要限制使用以避免带宽峰值的情况下尤其有用。
配置示例
http {
server {
location / {
uwsgi_pass myapp;
uwsgi_limit_rate 500k;
}
}
}将 `uwsgi_limit_rate` 设置得过低可能因响应时间过长而导致用户体验变差。
确保正确指定该速率;否则,NGINX 可能会忽略该指令。
如果应用本身的输出速度较低,即使提高限制也可能不会产生明显效果。
说明
在 NGINX 配置中,`uwsgi_cache` 指令用于定义一个缓存区域,该区域存储来自 uWSGI 应用的响应,通过减少加载时间来提升应用性能。每次 NGINX 向上游 uWSGI 服务器发出请求并收到响应时,该响应可以被存储到指定的缓存中以供后续请求使用。这样可以加速对通常需要 uWSGI 应用处理的重复请求的响应,允许直接由 NGINX 提供缓存的响应,而无需反复调用应用本身。 该指令需要一个参数,用来指定先前使用指令 `uwsgi_cache_path` 定义的缓存区域名称。缓存的行为还可以通过其他指令控制,例如 `uwsgi_cache_key`、`uwsgi_cache_valid` 和 `uwsgi_cache_bypass` 等。正确配置这些附加指令对于有效管理缓存条目并根据响应类型或请求条件控制缓存过期时间至关重要。 需要注意的是,缓存功能依赖于 uWSGI 应用返回的响应头来确定内容是否应被缓存以及响应应存储多长时间。在负载较重的 Web 应用中,尤其是在高流量情况下,缓存策略可以显著提升性能。
配置示例
http {
uwsgi_cache_path /tmp/uwsgi_cache levels=1:2 keys_zone=uwsgi_cache:10m inactive=60m;
server {
location /api {
include uwsgi_params;
uwsgi_pass uWSGI_backend;
uwsgi_cache uwsgi_cache;
uwsgi_cache_valid 200 30m;
}
}
}确保缓存路径可访问并设置了适当的权限。
监控缓存大小和使用情况,避免过度占用磁盘空间。
注意不要缓存不应共享的敏感数据。
请记得正确处理缓存失效,以确保内容已更新。
说明
`uwsgi_cache_key` 指令用于定义一个自定义键,NGINX 将使用该键将响应存入 uWSGI 缓存。该指令在需要根据某些参数对缓存进行分段的场景中非常重要,例如会话 ID、用户认证状态,或任何影响针对特定请求所提供内容的其他变量。默认情况下,NGINX 会使用请求 URI 的哈希,但通过该指令,你可以显式指定缓存键的构造方式。 该指令通过接受单个参数来工作,该参数是一个可以包含变量、常量或两者的字符串,从而提供了构建缓存键的灵活方式。例如,如果你希望基于用户会话使用不同的缓存条目,可以包含变量 $http_cookie。这里定义的键对于确保缓存命中准确至关重要,能够保证在随后相同请求发生时检索到预期的响应。
配置示例
uwsgi_cache_key "$scheme$request_method$host$request_uri$http_cookie";
覆盖默认 key 需要准确地指定,以避免 cache misses。
如果在 key 中使用 variables,请确保它们在访问 cache 的上下文中已被定义。
说明
`uwsgi_cache_path` 指令用于定义在文件系统中用于缓存来自 uWSGI 应用响应的位置。该指令启用响应缓存:来自 uWSGI 处理程序的响应会被存储到磁盘,并可直接从缓存中提供,从而降低后端服务器负载并改善响应时间。该指令的主要参数包括缓存键名、缓存目录,以及可选的缓存大小、空闲时间和缓存存储结构中使用的目录层级数。 `uwsgi_cache_path` 配置时接受多个配置选项,例如用于存储缓存数据的目录路径、缓存键名、缓存的最大大小以及缓存项的特定空闲超时时间。缓存目录必须可被 NGINX 工作进程写入。对于生成可缓存的重复响应的应用来说,该缓存机制可以显著提升性能,尤其是针对静态内容或变化不频繁的动态页面。 总体上,该指令通常与 `uwsgi_cache` 指令结合使用,后者用来指定针对特定 uWSGI 路径是否启用缓存以及在该上下文中如何管理缓存行为,从而与 NGINX 的缓存功能紧密集成以优化应用交付。
配置示例
uwsgi_cache_path /var/cache/nginx/uwsgi_cache levels=1:2 max_size=10g inactive=60m use_temp_path=off;
确保缓存目录具有正确的权限,以便 NGINX 工作进程能够写入。
注意缓存大小限制,并在必要时清理陈旧条目以防止磁盘空间问题。
错误设置 `levels` 选项可能导致存储效率低下或性能问题。
说明
`uwsgi_cache_bypass` 指令在 NGINX 中用于指定导致跳过已缓存 uWSGI 响应的具体条件。这在某些请求不应获取缓存内容的场景中特别有用,可确保在不受缓存干扰的情况下提供最新的数据。您可以为该指令指定一个或多个参数,这些参数可以是用户定义的变量或基于 HTTP 头或其他请求属性的条件。 该指令可以放在 `http`、`server` 或 `location` 上下文中,并支持一个或多个参数。每个参数表示一个条件或变量,当其计算为真时,会触发缓存系统为该请求跳过缓存响应。例如,您可以将 `uwsgi_cache_bypass` 配置为避免对已认证用户进行缓存,或在请求中存在特定查询参数时禁止缓存。 此外,该指令与其他与缓存相关的指令(例如 `uwsgi_cache` 和 `uwsgi_cache_key`)协同工作。将 `uwsgi_cache_bypass` 与这些指令正确配合使用可以微调缓存行为,更好地满足您的应用需求,使开发者能够控制何时不使用缓存,从而提供更具动态性的内容交付。
配置示例
location /api {
uwsgi_pass backend;
uwsgi_cache my_cache;
uwsgi_cache_bypass $arg_bypass;
}请确保您指定的任何条件确实求值为 true 以绕过缓存;否则将发生缓存。
使用过多的条件,如果管理不当,可能导致性能下降,因为这会为请求处理增加开销。
说明
`uwsgi_no_cache` 指令用于 NGINX 配置中,根据指定的参数防止某些响应被缓存。当该指令带有一个或多个参数时,它会告诉 NGINX 对于任何匹配这些参数的请求不缓存响应。这在必须始终从 uWSGI 应用服务器新鲜获取内容的情况下尤其有用,例如经常变化的动态内容。 `uwsgi_no_cache` 的参数可以包含会被求值为条件或数值的变量,从而实现对缓存的细粒度控制。例如,可以指定某些请求头或状态码,使响应被标记为不可缓存。该指令是上下文敏感的,可在包括 `http`、`server` 和 `location` 在内的各种作用域中使用,从而在整个 NGINX 配置中实现灵活的缓存策略。 当满足指定条件时,响应由 NGINX 处理但不会存储到其缓存机制中,确保用户始终收到最新内容。如果未指定该指令,NGINX 可能会根据默认缓存设置缓存符合条件的响应,从而可能导致提供过时的内容。
配置示例
location /app {
uwsgi_pass unix:/tmp/uwsgi.sock;
uwsgi_no_cache $http_cache_control;
}确保所提供的参数正确匹配缓存需求;参数错误可能导致意外的缓存行为。
请记得检查配置中的其他部分是否存在缓存设置,例如 `proxy_cache` 或其他可能覆盖此设置的缓存指令。
说明
`uwsgi_cache_valid` 指令用于 HTTP、server 和 location 上下文中,用于定义在使用 UWSGI 缓存时,特定 HTTP 响应代码应缓存多长时间。该指令允许管理员为不同的响应状态码指定不同的缓存时长,这有助于通过减少上游服务器的负载来优化内容传输。对于某些比其他更稳定的动态内容,这一点尤其有用。 在配置此指令时,您可以提供一个或多个 `code` 和 `time` 对。每个对表示具有特定 HTTP 状态码的响应应缓存指定的 `time` 参数所表示的时长。时间值可以用秒指定,或使用后缀例如 'm' 表示分钟或 'h' 表示小时。例如,`200 10m` 将所有状态为 200 的响应缓存 10 分钟。未在指令中定义的状态的响应将不会被缓存。 此指令通常与启用 UWSGI 响应缓存的 `uwsgi_cache` 指令配合使用。通过微调不同响应的缓存时长,可以提高服务器性能并减少带宽使用,从而为用户带来更快的响应时间。
配置示例
uwsgi_cache_valid 200 30m; uwsgi_cache_valid 404 1m; uwsgi_cache_valid 500 5m;
确保为所提供的内容指定的缓存时间合适,因为过于激进的缓存策略可能导致向用户提供过时的内容。
应测试上游服务器的响应,以验证可缓存的响应代码确实已被正确设置,因为后端服务配置错误可能导致意外行为。
说明
指令 `uwsgi_cache_min_uses` 是 NGINX 缓存机制的一部分,专门用于 uWSGI 请求。它允许你为某个请求被缓存设定一个阈值,即该请求必须被处理多少次才有资格被缓存。这在控制缓存持久性和性能方面特别有用,因为它可以防止不常见的请求不必要地占用缓存空间。 该指令接受一个参数:一个整数值,表示最小使用阈值。例如,如果设置为 3,则某个请求必须至少被发起三次后,其响应才会被存入缓存。如果请求次数低于该限制,则响应不会被缓存,这在高流量环境中可能是有利的,因为并非所有请求都值得缓存。通过确保缓存只保存最常被请求的响应,这有助于优化缓存使用并提高应用程序的整体性能。 需要注意的是,应当谨慎使用此指令:将阈值设置得过高可能会阻止有效响应被缓存,而设置得过低则可能导致对仅偶发出现的响应进行过度缓存。因此,建议评估流量模式并相应调整此指令以实现期望的缓存行为。
配置示例
uwsgi_cache_min_uses 3;
将该值设置为 1 可能导致缓存使用过度,因为所有响应会在第一次请求后立刻被缓存。
如果请求总数过低,而阈值设置得过高,某些有用的响应可能永远不会被缓存。
说明
在 NGINX 使用 uWSGI 缓存机制时,`uwsgi_cache_max_range_offset` 指令指定范围请求可偏移的最大字节数。范围请求允许客户端仅请求文件的一部分,该部分由字节范围标识,对于恢复中断的下载或媒体流等场景很有用。 当客户端带有 Range 请求头发起请求时,本指令会限制请求在内容中可到达的偏移位置。如果指定的偏移量超过本指令设置的限制,NGINX 将以表明范围不可满足的状态码(HTTP 416)进行响应。该指令的值以字节为单位指定,因此应根据预期的使用模式和所提供内容的类型对其进行微调。 例如,如果 `uwsgi_cache_max_range_offset` 设置为 1024,客户端只能请求缓存对象前 1024 字节范围内的部分内容偏移。这可以防止大文件导致的过度资源消耗,并通过限制为提供部分内容而进行的缓存查找和内存分配范围来提高性能。
配置示例
location /app {
uwsgi_pass 127.0.0.1:9000;
uwsgi_cache my_cache;
uwsgi_cache_max_range_offset 2048;
}将该值设置得过高可能在处理大文件的范围请求时导致资源使用过多。
不设置此指令可能会导致某些期望使用范围定位功能的客户端出现意外行为。
说明
`uwsgi_cache_use_stale` 指令控制在对 uWSGI 请求响应时 NGINX 何时应该返回过期的缓存内容。该指令在维护服务可用性方面尤其有用,因为它允许在正在生成新鲜内容时使用过期的缓存响应。你可以使用以下参数来指定在何种情况下返回过期内容:'error'、'timeout' 和 'invalid_header'。例如,如果后端 uWSGI 服务器宕机或超时,用户仍然可以接收到缓存内容而不是错误页面。 要有效地使用此指令,应将其添加到配置了 uWSGI 缓存的 location block 中。它可以根据需要接受多个参数,这意味着如果你指定了 'timeout error',在超时和发生错误的情况下都会返回过期内容。这样可以通过减少用户遇到的服务中断次数来提高应用的健壮性。然而,管理员在广泛使用此指令前应谨慎,确保过期内容对用户仍然是相关且可接受的。
配置示例
location /api {
uwsgi_pass 127.0.0.1:9000;
uwsgi_cache my_cache;
uwsgi_cache_use_stale error timeout;
}确保在您的应用场景中允许提供过期内容;这可能会导致提供过时的信息。
请记得在使用 `uwsgi_cache_use_stale` 之前,使用 `uwsgi_cache` 定义一个有效的缓存配置。
组合过多选项可能导致行为复杂;请进行充分测试。
说明
`uwsgi_cache_methods` 指令是 NGINX 中 uWSGI 缓存机制的一部分,允许用户指定应缓存响应的特定 HTTP 方法。默认情况下,缓存仅应用于 GET 和 HEAD 请求,但使用此指令可以通过将额外的方法作为参数包含在内。在某些应用中,POST 或其他方法产生的响应也应被缓存以提升性能并避免过高的服务器负载时,这种灵活性非常重要。 该指令允许一个或多个参数,这些参数是方法名称,例如 'GET'、'HEAD'、'POST' 等。这些名称区分大小写,必须拼写正确才能生效。除了控制哪些方法可以被缓存之外,它还提供了一种根据应用特性微调缓存行为的方法,在速度和向用户提供数据的新鲜度之间取得平衡。指定缓存方法后,NGINX 将仅缓存由这些 HTTP 方法生成的响应,而其他方法的响应将不会被存储在缓存中。 该指令可在 `http`、`server` 和 `location` 等上下文中使用。这种灵活性意味着可以在每个部署层面精细控制缓存,使管理员能够根据具体情况自定义缓存行为。
配置示例
uwsgi_cache_methods POST PUT;
确保所列的方法对于您的应用程序是有效且必要的;不当的方法指定可能导致缓存问题。
请记住,缓存的行为也可能受其他指令的影响,例如 `uwsgi_cache_bypass` 和 `uwsgi_cache_use_stale`。
说明
`uwsgi_cache_lock` 指令用于在 NGINX 中使用 uWSGI 缓存机制时启用或禁用缓存锁定。当该指令设置为 'on' 时,如果对当前正在生成的缓存内容发起请求,其他对相同内容的请求将被锁定,直到第一个请求完成。这样可以减少对同一请求的重复处理,提高资源利用率,并降低并发请求的响应时间。默认情况下,如果未设置该指令,缓存将不进行锁定,这可能导致在多个请求同时发生时出现多次内容生成。 该指令与 `uwsgi_cache` 指令相互作用,后者负责定义用于缓存 uWSGI 响应的缓存区。将 `uwsgi_cache_lock` 设置为 'off' 会允许对同一未缓存资源的多个并发请求,这可能会导致应用后端负载增加。您可以在 http、server 或 location 上下文中指定此指令,根据您的缓存策略和架构提供灵活性。可以通过其他缓存指令进一步微调缓存行为,以根据应用需求确保最佳性能。
配置示例
uwsgi_cache my_cache;
uwsgi_cache_lock on;
location /example {
uwsgi_pass my_app;
uwsgi_cache my_cache;
}在启用锁定之前,确保已为有效缓存定义 uwsgi_cache。
如果您的应用可以容忍多个请求同时处理,请避免启用 `uwsgi_cache_lock`。
说明
NGINX 中的 `uwsgi_cache_lock_timeout` 指令用于控制在等待另一个请求完成其缓存操作时缓存锁保持激活的时长。当多个请求试图从 uWSGI 检索缓存数据时,该锁可防止缓存雪崩,确保一次只有一个请求能够获取缓存数据。如果在锁超时之前有另一个请求到达,它将等待锁被释放,从而减少多个后端请求的处理并提高性能。 该指令接受一个时间值作为参数,用于指定其他请求等待缓存锁的时长。超时以秒为单位定义,在负载偶发性较高的场景中较长的超时可能有助,但在缓存访问竞争激烈时会导致请求延迟增加。相反,将此值设置得过低可能会导致如果原始请求耗时超过锁超时,则多个并发请求同时打到后端,从而抵消缓存的好处。 此外,应在适当的配置上下文(http、server 或 location)中设置 `uwsgi_cache_lock_timeout` 指令,具体取决于您希望在哪个范围内管理缓存行为。请根据您的流量模式和应用响应时间谨慎使用此指令,以获得最佳的缓存性能。
配置示例
http {
uwsgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m;
server {
location / {
uwsgi_pass my_uwsgi;
uwsgi_cache my_cache;
uwsgi_cache_lock on;
uwsgi_cache_lock_timeout 5s;
}
}
}将超时设置得过低可能导致缓存未命中,因为其他请求可能不会等待足够长的时间让锁释放。
如果缓存锁超时设置得不成比例地高于预期响应时间,在高争用情况下会导致请求产生不必要的用户等待时间。
未指定值可能会根据其他配置设置导致不可预测的行为。必须始终定义一个值或将其设置为 'none'。
确保缓存机制已正确配置,否则该指令不会生效。
说明
`uwsgi_cache_lock_age` 指令用于 NGINX 配置中,定义等待缓存锁的特定超时时间。当多个针对同一资源的请求同时到达时,缓存锁机制通过只允许一个请求从后端获取资源而让其他请求等待缓存填充,从而防止缓存雪崩。这可以避免后端因重复请求而过载,并在资源被缓存后向客户端提供最新内容。 为 `uwsgi_cache_lock_age` 指定的值是一个时间长度,用于控制其他请求等待锁释放的最长时间。如果缓存锁不可用且超时时间到期,后续请求可能会立即失败,或根据配置继续由后端获取资源。因此该指令在性能需求与使用 uWSGI 的动态内容的资源管理之间起到平衡作用。 该指令可在 NGINX 的多个上下文中使用,包括 http、server 和 location 块。在高并发环境中尤为有效,缓存对于降低后端负载和提升响应时间至关重要。
配置示例
uwsgi_cache_lock on; uwsgi_cache_lock_age 10s;
将该值设置得过低可能导致缓存击穿,当多个请求同时到达时会发生冲突。
未启用 `uwsgi_cache_lock` 将使该指令失效,因为不会应用任何锁。
过长的缓存锁定周期可能会延长等待缓存命中的用户的响应时间。
说明
指令 `uwsgi_cache_revalidate` 用于管理缓存响应在新鲜度方面的处理方式。当启用此指令时,对于被视为过期的缓存响应,NGINX 会向 uWSGI 服务器发出重新验证请求。这意味着当缓存响应的过期时间(由 `uwsgi_cache_valid` 指令定义)已过时,NGINX 不会直接提供该响应,而是会向服务器确认内容是否仍然有效。这有助于在内容频繁更新的情况下向用户提供最准确、最新的响应。 该指令可以在多个上下文中使用,包括 http、server 和 location 范围,从而允许在应用的不同部分采用灵活的缓存策略。它接受一个布尔参数,用于启用或禁用重新验证过程。启用此指令可能会增加一些开销,因为它涉及向 uWSGI 服务器发出额外请求,然而它能确保最终用户的数据一致性和新鲜度。 在应用数据经常变化且需要迅速反映这些变化、避免长时间陈旧的环境中,使用 `uwsgi_cache_revalidate` 特别有用。它可以与其他缓存指令(例如 `uwsgi_cache`、`uwsgi_cache_key` 和 `uwsgi_cache_valid`)配合使用,以提供满足应用需求的全面缓存配置。
配置示例
uwsgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m;
location / {
uwsgi_pass my_uwsgi;
uwsgi_cache my_cache;
uwsgi_cache_revalidate on;
uwsgi_cache_valid 200 1h;
}启用重新验证可能会引入额外延迟,因为会向 uWSGI 服务器 发出额外的请求。
确保你的 uWSGI 应用能够高效处理重新验证请求,以避免性能下降。
在没有适当缓存失效策略且管理不当的情况下使用 `uwsgi_cache_revalidate` 可能导致应用行为不一致。
说明
`uwsgi_cache_background_update` 指令用于 NGINX 配置中的 `http`、`server` 和 `location` 块。当该指令设置为 `on` 时,NGINX 会在某个请求的响应未在缓存中找到时启动后台缓存更新。此举有助于减少后续请求的延迟,因为首次请求可能发生缓存未命中,但可以在客户端与服务器交互的同时透明地更新缓存内容。 该特性通过在新内容生成时将用户等待时间最小化来优化性能。如果 `uwsgi_cache_background_update` 设置为 `off`,NGINX 将不会尝试为未命中的请求刷新缓存,这意味着后续请求将继续收到陈旧或没有缓存的响应,直到有新的响应被手动写入缓存。因此,需要实时数据的应用可能更适合使用后台更新机制,以在不产生额外延迟的情况下确保响应是最新的。 该指令接受单个参数,可选值为 `on` 或 `off`。在使用该指令时,应确保缓存存储和 uWSGI 应用已被有效配置以处理后台操作,以避免因并发后台抓取导致服务器过载或性能下降。此外,应将缓存策略与 NGINX 配置中的其他缓存设置一并明确定义。
配置示例
uwsgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m;
location / {
uwsgi_pass 127.0.0.1:9000;
uwsgi_cache my_cache;
uwsgi_cache_background_update on;
}在高流量场景中使用此指令时要谨慎,因大量缓存未命中可能触发大量并发缓存更新,从而可能影响应用性能。
当在后台执行缓存更新时,确保你的 uWSGI 应用能够正确处理并发请求。
说明
`uwsgi_temp_path` 指令指定了 NGINX 在处理发送到 uWSGI 应用的请求时存放临时文件的目录。这在可能需要在发送给客户端之前对大型响应进行缓冲的场景中特别有用。默认情况下,这些临时文件会在定义的路径中创建以有效处理缓冲,从而减少后端应用的负载。该指令接受一到四个参数,允许用户定义主目录和可选的子目录来组织临时文件。 在配置 `uwsgi_temp_path` 时,请注意底层文件系统的权限,确保 NGINX 对所定义的目录具有写权限。定期清理临时文件也很重要;否则,过多的积累可能导致存储问题。通过妥善管理这些文件,可以保持应用的最佳性能并防止与存储限制相关的意外错误。 该指令可以放在诸如 http、server 和 location 等不同上下文中,使其在 NGINX 配置的不同路由场景下具有灵活性。对该指令进行谨慎配置对于高效的资源管理和 Web 应用的高可用性至关重要。
配置示例
uwsgi_temp_path /var/tmp/uwsgi;
确保指定目录具有适当的权限,以便 NGINX 写入临时文件。
考虑为旧临时文件配置清理机制,以避免磁盘空间问题。
说明
`uwsgi_max_temp_file_size` 指令在 NGINX 中定义了在为 uWSGI 请求存储请求体时临时文件允许的最大大小。如果超过此限制,NGINX 将以 413 error (Request Entity Too Large) 拒绝该请求。这在上传场景中尤其相关,可帮助防止由于上传或处理过大的文件导致服务器磁盘空间耗尽。 该指令以字节为单位指定,并可以在 `http`、`server` 或 `location` 上下文中设置,使其在配置的不同部分具有灵活性。设置此指令可以让管理员通过限制每个 location 或 server 块的上传大小,更有效地管理磁盘空间。根据应用的预期文件大小设置此值很重要,以确保性能和可靠性。 此指令的典型配置类似于 `uwsgi_max_temp_file_size 10m;`,这会将临时文件限制为最多 10 兆字节。通常,监控服务器上临时文件占用的空间并根据应用使用模式按需调整此设置是良好做法。
配置示例
location /upload {
uwsgi_pass 127.0.0.1:9000;
uwsgi_max_temp_file_size 10m;
}将此值设置得过低可能会导致合法上传出现意外的 413 错误。
并非所有客户端都能优雅地处理 413 错误;请确保客户端应用程序能够处理这些响应。
说明
`uwsgi_temp_file_write_size` 指令控制 NGINX 用于存储缓冲的 uWSGI 响应的临时文件的最大大小。当 NGINX 处理来自 uWSGI 服务器的响应时,可能需要在将响应发送给客户端之前临时写入文件。该指令指定这些临时文件的大小上限,有助于根据来自 uWSGI 服务器的预期响应大小管理磁盘空间并优化性能。它接受一个参数,用于以字节、千字节、兆字节等为单位定义大小,并使用标准 NGINX 大小后缀,例如 'k' 表示千字节,'m' 表示兆字节。该指令可在 `http`、`server` 或 `location` 上下文中设置,提供了根据所需控制临时文件大小粒度的灵活性。
配置示例
uwsgi_temp_file_write_size 16k;
将该值设置得过低可能导致 NGINX 频繁写入磁盘,从而造成性能下降。
如果未设置,NGINX 默认为使用 8k,这可能不足以应对较大的响应。
说明
`uwsgi_next_upstream` 指令用于处理与上游 UWSGI 服务器通信时的失败情况。它允许你配置特定的响应码或条件,当这些条件触发时,会在上游组的下一个服务器上重试该请求。你可以指定的值包括常见的失败条件,例如 `timeout`、`invalid_header`,以及表示错误的一系列 HTTP 状态码(例如,`502`、`503`、`504`)。这种灵活性通过在服务器出现问题时提供备选方案,帮助提高 Web 应用的可靠性。 当 NGINX 在处理 UWSGI 请求时遇到与指定失败条件匹配的错误时,它会自动尝试将请求重新路由到 `uwsgi_pass` 指令中定义的下一个服务器。这可以通过防止临时错误影响最终用户体验,显著增强应用的弹性。提供给该指令的参数可以组合使用,以提供一套全面的重试策略,针对你的特定应用需求进行定制。
配置示例
location /app {
uwsgi_pass backend;
uwsgi_next_upstream error 502 503 504;
}确保上游服务器能够处理与初始服务器相同的请求,以避免出现不一致的行为。
该指令仅应在 `uwsgi` 指令的上下文中使用,例如 `uwsgi_pass`,否则不会生效。
如果多个上游服务器不可用,且未配置适当的退出条件,请求可能会进入重试循环。
说明
'uwsgi_next_upstream_tries' 指令用于指定在请求失败之前 NGINX 应尝试联系备用上游服务器的次数。该指令与 uWSGI 模块配合使用,适用于 'http'、'server' 和 'location' 上下文。当 NGINX 遇到与指定上游服务器连接问题时——例如服务器宕机或返回 HTTP 错误码——它将尝试连接其可用服务器列表中的下一个上游服务器,最多尝试至该指令指定的次数。 默认情况下,该指令的值为 0,这意味着当与上游服务器连接失败时 NGINX 不会进行任何重试。将此指令设置为大于零的值(例如 1、2 或更多)可以使 NGINX 更优雅地处理临时服务器问题,允许在不直接使请求失败的情况下实现潜在的服务恢复。这可以在上游服务器出现瞬时错误时增强应用的弹性。 提供的值必须为正整数,表示对定义的上游服务器进行重试的最大次数。用户在使用此指令时应谨慎,因为过多的重试可能导致在上游服务器持续失败时增加延迟和资源消耗。 此外,监控上游服务器的健康状况并考虑使用健康检查至关重要,以确保 NGINX 仅将流量路由到可用且响应的服务器。
配置示例
upstream myapp {
server backend1.example.com;
server backend2.example.com;
}
location / {
uwsgi_pass myapp;
uwsgi_next_upstream_tries 2;
}确保 'uwsgi_next_upstream_tries' 的值为正整数;否则,NGINX 将不会进行重试。
过多的重试可能导致延迟增加;请密切监控上游服务器的性能。
说明
`uwsgi_next_upstream_timeout` 指令主要用于涉及 uWSGI 作为后端应用服务器的 NGINX 配置中。此指令指定当当前上游服务器失败时,NGINX 在尝试向下一个上游服务器发送请求之前应等待的最大时间。这在将请求分发到多个 uWSGI 服务器的负载均衡环境中尤为有用。 该指令应设置为一个时间值,可以用秒指定,或使用后缀如 'ms'(毫秒)、's'(秒)、'm'(分钟)或 'h'(小时)。如果对上游服务器的请求失败且指定的超时时间尚未过去,NGINX 会立即尝试联系可用上游服务器组中的另一个服务器。通过更快地故障转移到可能能够成功处理请求的其他服务器,这可以在高流量应用中改善响应时间。 关键是要确保为该指令设置的值与 NGINX 配置中为其他相关指令(例如 `uwsgi_read_timeout`)指定的整体超时设置相一致,因为不匹配的值可能在处理请求时导致意外行为。此外,在没有适当监控的情况下增加此超时可能导致对最终会失败的请求进行较长时间的等待,这可能不利于用户体验。
配置示例
uwsgi_next_upstream_timeout 30s;
将超时时间设置得非常短可能导致频繁的故障切换尝试并增加上游服务器的负载。
如果不将该指令与其他超时指令一起配置,可能会导致请求处理行为异常。
说明
`uwsgi_param` 指令用于在 uWSGI 协议中为转发到 uWSGI 服务器的请求设置参数。这些参数可帮助配置运行在 uWSGI 服务器上的应用可用的请求环境变量。指令接受两个到三个参数:第一个必须是参数名,第二个是值,可选的第三个参数可用于指示是否传递原始服务器变量。这种灵活性有助于根据特定应用需求自定义请求处理。 在定义 `uwsgi_param` 时,重要的是要理解这些参数区分大小写,并且应与你的 uWSGI 应用中期望的值相匹配。此外,这些定义可以在诸如 `http`、`server` 和 `location` 块等不同上下文中设置,从而对应用不同部分与 uWSGI 服务器的交互提供细粒度控制。通过 `uwsgi_param` 设置的值可能会影响诸如路由、日志记录或响应渲染等行为,具体取决于在 uWSGI 应用中定义的应用逻辑。
配置示例
location /app {
include uwsgi_params;
uwsgi_pass unix:/tmp/uwsgi.sock;
uwsgi_param SCRIPT_NAME /app;
uwsgi_param YOUR_CUSTOM_PARAM value;
}确保参数名称与 uWSGI 应用中预期的值匹配;它们是区分大小写的。
使用不必要的参数可能导致性能开销或意外行为。
具体取决于 uWSGI 应用的设置,并非所有参数都相关,因此请了解您的应用上下文。
说明
`uwsgi_string` 指令用于指定一个将传递给 uWSGI 服务器的字符串值。在需要将特定配置或命令发送到应用服务器的场景中,这尤其有用。该指令可以放在不同的上下文中,例如 `http`、`server` 和 `location`,根据您的服务器配置需求提供灵活性。 在实现 `uwsgi_string` 指令时,您需要提供一个表示字符串内容的参数。该字符串可以是预定义的命令或应用程序期望的任意其他文本。`uwsgi_string` 指令的行为会受到其使用上下文的影响,从而允许在 NGINX 配置的不同部分对 uWSGI 交互进行更精细的控制。 在执行方面,当有请求匹配 `uwsgi_string` 指令所在的上下文时,NGINX 会将指定的字符串附加到后端 uWSGI 请求中。这有助于高效地管理 NGINX 与 uWSGI 应用之间的通信,确保在请求生命周期中必要的参数能够成功传递。
配置示例
location /myapp {
uwsgi_pass 127.0.0.1:8000;
uwsgi_string "my_custom_command";
}确保该字符串不包含特殊字符,除非已正确转义。
仔细核对发送的字符串是否为 uWSGI 应用所期望,以避免出现意外行为。
说明
`uwsgi_pass_header` 指令是 NGINX 的 uWSGI 模块中的一个配置选项,允许用户指定由 uWSGI 应用返回并在响应中传递给客户端的特定头部。该指令可以在 `http`、`server` 或 `location` 上下文中指定,从而在 NGINX 服务器的不同部分实现灵活配置。该指令的参数是单个头部名称,必须与 uWSGI 应用在响应中包含的头部名称相匹配。 使用 `uwsgi_pass_header` 指令时,只有被指定的头部会被转发到客户端,这有助于控制暴露的信息并确保相关头部被一致地返回。这对于传递应用特定数据的头部特别有用,例如版本信息、安全令牌或自定义的应用状态消息。通过有选择地传递头部,管理员可以提升安全性并减少不必要的数据传输。 如果需要传递多个头部,可以在同一配置块中多次声明 `uwsgi_pass_header` 指令,每次指定一个不同的要转发的头部。整体行为还取决于 uWSGI 服务器的配置,NGINX 在尝试转发到客户端之前会确保这些指定的头部确实存在于响应中。
配置示例
location /app {
include uwsgi_params;
uwsgi_pass my_app;
uwsgi_pass_header X-My-Custom-Header;
}确保所指定的 header 名称与 uWSGI 响应中出现的完全一致(包括大小写)。
如果 uWSGI 应用未设置某个 header,则无法通过 `uwsgi_pass_header` 传递该 header,可能会造成混淆。
说明
`uwsgi_hide_header` 指令旨在增强安全性并自定义从 uWSGI 应用返回给客户端的响应头。当该指令出现在配置中时,它会显式指定在生成响应时应省略的头。这对于防止泄露敏感信息或通常由头部传达的应用细节特别有用。 该指令可以放在多个上下文中,包括 `http`、`server` 和 `location`,这使得可以根据应用需求灵活配置。它接受一个参数:要隐藏的头名称。例如,若想抑制 `X-Powered-By` 头,可以使用 `uwsgi_hide_header X-Powered-By;`。该指令有效地集成到 NGINX 对请求和响应的处理流程中,在生成响应的过程中拦截头部,确保它们不会到达客户端。 请记住,不当使用该指令可能导致响应上下文不完整,某些重要头部可能是客户端应用或中间件所需。因此,应谨慎使用,主要针对已确认包含不影响整体功能的多余数据的头部。
配置示例
server {
location /api {
uwsgi_pass 127.0.0.1:8000;
uwsgi_hide_header X-Powered-By;
}
}隐藏重要的 HTTP 头部可能会导致客户端应用程序出现意外行为。
请确保仅隐藏不会影响您应用程序功能的头部。
说明
uwsgi_ignore_headers 指令在 NGINX 中用于在处理来自 uWSGI 应用服务器的响应时,排除不被转发给客户端的特定头部。该指令可以接受一个或多个头部名称作为参数,用于指定要忽略的头部。当指定的头部名称出现在 uWSGI 响应中时,NGINX 不会在最终返回给客户端的响应中包含该头部,从而使对向客户端暴露的信息能够进行更细粒度的控制。 该指令在安全和隐私方面尤其有用,因为某些头部可能包含不应向客户端披露的信息,例如内部服务器状态或应用特定的元数据。在适当的上下文中使用该指令——包括 http、server 和 location 块——可以使系统管理员根据与 uWSGI 应用交互时的需要调整 NGINX 的行为,确保仅向外暴露必要的数据并防止敏感信息泄露。 此外,使用该指令还可以通过减少处理和返回给客户端的数据量来略微提高响应时间。仔细选择要忽略的头部可以消除可能对最终用户不感兴趣或无关的信息的冗余传输。
配置示例
uwsgi_ignore_headers X-Powered-By Set-Cookie;
确保所指定的 headers 确实存在于 uWSGI response 中;否则在缺失时不会生效。
在忽略可能对 client 交互重要的 headers(例如用于管理 sessions 的 cookies)时要小心。
说明
`uwsgi_ssl_session_reuse` 指令用于开启或关闭通过 NGINX 代理到后端的 uWSGI 请求的 SSL 会话重用。启用时,该指令允许 NGINX 在向相同后端服务器发送后续请求时使用已有的 SSL 会话参数,从而减少 SSL 握手开销并提升性能。 该指令接受一个标志值,其中 `on` 启用会话重用,`off` 禁用。默认情况下,该行为未设置,这意味着会遵循全局或服务器级别定义的 SSL 会话设置。在高负载下,启用 SSL 会话重用可以带来性能提升,尤其是在短时间内向同一 uWSGI 后端发出多次请求的环境中,因为它避免了每次请求都进行完整的 SSL 握手。 但是,如果后端 uWSGI 服务器未正确配置以处理或识别 SSL 会话重用,可能会导致意外行为。因此,重要的是确保系统的各个部分都采用一致的配置以正确处理被重用的 SSL 会话。此外,建议在将更改部署到生产环境之前在预发布环境中进行测试。
配置示例
uwsgi_pass unix:/var/run/uwsgi/your_app.sock; uwsgi_ssl_session_reuse on;
确保您的后端 uWSGI 服务器支持 SSL 会话重用,以确保正常运行。
如果后端存在会话处理问题,可能需要使用 `off`。
应进行测试以验证在预期负载条件下的性能改进。
说明
`uwsgi_ssl_protocols` 指令用于配置在 NGINX 通过 SSL 与上游 uWSGI 服务器通信时允许使用的 SSL 协议。这对于确保安全连接仅使用符合安全标准的 SSL/TLS 版本尤为重要。 该指令接受一个或多个参数,表示 SSL 协议,例如 `TLSv1`、`TLSv1.1` 或 `TLSv1.2`。通过指定所需的 SSL 协议,管理员可以强制连接只使用安全的版本,避免使用已弃用或不安全的协议。如果未指定任何协议,默认行为可能会根据 NGINX 版本和编译选项而有所不同,因此通常建议为安全起见进行显式配置。 为有效应用 `uwsgi_ssl_protocols`,它需要放在以下上下文之一:`http`、`server` 或 `location`。这使管理员能够根据架构需求和特定服务器配置灵活设置不同的 SSL 协议。
配置示例
http {
uwsgi_ssl_protocols TLSv1.2 TLSv1.3;
}确保所指定的协议由用于 NGINX 的底层 OpenSSL 版本所支持。
在禁用较旧协议时要小心,因为某些客户端可能不支持较新的版本,可能导致连接失败。
说明
'uwsgi_ssl_ciphers' 指令用于 NGINX 配置中,管理通过 FastCGI 或类似协议向 uWSGI 应用建立的安全连接。它指定 uWSGI 服务器在 SSL 连接中应使用的密码套件,确保 NGINX 与 uWSGI 后端之间进行安全加密的通信。该指令在执行安全策略方面起着关键作用,通过限制可用的密码可以帮助降低潜在的漏洞风险。因此,谨慎选择密码套件非常重要,因为这会影响通过 SSL 连接传输的数据的安全级别。 'uwsgi_ssl_ciphers' 指令接受一个参数,该参数是表示密码列表的字符串。此列表可以使用 OpenSSL 的密码字符串格式来定义。需要注意的是,正确配置的密码列表可以提高整体安全性并符合各种安全标准。具体而言,该指令可以放在 NGINX 配置中的 http、server 或 location 块内,允许在服务器托管的不同站点或应用之间灵活指定和强制使用 SSL 密码。
配置示例
uwsgi_ssl_ciphers 'HIGH:!aNULL:!MD5';
确保已安装的 OpenSSL 库支持指定的密码套件。
使用已弃用或弱的密码套件可能会使您的应用程序面临安全漏洞风险。
在全局与局部应用此指令时要谨慎,因为如果配置错误,它可能会影响所有 SSL 流量。
说明
`uwsgi_ssl_name` 指令在将 NGINX 配置为通过 SSL 与 uWSGI 后端通信时使用。该指令允许管理员指定在建立安全连接时 NGINX 应向 uWSGI 服务器出示的 SSL 主机名。这对于后端服务器配置为在证书验证或主机名校验时要求特定主机名的场景尤其有用。 `uwsgi_ssl_name` 接受单个参数,即应使用的主机名。它在 `http`、`server` 和 `location` 上下文中受支持,允许在 NGINX 配置的不同层级使用。它在确保 NGINX 与 uWSGI 实例之间的安全通信方面起着关键作用,促进保护应用服务器的最佳实践。 配置后,指定的 `uwsgi_ssl_name` 会在 SSL 握手之前作为 Server Name Indication (SNI) 包含在 ClientHello 消息中,允许后端服务器选择返回相应的 SSL 证书。如果配置不正确,或者主机名与 uWSGI 服务器端的预期值不匹配,SSL 连接可能会失败并产生错误。
配置示例
location /app {
include uwsgi_params;
uwsgi_pass backend;
uwsgi_ssl_name example.com;
}确保指定的主机名有效并与 uWSGI 服务器的证书配置相匹配。
注意主机名中的拼写错误或大小写不正确,因为如果提供的名称与服务器的期望不匹配,SSL 连接将失败。
说明
`uwsgi_ssl_server_name` 指令适用于包括 `http`、`server` 和 `location` 在内的不同上下文。启用此指令时,NGINX 会在通过 SSL 通信时将 `Host` 头中指定的服务器名传递给 uWSGI 应用。对于由于虚拟主机配置导致 uWSGI 服务器需要知道原始服务器名的情况,这一点尤其有用。 当设置为 'on' 时,NGINX 会在 uWSGI 请求中包含 `SERVER_NAME` 变量,从而根据虚拟主机配置实现更精确的路由和行为。该参数仅需一个标志且不接受其他参数;只需设置该指令即可启用其功能。重要的是确保目标 uWSGI 应用能够正确解释所传递的服务器名,以免导致请求路由错误或在处理 HTTP 响应时出现错误。 该指令在 SSL 终止的场景下增强了 NGINX 与 uWSGI 之间的兼容性和集成,对于希望在使用安全连接时保持其 Web 应用上下文的开发者来说是一个有用的选项。如果在同一后端环境中存在多个域名应用且基于服务器名处理请求时出现问题,可能需要调整此设置。
配置示例
server {
listen 443 ssl;
server_name example.com;
# other ssl configurations
location / {
uwsgi_pass unix:/path/to/your.sock;
uwsgi_ssl_server_name on;
uwsgi_param SCRIPT_NAME '';
uwsgi_param PATH_INFO $uri;
}
}确保你的 uWSGI 应用已配置为正确识别 SERVER_NAME 变量。
此指令仅在使用 SSL 时适用;请确保你的 server block 已针对 SSL 连接进行配置。
在将此指令用于多个 server block 时要格外小心,否则处理不当可能导致意外行为。
说明
在 NGINX 中,`uwsgi_ssl_verify` 指令用于在 NGINX 通过 SSL 向 uWSGI 服务器发出请求时启用或禁用 SSL 验证。该指令可以接受一个布尔标志作为参数,用以指示是否应执行 SSL 证书验证。启用时,NGINX 会检查 uWSGI 服务器提供的 SSL 证书以确保证书有效且受信任,这有助于防止中间人攻击并确保通信安全。 该指令通常与 `uwsgi_pass` 配合使用,请求会被转发到配置为处理 PHP 应用、Python 应用或其他使用 uWSGI 协议的框架的 uWSGI 后端。该指令可以在 `http`、`server` 或 `location` 上下文中指定,根据所需的 SSL 验证作用范围提供灵活的配置。该指令在生产环境中尤为重要,在此类环境下安全通信至关重要。 当启用验证(`on`)时,NGINX 还需要相应的证书颁发机构 (CA) 文件或捆绑包以确认证书的有效性。如果设置为 `off`,NGINX 将不会验证 SSL 证书,这可能使服务器容易受到欺骗攻击。鉴于其重要性,应根据应用的安全需求谨慎配置此指令。
配置示例
uwsgi_ssl_verify on; uwsgi_pass https://backend-uwsgi;
如果启用 SSL 验证,请确保 CA 文件已正确设置。
在生产环境中避免将其设置为 'off',因为这会降低安全性。
如果在启用验证时出现问题,请检查 uWSGI 服务器的 SSL 配置。
说明
指令 `uwsgi_ssl_verify_depth` 用于指定 NGINX 与 uWSGI 服务器通过 SSL 通信时对 SSL 证书的验证深度。此设置在 NGINX 作为配备 SSL 证书的 uWSGI 应用的反向代理时尤其有用。 通过配置验证深度,可以控制在证书链中将检查多少级证书。该深度反映了 NGINX 在到达受信任根证书之前会遍历多少个中间证书。适当的设置可以确保任何无效的中间证书不会允许建立连接,从而增强安全性。较大的深度值意味着更详细的验证,但如果管理不当可能会使证书配置复杂化。 该指令可以在多种上下文中设置,包括 `http`、`server` 和 `location`,根据需要在配置的不同层级灵活保护 SSL 连接。将其设置为 `0` 会禁用证书链验证,而设置为 `1` 则验证到直接的证书级别,通常对大多数配置而言已足够且不会增加过多复杂性。
配置示例
uwsgi_ssl_verify_depth 2;
将该值设置得过高可能会在中间证书缺失时导致连接失败。
将值设为 0 会禁用验证,这可能会使应用暴露于安全风险。
确保您的证书链已针对您设置的深度正确配置,否则请求可能会失败。
说明
在 NGINX 中,指令 'uwsgi_ssl_trusted_certificate' 用于与 uWSGI 服务器建立安全的 SSL 连接。该指令指定包含受信任 CA(证书颁发机构)证书的文件的路径。在通过 SSL 处理 uWSGI 请求时,NGINX 需要验证 uWSGI 服务器所提供的 SSL 证书。此验证对于确保客户端正在与受信任的 uWSGI 服务器通信并且连接是安全的至关重要。 该指令的参数是指向证书文件的单一路径。NGINX 会加载指定的文件,以在 SSL 握手期间将其与 uWSGI 服务器提供的证书进行比对。这一额外的安全层有助于防止中间人攻击,并确保通过网络传输的数据保持机密。 'uwsgi_ssl_trusted_certificate' 应在适当的上下文中指定——即 http、server 或 location。作为 SSL 连接配置设置的一部分,它可以与其他 SSL 指令配合使用,以无缝配置安全通信。
配置示例
server {
listen 443 ssl;
server_name example.com;
uwsgi_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
# Additional SSL configurations...
location / {
include uwsgi_params;
uwsgi_pass unix:/path/to/uwsgi.sock;
}
}确保证书文件路径正确,且可被 NGINX 进程访问。
使用错误的格式或过期的证书可能导致 SSL 连接失败。
多个证书可以合并到一个文件中,确保证书已按正确的顺序拼接。
说明
'uwsgi_ssl_crl' 指令用于在 NGINX 中处理 uWSGI SSL 连接。通过设置此指令,可以定义包含被撤销证书列表的文件的路径,该列表用于在 SSL 握手期间验证客户端出示的证书。这对于增强安全性非常重要,能确保证书不再有效或已被撤销的证书不会被服务器接受。CRL 由 NGINX 服务器处理,用以拒绝使用已撤销证书的客户端,从而维持强健的 SSL 安全态势。 此指令可以在 `http`、`server` 或 `location` 上下文中指定,接受一个参数,即 CRL 的文件路径。如果指定的文件不正确或无法读取,NGINX 会记录错误,并可能无法正确终止涉及已撤销证书的连接。必须确保证书撤销列表文件保持最新并可被 NGINX 服务器进程访问,以避免安全问题。 总的来说,使用 'uwsgi_ssl_crl' 指令通过控制哪些 SSL 证书被视为有效,提供了额外的安全层,这对处理敏感数据或需要高信任与合规性的应用尤为重要。
配置示例
server {
listen 443 ssl;
server_name example.com;
uwsgi_ssl_crl /etc/ssl/crl.pem;
location / {
uwsgi_pass unix:/tmp/uwsgi.sock;
uwsgi_ssl_certificate /etc/ssl/certs/your_cert.pem;
uwsgi_ssl_certificate_key /etc/ssl/private/your_key.pem;
}
}确保 CRL 文件格式正确并且 NGINX 可访问;否则,服务器可能无法正确验证证书。
在更新 CRL 文件后,请记得 reload 或 restart NGINX,以确保更改生效。
验证 CRL 文件的权限以避免运行时发生访问错误。
说明
`uwsgi_ssl_certificate` 指令在 NGINX 中用于定义服务器在通过 SSL 加密通道连接到 uWSGI 应用后端时将使用的 SSL 证书。该指令允许 NGINX 与 uWSGI 之间进行安全通信,确保数据在传输过程中得到保护。该指令接受一个参数,即指向 PEM 格式 SSL 证书文件的路径。 在 `http`、`server` 或 `location` 上下文中,`uwsgi_ssl_certificate` 指令期望提供一个有效的证书文件路径。如果指定了此配置,NGINX 在与 uWSGI 进程建立 SSL 握手时将使用该证书。务必确保证书格式正确且 NGINX 的工作进程可以访问该文件;否则,指向 uWSGI 后端的 SSL 连接可能会失败,导致诸如 SSL 握手失败之类的错误。 应将 `uwsgi_ssl_certificate` 指令与相应的 `uwsgi_ssl_certificate_key` 指令配对使用,后者指定与证书对应的私钥。两者共同确保从 NGINX 到 uWSGI 的连接是安全的,从而为使用此通信路径的 Web 应用提供安全的架构。
配置示例
server {
listen 443 ssl;
server_name example.com;
uwsgi_ssl_certificate /etc/ssl/certs/my_cert.pem;
uwsgi_ssl_certificate_key /etc/ssl/private/my_key.pem;
location / {
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi.sock;
}
}确保证书文件路径正确且文件对 NGINX 可读。
不要忘记设置相应的 `uwsgi_ssl_certificate_key` 指令,否则 SSL 连接可能会失败。
使用不正确的证书格式或过期的证书可能导致 SSL 握手错误。
说明
`uwsgi_ssl_certificate_key` 指令用于 NGINX 配置中,用以指定一个文件的路径,该文件包含与用于通过 SSL 与 uWSGI 应用通信的 SSL 证书相关联的私钥。当你希望通过对 NGINX 与 uWSGI 之间交换的数据进行加密以确保通信安全时,该指令尤为重要。该指令通常与指向 SSL 证书本身的 `uwsgi_ssl_certificate` 指令配合使用。 该指令接受单个参数,即私钥的文件路径,可在 `http`、`server` 或 `location` 上下文中指定。当 NGINX 处理针对 uWSGI 的请求时,会读取此私钥文件以建立安全连接。为防止未授权访问,私钥文件的权限设置至关重要,通常私钥文件应仅对运行 NGINX 工作进程的用户可读。 如果未正确指定私钥或因权限问题导致文件无法访问,NGINX 将无法启动或重载并产生错误。因此,在为 uWSGI 配置 SSL 时,务必确保文件路径正确并遵循必要的安全实践。
配置示例
uwsgi_ssl_certificate_key /etc/ssl/private/nginx.key;
确保文件路径正确并且对 NGINX 用户可访问。
确保私钥与在 `uwsgi_ssl_certificate` 中指定的 SSL 证书相匹配。
密钥文件的权限不正确可能导致 NGINX 启动或重载失败。
说明
'uwsgi_ssl_certificate_cache' 指令允许您定义在 NGINX 处理 uWSGI 请求时 SSL 证书的缓存方式。配置后,NGINX 会在指定的期限内缓存 SSL 证书,从而使后续连接无需重新协商 SSL 即能更快建立。这可以通过减少 SSL 握手时的延迟显著提升应用性能。 该指令的参数可以指定缓存大小、缓存时长以及任何其他与缓存相关的附加指令。指定缓存参数使用户能够根据特定的性能需求和服务器能力来优化资源使用。例如,更大的缓存可以带来更好的性能,但代价是更高的内存占用。 该指令必须放在适当的上下文中,例如 http、server 或 location,对于持续使用 SSL 并且需要频繁连接的应用(例如使用 uWSGI 协议的 Web 应用)非常有用。
配置示例
uwsgi_ssl_certificate_cache 10m 30s;
确保缓存大小和持续时间适合您的应用需求,以避免不必要的内存使用。
错误的值可能导致 SSL 问题,尤其是在证书未能在其有效期内正确刷新时。
说明
当 NGINX 在通过 SSL 连接到 uWSGI 后端时,`uwsgi_ssl_password_file` 指令用于相关配置。该指令允许您指定一个文件的路径,该文件包含解密 SSL 证书所需的密码。当 SSL 证书受密码保护且 NGINX 需要该密码与 uWSGI 服务器建立安全连接时,这一点尤其有用。 该指令的参数为一个表示文件路径的单个字符串。NGINX 启动时会读取该文件以获取密码。必须确保密码文件的权限设置正确以防止未授权访问,因为泄露该文件可能会危及您的 SSL 连接的安全性。该指令可在包括 `http`、`server` 和 `location` 块在内的多种上下文中使用,从而根据 NGINX 服务器中 SSL 配置的设置方式提供灵活性。
配置示例
uwsgi_ssl_password_file /etc/ssl/private/uwsgi_pass.key;
确保密码文件具有正确的权限,以防止未经授权的用户访问。
确保指定的文件路径正确并且对 NGINX 用户可访问。
如果该文件不存在或不可读,NGINX 可能无法启动或在运行时抛出错误。
说明
`uwsgi_ssl_conf_command` 指令允许用户向 uWSGI 服务器发送特定的 SSL 配置命令。该指令可在 `http`、`server` 和 `location` 上下文中使用,为在 NGINX 和 uWSGI 之间保护通信提供灵活性。该指令要求两个必需参数:一个 SSL 配置指令及其对应的值,从而可针对每个 `location` 或 `server` 块微调 SSL 参数。 该指令直接与 uWSGI 连接设置交互,其参数应以字符串格式提供,以符合典型的 SSL 配置。务必确保作为参数提供的值是 uWSGI 服务器识别的有效 SSL 命令,因为错误的配置可能导致连接失败或降低安全性。通过将 SSL 配置直接放在 NGINX 上下文中,可更为集成和简化地管理 SSL 连接,尤其适用于需要端到端安全通信的应用。 由于该指令可以在服务器配置的不同层级声明,开发人员可以在遵循安全最佳实践的同时采用模块化的配置策略。尽管如此,仍需仔细将参数与 uWSGI 支持的 SSL 命令进行校验,以避免潜在的运行问题。
配置示例
uwsgi_ssl_conf_command "ssl_certificate" "/etc/ssl/certs/cert.pem";
确保 uWSGI 服务器能够识别所提供的 SSL 命令,以避免运行时错误。
该指令需要恰好两个参数;提供更多或更少会导致配置错误。
不正确的路径或无效的配置可能导致 NGINX 与 uWSGI 之间发生 SSL 握手失败。
说明
'xml_entities' 指令控制 NGINX 中 XML 实体的处理方式,特别影响服务器所提供的 XML 文档中某些字符的表示。当启用时,该指令会确保诸如 `<`, `>` 和 `&` 等特殊字符被正确编码为对应的 XML 实体引用,从而有助于符合 XML 标准。这在提供 XML 文件或使用 XML 数据结构的应用中尤为重要,以保证数据完整性并防止 XML 解析器误解。 设置该指令后,任何在服务器生成包含 XML 内容的响应时出现的具有特定含义的字符都会被替换为相应的实体引用。这有助于避免客户端在期望良构 XML 时遇到的潜在解析错误。该指令可以放在不同上下文中,例如 http、server 和 location,从而可以根据应用位置对响应进行细粒度控制。 该指令接受单个参数:使用 `on` 启用实体编码,或使用 `off` 禁用它。如果该指令设置为 'off',NGINX 将在传输 XML 数据时不对特殊字符进行实体编码,这可能导致 XML 消费者处理不正确。
配置示例
http {
xml_entities on;
server {
location /api {
xml_entities on;
}
}
}确保它不会与其他处理输出格式的指令发生冲突。
如果您正在提供纯文本内容,请不要启用 XML 实体,因为这可能导致不必要的开销。
说明
`xslt_stylesheet` 指令在 NGINX 中用于定义一个或多个 XSLT 样式表,这些样式表将在请求 XML 响应时应用。该指令在 `location` 块中定义,可以接受一个或多个参数,每个参数指定要在转换过程中应用的 XSLT 文件的路径或参数。当生成 XML 响应时,NGINX 将使用提供的 XSLT 样式表将 XML 转换为不同的格式(例如 HTML),然后将数据传递给客户端浏览器。 使用 `xslt_stylesheet` 时,重要的是正确配置 XSLT 文件的路径,并确保 XML 响应格式正确以便进行转换。XSLT 的处理还可能受 NGINX 中与 XML 处理相关的其他指令的影响,例如 `xslt_types` 和 `xslt_last_modified`。此外,正确的转换依赖于 NGINX 配置中存在有效的 XSLT 处理器,XSLT 中的任何错误都可能导致无法转换 XML 响应。 此外,它既可以接受基于 NGINX 根目录的相对路径,也可以接受绝对路径。该指令的行为是,如果指定了多个样式表,它们将按给定顺序依次应用,这有助于在需要多次转换以进行复杂 XML 操作的场景中实现所需的处理。
配置示例
location /xml {
xslt_stylesheet /path/to/stylesheet.xsl;
}确保 XSLT 文件的路径正确;否则转换将无法正常工作。
在部署到生产环境之前,请分别验证 XML 和 XSLT 文件以查找语法错误。
如果指定了多个 XSLT 文件,应用的顺序会影响最终输出。
说明
`xslt_param` 指令专门用于在 NGINX 处理 XSLT 样式表时传递参数。这对于在 Web 请求期间动态操作 XML 数据特别有用。每个参数都定义为名称-值对,其中名称对应样式表中的 XSLT 参数,值表示为该参数提供的数据。 在实践中,该指令可以在 `http`、`server` 或 `location` 上下文中使用,并且可以多次出现以为 XSLT 处理器指定不同的参数。当启动 XSLT 转换时,这些参数会自动在样式表中可用,从而根据不同的输入数据或条件生成定制的输出。 需要注意的是,由 `xslt_param` 指令设置的参数仅在其声明的上下文中生效。因此,它们影响同一上下文中发生的任何 XSLT 转换,从而允许根据特定路由或服务器条件进行灵活配置。
配置示例
location /transform {
xslt_param param1 value1;
xslt_param param2 value2;
# other directives...
}使用冲突的参数名可能导致意外行为,因为后定义会覆盖先前的定义。
确保参数名称与 XSLT 样式表中所期望的完全一致,以避免运行时错误。
说明
`xslt_string_param` 指令在 NGINX 配置中用于向 XSLT 处理器传递字符串参数。该指令可用于 `http`、`server` 和 `location` 上下文。它接受两个参数:参数的名称和它的值。当 NGINX 提供的 XML 数据应用 XSLT 进行转换时,这些参数会在转换过程中使用。该指令的作用在需要将动态数据传递给 XSLT 样式表以根据传入请求生成定制输出时尤为重要。\n\n例如,如果您有一个 XSLT 样式表需要用户特定的名称来呈现个性化内容,您可以在 NGINX 配置中使用该指令为 name 参数指定相应的值。能够提供多个此类参数可以将不同的数据点传入转换过程,增强通过 XSLT 进行内容分发的动态能力。在使用 `xslt_string_param` 时,应注意正确匹配 XSLT 所期望的参数名称,以确保无缝集成并得到预期的输出。
配置示例
location /transform {
xslt_stylesheet /path/to/stylesheet.xsl;
xslt_string_param user_name "John Doe";
xslt_string_param display_message "Welcome to our website!";
}确保参数名称与 XSLT 样式表中预期的名称匹配,以避免处理错误。
使用非字符串值可能导致 XSLT 转换出现意外行为。
仅在适用于 XSLT 处理的上下文中定义参数,以避免配置警告。
说明
使用 `xslt_types` 指令可以指定应应用 XSLT 转换的 MIME 类型。此指令允许你将多个 MIME 类型作为参数定义,NGINX 会将它们与 XSLT 处理关联。当收到对具有这些 MIME 类型之一的资源的请求时,NGINX 会在将内容发送到客户端之前应用指定的 XSLT 样式表对其进行转换。 实际上,这意味着你可以配置 NGINX 自动根据指定的 MIME 类型将 XML 文档转换为 HTML(或其他格式)。这对提供动态内容呈现的应用尤其有用。每个记录的类型应当是用于 HTTP 响应的有效 MIME 类型。如果客户端请求的资源匹配 `xslt_types` 中定义的某个类型,服务器将使用所定义的 XSLT 样式表执行转换。
配置示例
http {
xslt_types text/xml application/xml;
}确保在定义 `xslt_types` 的上下文中正确设置所指定的 MIME 类型。
在转换大型文档或 XSLT 处理过程复杂时,请注意性能影响。
说明
`xslt_last_modified` 指令在启用时指示 NGINX 在包含已通过 XSLT 处理的 XML 文档的响应中添加 `Last-Modified` 头。该头部指示资源的最后修改时间,这对缓存和优化很有用。对于客户端可能会缓存此类文档并从了解内容新旧程度中受益的场景尤为相关。 该指令可设置为 'on' 或 'off',并且适用于 `http`、`server` 和 `location` 等不同上下文。启用时,它会考虑被转换的底层 XML 数据的最后修改日期,而不仅仅是 XSLT 样式表本身。因此,如果自上次响应以来 XML 文件未发生变化,客户端就可以有效使用缓存机制,而无需重复获取相同的数据。 请注意,该指令应与 XSLT 处理配置一起使用才会生效。如果没有进行任何 XSLT 转换,即使将该指令设置为 'on' 也不会产生实际效果。该指令的行为有助于优化性能并减少不必要的带宽使用,因为它可确保客户端基于所提供资源的新旧程度做出合理的缓存决策。
配置示例
server {
listen 80;
location / {
xslt_last_modified on;
# additional configurations for XML and XSLT processing
}
}确保 XML 文件已正确更新;否则,客户端可能因缓存而无法收到更新。
如果未配置 XSLT 处理,则此指令将不会生效。
说明
NGINX 中的 `perl_modules` 指令允许您指定一个或多个应在 NGINX 服务器启动时加载的 Perl 模块。此功能对在请求处理期间需要使用 Perl 来处理某些任务或脚本的 Web 应用特别有用。通过包含相关的 Perl 模块,开发者可以扩展 NGINX 的功能,使得在 NGINX 配置中使用 Perl 脚本和函数成为可能。 该指令接受一个参数,即要加载的 Perl 模块的名称。多个模块可通过空格分隔来指定。当 NGINX 初始化时,它会将这些指定的模块加载到内存中,使它们可用于各种上下文,例如在用于 location 块的配置中或处理某些请求时。这种方式允许将 Perl 代码与 NGINX 原生功能更灵活地集成。 必须确保指定的模块已安装并且在 NGINX 环境中可访问。当 NGINX 服务器处理请求时,会按照配置调用这些 Perl 模块,从而动态执行 Perl 代码。开发者还应注意性能影响,因为加载大量或体积较大的 Perl 模块可能会影响服务器响应时间。
配置示例
perl_modules My::Module; perl_modules Some::OtherModule;
确保 Perl 模块已正确安装并且可被 NGINX 进程访问。
谨慎一次性加载过多模块,因为这会增加内存使用并影响性能。
检查模块名称是否有语法错误,因为 NGINX 不会为模块加载失败提供详尽的错误反馈。
说明
`perl_require` 指令允许用户指定一个在运行时由 NGINX 加载的 Perl 模块。此指令在你希望使用自定义 Perl 代码扩展 NGINX 功能、并对请求处理流程的各个方面进行脚本化控制时非常有用。该指令期望的参数是 Perl 模块的路径,可以是相对路径或绝对路径。加载过程仅在 NGINX 服务器的初始化阶段发生一次,确保指定的模块在服务器其余生命周期内可用。 在定义此指令时,必须确保指定的模块格式正确且满足该 Perl 模块所需的任何依赖项。如果加载模块失败,NGINX 会记录错误并无法启动,因此对模块路径和内容进行充分的测试与验证至关重要。因为此指令在 `http` 上下文中生效,它会影响整个服务器以及该上下文内的所有嵌套配置,从而允许集中管理可能用于跨多个 locations 或 server blocks 处理请求的 Perl 脚本。
配置示例
http {
perl_require /path/to/your/module.pm;
}Perl 模块的路径必须有效;否则 NGINX 将无法启动。
确保服务器上已安装必要的 Perl 模块。
检查 NGINX 错误日志中与模块加载问题相关的消息。
说明
'perl' 指令允许将 Perl 代码直接嵌入到 NGINX 配置中,以在请求通过服务器时对请求进行处理。通过定义 Perl 子例程,该指令在请求处理上提供了更大的灵活性和控制,例如修改请求头、生成动态响应或根据请求参数实现自定义逻辑。该指令可以接受一个参数,通常指定要执行的 Perl 子例程的名称。这种集成对于高级路由、内容处理或在不依赖外部脚本或应用程序开销的情况下实现复杂应用逻辑特别有用。 配置后,Perl 子例程将在匹配定义上下文(location 或 limit_except)的每个请求上运行,使其成为需要基于传入请求实现动态行为环境的强大工具。处理模型允许同步执行,这意味着在处理该请求期间,其他请求可能无法被处理,直到 Perl 代码完成执行。如果管理不当,这可能会影响性能,尤其是在高负载情况下。此外,Perl 代码抛出的任何错误都可能导致 500 Internal Server Error 响应,因此在 Perl 脚本中进行适当的错误处理非常重要。
配置示例
location /example {
perl my_perl_handler;
}确保在 NGINX 中安装并正确配置 Perl 模块。
在高流量环境中使用 Perl 脚本时,请注意对性能的影响,因为它们可能会导致阻塞。
确保子例程名称与您在 Perl 代码中定义的名称一致。
说明
`perl_set` 指令旨在允许用户根据任意 Perl 表达式定义 NGINX 变量。该指令在需要动态计算值的场景中特别有用。该指令接受两个参数:第一个是变量名,第二个是用于设置该变量值的 Perl 表达式。 当 NGINX 遇到 `perl_set` 指令时,会在请求处理阶段运行指定的 Perl 代码,从而在变量使用之前确定该变量的值。这使得 `perl_set` 适用于根据 HTTP 请求的上下文创建复杂的变量值,例如请求头、连接详情或动态生成的内容。要使用此指令,必须在 NGINX 中启用 Perl 模块,并且由于可能的性能影响,建议在生产环境部署前进行充分测试。 `perl_set` 的参数包括以 `$` 为前缀的变量名,以及用引号括起来的 Perl 表达式。例如,如果您想基于某个请求参数计算变量,则需要正确的语法和能够正确与 NGINX 上下文交互的可用 Perl 脚本。这些变量的行为由其定义的上下文决定,可能会影响在不同请求处理阶段的作用域和可用性。
配置示例
perl_set $dynamic_value 'sub { return "Hello, World!"; }';在使用此指令之前,确保 Perl 模块已编译并加载到 NGINX 中。
Perl 表达式中的语法错误可能导致配置错误或运行时失败。
如果过度使用或编写不当,性能可能会受到影响,因为 Perl 解释器会在每个请求上评估该表达式。
说明
`output_buffers` 指令设置 NGINX 用来保存发送给客户端的响应的缓冲区数量和大小。当生成响应时,NGINX 需要高效管理输出,尤其是对于较大的响应。该指令通过允许管理员根据预期响应大小指定缓冲区数量及每个缓冲区的大小,从而帮助优化这一管理。它在性能调优方面特别有用,因为较少但更大的缓冲区可能减少开销,但也可能导致更高的内存消耗。 该指令的语法需要两个参数:第一个是缓冲区的数量,第二个是每个缓冲区的大小。例如,`output_buffers 2 16k;` 将配置 NGINX 使用 2 个缓冲区,每个大小为 16 千字节。该分配意味着在开始向客户端发送数据之前,最多可以缓存 32 千字节。该指令可以在 `http`、`server` 或 `location` 上下文中声明,为服务器配置的不同部分提供灵活性。 在基于流量模式和响应大小选择合适的缓冲区大小和数量时应当谨慎。过小的缓冲区可能导致 NGINX 经常向客户端写入,降低性能,而过大的缓冲区则会造成内存浪费。建议在微调这些值时持续监控响应大小和性能。
配置示例
http {
output_buffers 4 32k;
}使用不合适的大小可能导致内存使用低效并且性能下降。
虽然增大缓冲区大小可以提升大响应的性能,但对于较小的响应可能会浪费内存。
说明
'variables_hash_max_size' 指令配置用于存放 NGINX 内部变量的哈希表允许的最大元素数量。默认情况下,该哈希表有一定的大小限制,这可能会在处理大量动态变量时影响性能,尤其是在复杂配置或在某些上下文中使用许多变量时。 该指令在 'http' 上下文中指定,并且可以接受一个表示最大大小的单个参数。增大哈希大小可以通过减少哈希冲突和检索变量时的查找时间来提高性能。然而,分配过大的哈希大小可能会浪费内存资源。理想的大小取决于具体用例和预期的变量使用模式。在内存利用与性能要求之间取得平衡以找到最有效的设置非常重要。 如果此指令设置的值小于实际正在使用的变量数量,多余的变量可能无法访问,从而可能导致请求处理出现不良副作用。因此,建议在修改此设置后进行充分测试,以确保没有关键变量被丢弃。
配置示例
http {
variables_hash_max_size 1024;
}将值设置得过低可能导致变量查找失败或无法解析。
在运行中的配置中修改此值可能需要重新加载才能生效。
说明
指令 'variables_hash_bucket_size' 配置 NGINX 服务器用于在内存中保存变量的哈希桶大小。该参数对于优化变量存储的内存分配至关重要:较小的桶大小会导致分配更多的桶,从而增加内存使用并可能因更多的哈希冲突而降低性能;反之,较大的桶大小会减少所需桶的数量,但无条件地增加内存消耗。因此,选择合适的桶大小需要在使用的变量数量和服务器整体内存效率等因素之间进行权衡。 该值通常为二的幂,可根据服务器的预期负载和架构进行调整。该指令可以在 `http` 上下文中配置,从而影响 NGINX 配置中使用的所有变量实例。调整此参数会显著影响变量解析的性能,尤其是在配置复杂或高负载且频繁使用变量的环境中。建议在不同的桶大小下对应用进行基准测试,以为特定环境找到最有效的设置。
配置示例
http {
variables_hash_bucket_size 128;
}将桶大小设置得过低会增加哈希冲突,导致性能下降。
在某些系统上,非 2 的幂的大小可能导致意外行为;最好坚持使用 2 的幂。
对该指令的更改需要重新加载服务器才能生效。
说明
'server_names_hash_max_size' 指令在 NGINX 中用于指定存储服务器名称的哈希表的最大大小。这是一个重要的参数,因为 NGINX 依赖对服务器名称进行哈希,以有效地将进入的请求路由到正确的服务器块。当服务器名称的数量超过该定义的限制时,哈希机制的效率可能会下降,从而在请求处理时造成潜在的性能影响。 在配置此指令时,请注意如果指定的服务器名称数量超过设定的 'server_names_hash_max_size',NGINX 会自动增大哈希表的大小,这可能导致内存使用量增加。还应注意,尽管此指令定义了哈希表的最大大小,但 NGINX 在运行时实际使用的大小可能会根据服务器名称的数量和哈希算法的具体实现而变化。因此,适当调整此值可以帮助确保 NGINX 保持最佳性能,尤其是在存在大量虚拟主机或复杂配置的环境中。 此指令可在 NGINX 配置文件的 'http' 上下文中使用,确保它影响定义范围内的所有服务器块。对于负责高流量网站或拥有大量服务器配置的管理员来说,仔细考虑该指令可以在请求处理期间最大程度地减少查找开销。
配置示例
http {
server_names_hash_max_size 1024;
}将值设置得过低可能会导致服务器名称冲突,并由于频繁的内存重新分配而造成性能下降。
必须在使用此指令之前定义服务器名称,以便哈希表能被适当调整大小。
说明
在 NGINX 中,"server_names_hash_bucket_size" 指令控制用于在配置中存储服务器名称的哈希桶大小。当定义了多个服务器名称时,NGINX 会对这些名称进行哈希,以提高查找效率并加快将传入请求与定义的服务器块匹配的速度。哈希桶的大小影响哈希表的效率:较小的大小可能导致冲突,迫使哈希表去解决这些冲突,可能影响性能。对于具有大量或较长服务器名称的配置,该指令非常重要,因为它允许微调内存消耗和性能特性。 该指令的参数以字节为单位指定,值通常应为二的幂。选择合适的值取决于具体服务器的使用情况和定义的服务器名称数量。在存在大量服务器名称或名称特别长的情况下,增大桶大小有助于保持哈希解析的效率,因为理想情况下每个桶应包含更少的条目以最小化查找时间。同时要避免将值设置得过大,以免根据服务器的配置和负载浪费内存。
配置示例
http {
server_names_hash_bucket_size 64;
}将该值设置得过低可能导致哈希冲突,从而对性能产生负面影响。
使用不是2的幂的值可能导致桶分配不理想。
说明
`server` 指令是 NGINX 配置的一个基本元素,允许定义一个虚拟服务器,该服务器根据指定的监听地址和其他配置参数来处理传入请求。每个 `server` 块都可以有自己的一组指令,包括 `listen`、`server_name`、`location` 等,从而实现对请求处理的精细控制。通过指定不同的 `server` 块,单个 NGINX 实例可以为多个域名或子域名提供服务,每个域名可具有不同的设置。\n\n在 `server` 块中,像 `listen` 这样的指令决定服务器响应的 IP 地址和端口,而 `server_name` 指定该服务器应响应的域名。还可以包含其他配置选项——例如用于 HTTPS 的 `server` 块中的 SSL 设置——以处理安全连接。需要注意的是,`server` 块的顺序很重要,因为当多个块使用相同的监听地址时,NGINX 会按先到先得的原则根据服务器名匹配请求。
配置示例
server {
listen 80;
server_name example.com;
location / {
root /var/www/example;
index index.html index.htm;
}
}确保每个 `server` 块具有唯一的 `server_name` 或 `listen` 指令,以避免请求被多个块意外处理。
如果在没有相应 `listen` 设置的情况下错误使用 SSL 指令,可能导致 HTTPS 请求无法正常工作。
不允许嵌套 `server` 指令,这会导致配置错误。
说明
NGINX 中的 connection_pool_size 指令允许你指定服务器通过连接池能够同时处理的活动连接数。该参数对于优化性能(尤其在高负载下)至关重要,因为它决定了在不引入过高延迟或资源争用的情况下可以同时服务多少客户端。当连接池被耗尽时,新连接必须等待,直到现有连接关闭或被释放回连接池。 该指令可以在 'http' 或 'server' 上下文中配置,从而根据应用需求灵活地定义限制。在设置该值时,需要考虑服务器的系统资源(例如内存和 CPU)以及预期的工作负载。值设置过高可能导致资源使用增加,而值过低则可能限制服务器的可扩展性。 connection_pool_size 指令通常用于预期会有大量并发连接的场景。正确调整该参数可以提高服务器在负载下的响应性和吞吐量,因为它确保有足够的连接来高效处理传入请求。
配置示例
http {
connection_pool_size 256;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
}将池大小设置得过高可能会耗尽系统资源,导致性能变慢或崩溃。
池大小过小可能会因连接排队而导致延迟增加。
在调整后始终监控服务器指标以微调配置。
说明
`request_pool_size` 指令决定在 NGINX 中为每个传入请求分配多少内存。通过配置此指令,管理员可以根据应用的需求优化请求的内存使用。这在并发请求数量较多的场景中尤为有用,可实现更好的内存管理并可能提升整体性能。 为 `request_pool_size` 指定的大小在请求处理期间生效,这意味着更大的内存池可能允许在单个请求内更有效地处理资源密集型操作。该大小至关重要,因为它会影响 NGINX 如何管理临时数据、缓冲区以及其他与请求相关的资源。过小的内存池可能导致频繁的内存分配和释放,从而在高负载下引发性能问题。 需要注意的是,为请求分配的内存与 NGINX 用于连接处理和缓冲的其他内存池是分开的,因此应根据服务器的预期负载和所处理请求的类型进行配置。
配置示例
http {
request_pool_size 32k;
}将 `request_pool_size` 设置得过低可能导致在处理请求时增加内存分配和开销,从而造成性能下降。
如果 request pool sizes 过大并超出系统内存限制,可能会导致 NGINX 故障或出现不可预测的行为。
说明
`client_header_timeout` 指令定义了服务器等待客户端发送请求头的最长时间。该值以秒为单位指定,如果超过超时时间,NGINX 将关闭连接并向客户端返回错误。该指令有助于防止服务器被不及时发送请求头的慢客户端占用。超时时间可以在 http 上下文中全局配置,也可以针对特定的 server 块配置。该超时适用于读取完整的请求头,包括请求行和客户端发送的所有头部。如果请求超过此时间限制,连接将被断开,以释放服务器资源并保持性能。
配置示例
http {
client_header_timeout 30s;
server {
# Server configuration
}
}将值设置得过低可能导致合法客户端被过早断开连接。
如果服务器同时在上游服务器或客户端一侧管理超时,则此指令无效。
对该指令的更改需要重新加载 NGINX 才能生效。
说明
`client_header_buffer_size` 指令在 NGINX 中允许您指定用于读取传入客户端请求头的缓冲区大小。这对于管理在开始将额外头数据存入其他缓冲区之前 NGINX 一次能够处理多少头数据至关重要。当客户端发送 HTTP 头时,NGINX 会对其进行处理;如果组合后的头大小超过指定的缓冲区大小,NGINX 将使用更大的缓冲区来容纳这些数据。这有助于防止与较大头相关的问题,例如在某些身份验证和 cookie 配置中遇到的问题。 在由于 cookie 大小增加或其他自定义头而可能出现较大头的场景中,该指令尤其重要。如果缓冲区设置得太小,可能会导致诸如 `413 Request Entity Too Large` 的错误或处理大头请求时延迟增加。管理员在设置该值时应保持谨慎,因为将其设置得过大可能导致不必要的内存消耗,尤其是在高负载或处理大量并发连接时。该指令定义在 `http` 和 `server` 上下文中,可灵活用于全局或特定服务器的配置。
配置示例
server {
listen 80;
server_name example.com;
client_header_buffer_size 2k;
}将缓冲区大小设置得过大可能导致高流量站点的内存占用过高。
对该指令的更改需要重启 NGINX 才能生效。
说明
'large_client_header_buffers' 指令用于设置为读取超过默认大小的客户端请求头而分配的缓冲区的最大数量和每个缓冲区的大小。当处理发送异常大的头部的客户端(例如包含大量 cookies 或者超长 URL 的客户端)时,这一点尤其有用。该指令有两个参数:第一个指定缓冲区的数量,第二个指定每个缓冲区的大小。\n\n当 NGINX 收到请求时,它会尝试将头部读入指定的缓冲区。如果总头部大小超过该指令分配的容量,NGINX 将返回 '400 Bad Request' 错误。管理员可以根据预期的客户端头部大小调整这些值。例如,如果服务器预计由于大量用户状态跟踪而产生较大的 cookies,增大缓冲区大小可以帮助避免不必要的错误并改善用户体验。\n\n为了有效利用此指令,监控实际的头部大小并相应调整缓冲区大小非常重要。同样,请记住在没有必要的情况下设置过大的缓冲区可能导致内存使用增加并引发性能问题。
配置示例
http {
large_client_header_buffers 16 32k;
}将缓冲区大小设置得过高可能导致内存问题,尤其是在高负载下。
如果分配的缓冲区不足以容纳头部大小,客户端会收到 400 Bad Request 错误。
该指令在 http 上下文中全局生效,也可以在特定的 server 块中设置。注意可能的设置冲突。
说明
该 `ignore_invalid_headers` 指令是 NGINX 中的一个配置选项,允许管理员管理服务器如何处理在请求中接收到的无效 HTTP 头部。当设置为 'on' 时,NGINX 会忽略任何无效头部,而不是直接拒绝该请求。这在客户端可能发送不符合 HTTP 规范的格式错误头部的场景中很有用,能够在不丢弃整个请求的情况下更好地从这些错误中恢复。该指令接受一个标志参数,'on' 或 'off'。如果设置为 'on',即使请求包含无效头部,服务器也将照常处理该请求;相反,如果设置为 'off'(默认行为),当遇到无效头部时,服务器将拒绝该请求并返回错误响应。该设置既适用于 HTTP 块,也适用于 server 上下文,从而允许各个服务器实例在处理可能存在问题的头部时具有更大的灵活性。
配置示例
http {
ignore_invalid_headers on;
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}将此指令设置为 'on' 可能导致潜在的安全风险:如果攻击者可以恶意构造无效的请求头以利用应用程序漏洞。
更改此设置时务必彻底测试应用,因为忽略无效的请求头可能导致意外行为或应用错误。
说明
'merge_slashes' 指令在 NGINX 中决定对请求 URI 中多个正斜杠 ('/') 的处理行为。当该指令设置为 'on' 时,NGINX 会将连续的斜杠合并为单个斜杠,从而有效减少 URI 路径中的冗余。例如,对 '///example' 的请求将被转换为 '/example'。这种行为有助于生成更简洁的 URI,并避免因路径中存在多个斜杠而可能引发的问题。 相反,当 'merge_slashes' 设置为 'off' 时,NGINX 会保留原始请求而不更改斜杠,意味着 '///example' 将保持不变。这允许传递那些连续斜杠可能具有重要含义的特定 URI。在需要严格遵守原始请求路径而不做修改的情形下,该指令尤其有用。 在安全上下文或与以不同方式解释斜杠的外部应用交互时,使用该指令可能尤其重要。它会影响请求路由以及后端系统对 URI 的潜在解释。
配置示例
http {
merge_slashes off;
server {
location / {
# additional configurations
}
}
}将 'merge_slashes' 设置为 'off' 可能导致 URL 处理出现歧义,影响路由行为。
请记住,更改 'merge_slashes' 设置可能需要进行测试,以确保与现有应用路由的兼容性。
说明
默认情况下,NGINX 出于安全原因不允许在 HTTP 头部名称中使用下划线,主要是为了避免与某些头部解析行为发生潜在冲突。 `underscores_in_headers` 指令可以修改该限制。它可以设置为 'on' 或 'off',其中 'on' 允许在头部名称中使用下划线。当与依赖包含下划线的头部名称的特定 API 或客户端一起使用时,这一点尤其有用。 该指令可在 `http` 或 `server` 上下文中使用,允许进行全局或针对特定服务器的配置。启用后,它将作用于 NGINX 处理的所有头部,影响传入的请求头和传出的响应头。
配置示例
http {
underscores_in_headers on;
server {
location / {
# server configuration
}
}
}在请求头中启用下划线可能会使您的应用程序暴露于某些无法正确处理此类请求头的代理或客户端所带来的潜在问题。
确保依赖下划线的功能在配置更改后经过彻底测试。
说明
`location` 指令在 NGINX 中用于为特定的请求 URI 或 URI 模式定义具体的处理方式。它允许根据跟在服务器名后面的 URL 的部分应用不同的配置。该指令可以放在 `server` 块中,或嵌套在另一个 `location` 块内以创建更专门的行为。 在定义 `location` 时,可以指定精确匹配、前缀匹配或正则表达式。例如,`location /images/` 匹配任何以 `/images/` 开头的请求,而 `location = /` 仅匹配目标为根路径的请求。这意味着对 `/images/logo.png` 的请求会由 `location /images/` 处理,但不会由 `location = /` 处理。对于更复杂的匹配要求,也可以使用正则表达式,并使用 `~` 和 `~*` 修饰符分别表示区分大小写和不区分大小写的匹配。 此外,在 `location` 块中,可以指定诸如 `proxy_pass`、`rewrite` 或其他与 HTTP 处理相关的 NGINX 指令。此灵活性允许对不同请求的处理进行详细控制,从而根据其 URI 更高效、恰当地提高 NGINX 服务器对不同类型请求的服务能力。
配置示例
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
location /images/ {
root /var/www/images;
}
}错误地嵌套使用 `location` 块可能导致意外行为。
未使用正确的匹配修饰符可能导致无法匹配到目标块。
locations 重叠且缺乏正确的特异性会导致请求处理混乱。
说明
'listen' 指令在 NGINX 的 HTTP 核心模块中指定服务器块将响应的网络地址和端口。它接受各种参数,允许进行详细配置,包括 IP 版本(IPv4 或 IPv6)、端口号和套接字类型(包括 UNIX 域套接字)。指令的典型用法使 NGINX 能够处理发送到所配置 IP 和端口组合的流量,从而根据这些参数将传入请求定向到相应的 server 块。 语法允许在一个 server 块中使用多个 'listen' 指令以指定多个 IP/端口对,或配置同一 server 块同时处理 IPv4 和 IPv6 流量。例如,配置可能包含 `listen 80;` 来处理端口 80 上的标准 HTTP 流量。其他选项可以指定诸如 backlog 大小、默认服务器状态以及 SSL 配置等参数。 使用该指令时,用户应注意 NGINX 的默认行为:如果定义了多个 'listen' 语句,NGINX 会为任何未匹配的请求创建一个默认服务器。理解如何配置这些参数会显著影响 NGINX 如何管理网络通信、负载均衡以及基于所定义网络绑定的安全限制。
配置示例
server {
listen 80;
server_name example.com;
}
server {
listen 443 ssl;
server_name secure.example.com;
ssl_certificate /path/to/certificate.crt;
ssl_certificate_key /path/to/private.key;
}对于 SSL 配置,请确保提供了正确的 SSL 选项。
对于特定的 listen 指令,最多只能将一个 server block 配置为默认服务器;在使用 'default_server' 选项时请谨慎。
如果使用多个 'listen' 指令,请注意可能出现的冲突或关于请求路由的意外行为。
说明
在 NGINX 中,'server_name' 指令在服务器块中用于指定服务器应响应哪些域名或 IP 地址。这在虚拟主机场景中特别有用,可以在单台服务器上托管多个域名。该指令接受一个或多个名称参数,参数可以包含通配符来匹配多个名称,例如 `*.example.com` 可匹配 `example.com` 的任意子域名。正确声明该指令至关重要,因为它决定了 NGINX 如何将传入请求路由到相应的服务器块。 当请求到达时,NGINX 会检查 HTTP `Host` 头以确定哪个 'server_name' 与该请求对应。如果请求的主机名与服务器块中定义的任一名称匹配,则使用该服务器对应的配置来处理请求。如果没有精确匹配,且定义了多个服务器块,NGINX 将尝试使用指定了 `default_server` 的服务器块。匹配时精确名称优先于通配符,并且服务器块在 `nginx.conf` 中的配置顺序也会影响匹配。如果没有任何服务器配置匹配,客户端将收到 404 Not Found 错误。
配置示例
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/example;
index index.html;
}
}请确保包含有效的域名;不正确的名称会导致 NGINX 无法处理相关的 server block。
避免在多个 server block 中使用冲突的 server_name 指令,因为这可能导致意外的路由行为。
通配符名称可能带来复杂性;请确保它们被正确配置以避免安全隐患。
说明
`types_hash_max_size` 指令控制 NGINX 用来存储 MIME 类型的哈希表的最大大小。它指定哈希表可容纳的最大条目数,从而高效地将文件扩展名映射到相应的 MIME 类型。当为该指令设置值时,NGINX 会分配足够的内存以适应指定的大小,从而增强其在不降低性能的情况下处理大量文件类型的能力。 传递给 `types_hash_max_size` 的参数通常是正整数。如果哈希表大小被超出,NGINX 将退回到使用较低效的存储方式。根据预期的 MIME 类型数量适当调整此值,能显著提升服务器对特定内容类型文件请求的响应性能。注意此指令在 `http`、`server` 和 `location` 等上下文中是相关的。对于服务多种文件类型的部署来说,这一点尤为关键,可确保映射过程的最佳性能。 设置时应注意避免将值设得过高,因为这会导致不必要的内存使用增加。相反,设置过低可能引起性能瓶颈。因此,建议监控应用并根据观察到的需求调整此指令。
配置示例
http {
types_hash_max_size 2048;
}将该值设置得过低可能由于哈希冲突导致性能瓶颈。
将该值设置得过高会不必要地增加内存使用。
说明
'types_hash_bucket_size' 指令在 NGINX 中允许管理员指定用于存储 MIME 类型的哈希桶大小。该指令对性能优化至关重要,因为哈希表用于存储文件扩展名到其 MIME 类型的映射,这些映射在文件请求时确定。如果请求的 MIME 类型在哈希表中未找到,服务器需要创建一个新条目,如果哈希桶过小,会导致性能下降。每个桶的大小通常以字节为单位指定,应根据应用预期使用的 MIME 类型数量进行设置。\n\n该指令可以带一个参数来指定桶大小。推荐的大小通常基于具体用例和应用中 MIME 类型映射的复杂性来确定。如果存在大量不同的 MIME 类型,增大桶大小有助于减少哈希表中的查找时间和冲突。对于性能至关重要的环境,服务器管理员应测试并分析他们的 NGINX 配置,以确定该指令的最优值。
配置示例
http {
types_hash_bucket_size 128;
include mime.types;
}将大小设置得过小可能导致哈希冲突并降低性能。
过大的桶大小会浪费内存,尤其是在 MIME types 数量较少时。
对该指令的更改需要重新加载 NGINX 配置才能生效。
说明
NGINX 中的 `types` 指令用于根据文件扩展名定义分配给由 web 服务器提供的文件的 MIME 类型。该指令可以在 `http`、`server` 或 `location` 上下文中指定,从而可对不同类型的文件如何被处理进行细粒度控制。`types` 指令中的每一项由文件扩展名和随后对应的 MIME 类型组成,允许服务器向客户端准确传达文件的内容类型。 当对某个文件发出请求时,NGINX 会将请求文件的扩展名与 `types` 指令中提供的定义进行匹配。如果匹配成功,NGINX 将在响应中包含相应的 `Content-Type` 头。这样就能确保浏览器或任何接收该文件的客户端能够正确解释它。例如,`.css` 文件通常具有 MIME 类型 `text/css`,而 `.html` 文件通常以 MIME 类型 `text/html` 提供。 需要注意的是,`types` 指令可以在 `server` 或 `location` 上下文级别被覆盖,从而允许在配置的不同部分设置特定行为。NGINX 附带了在 `mime.types` 文件中指定的一组默认 MIME 类型,这些类型也可以通过 `include` 语句包含进来,从而提供更广泛的常用 MIME 类型集合,而无需手动逐一定义。
配置示例
types {
text/html html;
text/css css;
application/javascript js;
image/png png;
image/jpeg jpeg jpg;
};确保 MIME types 正确定义;类型不正确可能导致客户端对文件处理不当。
在更具体的上下文(server 或 location)中定义的 MIME types 会覆盖在更一般的上下文(http)中定义的那些。
始终检查文件扩展名或 MIME type 定义中的拼写错误,以避免内容分发问题。
说明
`default_type` 指令在 NGINX 中指定默认的媒体类型,当服务器无法从文件扩展名或其他因素确定内容类型时,应使用该类型作为响应的默认类型。此指令在以下情况下尤为有用:当提供的文件可能没有标准文件扩展名,或配置中没有包含某些文件类型的特定映射时。通过指定默认类型,可以确保客户端收到合适的 Content-Type 头,这有助于浏览器对数据的解释和处理。 该指令可在多个上下文中定义:`http`、`server` 和 `location`,从而在不同配置作用域中提供灵活性。`default_type` 的参数可以是标准的 MIME 类型,例如 'text/html'、'application/json',或任何其他有效的媒体类型。它在配置中的位置决定了是否将指定的默认类型应用于所有请求,或仅应用于特定的 server 或 location 块中的请求。 如果未声明默认类型,并且 NGINX 无法确定文件的类型,则不会设置 Content-Type 头,这可能导致客户端无法正确处理响应。因此,通常的最佳实践是显式定义默认类型,以在所提供的内容中保持一致的行为。
配置示例
http {
default_type text/html;
server {
location / {
root /usr/share/nginx/html;
}
}
}在嵌套上下文中覆盖默认类型时要小心;更具体的声明会优先。
未设置默认类型可能导致客户端收到不正确的 Content-Type 头,影响浏览器中的内容显示。
说明
'root' 指令在 NGINX 中用于设置服务器或 location 上下文从中提供文件的文件系统路径。当对某个资源(例如 HTML 文件或图像)的请求到达时,NGINX 会通过将 'root' 指令中指定的参数与请求的 URI 连接起来来构建最终的文件路径。例如,如果 'root' 指令配置为 `/var/www/html`,且用户请求 `/images/photo.jpg`,NGINX 将在 `/var/www/html/images/photo.jpg` 查找该文件。这样就可以从磁盘上的特定目录结构提供静态文件。 该指令可以放在不同的上下文中,包括 'http'、'server'、'location',甚至放在 location 上下文的 'if' 语句中。当在不同上下文中指定了多个 'root' 指令时,优先使用最具体的那个。需要注意的是,如果请求映射到一个目录而不是文件,NGINX 会在 URI 末尾追加斜杠,并在该目录中查找一个 'index' 文件(由 'index' 指令定义)。此外,'root' 指令用于静态内容,因此动态内容,例如由脚本提供或可能通过代理的请求,不会使用该指令来查找文件。
配置示例
server {
listen 80;
server_name example.com;
root /usr/share/nginx/html;
index index.html index.htm;
location /images/ {
# Specific location
root /usr/share/nginx/images;
}
}'root' 指令仅适用于静态文件的提供;不要将其用于 proxy_pass 或其他动态响应。
注意层级中所有生效的 'root' 指令,因为它们可能相互冲突或覆盖。
确保指定路径具有正确的权限,以便 NGINX 用户可以读取文件。
说明
'alias' 指令在 location 上下文中使用,用于指定一个 URI 应映射到的备用本地文件系统路径。例如,当对匹配指定 location 块的 URI 发出请求时,NGINX 会使用 'alias' 的值进行后续处理和文件检索,而不是采用默认行为。这使得在保持客户端请求中有意义的 URL 的同时,可以灵活配置静态文件的位置。 'alias' 指令接受一个单一参数,该参数是当请求匹配时应被用于响应的目录或文件的路径。需要注意的是,使用 'alias' 时,匹配到的 URI 部分会被 alias 路径替换。这不同于 'root' 指令,在 'root' 中请求 URI 会被附加到 'root' 指定的路径后。因此,在配置 'alias' 时需小心,确保它能够将期望的 URI 结构正确映射到相应的文件系统结构。 'alias' 的一种常见用法是在从不遵循 document root 结构的目录中提供图片或静态文件时使用。例如,如果你将图片存储在 '/var/www/images',但希望在 URI 下以 '/images' 提供它们,可以使用 'alias' 指令来实现这种映射,而无需更改后端文件系统的结构。
配置示例
location /images {
alias /var/www/images/;
}如果请求 URI 未以尾随斜杠结尾,且未正确处理,可能会导致意外行为并返回 404 错误。
如果要提供目录,请记得在 alias path 后添加尾随斜杠,以确保其与 NGINX 的文件系统查找配合正常。
未能正确匹配 location block 会导致路径配置错误并产生意外的服务行为。
说明
'limit_except' 指令在 NGINX 的 location block 中使用,用于限制允许的 HTTP 请求方法。实施后,它定义了一组允许的方法,而所有其他方法将收到 403 Forbidden 响应。例如,如果在 'limit_except' block 中指定 'GET' 和 'HEAD',则诸如 'POST'、'PUT' 或 'DELETE' 等所有其他方法将被阻止。此功能有助于保护只应允许特定方法的资源,从而增强访问控制和安全性。 该指令以一个 block 作为参数,block 内包含一个或多个使用相应配置语法指定的方法。每个方法可以在 block 内连续列出。例如,如果你有 'limit_except GET { deny all; }',则该 location block 仅允许 GET 请求。需要强调的是,在 URI 保护的上下文中,这里定义的例外对被禁止的请求提供了优雅的处理,同时确保合法方法得以不受干扰地被服务。
配置示例
location /protected {
limit_except GET {
deny all;
}
}确保在 'limit_except' 中指定的方法受到您的应用支持;不受支持的方法可能会意外返回 403 错误。
请记住,'limit_except' 规则仅适用于指定的 location block,而不适用于嵌套的 location block,除非在那里明确定义。
说明
`client_max_body_size` 指令在 NGINX 中指定允许的客户端请求正文的最大大小,这对于控制资源使用和防止滥用非常重要。该指令可以在三种上下文中配置:`http`、`server` 和 `location`,允许根据希望的限制范围灵活应用。 `client_max_body_size` 的参数可以使用各种大小单位设置,例如 'k' 表示千字节,'m' 表示兆字节,或 'g' 表示吉字节。例如,指定 `client_max_body_size 10m;` 将请求正文限制为最多 10 兆字节。如果客户端尝试发送比指定限制更大的请求正文,NGINX 将立即返回 `413 Request Entity Too Large` 错误,从而保护服务器免受过大负载。 需要注意的是,在不同级别设置该指令可能会根据请求处理的上下文导致不同的行为。例如,如果某个 `location` 块将 `client_max_body_size` 设置为比 `http` 级别更小的值,那么在请求处理时 `location` 级别的设置将优先。这种分层方法使管理员能够根据不同应用部分的需要实施特定配置。
配置示例
server {
listen 80;
server_name example.com;
client_max_body_size 10m;
location /upload {
proxy_pass http://backend;
}
}将 `client_max_body_size` 设置得过低可能会阻止合法的文件上传,从而导致不佳的用户体验。
确保任何应用级设置与该指令保持一致,以避免混淆和错误。
请记住,该指令不会影响客户端指定的 `Content-Length` 头。
说明
`client_body_buffer_size` 指令指定 NGINX 用于读取客户端请求主体的缓冲区最大尺寸。如果请求主体超过此大小,NGINX 会将其写入临时文件,这有助于管理内存使用并通过允许更大上传而不耗尽内存资源来提高性能。该指令可以在 `http`、`server` 或 `location` 上下文中设置,能够根据特定应用需求灵活配置。 当收到请求主体时,NGINX 会将请求的大小与指定的 `client_body_buffer_size` 进行比较。如果大小在限制范围内,请求主体会缓存在内存中;否则会存储到磁盘文件中。对于处理文件上传或大载荷的应用来说,这一行为非常关键,因为设置合适的缓冲区大小可优化内存消耗和处理速度。该值可以用字节、千字节 (k)、兆字节 (m) 等指定,从而根据预期的请求大小进行精细调整。 该指令常与其他相关配置一起使用,例如 `client_max_body_size`,其指定客户端请求主体的总体最大允许大小。这进一步确保了资源得到适当管理,防止通过过大的上传滥用资源。
配置示例
http {
client_body_buffer_size 32k;
}将缓冲区大小设置得非常小时,可能导致对较大的请求体进行过多的磁盘写入,从而影响性能。
如果 `client_max_body_size` 低于 `client_body_buffer_size`,对于较大的请求可能会导致意外行为。
说明
`client_body_timeout` 指令指定了一个超时值,用于决定服务器等待客户端发送完整请求主体的时长。 这包括 POST 和 PUT 请求,这类请求的主体可能较大。如果客户端在指定时间内未发送完整主体,NGINX 将关闭连接并返回 `408 Request Timeout` 错误。该超时有助于通过防止挂起的连接来有效管理服务器资源。 该指令可用于多个上下文:`http`、`server` 和 `location`,因此在配置不同作用域的请求处理时很灵活。它接受一个参数,即超时时长,通常以秒为单位或使用 `ngx_time_t` 可识别的格式指定,例如 '30s'、'1m' 等。适当设置超时对于防止较慢的客户端独占服务器资源尤其重要,尤其是在高流量场景中。需要注意的是,更具体上下文(如 `location`)中设置的配置会覆盖更高层次(如 `http`)的配置。
配置示例
http {
client_body_timeout 30s;
server {
location /upload {
client_body_timeout 5s;
}
}
}将超时时间设置得过低可能会导致对连接较慢的客户端或发送大量数据的客户端出现意外的 `408 Request Timeout` 错误。
如果未定义,默认值为 60 秒,这可能并不适用于所有应用,尤其是在处理大量上传时。
说明
`client_body_temp_path` 指令指定在处理传入请求时,包含客户端主体数据的临时文件将被存放的位置。该指令在处理较大的请求主体(如文件上传)时尤为重要。它可以接受单个路径作为参数,或者可选地最多四个参数:用于存放文件的路径、每个临时文件的最大大小、可创建的临时文件的最大数量,以及在指定时间后删除临时文件的可选超时值。对该指令进行正确配置对应优化文件上传过程和有效管理磁盘使用至关重要。 所指定的路径应可被运行 NGINX 工作进程的用户写入。此外,当提供多个参数时,必须按文档中定义的顺序指定它们。如果只指定单个路径,则默认使用某个固定位置,例如类 Unix 系统上的 `/tmp`。还应确保指定目录存在并已妥善保护,以避免潜在的安全漏洞。
配置示例
client_body_temp_path /var/tmp/nginx/client_body_temp;
确保指定的目录存在并且对 NGINX 用户可写。
在接收大型客户端请求体上传时要注意磁盘空间,以免填满文件系统。
避免对临时目录设置过于严格的权限,以防写入失败。
说明
NGINX 中的 `client_body_in_file_only` 指令用于在 `client_body` 被设置为文件时,控制客户端请求体的存储行为。该指令可指定请求体是否应仅保存为文件,而不是直接在内存中处理。 该指令接受 `on` 或 `off` 参数:`on` 允许将请求体保存到临时文件,而 `off` 则不使用文件存储,而是在内存中直接管理请求体。 启用后,在需要处理大文件上传的场景中尤其有用,因为它能防止服务器消耗过多内存,从而避免性能下降。此外,临时文件还可以作为异步处理大型请求体的机制,从而更高效地利用资源。该指令可以放在 `http`、`server` 或 `location` 上下文中,根据应用架构需要提供灵活的配置。 但是,必须确保用于存储文件的目录具有足够的权限,以避免意外错误。当该指令关闭时,任何带请求体的请求都将在内存中处理,这可能不适用于大型请求体,从而在高负载情况下增加耗尽服务器资源的风险。
配置示例
location /upload {
client_body_in_file_only on;
client_max_body_size 10M;
# other configurations
}使用 `client_body_in_file_only on` 需要适当的文件系统权限来写入临时文件,如果未正确配置,可能会导致错误。
使用 NGINX 对请求体进行后续处理时,应考虑文件存储,因为这可能会改变你处理上传或表单的方式。
说明
‘client_body_in_single_buffer’ 指令用于优化 NGINX 在处理请求时对客户端请求体的处理。当该指令设置为 'on' 时,请求的完整主体会被读取到单个缓冲区,这可以减少管理多个缓冲区的开销,尤其是在请求体较小的情况下。这在服务器处理大量小请求的场景下可以提高性能。 另一方面,当设置为 'off' 时,NGINX 在某些情况下可能为请求体分配多个缓冲区,这使得对较大请求体的处理更灵活,但可能会为管理这些缓冲区引入额外开销。对于对延迟敏感、需要快速处理请求体的应用来说,使用单一缓冲区可能更有利。在配置该指令时应考虑应用的具体需求,尤其要权衡预期载荷大小与内存使用和性能之间的平衡。 该指令的参数是一个可启用或禁用的简单标志,可在 http、server 或 location 上下文中定义。这是调整 NGINX 请求体处理行为以匹配所服务应用工作负载特性的简单方法。
配置示例
server {
listen 80;
server_name example.com;
client_body_in_single_buffer on;
location /submit {
# additional configuration here
}
}如果请求体大小超过已配置的缓冲区大小,启用此指令仍可能导致溢出,从而使请求被错误处理。
在 location 上下文中使用此指令,若被更高层的上下文覆盖,可能无法达到预期效果。请确保各上下文的配置一致。
说明
指令 `sendfile` 是 NGINX HTTP 核心模块的一部分,通过允许服务器直接从磁盘向网络连接发送文件而无需在内核和用户空间之间复制数据,从而优化了文件传输。这会提高性能并降低 CPU 使用率,尤其是在提供诸如图片、样式表或 JavaScript 等静态文件时。 该指令接受一个参数,其值可以是 `on` 或 `off`。当设置为 `on` 时,NGINX 将使用 `sendfile()` 函数向客户端输出文件,这在处理大文件时尤其有利。相反,设置为 `off` 会禁用此功能,改为依赖传统的文件发送方法,这些方法可能效率较低。 `sendfile` 指令可以包含在 `http`、`server` 和 `location` 等各种上下文中,也可以在 location 上下文的 `if` 指令中使用。注意,尽管启用 sendfile 通常会带来更好的性能,但重要的是要确保服务器的配置和应用程序逻辑能够安全地处理该指令的使用,因为它可能在某些配置(例如涉及 TLS 或特定日志记录场景的配置)下引入复杂性。
配置示例
http {
sendfile on;
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
}由于数据传输方式的原因,使用 `sendfile` 与 non-blocking I/O 配合可能导致意外行为。
某些配置(例如 proxying 或某些模块(例如 HTTP/2))可能与 `sendfile` 交互不良,因此请务必相应地测试性能。
说明
`sendfile_max_chunk` 指令确定在单次操作中使用 `sendfile` 系统调用能够传输的最大数据量(以字节为单位)。这在优化高负载服务器上的文件发送性能时尤为有用,因底层操作系统的限制可能需要调整以优化吞吐量。 设置后,该指令限制在一次 `sendfile` 调用中可传输的数据量,这有助于管理内存使用并避免在大文件传输时阻塞。如果被发送文件的大小超过指定的块大小,NGINX 将把传输拆分为多个 `sendfile` 调用,每个调用的大小上限为定义的最大块大小。此行为可确保存储资源得到高效利用,并能在高负载下提高整体服务器响应性。 该指令在提供静态文件(如图像或视频)时尤其相关,在扩展工作负载下如果没有此限制性能可能会下降。调整此参数可以让运维人员在资源消耗与应用性能之间找到平衡,是 NGINX 性能调优中的一个重要考虑因素。
配置示例
http {
sendfile on;
sendfile_max_chunk 1m;
}将该值设置得过低可能导致数据传输效率低下,并由于频繁的上下文切换而增加 CPU 使用率。
在文件大小较小的环境中,较高的值可能收益甚微,并可能不必要地增加资源管理的复杂性。
说明
NGINX 中的 `subrequest_output_buffer_size` 指令控制可为子请求输出缓冲的最大数据量。子请求是在处理请求时为获取额外数据或资源而发起的,例如包含不同的文件或执行另一个服务器位置。通过指定此指令,管理员可以根据子请求预期的响应大小微调内存使用,从而在高负载时可能提升性能。 该指令设置的值决定了子请求缓冲区可以保存多少数据。如果子请求生成的输出超过该值,便会触发额外的缓冲机制或直接发送输出,可能影响性能和内存消耗。适当的设置取决于子请求的预期使用场景以及服务器的内存配置。
配置示例
server {
location /example {
subrequest_output_buffer_size 16k;
}
}将缓冲区设置得过低可能导致性能下降,因为数据会更频繁地被发送。
如果未正确管理,值过高可能导致内存消耗过多。
说明
'aio' 指令在 NGINX 中允许配置用于文件读写的异步 I/O 操作。通过启用异步 I/O,NGINX 在进行 I/O 操作时不会阻塞,这样它可以处理更多连接,因为在等待文件操作完成时仍能继续处理其他请求。这对提供静态文件或进行文件上传/下载的应用尤为有利。 该指令接受单个参数,用于指定要使用的异步 I/O 方法。对于类 Unix 操作系统,有效选项是 `off`(禁用异步 I/O)、`on`(启用异步 I/O)或 `io_uring`(在支持的情况下使用 io_uring 接口进行异步 I/O 操作)。设置后,NGINX 将对文件的读/写操作使用异步 I/O,在高负载下显著提高吞吐量,同时保持较低的延迟。
配置示例
http {
aio on;
server {
location /files/ {
root /data;
}
}
}确保你的操作系统支持所选的 I/O 方法(例如,io_uring 需要较新的 Linux kernel 版本)。
注意与传统的 blocking I/O 相比,调试异步操作时可能会更复杂。
说明
NGINX 中的 `aio_write` 指令启用异步文件写入,使服务器能够在不阻塞其他请求处理的情况下执行写操作。启用后,文件写入可以以非阻塞方式处理,从而释放资源并提高整体吞吐量。这在 I/O 操作可能成为瓶颈的高负载环境中尤其有利。该指令以一个标志作为参数,可设置为 'on' 或 'off'。设置为 'on' 时,服务器会利用内核级的异步写入支持。 要使用该指令,可在 http、server 或 location 块的上下文中指定它。根据底层操作系统的能力和配置,该指令可以利用各种异步机制(例如 Linux 的 AIO)来增强文件处理。但是,必须确保支持库和内核功能已正确配置,以实现预期的性能提升。启用 aio 后,应与其他 NGINX 配置结合使用,以最大化效率并确保其适用于当前的使用场景。
配置示例
server {
listen 80;
location /logs {
aio_write on;
root /var/log/nginx;
}
}确保底层文件系统支持异步 I/O 操作。并非所有文件系统都会按预期工作。
在某些场景中使用 aio_write 可能无法带来性能提升;最好在应用前后进行基准测试。
异步写入可能会引入错误处理方面的复杂性,而这些复杂性在同步操作中可能不存在。
说明
NGINX 中的 `read_ahead` 指令影响在处理之前从客户端连接读取的数据量。通过以字节为单位指定大小,该指令允许服务器预先读取来自客户端的流量,可能改善向服务器发送突发或大量数据的客户端的响应性和性能。对于速度较慢的客户端或处理大文件上传时,这尤其有益,因为它允许 NGINX 有效地缓冲这些数据,减少处理期间发生下溢的可能性。 当客户端连接建立时,指定数量的数据(例如 1k、4k 等)会预先读入 NGINX 的内部缓冲区。如果可读数据小于指定大小,服务器只会读取可用的数据。相反,如果未设置大小,NGINX 将使用其内部的缓冲管理。`read_ahead` 设置的数量在所有被接受的客户端连接之间共享,并针对给定上下文(http、server 或 location)优化读取策略。 了解如何利用 `read_ahead` 指令可以带来更好的资源利用和性能提升,尤其是在高流量期间或客户端上传速度不稳定时。务必针对应用的工作负载和客户端特性测试不同的大小,以达到最佳效果。
配置示例
http {
server {
location /upload {
read_ahead 1m;
# other configuration options
}
}
}将 `read_ahead` 大小设置得过大可能导致内存使用增加,尤其在高负载时。
请注意,当首次读取未被充分利用时,过高的值可能在等待更多数据时导致延迟。
说明
'directio' 指令在 NGINX 中用于配置文件处理的直接 I/O 操作,特别适用于在提供大文件时需要高性能的情况。启用后,数据将在磁盘和应用程序之间直接读写,绕过操作系统的缓存。这可以为经常访问大文件的应用减少延迟并提高吞吐量。 该指令带有一个参数,用于指定直接 I/O 缓冲区的大小。所给大小会与底层文件系统使用的块大小对齐。例如,如果你的块大小是 4 KB,则设置 'directio 4k;' 是合适的。该指令有助于在高性能场景或内存资源受限的系统中优化文件数据的处理方式。 '直directio' 指令可以在 `http`、`server` 和 `location` 块的上下文中声明,从而允许在 NGINX 层级的不同级别进行灵活配置。需要注意的是,尽管此功能可以带来显著的好处,但并非对所有工作负载都必要,尤其是不经常涉及大文件访问的工作负载,因为管理直接 I/O 的开销有时可能超过其性能收益。
配置示例
location /downloads {
directio 4k;
root /var/www/files;
}确保文件系统支持 direct I/O;否则,该指令可能不会生效。
注意将缓冲区大小与底层文件系统的块大小对齐,以避免性能损失。
使用 direct I/O 可能会绕过 kernel page cache,这可能导致小文件访问模式下的性能下降。
说明
NGINX 中的 `directio_alignment` 指令允许配置 direct I/O 操作的对齐方式,这可以通过优化数据从文件系统的读取和写入方式来提高某些工作负载的性能。该指令用于指定 direct I/O 数据传输的对齐边界,对要求数据在特定字节边界对齐的文件系统特别有益。 使用此指令,管理员可以定义一个以字节为单位的单一参数来设置对齐要求。启用后,NGINX 会确保所有的读写操作都按照指定值进行对齐,这对于诸如传输大文件或处理高负载 Web 服务器等高性能场景非常重要。需要注意的是,不正确的值可能会导致性能下降或由于未对齐而增加开销,因此在配置此指令时建议谨慎考虑并进行测试。 该 `directio_alignment` 指令可以在 `http`、`server` 和 `location` 等不同上下文中使用,从而在 NGINX 配置的不同范围内提供灵活性。此外,评估底层存储系统以确定最优对齐值也很重要,尤其是对于对对齐敏感的系统。
配置示例
http {
server {
location /files {
directio_alignment 4096;
}
}
}指定一个不是 2 的幂的对齐值可能会导致性能问题。
在不了解底层文件系统要求的情况下使用此指令可能导致性能下降。
这些值必须根据应用程序和数据访问模式仔细选择。
说明
tcp_nopush 指令在启用时指示 NGINX 在 Linux 系统上使用 TCP_CORK 选项。此选项允许 NGINX 通过阻止数据包过早发送来优化响应的传输。TCP_CORK 会确保数据只有在整个响应准备好或套接字缓冲区已满时才发送,而不是以小包发送数据。这可以减少通过网络发送的数据包数量并提高吞吐量,尤其在大响应或文件传输时。 默认情况下,此指令为关闭,意味着 NGINX 不会使用 TCP_CORK,这可能导致发送更多较小的数据包。当数据传输性能至关重要时(例如提供大文件或在高负载操作期间),此指令很有用。然而,需要注意的是,启用 tcp_nopush 可能会增加响应延迟,因为服务器会等待,直到满足释放 TCP_CORK 的条件才发送数据。 该指令接受一个标志参数,其值可以是 "on" 或 "off"。将 tcp_nopush 设置为 on 允许启用 TCP_CORK 的行为,而设置为 off 则恢复为标准的数据包发送行为。它可用于包括 http、server 和 location 块在内的多个上下文,从而在 NGINX 配置的不同部分定义最佳行为时提供灵活性。
配置示例
http {
tcp_nopush on;
server {
location / {
# Additional location settings
}
}
}确保服务器运行在 Linux 系统上,因为 TCP_CORK 是仅适用于 Linux 的功能。
在为 APIs 或实时服务启用 tcp_nopush 时要谨慎,因为它可能会增加小数据量的响应时间。
说明
tcp_nodelay 指令用于 NGINX 配置文件中的 HTTP、server 和 location 块。将其设置为 'on' 时,会禁用 TCP 连接的 Nagle's algorithm,这意味着数据包会立即发送,而无需等待累积更多数据以便一起传输。这可以帮助提高对低延迟要求严格的实时应用的性能,例如在线游戏、VoIP 和流媒体服务。 当 Nagle's algorithm 启用(默认)时,小数据包可能会被延迟,系统会尝试将它们合并为更大的数据包以优化网络使用。这会导致需要即时数据传输的应用出现更高的延迟。通过使用 tcp_nodelay,管理员可以确保数据准备好发送时立即发送,从而以可能增加网络流量为代价来降低延迟。在使用此指令时,必须仔细考虑对网络带宽的影响。 该指令接受一个标志参数;将其设置为 'on' 可启用 TCP_NODELAY,而 'off' 则恢复默认行为。需要注意的是,该指令主要影响性能特性而非功能行为,因此应根据所服务应用的具体需求进行调整。
配置示例
server {
listen 80;
location / {
tcp_nodelay on;
proxy_pass http://backend;
}
}将 tcp_nodelay 设置为 on 会增加网络流量,因为数据包会被立即发送。
在带宽效率比低延迟更重要的应用中请谨慎使用。
说明
`send_timeout` 指令在 NGINX 中配置向客户端传输响应所允许的最长时间。该超时在客户端发出需要大量数据返回的请求时尤为重要,它有助于确保资源不会被无法完整接收响应的客户端无限期占用。`send_timeout` 的参数以时间值指定,可以用秒 (s)、分钟 (m) 或小时 (h) 表示。 如果在传输数据时超过了指定的超时时间,NGINX 将关闭与客户端的连接。需要注意的是,该超时仅在向客户端发送数据时生效;它不会影响诸如连接或接收超时等其他超时设置。可以在不同级别(http、server 或 location)进行配置,以在应用的不同部分实现更细粒度的控制。该指令可以通过防止长时间运行的连接占用服务器带宽来帮助优化服务器性能和资源管理。 时间值可以根据不同用例进行配置,例如为大文件增加超时时间,或为实时流媒体应用减少超时时间。但应该在负载下测试设置,以确保它们满足特定应用的需求而不会对服务器资源产生不利影响。
配置示例
http {
send_timeout 60s;
server {
location / {
// other directives
}
}
}将超时时间设置得过低可能导致对接收数据较慢的客户端过早关闭连接。
该超时时间仅适用于发送阶段,而不适用于整个请求处理过程,这可能在排查连接问题时导致误解。
说明
`send_lowat` 指令用于在处理 HTTP 连接时为 TCP 发送缓冲区设置低水位标记。当套接字发送缓冲区中的字节数低于指定值时,NGINX 将被允许向客户端发送更多数据。在高吞吐量场景中,这一点尤其有用,因为它可以通过防止应用层过度缓冲来优化数据传输。设置合适的低水位标记有助于管理数据流,同时平衡服务器负载并提高整体性能。 指定的值必须大于零,并将被解释为字节数。当发送缓冲区达到该值时,NGINX 可以在 TCP 连接上开始发送新数据。`send_lowat` 指令可与 TCP node 配合使用,并适用于 HTTP、server 或 location 上下文,根据应用需求灵活配置此行为。在网络条件可变时,它可有效用于降低延迟并提高客户端访问服务器的响应性。 微调 `send_lowat` 指令可以在连接不断被打开和关闭或流量模式出现突发的场景中提升性能。需要慎重考虑为 `send_lowat` 设置的值,因为不当的值可能导致性能下降或增加客户端延迟。
配置示例
http {
...
send_lowat 4096;
...
}该值必须大于零;否则将被忽略。
使用非常高的值可能会因为发送缓冲区变大而导致内存消耗增加,从而可能影响其他连接。
在更改 send_lowat 后,务必测试性能影响,因为这可能会根据工作负载而有所不同。
说明
'postpone_output' 指令在可以生成响应但不需要立即发送给客户端的场景中特别有用。该指令告诉 NGINX 响应正文可以被延迟,从而通过推迟输出让服务器更有效地管理内存和处理。当启用该指令时,NGINX 工作进程不会立即将响应数据刷新到客户端的套接字,这可以通过减少系统调用次数并允许服务器同时处理多个请求而不发生过度的输出阻塞来提高性能。 该指令接受一个参数,用于指定可被延迟的最大量。当响应已完全构建但客户端正在忙或处理数据较慢时,该指令有助于确保不会在输出上浪费资源。它在 HTTP 级别上运行,其效果可以包含在 HTTP、server 和 location 上下文的配置文件中,从而允许在服务器处理的不同作用域上灵活应用。
配置示例
location /example {
postpone_output 1024;
}确保延迟输出的大小不会导致缓冲区溢出。
在不适当的上下文中使用 postpone_output 可能导致非预期行为。
说明
`limit_rate` 指令允许您为响应客户端设置速率限制。这在防止单个用户消耗过多服务器资源或带宽时特别有用,否则会降低其他用户的性能。该指令接受一个参数,指定以字节/秒为单位的最大传输速率。您可以包含后缀,例如 'k' 表示千字节,'m' 表示兆字节,以简化配置。 `limit_rate` 生效时,通过控制在某个时间间隔内发送的数据量来影响响应,实际上对外发流量实施了限速。该限速在请求处理的响应阶段生效,这意味着它在 `http`、`server` 和 `location` 等服务器指令上下文中有效,也可在 `location` 中的 `if` 语句内使用。这对于传输大文件或高峰期尤为有利,能够在客户端之间实现公平的带宽分配。 如果当前下载速率超过了 `limit_rate` 的设置,NGINX 会暂停数据传输以遵守该限制,从而确保不会有单个客户端独占服务器资源,为所有用户提供更平稳的体验。
配置示例
location /downloads {
limit_rate 100k;
}在 `if` 指令中使用 `limit_rate` 可能会由于 NGINX 的配置处理复杂性而导致意外行为。
速率限制仅适用于已传输的数据;不影响传入请求的处理。
过于严格的速率限制会导致客户端响应时间增加。
说明
'limit_rate_after' 指令在 NGINX 中用于控制客户端下载文件时使用的带宽。它允许配置一个阈值,超过该阈值后传输速率将被限制。该指令在希望为用户提供初始带宽突发以改善体验,但随后限制带宽以更好地管理资源的场景中非常有用。它可以在不同的上下文级别(如 http、server 和 location)设置,这为根据应用需求提供了灵活性。 当客户端请求资源时,如果已发送的数据量小于指定的限制,NGINX 将在不施加任何速率限制的情况下提供数据。一旦已发送的数据总量超过 'limit_rate_after' 中定义的数值,NGINX 就会根据 'limit_rate' 指令开始限制传输速率。此行为使网站所有者和管理员能够在下载达到阈值前让某些用户或请求先享受更高速度,同时在达到阈值后仍能控制资源使用。'limit_rate_after' 的参数是使此速率限制生效的字节限制。 需要注意的是,该指令需要与 'limit_rate' 指令配合谨慎配置,以确保在不使服务器带宽过载的情况下实现期望的用户体验。
配置示例
server {
location /downloads {
limit_rate_after 1m;
limit_rate 256k;
}
}确保同时定义 'limit_rate',因为 'limit_rate_after' 只有在该指令被触发后才生效。
错误配置 'limit_rate_after' 而没有 'limit_rate' 可能导致意外的带宽行为。
过大的值可能导致资源消耗过多,除非经过谨慎管理。
说明
`keepalive_min_timeout` 指令指定 keep-alive 连接的最小超时时间。该超时时间非常关键,因为它决定了在 NGINX 关闭连接之前,不活动连接最多可以保持开放的时间。默认情况下,keep-alive 超时由 `keepalive_timeout` 指令设为 75 秒,但在高延迟网络或客户响应缓慢时,超时可能会更长。设置 `keepalive_min_timeout` 可设定一个期望的最短超时,从而在断开空闲连接的激进程度方面提供一定的控制。 该指令接受一个参数,用于定义以秒为单位的最小超时时间。它对于在高负载下优化服务器性能尤其有用,因为可以在保持长连接和及时释放资源之间取得平衡。请注意,过低的 `keepalive_min_timeout` 可能导致连接被断开,并可能增加同一客户端后续请求的延迟,因此对于使用持久连接的 Web 应用来说,这是一项需要谨慎考虑的配置。 此指令可以在 `http`、`server` 或 `location` 上下文中定义,使您能够根据应用的需要应用不同的 keep-alive 超时设置。通过适当配置,您可以确保服务器在不因过多空闲连接而造成不必要负担的情况下高效处理 TCP 连接。
配置示例
keepalive_min_timeout 10s;
将值设置得过低可能导致连接过早关闭,影响用户体验。
此指令可能会覆盖默认的 keepalive 超时设置,如有需要,请与 keepalive_timeout 一并配置。
说明
`keepalive_disable` 指令在 NGINX 中用于根据发起请求的客户端的用户代理字符串控制 HTTP 持久连接的行为。指定该指令时,可以列出一个或多个将被拒绝使用持久连接的用户代理。禁用持久连接可能会导致延迟增加,因为每个请求将需要建立并拆除新的 TCP 连接,而不是重用现有连接。 该指令接受一个或多个参数,这些参数应为指定用户代理子字符串的字符串。如果客户端的用户代理匹配任何指定的子字符串,则该客户端不会使用持久连接。这对于处理已知在持久连接方面存在问题的客户端(例如旧浏览器或特定的爬虫)非常有用。该指令可在 `http`、`server` 或 `location` 上下文中使用,根据需要可灵活应用。 当该指令在未提供任何参数的情况下定义时,实际上不会改变行为,默认仍允许持久连接。相反,如果提供了一个或多个字符串,则会创建一条规则,根据指定的用户代理评估传入请求以确定是否应禁用持久连接。此指令对于调整服务器性能和资源管理很有帮助,尤其是在某些客户端可能导致性能问题或资源紧张的情况下。
配置示例
http {
keepalive_disable "MSIE";
keepalive_disable "Opera";
}
server {
location / {
keepalive_disable "FacebookExternalHit";
}
}注意精确的 user agent strings;部分匹配可能导致意外结果。
如果忽略 keep-alive,为这些客户端添加过多的 user agents 可能会降低性能。
说明
'satisfy' 指令允许您组合不同的访问控制机制来决定是否授予或拒绝请求。它接受一个单一参数,可为 'all'、'any' 或 'none',用于决定如何评估访问规则。若设置为 'all',则必须满足所有访问规则才能授予访问。若设置为 'any',只需要满足其中一条访问规则,从而允许更宽松的访问策略。相反,'none' 选项会有效地禁用任何预定义的访问控制,在没有其他规则适用时允许不受限制的访问。 该指令在需要满足多个条件的复杂授权场景中特别有用,例如将基于 IP 的限制(通过 'allow' 和 'deny' 指令)与诸如认证等其他方法结合使用。应注意定义清晰且结构良好的规则,因为错误配置的指令可能导致意外的访问问题。需要注意的是,如果未定义任何适用的规则,则适用于资源的默认访问权限将生效,而该默认行为可能会根据服务器配置而不同。
配置示例
location /secure {
allow 192.168.1.0/24;
deny all;
satisfy any;
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}确保由 'all' 和 'any' 定义的逻辑 AND/OR 条件彼此不冲突,以保持清晰性和安全性。
在未进一步指定其他指令的情况下使用 'satisfy none' 可能导致敏感位置被非预期地公开访问。
说明
`auth_delay` 指令旨在在处理认证请求时引入特定的延迟。通过增加延迟,它有助于缓解暴力破解攻击并提高安全性,因为这会使攻击者在短时间内猜测凭证变得更加困难。该指令可以接受多种格式的时间值(例如秒或分钟),从而在配置上提供灵活性。例如,你可以配置在每次认证失败之后强加 5 秒的延迟。 在实现 `auth_delay` 时,它可以在不同的上下文中指定,包括 `http`、`server` 和 `location`。这意味着你可以全局应用延迟,或在更细粒度的级别应用,从而根据应用的特定部分制定定制的安全措施。虽然引入认证延迟可以提高安全性,但如果设置过高也会影响用户体验;因此在配置该指令时应找到适当的平衡。 此外,在使用 `auth_delay` 时,管理员应警惕合法请求响应时间可能增加,因此根据观察到的流量模式和威胁级别进行监控和相应调整至关重要。通常建议从最小延迟开始,并根据所保护资源的敏感性及遇到的威胁类型逐步增加延迟。
配置示例
http {
auth_delay 5s;
}
server {
location /login {
auth_delay 3s;
}
}将延迟设置得太高可能会让合法用户感到沮丧。
此指令仅适用于认证请求;不会影响非认证操作。
说明
`internal` 指令在 NGINX 的 location 块中使用,用来指定该 location 只能由 NGINX 本身在内部访问,而不能被外部客户端访问。这在保护某些不应被用户直接访问的资源或路由时尤其有用,例如可能处理敏感数据的后端脚本或内部 API。当外部来源发起对内部 location 的请求时,NGINX 会返回 404 Not Found 错误,从而有效阻止未授权的访问。 当 `internal` 指令被应用到某个 location 块时,任何来自客户端直接访问该块的尝试都会返回错误响应,从而保持应用的完整性和安全性。这种行为有助于高效地构建应用,使某些路径可专门用于内部重定向、链接或对终端用户“隐藏”的 location,并且可以与诸如 `rewrite` 或 `error_page` 等其他指令结合使用,以控制在尝试未授权访问时的处理方式。 该指令不接受任何参数,体现了其开/关式的功能(声明时即启用)。因此它可以无缝地融入典型的 NGINX 配置范式,在该范式中各个块可根据用途和功能被清晰划分。正确使用该指令可以显著提升在 NGINX 中托管的应用的安全性,确保只有预期的服务器间通信通过受控端点进行。
配置示例
location /private {
internal;
# additional configurations
}将 internal 指令放在嵌套的 location 中可能导致意外行为;请确保在正确的逻辑上下文中使用它。
请记住,所有 internal requests 都需要通过已配置的 error pages 或 redirects 进行路由,以向用户提供反馈。
说明
NGINX 中的 `lingering_close` 指令控制客户端连接的延迟关闭行为。当设置为 'on' 时,它允许连接在客户端发送请求后在指定时间内保持打开,为客户端在连接完全关闭前读取剩余数据提供机会。这对于处理慢速客户端或可能不会及时读取全部数据的客户端尤其有用,从而防止潜在的数据丢失。当设置为 'off' 时,NGINX 会在发送响应后立即关闭连接而不等待客户端,这可以在高流量场景下提升服务器性能,但有丢失未被读取数据的风险。 该指令接受单个参数,可以是 'on' 或 'off'。在 'on' 状态下,NGINX 会执行延迟关闭,允许连接保持打开。若指令设置为 'off',则延迟关闭功能被禁用,连接会立即关闭。该指令可用于多个上下文,包括 http、server 和 location,从而为不同的应用需求提供灵活性。在进行性能微调时,NGINX 管理员可以利用此指令根据具体用例和客户端行为优化数据处理。
配置示例
server {
listen 80;
server_name example.com;
lingering_close on;
}将 lingering_close 设置为 'on' 在有过多慢速客户端时可能导致资源耗尽。
禁用 lingering_close 可能导致数据丢失,尤其是在客户端未完全读取响应时。
说明
'lingering_time' 指令用于控制 NGINX 在断开连接之前会等待客户端发起后续请求的时间长短,为接收延迟到达的请求提供一个宽限期,从而改善用户体验。此功能在客户端可能在前一个请求刚被接收后立即发送附加请求的情况下尤其有用。'lingering_time' 的参数以秒为单位,决定了该等待期的持续时间。 当客户端关闭连接(例如,浏览器选项卡关闭)时,如果设置了该指令,NGINX 仍可在指定的 'lingering_time' 内保持连接打开。在此期间,如果从同一客户端收到另一个请求,NGINX 可以在不重新建立连接的情况下处理该请求,从而提升响应速度并减少资源消耗。该指令在高流量环境中很有用,因为可维持的连接能降低延迟并提升整体性能。
配置示例
http {
lingering_time 10;
server {
listen 80;
location / {
root html;
index index.html index.htm;
}
}
}将 'lingering_time' 设置得过高可能导致资源耗尽,因为连接会比必要的保持打开时间更长,从而影响服务器性能。
如果设置不当,客户端可能会因服务器资源限制而遭遇连接被突然终止。
此指令在 HTTP/2 连接上可能效果较差,因为它们有自己独立的连接管理机制。
说明
NGINX 中的 `lingering_timeout` 指令用于配置服务器在客户端关闭连接后等待多长时间(以秒为单位)才完全关闭套接字。对于服务器希望允许额外的读写操作完成而不立即断开连接的场景,这一点尤其有用。当连接处于延迟状态时,服务器会在指定的超时时间内保留该套接字,以便给客户端时间发送或接收剩余数据。如果在超时时间内没有进一步活动,连接将被强制关闭。 在高负载环境中设置 `lingering_timeout` 很有用,因为在连接管理至关重要时,它可以帮助减少突然断开连接的次数。该指令可以应用于不同的上下文:http, server, and location,从而在 NGINX 配置的不同部分中对连接处理进行细粒度控制。 在指定超时时间时,重要的是该值应为表示秒数的正整数。值过短可能导致频繁的连接终止,而值过长则可能不必要地占用系统资源。
配置示例
http {
lingering_timeout 10;
}
server {
lingering_timeout 5;
}
location / {
lingering_timeout 3;
}将 lingering_timeout 设置得过低可能导致连接被突然断开,尤其在高延迟环境中。
设置得过高的值可能导致资源耗尽,因为打开的连接会在较长时间内保持空闲。
说明
该 `reset_timedout_connection` 指令用于 HTTP、server 和 location 上下文,用于管理超过允许非活动期限的空闲连接。启用后,该指令确保 NGINX 不会无限期地保持连接打开,避免不必要地消耗服务器资源。通过重置这些连接,NGINX 能在高负载下保持更好的性能,并通过释放本可分配给新请求而不是保持休眠连接的资源来提高响应性。 该指令接受单个参数,该参数是一个标志,用于表示是否启用此行为。将其设置为 'on' 时,NGINX 将系统性地检查已超时的连接并强制关闭它们。此设置在高流量环境中特别有用,因为由于客户端不活动,连接可能处于半打开状态。内部连接超时设置将决定这些空闲连接被识别和关闭的速度,因此通常与其他超时指令一起使用以微调连接管理。 需要注意的是,尽管该指令有助于管理资源使用,但配置不当可能导致过早终止连接,如果过于激进地重置连接,可能影响用户体验。该指令作为一种额外的安全措施,增强了 NGINX 服务器连接处理的稳健性。
配置示例
server {
listen 80;
server_name example.com;
location / {
reset_timedout_connection on;
proxy_pass http://backend;
}
}确保超时设置 (例如 `keepalive_timeout`) 已正确配置,以避免终止重要连接。
注意不要过度重置连接,这可能会导致访问您 Web 应用的用户体验变差。
说明
`absolute_redirect` 指令在 NGINX 中指定是否在重定向时使用绝对 URI。默认情况下,NGINX 生成使用相对 URI 的重定向,这可能会在需要包含协议和主机名的完整 URL 的应用中导致不一致。当启用时,NGINX 会构造包含完整 URL 的重定向响应,包括协议(http 或 https)和主机信息。 该指令接受一个标志参数,可为 `on` 或 `off`,其中 `on` 表示在重定向响应中应使用绝对 URI,`off` 表示不使用。该设置在将 NGINX 部署在其他代理后面或处理复杂路由场景时特别有用,此时客户端需要被明确告知确切的目标 URI 以确保正常工作。 该指令可以在配置文件的 http、server 或 location 等段中定义,从而允许在应用的不同部分对重定向行为进行细粒度控制。配置错误可能导致链接断开或 Web 应用的重定向出现意外行为。
配置示例
server {
listen 80;
server_name example.com;
absolute_redirect on;
location /old-path/ {
return 301 /new-path/;
}
}确保在正确的上下文(http、server 或 location)中设置该指令,以避免意外结果。
如果配置不当,使用 absolute_redirect on 可能会暴露内部服务器结构,因此请检查你的 URI 模式。
说明
当启用时,server_name_in_redirect 指令会改变 NGINX 在生成重定向(例如 HTTP 301 或 302 响应)以应对服务器处理的请求时的行为。具体来说,它决定重定向 URL 是否包含 server block 配置中指定的 `server_name`。默认情况下,当发生重定向时,NGINX 可能使用请求中的 `Host` 头来构建重定向 URL,但启用此指令后会强制 NGINX 改用 `server_name`。 当 NGINX 服务器承载多个域名(即虚拟主机)时,此指令尤其有用,能够确保重定向始终反映某个特定域名。例如,如果收到针对 `example.com` 的请求,但配置为重定向到 `www.example.com`,将 `server_name_in_redirect` 设置为 `on` 可以确保所有重定向一致地使用 `www.example.com`。该指令接受一个标志,取值可以为 `on`(启用此行为)或 `off`(禁用),从而便于在不同上下文(例如 http、server 和 location 块)中进行灵活配置。
配置示例
server {
listen 80;
server_name example.com www.example.com;
server_name_in_redirect on;
location / {
return 301 https://www.example.com$request_uri;
}
}忘记在适当的上下文中设置此指令可能导致重定向行为不一致。
如果使用多个 server 块,确保每个都设置了正确的 `server_name`,以避免出现意外结果。
说明
指令 `port_in_redirect` 用于确定 NGINX 在生成的重定向响应中如何处理端口号。将该指令设置为 `on` 时,如果服务器监听的是非常规端口,NGINX 会在其生成的重定向响应的 Location 头中包含端口号。 当 Web 服务器未在默认的 HTTP (80) 或 HTTPS (443) 端口上运行时,这对于准确引导客户端到正确的主机和端口尤其有用。相反,设置为 `off` 时,重定向 URL 中会省略端口号,这意味着客户端在跟随重定向时可能会采用默认端口。 在实际应用中,对于配置为使用非默认端口的服务,该指令可能是确保客户端获得正确重定向的关键;未包含端口号可能导致混淆或请求失败。该指令可在 `http`、`server` 和 `location` 上下文中使用,便于根据特定服务器或路径需求进行灵活配置。调整 `port_in_redirect` 设置有助于解决因复杂服务器设置(在不同端口上运行多个服务)而产生的歧义。
配置示例
server {
listen 8080;
port_in_redirect on;
location / {
return 301 http://example.com;
}
}使用此指令而不了解省略端口的含义,可能导致跟随重定向的客户端出现意外行为。
如果你的服务器运行在默认端口上,将此指令设置为 `on` 可能在响应中不必要地暴露端口。
在与 HTTPS 配置及非标准端口混合使用时要小心。
说明
`msie_padding` 指令用于专门为 Internet Explorer (IE) 浏览器管理响应填充。启用时,它会在 response body 中添加填充,以提高与某些 IE 版本的兼容性,这些版本在处理 chunked responses 或提供像 gzip 这样的特定内容类型时可能无法正确呈现页面。该指令确保 IE 客户端收到符合浏览器特殊行为的正确格式化响应,从而避免布局破碎或内容不完整等问题。 该指令接受一个标志参数,用于启用或禁用填充。当设置为 `on` 时,NGINX 将应用必要的填充;设置为 `off` 则关闭此功能,可能导致兼容性降低并在旧版 IE 中出现显示问题。该指令的行为对仍为旧有客户端提供服务的网站尤为重要,在切换其状态之前应谨慎考虑。
配置示例
http {
msie_padding on;
server {
location / {
# serve your content here
}
}
}在现代浏览器中使用 `msie_padding on` 可能导致不必要的开销,因为较新的浏览器不再需要此功能。
在高流量站点启用填充时,请注意性能影响,因为它可能会为每个响应增加额外的字节。
说明
`msie_refresh` 指令专门用于帮助处理 Internet Explorer 中的内容缓存。启用后,该指令会强制在 HTTP 响应中添加一个响应头,帮助 IE 识别需要刷新缓存的内容。这在资源频繁更新且希望使用 IE 的用户立即看到最新版本时尤其有用。该指令可以接受一个 flag 值,用以指示是否启用或禁用该功能。 在实现方面,`msie_refresh` 通常在 HTTP、server 或 location 上下文中使用。接受的参数是一个 flag,用来指定是否为 Internet Explorer 启用刷新行为。当 flag 设置为 'on' 时,它会在发出的响应中包含必要的头;否则默认行为是不发送这些头。必须慎重考虑指令的应用位置,因为它可能广泛影响使用该浏览器的用户的站点体验。
配置示例
server {
listen 80;
server_name example.com;
location / {
msie_refresh on;
}
}确保在正确的上下文中设置 `msie_refresh` 指令以使其生效(http、server 或 location)。
检查与 Internet Explorer 各版本的兼容性,因为较旧的版本在缓存方面可能表现不同。
谨慎将此指令与其他可能与刷新行为冲突的缓存机制一起使用。
说明
在 NGINX 中,`log_not_found` 指令用于指定服务器是否应记录对不存在文件的请求。该指令对网站管理员非常有用,因为它有助于监控对服务器上不存在资源的访问,可能揭示断链、配置问题或试图访问未授权内容的行为。它可以在 `http`、`server` 或 `location` 级别启用,从而实现灵活且细粒度的日志控制。
配置示例
server {
log_not_found on;
}启用此指令会增加日志噪音,可能使查找有用信息变得更困难。
如果您正在提供动态内容,请确保已实现适当的逻辑来处理 'not found' 情况,而不要仅仅依赖此指令。
说明
在 `http`、`server` 和 `location` 上下文中使用的 `log_subrequest` 指令允许你指定服务器发起的子请求是否应该被记录。子请求是 NGINX 发起的内部请求,通常由诸如 `include` 或 `try_files` 等指令生成。默认情况下,这些子请求的日志可能会淹没主错误日志,使得难以发现重要问题。该指令可以让你抑制这些日志,确保主日志仅包含重要的顶层请求信息。 启用时(设置为 `on`),子请求将以错误级别记录,这意味着在这些内部请求期间发生的任何问题都会记录到 NGINX 的错误日志中。相反,将其设置为 `off` 会禁用对子请求的记录,从而减少日志数据量。这在高流量场景尤其有用,因为子请求可能很多,记录每个子请求会影响性能并导致日志文件变得庞大且难以管理。 该指令的语法很简单,接受一个标志值;因此可以轻松地以最小的工作量集成到现有配置中。建议根据监控需求与文件大小或性能之间的权衡谨慎使用,并且可以在每个上下文中应用以细化日志中捕获的信息。
配置示例
http {
log_subrequest on;
server {
location /example {
try_files $uri /subrequest;
}
}
}请注意,记录大量 subrequests 可能会导致日志文件变大,从而影响性能和日志文件管理。
请记得在启用日志记录时,将错误日志级别适当配置,以捕获与 subrequests 相关的详细错误信息。
说明
`recursive_error_pages` 指令可设置为 'on' 或 'off',允许用户启用或禁用错误页面的递归处理。当该指令设为 'on' 时,如果请求遇到错误页面(例如 404 Not Found),NGINX 会尝试在相同的配置中处理该错误页面,这可能会在错误页面本身再次出现错误时允许继续提供后续的错误页面。 该指令在简化复杂站点配置中的错误处理时非常有用,尤其是当错误页面本身可能依赖额外的配置设置时。例如,如果错误页面本身也被错误配置,NGINX 会尝试使用相同的配置上下文来处理,而不是立即返回错误,这可以为用户提供更清晰的错误显示。但应注意避免创建循环,使错误页面相互引用而无法解决。 该指令可放在 `http`、`server` 或 `location` 的任何上下文中,从而在不同层级的错误处理管理上提供更广的控制范围。需要注意的是,在错误处理可能导致额外服务器负载的场景中,启用递归错误页面可能会带来额外的开销和复杂性。
配置示例
http {
recursive_error_pages on;
server {
error_page 404 /custom_404.html;
}
}启用 `recursive_error_pages` 可能会导致意外的递归循环,尤其是在错误页面也配置错误的情况下。在涉及多层错误处理的复杂配置中请格外小心。
使用该指令时建议对错误页面进行充分测试,以确保其正常工作并避免造成过高的服务器负载。
说明
在 NGINX 中,'server_tokens' 指令用于管理在 HTTP 响应头中显示版本信息的可见性。默认情况下,当 'server_tokens' 设置为 'on' 时,会在 'Server' 响应头中暴露 NGINX 服务器的版本。这可能会泄露对攻击者有用的信息。为增强服务器安全性,将该指令设置为 'off' 将阻止包含 NGINX 版本详细信息,而仅返回 'nginx' 作为服务器标识。此外,该指令还可以接受参数 'build',它只在错误页面上显示版本信息,在正常响应中保持隐藏。此行为可以通过不让攻击者轻易识别服务器版本以利用已知漏洞来最小化攻击面。
配置示例
http {
server_tokens off;
}设置 'server_tokens off' 并不会阻止版本在错误页面中显示,除非在 'build' 中正确指定。
请确保在设置此指令后测试配置,以避免出现意外行为。
此指令必须放在 'http'、'server' 或 'location' 上下文中。如果放置不正确,将不会生效。
说明
`if_modified_since` 指令用于 NGINX 中,根据客户端发送的 Last-Modified 头来管理内容缓存。该指令可以取三个值之一:`off`、`on` 或 `exact`。当设置为 `on` 时,NGINX 会检查请求资源自客户端请求的 If-Modified-Since 头中指定的时间以来是否已被修改。如果资源未改变,NGINX 将以 304 Not Modified 状态响应,表示客户端可以使用其缓存版本。 `exact` 选项进一步细化了比较,要求时间戳完全匹配。如果请求的 If-Modified-Since 时间戳与资源的 Last-Modified 时间戳相符,NGINX 将返回 304 Not Modified 响应。这对于更严格的缓存验证很有用。相反,当设置为 `off` 时,该指令禁用这种检查行为,NGINX 将始终返回资源,而不考虑客户端的缓存状态。这在内容频繁更新且缓存无益的场景中很有用。
配置示例
server {
location /images/ {
if_modified_since on;
}
}请确认您的后端或静态文件已正确设置 Last-Modified header;否则该指令可能无法按预期工作。
如果时间戳不完全匹配,`exact` 选项不会返回 304 响应;相比之下,`on` 选项会将任何未修改的资源视为有效。
确保您的缓存策略与该指令配合良好,以避免对服务器造成不必要的负载。
说明
`max_ranges` 指令用于在 NGINX 中控制服务器在单个 HTTP 响应中会接受的最大范围请求数量。范围请求允许客户端请求资源的特定部分,这对恢复下载或流媒体传输很有用。通过限制可请求的范围数量,可以节省服务器资源并减轻复杂范围请求对性能的影响。 该指令在 `http`、`server` 和 `location` 上下文中定义,使其在各种配置场景中具有灵活性。当客户端发送的多范围请求超过 `max_ranges` 指定的数量时,NGINX 会返回一个 HTTP 错误,表明无法完成该请求。这有助于防止通过过多范围请求实施的潜在拒绝服务攻击,并在高负载时提高服务器稳定性。 `max_ranges` 的参数是一个整数,表示可接受的最大范围数量。例如,如果设置为 5,服务器将最多同时处理 5 个范围请求,超出的请求会被拒绝。对于媒体服务器或提供大文件的应用来说,这种配置尤其重要,因为客户端可能会尝试同时请求大量字节范围,从而导致开销增加。
配置示例
http {
max_ranges 4;
}将此值设置得过低可能导致客户端无法有效检索大型文件。
过高的值会给服务器资源带来压力,尤其在高负载时。
说明
当 chunked_transfer_encoding 指令设置为 'on' 时,NGINX 将使用分块传输编码向客户端发送响应,而不是在 HTTP 头部中指定总内容长度。分块传输编码对于动态生成的内容特别有用,因为在响应开始时无法知道内容的总大小。通过使用这种方法,NGINX 可以在数据可用时立即开始向客户端发送,从而改善应用的感知性能并降低延迟。 该指令接受一个标志参数,可为 'on' 或 'off'。设置为 'on' 时,NGINX 将启用分块传输编码;设置为 'off' 时将禁用。该指令的位置灵活;可以在 http、server 或 location 上下文中使用,允许用户根据需要在全局或特定上下文中应用。通常,对动态生成的响应启用分块传输编码更为有利,例如由 CGI 脚本生成的响应或反向代理到应用服务器时,这类响应在开始时无法预先得知最终内容长度。
配置示例
http {
server {
location / {
chunked_transfer_encoding on;
proxy_pass http://backend;
}
}
}在使用动态内容时禁用分块传输编码可能会导致延迟增加,因为 NGINX 需要在发送响应之前知道总体内容长度。
将分块响应与缓冲设置混合使用可能会导致意外行为;当启用分块编码时,务必确保缓冲区配置与其兼容。
说明
'etag' 指令在 NGINX 中用于启用或禁用 HTTP 响应头中的 ETag 生成。ETag(或实体标签)用于由浏览器和代理服务器验证缓存的响应,从而实现高效的缓存管理。当 'etag' 指令设置为 'on' 时,NGINX 会基于资源内容生成 ETag,并将其添加到响应头中。相反,如果设置为 'off',NGINX 将不会在响应中包含 ETag,这在 ETag 管理由其他地方处理或生成 ETag 的额外开销不必要的情况下可能是可取的。 在实践中,启用 ETag 可以改善缓存验证,但不一定总是有利。例如,如果你的后端服务已经处理了 ETag,那么在 NGINX 中再次添加可能会导致不一致。此外,ETag 有时可能泄露关于资源版本的细节,这些细节可能被视为敏感信息。管理员需要评估其应用的缓存策略,以确定是否有效地使用该指令。总体而言,'etag' 指令的使用应考虑现有的具体缓存机制和应用架构。
配置示例
http {
server {
location / {
etag off;
}
}
}启用 ETags 可能导致不一致情况,尤其当后端也生成 ETags 时。
在通过 ETags 暴露资源版本信息时,请务必考虑其影响。
说明
该 `early_hints` 指令在 NGINX 中为 HTTP/3 设计,可发送初步的 HTTP 103 响应,使服务器在最终响应到达前向客户端提供提示。这对于资源预加载尤其有用,可提示像样式表或脚本这样的资源,客户端可能会在渲染页面前先行获取这些资源。该指令可以在 `http` 块中全局配置,或针对 `server` 或 `location` 上下文进行具体配置,且至少需要一个参数,通常包括指定要预加载资源的 'link' 头。 使用时,`early_hints` 能通过提前告知浏览器所需资源显著加快网页加载。配置该指令后,响应中指定的链接会使浏览器在等待最终响应时就开始加载这些资源,从而减少阻塞渲染的时间。但是,要有效使用此功能,应用也必须设计为能够适当处理这些早期响应,并且应检查浏览器支持情况,因为并非所有浏览器以相同方式处理 early hints。
配置示例
http {
server {
location / {
early_hints 'Link: ; rel=preload';
}
}
}并非所有客户端和浏览器都能正确支持 HTTP 103 响应,这可能导致行为不一致。
如果最终响应具有不同的缓存指令或访问限制,已提示的资源可能不会被获取。
说明
`error_page` 指令用于 NGINX 配置中,为特定的 HTTP 状态码定义自定义错误响应。该指令可在不同上下文中使用,例如 `http`、`server`、`location`,或在 `location` 块内的 `if` 块中。你可以指定两个或更多参数:第一个是 HTTP 状态码或状态码范围(例如 `404` 或 `500 502 503 504`),第二个是作为错误页面的 URI,该 URI 可以指向静态文件或另一个 `location` 块。 当发生错误时,例如未找到文件(`404`)或服务器错误(`500`),NGINX 会检查为该状态码定义的 `error_page` 指令。如果找到匹配的错误码,NGINX 会返回所定义的 URI,从而为终端用户提供定制的响应。错误页面可以是磁盘上的文件,也可以是进一步处理请求的另一个 `location`。此外,它还可以包含内部重定向,以更优雅地处理复杂的错误响应。 `error_page` 的有效使用可以通过提供比服务器默认错误消息更具信息性或更美观的错误响应来提升用户体验。此外,开发者可以将自定义错误页面与针对特定错误码的更详细的分析或故障排除资源关联起来。这种灵活性有助于提高 Web 应用以及静态网站的可用性和故障排查效率。
配置示例
http {
error_page 404 /custom_404.html;
location = /custom_404.html {
root /usr/share/nginx/html;
}
}指定不存在的 URI 可能导致递归的错误处理。
带有 `location` 块的错误页面本身不得返回 404,否则会触发下一个错误处理器。
并非所有 HTTP 状态码都可用;请务必查阅 NGINX 文档以获取可用的状态码。
说明
`post_action` 指令在 NGINX 中允许你指定在请求处理完成后应执行的附加操作。该指令可以在 NGINX 配置的不同层级定义,例如 http、server、location,或在 location 块内的 'if' 语句中,根据不同的 HTTP 请求处理需求提供灵活性。该指令的主要目的是允许执行不会影响对客户端即时响应的后续处理任务,例如日志记录、通知或额外的后台处理。 当你使用 `post_action` 指令时,指定的 URI 会在主请求完成后被请求,可能会向另一个端点发送后台请求。然而,重要的是要确保该端点被正确处理,因为 NGINX 不会等待 `post_action` 完成;它仅在主响应处理后触发该操作。这使得可以执行对用户体验非关键但对审计或系统维护可能至关重要的操作。 该指令接受一个参数,即 post-action 将请求的 URI。请记住,URI 可以包含查询参数,并且应直接对应于在 NGINX 配置中定义的有效 location 块。
配置示例
location /example {
post_action /post-handler;
}确保在 `post_action` 中指定的 URI 存在并且可以被 NGINX 访问,否则可能导致意外行为。
`post_action` 不会等待后端处理完成;任何必要的清理都应在 post-action 本身处理。
说明
NGINX 中的 `open_file_cache` 指令用于控制文件描述符的缓存,允许 NGINX 对经常被访问的文件重用文件句柄。这可以减少打开和关闭文件描述符的开销,从而在高流量场景下增强文件提供的性能。该指令可以接受一个或两个参数;第一个参数指定要缓存的最大文件描述符数量,可选的第二个参数定义在检查文件更改之前缓存保持有效的时间段(以秒为单位)。此功能对于优化静态文件传输非常重要,因为它将文件系统 I/O 操作的影响降到最低。
配置示例
http {
open_file_cache max=1000 inactive=30;
}设置 `max` 过高可能会在缓存大量文件描述符时消耗过多的服务器内存,从而导致性能下降。
如果 `inactive` 设置不正确,可能会导致使用过期的文件句柄,从而提供过时的内容。
说明
`open_file_cache_valid` 指令用于配置 NGINX 中已缓存文件属性的有效期。它接受一个参数,该参数指定在 NGINX 尝试检查文件系统以获取更新之前,缓存的文件信息被视为有效的持续时间。此功能通过减少不必要的文件系统检查来优化文件访问性能,从而改善静态文件服务的响应时间。 您可以在 `http`、`server` 或 `location` 上下文中设置此指令,这为不同的服务器配置提供了灵活性。该参数是一个时间值(例如 `30s`、`5m`、`1h`),表示应将文件状态(例如修改时间)视为有效的持续时间。在此有效期内,NGINX 会跳过对文件的文件系统检查,而是依靠缓存的信息来响应请求。 一旦指定的时间期满,NGINX 将重新验证缓存信息,以确保识别文件系统上对文件的更改。应当谨慎选择有效期,在性能(通过减少文件系统检查)和准确性(来自磁盘的最新信息)之间取得平衡。
配置示例
open_file_cache active; open_file_cache_valid 30s;
将该值设置得过高可能会导致 NGINX 提供过期的文件信息。
请确保通过 'open_file_cache' 启用文件缓存,以使 'open_file_cache_valid' 生效。
说明
`open_file_cache_min_uses` 指令配置在将文件考虑加入打开文件缓存之前,文件必须被访问的最小次数。该功能通过确保只有经常被访问的文件才会被存入内存来优化性能,从而减少对不常用文件的文件系统调用开销。当文件被打开时,NGINX 会将其访问计数与该指令的值进行比较。如果文件的访问计数大于或等于指定阈值,则将其加入缓存;否则保持未缓存。该方法可在某些文件被频繁访问而其他文件很少使用的场景中带来显著的效率提升。 该指令的参数为整数,表示所需的最小访问次数。在静态文件数量较多的环境中非常有用,可以防止缓存被不常需要的文件填满。通过在内存中维护一组最优的文件集合,缓存行为可以显著改善响应时间并减少磁盘 I/O。重要的是要将 `open_file_cache_min_uses` 与其他缓存指令平衡,以适应您的应用的访问模式。
配置示例
http {
open_file_cache max=1000 inactive=20s;
open_file_cache_min_uses 5;
}
将此值设置得过高可能会阻止有用的文件被缓存。
如果文件访问模式发生显著变化,可能需要调整该指令的值。
确保缓存的文件总数不要超过其他 `open_file_cache` 设置中定义的限制。
说明
'open_file_cache_errors' 指令是 NGINX 中的一项性能优化功能,用于决定服务器在尝试访问文件时是否缓存错误响应。启用后,NGINX 会缓存与文件访问尝试相关的错误状态,这可以提高对同一可能不存在或不可读的文件的重复请求的响应时间。这样就不需要在每次请求文件时都检查文件系统,从而减少磁盘 I/O 并在高负载条件下提升性能。 该指令接受一个标志作为参数:"on" 表示启用这些错误的缓存,"off" 表示禁用。默认情况下,此指令为关闭状态,意味着错误状态不会被缓存,每次文件访问请求都会重新检查文件系统,这可能导致较高的延迟,尤其是在多次请求针对相同缺失或无法访问文件的情况下。在错误状态可靠性至关重要的场景(例如动态生成的内容)中应谨慎使用,因为如果配置不当可能返回过时的错误。
配置示例
http {
open_file_cache_errors on;
}
server {
location / {
open_file_cache_errors on;
}
}缓存错误可能导致响应过时,尤其是在文件状态发生变化但缓存未刷新时。
如果启用,长时间存在的错误响应如果未被正确缓存,可能会导致不必要的磁盘 I/O。
说明
open_file_cache_events 指令是 NGINX HTTP Core 模块的一部分,允许你指定是否缓存与打开文件相关的事件。启用后,NGINX 将跟踪文件访问事件,比如文件何时被打开或关闭,这可以通过减少对文件系统的访问频率从而降低 I/O 操作显著提高性能。该指令接受一个标志作为参数,可以是 'on' 或 'off',分别表示启用或禁用打开文件事件的缓存。 使用此指令可以显著提升你的 NGINX 服务器的响应能力,特别是在处理请求时频繁打开和关闭文件的场景中。然而,启用此指令可能会导致在文件在 NGINX 进程外被修改且 NGINX 未能感知到这些更改时检索到过期数据,因此根据应用需求权衡非常重要。 使用 open_file_cache_events 时,应注意它应放在 http、server 或 location 上下文中。该指令没有默认配置,必须在希望启用文件缓存的配置块中显式设置才能生效。
配置示例
http {
open_file_cache_events on;
location / {
open_file_cache max=2000 inactive=60s;
}
}启用 open_file_cache_events 可能会导致文件信息过时,若文件已更改但未重新缓存。
在频繁变更的环境中应谨慎使用此指令以防止数据陈旧。
说明
在 NGINX 配置中,`resolver` 指令用于指定一个或多个用于解析服务器请求中域名的 DNS 服务器(IP 地址)。当缓存层或后端使用的域名可能会更改其 IP 地址,需要服务器按需动态解析这些名称时,这一点尤为重要。该指令可以在 `http`、`server` 和 `location` 上下文中设置,从而根据配置的作用域为 DNS 解析提供灵活性。 `resolver` 指令的语法包括以空格分隔的一个或多个 IP 地址。值得注意的是,NGINX 会按列出的顺序查询这些 DNS 服务器。如果某个 DNS 服务器不可达,NGINX 会转而查询列表中的下一个服务器,从而为 DNS 解析提供冗余。在出现故障转移的情况下,如果所有配置的服务器都无法响应,就会发生解析错误,依赖这些解析域名的请求会失败。 此外,`resolver` 指令可以包含可选参数,例如超时设置(以秒为单位)和 `valid` 参数,后者定义了解析到的地址被视为有效的新鲜时间。这样可以确保 NGINX 根据应用需求动态管理已解析地址的缓存行为。
配置示例
http {
resolver 8.8.8.8 8.8.4.4;
}DNS 解析失败可能导致依赖动态主机名的 NGINX 配置出现请求失败。
确保所指定的 DNS 服务器可从 NGINX 服务器的网络访问。
使用无效的 IP 格式可能导致配置错误。
说明
`resolver_timeout` 指令用于在 NGINX 中指定 DNS 名称解析的时间上限。对于依赖外部 DNS 记录的应用(例如使用 `proxy_pass` 指令将请求转发到以主机名定义的上游服务器时),该超时是一个重要设置。通过配置该指令,管理员可以控制 NGINX 在超时并可能记录错误或无法处理请求之前,等待 DNS 解析完成的时间。 该指令接受一个参数,用于定义超时时长,可按秒指定(默认),也可以使用时间单位,如 'm' 表示分钟,'h' 表示小时等。该超时不仅有助于在高流量情形下管理资源,还能提高应用在面对与 DNS 查找相关的延迟问题时的弹性。该指令可在 `http`、`server` 和 `location` 上下文级别使用,为不同层级的路由配置提供灵活性。 根据应用的具体需求设置合适的超时值至关重要。过短的超时可能导致因网络问题而响应缓慢的服务访问失败,而过长的超时则可能无谓占用 worker 进程,导致在 DNS 解析出现问题时性能下降。
配置示例
resolver 8.8.8.8; resolver_timeout 5s;
确保 timeout 不要设置得过低,因为这可能导致在响应较慢时出现零星的 DNS 解析失败。
在高负载场景中配置 resolver_timeout 时务必谨慎,因为它可能影响整体系统性能。
该指令仅影响 DNS 解析延迟,并不会影响任何其他网络操作的 timeouts。
说明
`gzip_vary` 指令在 NGINX 中用于启用或禁用在对响应应用 gzip 压缩时包含 `Vary: Accept-Encoding` HTTP 头。这个头对代理和 CDNs 的缓存行为很重要,因为它表明响应可能会根据客户端发送的 `Accept-Encoding` 请求头而有所不同。当 `gzip_vary` 设置为 `on` 时,能够确保支持不同内容编码的用户代理根据它们支持的编码收到正确缓存的资源版本。 当使用 `gzip_vary` 时,如果启用了 gzip 并激活了此指令,NGINX 会在响应中添加 `Vary: Accept-Encoding` 头。这使得中间缓存系统能够知道响应内容可能会根据客户端是否接受 gzip 编码的数据而变化。如果设置为 `off`,则不会添加此头,这可能导致不期望的缓存行为,尤其是对不请求 gzip 压缩的用户。 此指令可以在 `http`、`server` 和 `location` 等不同上下文中定义,因而对各种配置很灵活。当不同类型的客户端可能需要基于其编码能力对同一资源的不同表示时,该指令非常有用。
配置示例
http {
gzip on;
gzip_vary on;
}确保你的缓存机制(例如,代理或 CDN)识别 `Vary` 响应头。
将 `gzip_vary` 设置为 `on` 而未启用 gzip 可能会导致混淆,因为该响应头会被发送但不会产生任何效果。
说明
NGINX 中的 gzip_http_version 指令决定了客户端必须支持的最低 HTTP 版本,才能接收 gzip 压缩的响应。该设置对于优化带宽和提升能够处理压缩数据的客户端的加载时间非常重要。通过配置此指令,管理员可以确保只有能够处理 gzip 响应的客户端才会收到压缩内容,从而有助于避免旧版 HTTP(可能不支持压缩)带来的不兼容问题。 此指令的参数是一个版本字符串,可以是 "1.0" 或 "1.1"。如果设置为 "1.0",则仅对使用 HTTP/1.0 或更高版本的客户端启用 gzip 压缩;而设置为 "1.1" 则仅对使用 HTTP/1.1 或更高版本的客户端允许 gzip 响应。这种粒度使得可以根据客户端能力更好地控制压缩的使用,从而确保不会为使用旧协议的用户引入额外的处理开销。 此指令可以放在 http、server 或 location 上下文中,使其在整个服务器配置中针对不同应用场景具有灵活性。通过考虑访问服务器的客户端类型,服务器管理员可以优化压缩行为,以提升整体性能,同时避免引入潜在的错误或复杂性。
配置示例
gzip on; gzip_http_version 1.1;
将 gzip_http_version 设置为 1.1 可能导致对 HTTP/1.0 客户端不进行压缩,从而导致这些用户的响应大小可能更大。
请使用 'gzip on;' 指令确保已启用 gzip,以使该指令生效。
设置 HTTP 版本时应考虑与较旧客户端的兼容性。过度限制可能会疏远部分用户。
说明
`gzip_proxied` 指令在 NGINX 中用于配置来自代理服务器的响应的 gzip 压缩。通过设置此指令,你可以根据诸如 HTTP 状态码或请求中是否存在特定头部等条件,指定哪些请求的响应应被压缩。该指令接受诸如 `off`、`expired`、`no-cache`、`no-store`、`private`、`no_last_modified` 和 `undispositioned` 等参数。这些参数允许对何时应用 gzip 压缩进行精细控制,从而根据响应和请求的特性优化带宽并改善客户端加载时间。 启用后,该指令有助于提高 Web 应用的性能,尤其在响应大小较大时更为明显。其条件性行为意味着你可以避免对某些状态码(例如 4xx 或 5xx)的响应进行压缩,或避免对不会从压缩中受益的请求进行压缩。启用压缩可以显著减少在网络上传输的数据量,从而改善用户体验,特别是对于网络较慢的客户端。然而,必须正确配置以避免压缩不必要的或已压缩的内容。
配置示例
http {
gzip on;
gzip_proxied expired no-cache no-store private;
}确保已在全局或服务器级别启用 gzip,以使此指令生效。
避免对已压缩的文件或响应使用 gzip,因为这会导致额外的开销和不必要的处理。
如果错误配置了条件,可能会导致某些原本可受益的响应未被压缩。
说明
gzip_disable 指令允许管理员根据请求的 user-agent 来管理何时不应应用 Gzip 压缩。这在优化性能时尤其有用,可通过排除某些客户端来避免向其发送可能不支持压缩或可能影响功能的压缩内容,例如某些爬虫或浏览器。 该指令期望一个或多个参数,这些参数可以是 user-agent 字符串或正则表达式。如果传入请求的 user-agent 与任一指定参数匹配,则对该请求禁用 Gzip 压缩。该指令可以在 http、server 或 location 上下文中使用,使其在 NGINX 服务器配置的不同范围内都很灵活。 在使用此指令时,应谨慎考虑哪些 user-agent 更有可能从 Gzip 压缩中受益,哪些则不会。配置错误或过于宽泛的 user-agent 模式可能导致向兼容的客户端发送次优的响应。
配置示例
gzip on; gzip_disable "msie6"; gzip_disable "Mozilla/5.0";
使用过于宽泛的 user-agent 模式可能导致无意中为某些客户端禁用 Gzip。
Regex 模式需要正确转义才能按预期工作,否则可能无法正确匹配。
说明
`disable_symlinks` 指令在 NGINX 中可以配置以限制以下符号链接行为:它可以允许或禁止在指定上下文(如 http、server 和 location)中将符号链接用于文件。启用该指令后,可以通过阻止对可能指向位于预期文档根目录或 location 块之外的文件的符号链接的访问来增强安全性。 该指令接受一个或两个参数。当仅提供一个参数时,表示是否禁用符号链接。可以提供第二个参数以指定目录或允许的符号链接行为类型。这个附加参数通过允许针对特定文件或目录对符号链接的处理有所区别,从而增强了控制的粒度。 因此,系统管理员可以通过仔细配置此指令来保护其 NGINX 实现,防止因通过符号链接不慎访问而导致的潜在安全漏洞。还应确保配置遵循最小权限原则,仅允许访问必要的文件。
配置示例
location /files {
disable_symlinks on;
}错误配置可能会在无意中使用符号链接时导致 403 Forbidden 错误。
如果为某个目录启用符号链接处理,请确保不会暴露敏感文件。
说明
`upstream` 指令在 NGINX 中创建一个具名块,可以定义多个以负载均衡方式处理请求的后端服务器。在 `upstream` 块中,你可以指定多个服务器的详情,包括它们的地址和可选的权重。NGINX 支持多种负载均衡方法,例如轮询、最少连接数和 IP 哈希,这些也可以在 `upstream` 上下文中配置。 `upstream` 指令的语法允许在具名上下文下指定多个服务器。例如,你可以创建一个名为 `backend` 的 upstream 组,包含多个 `server` 块,每个代表不同的应用实例。每个 `server` 可以用其 IP 地址和可选参数来定义,例如 `max_fails` 和 `fail_timeout`,以控制 NGINX 如何处理服务器故障。此外,你可以通过指定 `least_conn`、`ip_hash` 等来调整负载均衡方法,以满足应用的需求。 `upstream` 指令没有任何默认值;它必须在配置文件中显式定义。配置完成后,它成为其他指令(例如 `proxy_pass`)的引用点,`proxy_pass` 可以使用该已定义的组来有效地将传入流量分配到指定的后端服务器。
配置示例
upstream backend {
server backend1.example.com;
server backend2.example.com weight=2;
server backend3.example.com max_fails=3 fail_timeout=30s;
}确保在 `http` 上下文中定义 upstream block,因为在 `server` 或 `location` 上下文中无效。
注意 health checks 和 failover logic,因为配置错误可能导致将流量发送到无响应的服务器。
upstream blocks 中的权重会影响 load distribution;确保其与预期的 load management 保持一致。
说明
'http2' 指令为 NGINX 处理的入站请求启用 HTTP/2 协议。该指令可在 'http' 或 'server' 上下文中指定,尤其在与 'listen' 指令配合使用时有用,用以表明某个 server 块应支持 HTTP/2。启用后,HTTP/2 的多路复用、头部压缩和请求优先级等特性将可用,从而提升所提供内容的性能与效率。 'http2' 指令接受一个标志作为参数,用于指定是否启用 HTTP/2(on)或禁用(off)。默认情况下,该指令设置为 'off',意味着除非在 server 或 http 块中显式启用,否则不会启用 HTTP/2 支持。启用后,支持 HTTP/2 的客户端在向服务器发起请求时可以协商使用该协议,从而实现更好的资源利用并提升由 NGINX 提供的网页的加载速度。 需要注意的是,要使用 HTTP/2,服务器必须配置为使用 TLS/SSL,因为大多数浏览器要求加密连接才能允许 HTTP/2。因此,通常会在 server 块中将此指令与与 SSL 相关的指令一起使用以实现安全连接。
配置示例
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
}确保为服务器启用 SSL,因为大多数浏览器要求使用 HTTPS 才能支持 HTTP/2。
避免在只需要 HTTP/1.1 的服务器块上使用 HTTP/2,因为这可能在协商过程中引入不必要的复杂性。
如果功能互操作性很关键,请确保你的上游服务器和代理也支持 HTTP/2。
说明
在 NGINX 中,`http2_recv_buffer_size` 指令用于指定用于处理传入 HTTP/2 流量的缓冲区大小。该指令对于优化服务器处理各种类型请求的能力至关重要,尤其是在处理 HTTP/2 通信中常见的多个并发连接时。默认情况下,该值未设置,这可能导致在高负载下性能较低,或如果设置过高则导致内存使用过多。因此,根据预期的流量模式和服务器资源平衡缓冲区大小非常重要。 当定义此指令时,它接受一个表示大小的单一参数,可用字节、千字节或兆字节指定(例如 1m 表示 1 兆字节)。该缓冲区主要在从客户端读取传入数据时使用,为管理通过连接传输的 HTTP/2 帧建立了一个受控环境。将此缓冲区设置得过小可能导致性能下降或额外的延迟,因为服务器需要更频繁地从套接字读取。相反,缓冲区过大可能会浪费服务器内存资源,尤其是在高连接数的情况下。因此,应根据服务器的负载预期和可用资源仔细考虑最优缓冲区大小。
配置示例
http {
http2_recv_buffer_size 256k;
}确保缓冲区大小根据预期流量适当设置;过小会导致性能问题,过大则会浪费内存。
错误配置可能导致在高负载下服务器出现意外行为或资源耗尽。
说明
http2_pool_size 指令用于配置 HTTP/2 连接池的大小,帮助管理 HTTP/2 客户端的并发连接数。通过优化连接池大小,NGINX 可以在降低开销和提高吞吐量的同时高效地处理并发连接。为该指令指定的值表示用于存储与 HTTP/2 流关联的连接数据的共享内存大小,单位为 bytes。 当池大小设置过小时,在高流量情况下可能导致连接资源耗尽,进而使客户端出现延迟或连接失败。相反,过度分配资源会导致不必要的内存消耗并影响服务器性能。建议根据流量模式分析并相应调整 http2_pool_size 指令,以在生产环境中获得最佳性能。 该指令的行为受预期负载和需要处理的并发流数量影响。适当的监控和调整可以显著改善服务器响应性和客户端体验,尤其是在处理现代 Web 应用程序中典型的大量并行请求时。
配置示例
http {
http2_pool_size 64k;
server {
# server configuration
}
}将池大小设置得过低可能会在高流量下导致资源耗尽。
分配过多内存可能会对服务器性能产生不利影响。
对该指令的更改需要重新加载 NGINX 配置才能生效。
说明
The `http2_max_concurrent_streams` 指令用于定义在单个 HTTP/2 连接上任意时刻可打开的最大并发流数。该指令可以在 `http` 和 `server` 上下文中配置,从而对单个连接上可处理的并发请求数进行细粒度控制。 通过为此指令指定一个整数值,您可以控制 NGINX 处理的 HTTP/2 流量的负载和性能行为。将限制值设高可以通过允许更多并发请求来提高吞吐量,但在流量高时也可能对服务器资源造成更大压力。相反,较低的限制可以防止服务器被压垮,但可能导致终端用户的延迟增加,因为请求必须等待可用流。 该参数为一个整数,指定并发流的数量。根据负载测试和实际流量模式监控服务器性能并按需调整此值非常重要。
配置示例
http {
http2_max_concurrent_streams 64;
}
server {
listen 443 ssl http2;
server_name example.com;
http2_max_concurrent_streams 100;
}将值设置得过高可能会耗尽服务器资源,导致性能下降。
如果客户端不支持,增加 streams 不会产生任何效果;请确保客户端兼容 HTTP/2。
说明
`http2_max_concurrent_pushes` 指令配置 NGINX 服务器在使用 HTTP/2 协议时可发起的并发服务器推送响应的最大数量。该指令适用于 `http` 和 `server` 两个上下文,允许服务器管理员微调向客户端推送内容的激进程度。当设置后,如果推送数量超过配置值,任何对被推送内容的额外请求将被排队,直到活动推送数量降到该阈值以下。 该指令的参数是一个正整数,用于指定并发推送的最大数量。它有助于防止服务器过载并管理资源使用,尤其在高流量情况下,大量推送请求可能会超出服务器的处理能力。在服务器主动预推送资源以改善用户在浏览预期资源时的加载时间的场景中,配置该指令可能尤为重要。 默认情况下,如果未指定,该值为 `none`,表示此指令不施加限制,允许服务器或客户端能够处理的任意并发推送。建议服务器管理员根据其基础设施能力和具体应用需求选择合适的数值,以在不造成过度负载或延迟的情况下实现最佳性能。
配置示例
http {
http2_max_concurrent_pushes 10;
}
server {
listen 443 ssl http2;
http2_max_concurrent_pushes 15;
}将此值设置得过低可能会因为推送请求过度排队而影响性能。
错误配置此指令不会产生错误,但可能导致性能不佳,需要仔细监控。
说明
http2_max_requests 指令用于 NGINX 中,对单个连接上可处理的并发 HTTP/2 请求数施加限制。在采用 HTTP/2 多路复用的高流量环境中,这尤其有用,因为它允许在单个连接上发送多个请求和响应。通过定义此指令,管理员可以控制资源使用,避免服务器因过多同时请求而被压垮,从而可能防止资源耗尽或其他性能问题。 该指令在 NGINX 配置的 `http` 或 `server` 段中生效,允许在多个级别进行细粒度调整。为 http2_max_requests 设置的值必须为正整数,用于指定并发请求限制。如果达到该限制,后续请求将被排队,直到活动请求数低于指定阈值,处理才会继续。 选择该值时需谨慎;设置过低可能导致服务器能力未被充分利用,而设置过高则可能给服务器带来负担。该指令的行为与 NGINX 面向高性能和低资源消耗的架构相一致,既支持无缝的 HTTP/2 操作,又有助于保持服务器稳定。
配置示例
http {
http2_max_requests 50;
}
server {
http2_max_requests 200;
}将值设置得过高可能导致资源消耗过度,从而降低性能。
如果不指定此指令,将使用服务器的内部限制作为默认值,这可能不适用于所有使用场景。
说明
`http2_max_field_size` 指令定义了 NGINX 服务器可接受的单个 HTTP/2 头字段的最大大小。该参数对于控制单个头字段可发送的数据量至关重要,能够帮助缓解内存耗尽攻击并确保满足特定应用的要求。大小限制以字节为单位指定,并直接影响 NGINX 如何处理传入请求和管理头字段。 当配置了该指令后,如果某个头字段超过了指定的大小限制,NGINX 可能会以错误拒绝该请求,从而对可能被滥用的过大头部提供防护。这在效率和可靠性至关重要的高流量环境中尤其重要。正确配置该指令可以使系统管理员在应用性能和资源保护之间有效平衡。 要使用 `http2_max_field_size` 指令,只需在 NGINX 配置的 `http` 或 `server` 上下文中指定要设置的最大字节数即可。此灵活性允许管理员根据应用需求进行调整,无论是使用标准大小还是为特定用例设置更大的值。
配置示例
http {
http2_max_field_size 32k;
}将该值设置得过低可能会导致当头部超过限制时合法请求失败。
请注意,该指令仅适用于 HTTP/2 连接。
说明
'http2_max_header_size' 指令用于控制 NGINX 服务器愿意处理的 HTTP/2 头部的最大尺寸。该指令有助于缓解潜在的拒绝服务攻击,防止过大的头部耗尽服务器资源。该指令的值以字节为单位指定,合理设置此值对于确保服务器在保持性能和安全性的同时高效处理常规请求至关重要。如果头部超过此限制,NGINX 将向客户端返回错误,从而防止服务器被大头部淹没。 该指令可以在 'http' 和 'server' 上下文中配置,允许在服务器配置的不同级别进行细粒度调整。它接受单个参数,表示允许的头部最大大小。请注意,过小的值可能导致合法请求被拒绝,而过大的值可能使服务器暴露于性能问题或通过畸形请求的利用中。
配置示例
http {
http2_max_header_size 4096;
}
server {
http2_max_header_size 8192;
}将该指令设置得过低可能导致合法请求被拒绝,从而引发可用性问题。
在更改后请记得测试配置,确保重要的头部不会被意外阻止。
说明
`http2_body_preread_size` 指令用于配置在将请求交给 NGINX 的请求处理处理器之前,可以读取并临时存放于内存(缓冲)的 HTTP/2 请求主体的最大大小。对于在完全处理之前需要对请求主体进行早期验证的应用,这一配置特别有用。 当通过 HTTP/2 协议接收请求时,缓冲一部分请求主体允许 NGINX 分析或验证内容,例如检查特定头部或确保主体符合预期的数据格式。为 `http2_body_preread_size` 设置合适的大小有助于优化内存使用和性能,因为设置过大可能导致不必要的内存消耗,而设置过小则可能限制有效读取较大请求的能力。 该指令以大小值作为参数,可以用字节(例如 1k、2m)来定义要缓冲的最大数据量。根据应用需求和预期请求大小调整此值,对于实现最佳的 NGINX 性能和资源管理至关重要。
配置示例
http {
http2_body_preread_size 64k;
}确保指定的缓冲区大小足以应对预期的请求大小,因为不足可能导致处理错误。
注意资源限制;将大小设置得过高会导致内存使用增加,可能引起应用程序不稳定。
说明
指令 'http2_streams_index_size' 用于配置在 NGINX 中管理 HTTP/2 流所使用的索引大小。该索引可帮助服务器高效管理多个同时存在的 HTTP/2 连接的状态和数据。所定义的大小表示在服务器开始以不同方式管理这些连接之前可以被索引的流数量。较大的索引大小可能通过允许更多并发的 HTTP/2 流来提升性能,但也会占用更多内存。此外,如果索引被填满,较旧的流可能会被从内存中驱逐,这可能导致请求被延迟或丢弃。在调整此参数时应谨慎考虑,尤其是在内存受限的系统或高负载情况下。
配置示例
http2_streams_index_size 256;
将索引大小设置得过小可能会在服务器可用的 HTTP/2 流插槽耗尽时导致请求被延迟或丢弃。
增大索引大小会增加内存使用,请注意避免超出服务器的内存限制。
说明
`http2_recv_timeout` 指令适用于 `http` 和 `server` 上下文,确定服务器在 HTTP/2 连接上等待来自客户端的附加数据的时间长度。如果超过指定时间仍未接收到数据,服务器将终止连接并关闭 socket。这对于控制资源使用并确保连接不会因客户端无活动而无限期保持打开非常重要。 该指令的参数是一个时间值,可以用秒或更细的单位表示,从而对超时持续时间进行精确控制。在调整此值时,应考虑客户端请求的性质和预期的连接模式。如果设置过低,可能会导致需要更长时间发送数据的客户端被过早断开;相反,设置过高可能会因闲置连接长时间存在而导致资源耗尽。 在实践中,`http2_recv_timeout` 指令与其他与超时相关的配置参数互为补充,允许系统管理员根据应用需求和预期流量模式微调服务器的响应性和资源管理。
配置示例
server {
listen 443 ssl http2;
http2_recv_timeout 10s;
}将超时设置得过低可能会无意中断开需要时间发送数据的合法连接。
此指令仅适用于 HTTP/2 连接;请确保不要将其与用于其他协议的超时指令混淆。
说明
`http2_idle_timeout` 指令指定在服务器关闭之前 HTTP/2 连接可以保持空闲的最长时间。这个超时在客户端可能不必要地保持连接打开、在没有数据传输的情况下消耗服务器资源的场景中特别有用。通过设置适当的空闲超时,服务器管理员可以释放资源并提高其他客户端的性能。 该指令接受一个参数,该参数是以秒为单位的时间值,可选后缀如 'm' 表示分钟,'h' 表示小时。例如,指定 `http2_idle_timeout 10s;` 将空闲超时设置为 10 秒。如果客户端在指定时间内未发送任何请求,服务器将关闭连接,这可能会使资源使用更高效并提升整体服务器性能。重要的是为此值选择一个平衡,以适应客户端的预期使用模式,因为过于严格的限制可能会过度主动地断开客户端连接。
配置示例
http2_idle_timeout 5s;
将超时设置得过低可能会导致连接被过早断开,尤其是对于那些保持连接但长时间不发送请求的客户端。
确保超时设置与客户端设置或预期的使用模式兼容,以避免让用户感到沮丧。
说明
'http2_chunk_size' 指令在 NGINX 中指定通过 HTTP/2 协议传输的响应帧有效负载的大小上限。该指令允许管理员控制从服务器发送到客户端的数据块最大大小。通过调整此参数,可以优化网络性能并可能降低延迟,因为较小的数据块能够加快传输,但可能会增加多个帧的开销。\n\n当启用并配置此指令时,NGINX 会将较大的响应体拆分为符合指定块大小的帧。这在提供大型文件或数据流的场景中尤其有用,因为它确保数据以可管理的片段发送。然而,过小的块大小可能导致由于需要处理更多帧而增加 CPU 使用率和更高的开销;而过大的值则可能削弱 HTTP/2 的多路复用和优先级特性效率。\n\n'http2_chunk_size' 可应用于多种上下文类型,包括 'http'、'server' 和 'location',允许根据架构和需求进行细粒度控制。总体而言,应根据具体用例和接收响应的客户端的网络特性,谨慎设置该值。
配置示例
http2_chunk_size 16k;
将分块大小设置得过小会增加开销和 CPU 使用率,因为需要处理的帧数增多。
并非所有浏览器客户端都能有效处理较小的分块大小,这可能导致性能问题。
如果与上游服务器一起使用,请确保在所有相关配置中该设置保持一致。
说明
`http2_push_preload` 指令用于指示服务器在 HTTP/2 环境中主动向客户端发送资源,而无需等待客户端请求这些资源。该功能特别有助于通过在需要时立即传送关键资源来优化页面加载速度并提升用户体验。当设置为 `on` 时,该指令允许服务器根据客户端请求的当前页面自动推送已标记为预加载的关联资源。 该指令可以在 NGINX 配置文件的 `http`、`server` 或 `location` 上下文中指定。通过启用 `http2_push_preload`,服务器运维人员可以提升应用的加载性能,尤其是对于拥有多个资源依赖的内容密集型站点。然而,不必要的推送会浪费带宽并在配置不当时导致性能下降。因此,应谨慎考虑哪些资源应被标记为推送,以避免发送客户端不需要的过多响应。
配置示例
server {
listen 443 ssl http2;
server_name example.com;
http2_push_preload on;
location / {
root /var/www/html;
index index.html;
add_header Link "/styles/main.css; rel=preload; as=style";
}
}过度使用 server push 会导致带宽使用量增加。
并非所有浏览器都支持 HTTP/2 server push,这会导致用户之间出现不一致的行为。
始终确保通过 server push 推送的资源对客户端确实有用,以避免浪费资源。
说明
在 NGINX 中,http2_push 指令用于对应该主动发送给客户端的资源发起服务器推送,从而提升 Web 应用的加载性能。当在 http、server 或 location 上下文中定义时,该指令会在对指定 URI 发出相应请求时推送被指定的资源。这在 HTTP/2 场景中特别有效,因为 HTTP/2 允许服务器并发地为单个客户端请求发送多个响应。 使用 http2_push 时,该指令接受单个参数,用以指定将要被推送的资源。通常这些是静态文件,例如样式表或脚本,客户端在接收到页面后需要这些文件以完整呈现页面。通过提前推送这些文件,可以减少用户感知的加载时间,因为客户端无需为这些资源发起额外请求。对这些推送进行适当管理非常重要,推送不必要的资源会导致带宽浪费并降低性能。 在使用 http2_push 指令时,确保被推送的资源确实是客户端初始渲染页面所必需的,这不仅能提升性能,还能避免服务器端资源的过度使用。此外,还需确认客户端支持 HTTP/2,因为回退到旧的 HTTP 版本将无法有效利用该指令。
配置示例
http2_push /static/style.css; http2_push /static/script.js;
应仔细选择资源,以避免网络传输中的不必要开销。
确保客户端支持 HTTP/2,以有效利用服务器推送功能。
推送的资源应保持稳定,不应频繁更改,以避免与缓存相关的问题。
说明
`http3` 指令允许 NGINX 支持 HTTP/3 协议,HTTP/3 是超文本传输协议 (Hypertext Transfer Protocol) 的第三个主要版本。HTTP/3 构建于 QUIC 之上,QUIC 是一种由 Google 最初开发的传输层网络协议。将此指令设置为 'on' 后,服务器将能够使用 HTTP/3 处理请求,利用流复用并相较于传统的 HTTP/2 和 HTTP/1.1 提供更好的性能。启用时,NGINX 会与支持 HTTP/3 的客户端通信,为它们带来更低的延迟和更强的连接弹性,这得益于 QUIC 的独特特性,例如 0RTT 连接建立和更好的丢包处理。 该指令可以放在 `http` 和 `server` 上下文中,允许在全局或特定服务器级别进行配置。将此指令设置为 'on' 后,服务器将在支持的客户端上尝试使用 HTTP/3,同时仍能为使用旧协议的客户端提供服务。这使得向较新协议版本的过渡更加平滑,而无需完全停止对现有协议的支持。此外,HTTP/3 依赖于加密连接,因此需要正确配置 TLS/SSL,部署此指令之前务必设置好相应的证书。
配置示例
server {
listen 443 ssl;
http3 on;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
}
确保在服务器上正确启用 QUIC,并打开必要的端口(通常为 UDP 443)。
确保正确配置 SSL 证书,因为 HTTP/3 需要加密连接。
检查你的客户端是否支持 HTTP/3,因为较旧的客户端会回退到 HTTP/2 或 HTTP/1.1。
说明
`http3_hq` 指令是 NGINX 中的一个配置选项,用于启用或禁用对 HTTP/3(超文本传输协议的第三个主要版本)的支持。该指令可以放在 `http` 或 `server` 上下文中,既可用于全局配置,也可用于特定服务器级别的配置。启用后,NGINX 将监听 QUIC 连接(HTTP/3 使用其作为传输层)并通过该协议处理请求。 使用此指令可以显著改善响应时间并在丢包情况下提供更好的处理能力,因为 HTTP/3 基于 QUIC,QUIC 提供诸如多路复用和连接迁移等特性。当 `http3_hq` 指令设置为 `on` 时,NGINX 将相应地处理 HTTP/3 请求;将其设置为 `off` 则会回退到传统的 HTTP/1.1 或 HTTP/2 来提供网页内容。由于 QUIC 和 HTTP/3 通常与 HTTPS 一起使用,必须确保证书符合要求的规范。 管理上需注意,启用 HTTP/3 可能需要特定的额外配置,例如为 QUIC 流量使用 UDP 以及配置相关防火墙规则以避免阻止 HTTP/3 请求。
配置示例
server {
listen 443 ssl http3;
http3_hq on;
ssl_certificate /etc/ssl/certs/example.com.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
}确保您的系统支持 QUIC 和 UDP;否则 HTTP/3 无法正常工作。
可能需要调整防火墙以允许 UDP 流量,这对 HTTP/3 至关重要。
证书必须正确配置以与 QUIC 配合使用;无效的证书将导致无法建立 HTTP/3 连接。
说明
`http3_max_concurrent_streams` 指令配置单个 HTTP/3 连接中可打开的最大并发流数量。该指令对于优化资源使用和性能至关重要,尤其是在高流量负载或客户端可能同时打开大量流的场景中。它允许根据预期工作负载调整服务器的处理容量,并通过控制在给定时间内可通过 HTTP/3 处理的并发请求数来管理应用的响应性。默认情况下,如果未显式设置,NGINX 会根据其内部逻辑处理并发级别。 当将配置值设置为限制时,超过该数量的额外流将被排队或拒绝,直到现有流完成,从而有助于防止资源耗尽。此参数接受一个表示流数量的正整数,使您能够根据服务器的能力和预期流量模式进行明确控制。在使用 HTTP/3 的环境中,仔细调整此指令对于确保最佳性能至关重要;将值设置过低可能导致性能瓶颈,而在资源不足的情况下将值设置过高可能导致性能下降或崩溃。
配置示例
http {
http3_max_concurrent_streams 100;
server {
listen 443 ssl http3;
}
}将此指令设置得过高可能导致服务器资源耗尽。
未指定此指令可能导致并发流的处理不佳。
说明
在 NGINX 中,`http3_stream_buffer_size` 指令用于指定每个 QUIC 流使用的缓冲区的最大大小,从而在处理 HTTP/3 流量时对内存分配和数据管理进行优化。通过调整该指令,服务器管理员可以影响 QUIC 连接的性能特性,尤其是在不同负载和流模式下。该指令接受单个参数,用于以字节为单位定义缓冲区大小,从而根据预期的并发流数量和所服务内容的特性进行精细调整。 该指令的一个关键方面是它在管理带宽利用率和整体资源效率方面的作用。较大的缓冲区可能会提高高带宽连接的流媒体性能,而较小的缓冲区则可能有利于资源受限或流量较低的服务器,促进更快的资源回收。因此,确定最佳值需要了解应用的具体需求以及与 QUIC 流相关的预期使用模式。
配置示例
http {
http3_stream_buffer_size 16k;
server {
listen 443 quic;
...
}
}将缓冲区大小设置得过低可能导致频繁的缓冲区下溢或流传输延迟。
测试不足可能在更改默认值时引发意想不到的性能问题。
确保缓冲区大小足以满足预期的工作负载,以避免用户体验下降。
说明
`quic_retry` 指令用于控制 QUIC 协议在连接重试方面的行为。当启用时,NGINX 会对那些不包含有效 connection ID 的传入连接请求返回 retry packet。当客户端最近建立的连接可能尚未完全完成时,这一机制尤为重要。通过使用 connection retries,NGINX 有助于处理客户端可能遇到的连接中断或网络切换等情况,使其能够无缝重连而不会出现长时间延迟。 该指令可接受一个布尔标志作为参数,'on' 表示允许 QUIC 重试,'off' 表示不允许。这种灵活性使系统管理员能够根据特定的网络环境或应用需求启用或禁用 QUIC 重试功能。在 `http` 和 `server` 上下文中,管理员可以针对 QUIC 实现进行细粒度调整,从而提升通过 QUIC 协议连接的用户的性能和可靠性。
配置示例
http {
quic_retry on;
}
server {
listen 443 quic;
quic_retry on;
}确保在使用此指令之前在您的 NGINX 设置中正确配置 QUIC,因为缺少设置可能导致意外行为。
请注意,启用 `quic_retry` 可能会增加服务器负载,尤其当客户端经常中断连接时。
说明
'quic_gso' 指令在 NGINX 配置的 'http' 和 'server' 上下文中使用,用于控制 QUIC (Quick UDP Internet Connections) 在进行 segmentation offloading 时的行为。此功能允许 NGINX 利用底层网络堆栈在传输前将数据分割成更小的包,从而更有效地处理大包。这对于高吞吐量应用尤为有利,因为在处理 QUIC 连接时它可以降低 CPU 负载并提升整体性能。 当启用 'quic_gso' 指令时,QUIC 流量将在操作系统和网络接口支持 GSO 的情况下利用 GSO。这意味着网络堆栈不会为单个 QUIC 连接生成多个小包,而是将较大的包分解为传输所需的大小。该行为通过一个布尔标志控制——设置 'quic_gso on;' 可启用此功能,而 'quic_gso off;' 则将其禁用。默认情况下此项实际上是关闭的,除非显式设置,因此管理员在针对严重依赖 QUIC 的应用进行性能调优时应考虑该指令。 启用 'quic_gso' 的时机应根据应用工作负载的性能基准进行适当管理。不当的配置可能导致延迟增加或丢包,尤其是在不完全支持 GSO 的网络中。建议进行充分测试,以确保在特定用例中兼容并带来性能提升。
配置示例
http {
server {
listen 443 ssl http2;
quic_gso on;
# other configurations...
}
}确保您的网络栈支持 GSO,以获得最佳性能。
禁用 GSO 可能导致 CPU 使用率增加并降低 QUIC 流量的吞吐量。
在预发布环境中测试配置,以避免在生产环境中出现意外行为。
说明
'quic_host_key' 指令用于在 NGINX 中启用 QUIC 支持时为每个 server 块指定唯一的主机密钥。该密钥对于通过 QUIC(基于 UDP 的传输)建立安全连接至关重要,这使其不同于传统的基于 TCP 的协议。该指令可以包含在 'http' 或 'server' 上下文中,从而提供配置灵活性。通过提供该密钥,NGINX 会为指定的服务器启用 QUIC 处理,从而加快连接建立并为兼容客户端的用户提升性能。 作为一种传输层网络协议,QUIC 将该密钥与 TLS (Transport Layer Security) 配合使用,以在保持速度的同时增强安全性。该指令接受单个参数,表示主机密钥,通常为一个字符串或指向加密密钥文件的路径。必须确保所选密钥被妥善保护,并且仅能被 NGINX 进程访问,以防止信息泄露。对于希望利用 QUIC 带来的性能提升(尤其是对延迟敏感的应用和丰富内容分发)的站点来说,这一功能非常重要。
配置示例
server {
listen 443 quic;
quic_host_key /etc/nginx/ssl/quic_host_key.pem;
# additional server configurations...
}确保密钥文件可被 NGINX 进程读取。
密钥格式不正确可能会导致 QUIC 无法正常工作,从而引发连接失败。
该指令需要适当的 SSL/TLS 配置,并应配有有效证书。
说明
`quic_active_connection_id_limit` 指令在 NGINX 中指定可用于 QUIC(快速 UDP 互联网连接)协议的活动连接 ID 的数量上限。QUIC 旨在通过解决 TCP 的一些限制,实现更快且更高效的互联网连接管理。通过设置此指令,管理员可以定义 QUIC 在特定服务器或上下文中可轮换使用的不同连接标识符数量,从而在客户端频繁切换网络的情况下提高对连接 ID 耗尽的抵抗能力。 此指令的值必须为正整数,并适用于 `http` 和 `server` 两个级别的上下文。当客户端使用 QUIC 发起通信时,出于性能和安全原因可能会多次更改其连接 ID。该指令确保服务器维护一个可控数量的正在使用的连接 ID,防止资源浪费和潜在的拒绝服务(DoS)情况。如果设置得过低,在大量同时发生的连接变更时可能会限制性能;而设置得过高则可能导致服务器端资源消耗增加。
配置示例
http {
server {
listen 443 quic;
quic_active_connection_id_limit 100;
}
}将限制设置得过低可能会导致经常更改其 connection IDs 的客户端出现问题,从而导致连接失败。
将限制设置得过高可能会不必要地消耗服务器资源。
为有效使用此指令,请确保服务器已正确配置并支持 QUIC。
说明
`auth_http` 指令用于 NGINX Mail Core 模块,通过外部 HTTP 服务启用对邮件用户的认证。配置后,NGINX 会在认证过程中与指定的 HTTP 服务器通信,以验证用户凭据。这样可以利用现有的基于 HTTP 的认证机制,为将 NGINX 与外部身份提供者集成提供灵活性。 该指令接受一个参数,即负责处理认证请求的 HTTP 服务器的 URL。参数在特定的邮件服务器上下文中设置,这使得配置能够针对 NGINX 支持的不同邮件服务器实例进行定制。例如,它可以用于与管理用户认证的 REST API 集成,从而进一步扩展 NGINX 在管理邮件服务方面的能力。 `auth_http` 指令在需要集中认证的环境中特别有用,并且支持多种认证方案。根据 HTTP 服务器的响应,NGINX 可以根据尝试连接邮件服务的用户提供的凭据授予或拒绝访问。
配置示例
mail {
server {
listen 25;
auth_http http://auth-server/auth;
}
}确保 URL 格式正确,并且可以从 NGINX 服务器访问。
HTTP 身份验证可能需要进行安全处理,以避免暴露敏感凭据。
验证外部 HTTP 服务器响应迅速,以避免邮件服务身份验证延迟。
说明
`auth_http_timeout` 指令定义了与用于身份验证的 HTTP 服务器通信的超时时间(用于 NGINX 邮件模块)。当与外部身份验证系统集成时,这一点尤为重要,因为获取响应可能比预期或所需的时间更长。`auth_http_timeout` 的参数以时间格式指定,可以包含诸如秒 (s)、分钟 (m)、小时 (h) 等时间单位。 如果超过指定的超时时间,邮件服务器会向客户端返回错误响应。这有助于防止由于身份验证响应缓慢而导致邮件事务被无限期阻塞。管理员需要选择一个在为合法身份验证过程留出足够时间与限制等待时间以确保用户响应性之间取得平衡的值。在许多使用场景中,几秒钟的超时通常就足够了。 该指令可以放在 `mail` 或 `mail server` 上下文中,这意味着它必须在与邮件服务相关的 NGINX 配置文件的相应块内进行定义。作为配置设置的一部分,务必正确配置此指令以确保邮件服务器的最佳性能,尤其是在需要针对外部服务进行用户身份验证的环境中。
配置示例
mail {
auth_http_timeout 5s;
server {
listen 110;
protocol pop3;
}
}确保 timeout 值合理,以避免拒绝合法的身份验证尝试。
验证外部 HTTP 身份验证服务器在给定的 timeout 时段内是否有响应。
检查时间格式的有效性;使用无效的格式可能导致配置错误。
说明
`auth_http_header` 指令在 NGINX Mail Core 中使用,用于定义在客户端连接时为认证目的而发送的特定 HTTP 头。当认证机制需要特殊头由上游服务器正确处理时,此指令尤其有用。通过指定相应的头,该指令可确保在邮件事务期间认证过程顺利执行。 该指令接受两个参数:第一个参数指定头的名称,第二个参数指示该头的预期值。当客户端尝试认证时,NGINX 会在通信中包含这些头,以便针对远程认证服务验证用户。在需要特殊输入格式来有效管理认证的集成系统环境中,这点尤为重要。 作为邮件服务器配置的一部分,该指令必须在 mail server blocks 的上下文中使用,以确保其有效地应用于目标邮件服务。正确配置此指令对于确保任何外部认证服务能够识别并响应指定的头,从而实现成功的认证流程,至关重要。
配置示例
mail {
auth_http_header "X-Auth-User" "$remote_user";
}确保标头名称拼写正确,以避免身份验证失败。
确保所设置的标头不会与 NGINX 服务器或邮件客户端使用的现有标头冲突。
说明
`auth_http_pass_client_cert` 指令属于 NGINX Mail Core 模块,控制 HTTP 身份验证过程中客户端证书转发的行为。当设置为 `on` 时,NGINX 会将客户端证书转发到外部 HTTP 身份验证服务器,后者可以根据需要检查或验证该证书。这在客户端证书作为身份验证机制一部分的部署中特别有用,可允许针对集中式服务器进行验证。 该指令可取两个值:`on` 和 `off`。默认情况下该指令为 `off`,意味着不会转发客户端证书。如果需要此功能,运维人员必须在其 NGINX 邮件配置中显式声明。当设置为 `on` 时,相关的客户端 SSL 信息会被传递,这对于通过证书正确验证用户身份至关重要。 在实际使用中,应进行适当测试以确保配置按预期工作,特别是在需要客户端证书才能访问某些资源的环境中。如果错误配置该指令,可能导致认证失败或安全漏洞,例如在不应提供证书时证书被错误处理或暴露。
配置示例
mail {
auth_http_pass_client_cert on;
# additional configuration...
}确保外部 HTTP 身份验证服务器已正确设置,以处理发送的客户端证书。
误解将此指令设置为 `on` 的效果,因为如果 HTTP 服务器未正确处理,可能会暴露客户端证书。
说明
'protocol' 指令在邮件服务器上下文中使用,用于定义 NGINX 邮件服务器与客户端交互时将使用的通信协议。该指令尤为重要,因为它决定了客户端如何连接以及服务器如何解释传入的数据。支持的协议包括 'imap'、'pop3' 和 'smtp'。每种协议都有其特定的功能和行为,使 NGINX 服务器能够根据需求处理不同类型的邮件操作。
配置示例
mail {
server {
listen 10.0.0.1:25;
protocol smtp;
# additional configuration
}
}请确保在有效的邮件服务器上下文中使用该指令,因为它不能放在该上下文之外。
检查每个协议的具体要求和配置,以避免错误配置。
说明
'timeout' 指令在 NGINX Mail Core 模块中对于管理连接生命周期至关重要。它定义了在终止连接之前的空闲持续时间,从而防止服务器保持陈旧连接,这些连接可能导致资源耗尽。该参数的值以时间单位指定,例如秒、分钟或小时,这允许灵活地设置 NGINX 在启动超时之前等待客户端活动的时长。 在将 'timeout' 指令应用于与邮件相关的配置时,必须考虑特定环境和预期的客户端交互模式。例如,在用户通常会长时间保持不活动的环境中,设置较高的超时值可以通过防止过早断开连接来提升用户体验。相反,设置较低的超时有助于通过及时释放被不活动连接占用的资源来保持服务器性能。 该指令既影响邮件服务器上下文,也影响整体电子邮件服务的稳定性,尤其是在高流量情况下并发连接数可能达到最大阈值时。管理员应在配置超时后监控性能指标以根据需要优化值,在用户体验与服务器资源管理之间取得平衡。
配置示例
mail {
server {
timeout 5m;
}
}将超时时间设置得过低可能导致意外断开连接,尤其是对于网络较慢的用户。
确保超时值与您的应用需求一致,以避免用户产生挫败感。
说明
`max_errors` 是在 NGINX Mail Core 模块中定义的指令,用于指定 NGINX 实例在连接到邮件服务器时应容忍的最大连接错误次数。当连接错误次数超过指定的限制时,NGINX 将停止尝试连接该邮件服务器。这样可以防止 NGINX 不断尝试连接无响应的服务器,避免浪费资源并导致性能下降。 该指令接受一个整数参数,表示允许的最大错误计数。例如,如果设置为 `max_errors 3;`,在三次连续连接失败之后,NGINX 将停止尝试连接出现问题的邮件服务器,直到该服务器被手动重新启用或 NGINX 服务重启为止。此设置对于维护健康且响应迅速的邮件服务非常重要,特别是在具有多个邮件服务器的环境中,因为它允许其他正常运行的服务器高效地提供服务,而不会因与某台服务器的持续连接问题而被拖慢。
配置示例
mail {
server {
listen 25;
# Define the maximum errors
max_errors 3;
# Additional configurations here...
}
}`max_errors` 指令仅适用于邮件服务器连接,不影响其他类型的连接。
将该值设置得过低可能导致忽略邮件服务器的短暂问题,这些问题可能会很快自行解决。
务必监控日志,否则你可能不会注意到重复的连接失败。
说明
`imap_client_buffer` 指令位于 NGINX Mail 模块中,允许您为每个 IMAP 客户端连接设置分配的缓冲区大小。该缓冲区用于在处理之前保存从客户端接收的数据。通过指定更大的缓冲区,您可以容纳发送更大命令或响应的客户端,这可以通过减少多次读取操作的需要来提高性能。 该指令接受一个参数,用于指定缓冲区大小,可用字节表示,或使用诸如 `k`(千字节)和 `m`(兆字节)的后缀。在调整此指令时,需在内存使用与性能需求之间取得平衡,尤其是在处理大量并发 IMAP 连接的服务器上。适当大小的缓冲区可以帮助防止在高流量期间由于频繁内存分配导致的性能下降。 该指令应在 `mail` 或 `mail server` 上下文中使用,确保其被适当地应用到目标邮件服务配置。如果未设置,在多个 IMAP 客户端与服务器频繁交互的环境中可能导致低效。
配置示例
mail {
imap_client_buffer 512k;
}使用过小的缓冲区可能导致延迟增加,因为服务器必须多次从套接字读取数据。
过大的缓冲区可能会浪费内存,尤其是在存在大量并发连接且并非所有连接都需要这么大容量的情况下。
说明
在 `mail` 上下文中使用 `imap_capabilities` 指令来指定 IMAP 服务器可以向邮件客户端提供的一组能力。该列表至关重要,因为它向客户端告知 IMAP 服务器支持的功能,例如 `IMAP4rev1`、`UIDPLUS` 或 `IDLE`,使客户端能够据此决定如何与服务器交互。 每个能力以字符串参数的形式定义,可重复指定;每次后续的条目都会附加到服务器公告的能力列表中。这样在连接过程中进行能力协商的客户端就能识别并使用 IMAP 服务器提供的这些功能。因此,在填写该指令时应仔细选择准确的能力,以确保客户端与服务器之间的通信和功能正常。 使用 `imap_capabilities` 时,建议包含常见的 IMAP 功能,以提高与更广泛邮件客户端的兼容性。此外,任何格式错误的条目都可能在握手过程中导致问题,因此严格遵循 IMAP 标准非常重要。
配置示例
mail {
imap_capabilities IMAP4rev1 UIDPLUS IDLE;
}确保 capabilities 的拼写正确且符合 IMAP 标准,以避免与客户端握手失败。
定义冲突的 capabilities 可能导致意外行为或使某些功能失效。
请记住,并非所有客户端都支持所有声明的 capabilities,因此只包含对你的用例至关重要的那些。
说明
`imap_auth` 指令在配置 NGINX Mail 模块中用于 IMAP 连接的认证方法时起着关键作用。它允许指定一个或多个认证机制,这些机制可能包括 'PLAIN'、'LOGIN' 或 'SCRAM-SHA-256' 等选项。每个机制可以单独指定,列出它们的顺序决定了认证尝试时的优先顺序。当客户端连接到 IMAP 服务器时,它们可以协商使用的认证方法,而该指令确保服务器支持所请求的机制。 在其实现中,当发生与 IMAP 服务器的连接时,NGINX 会评估所提供的机制,并按照该指令定义的顺序尝试认证。如果客户端请求未列出的认证方法,则连接将失败,从而确保仅使用受支持的方法,增强安全性。该指令应放置在 `mail` 部分的上下文中,具体在用于处理 IMAP 连接的 `server` 块内。 其他配置可能还涉及用户权限和 TLS 要求,应仔细整合这些配置以构建可靠的邮件认证环境。同样重要的是要理解所选认证方法的任何安全影响,尤其是在处理明文与加密方法时。
配置示例
mail {
server {
listen 0.0.0.0:143;
protocol imap;
auth_http localhost:9000/auth;
imap_auth plain login;
}
}确保所指定的身份验证方法同时被服务器和客户端支持。
机制顺序不正确可能导致身份验证失败,尤其是在将较不安全的方法优先于更强的方法时。
忽略配置诸如 `auth_http` 之类的相关指令可能导致身份验证失败。
说明
'pop3_capabilities' 指令在 NGINX 邮件服务器配置中使用,用于定义 POP3 服务器实例可以支持的特性和功能。设置该指令时,会提供一个字符串,概述具体的能力,例如检索后删除邮件或支持 UIDL(唯一 ID 列表)等。它允许连接到 POP3 服务器的客户端了解可用的功能,从而增强邮件客户端与服务器之间的互操作性。 该指令接受一个或多个表示不同能力的字符串参数。在指令定义中,每个能力字符串应以空格分隔。根据指定的能力,客户端可能会相应调整其行为以利用服务器支持的功能。例如,如果公布了 'UIDL' 能力,邮件客户端可能会提供更强的服务器消息管理功能。该指令对于保持与 POP3 协议的兼容性尤为有用,确保邮件客户端收到有关服务器可用功能的充分信息。 正确实现 'pop3_capabilities' 指令对于实现最佳的服务器-客户端通信至关重要。配置错误可能导致客户端尝试使用不受支持的功能,从而引发错误或性能下降。因此,务必确保列出的能力准确反映配置中实现的服务器能力。
配置示例
mail {
pop3_capabilities UIDs DELE;
}确保列出的能力确实被底层服务器实现所支持;否则,客户端可能会遇到错误。
使用不受支持或冗余的能力字符串可能会导致尝试连接的客户端产生混淆。
随着时间推移,如果能力发生变化(例如添加或删除功能),你必须记得相应地更新此指令。
说明
指令 `pop3_auth` 用于定义在客户端尝试认证时 POP3 服务器将使用的一种或多种认证方法。该指令可以通过将多个认证机制作为单独参数指定来容纳多种方法。例如,它允许使用 `plain`、`login` 或 `cram-md5` 等机制。认证方法的顺序很重要,服务器将按顺序尝试使用这些方法对客户端进行认证,直到其中一种成功,或全部失败并导致认证错误。 管理员必须正确配置 POP3 服务器,确保所选认证方法与客户端能力和安全考虑相一致。配置错误可能导致客户端无法认证,或在使用不够安全的方法时暴露敏感数据。该指令专门针对 POP3 协议通信,应根据所需设置的作用域将其放置在 NGINX 配置的 `mail` 或 `server` 块中。 在设置此指令时,应优先考虑所使用机制的安全性以降低漏洞风险。此外,必须根据所选认证方法,确保对加密和未加密通信配置兼容的设置。
配置示例
mail {
pop3_auth plain login cram-md5;
}确保所指定的身份验证方法被您的客户端软件支持。
使用不安全的身份验证方法可能会泄露用户凭据;在可用的情况下,应优先使用安全的替代方案。
请注意,指定多个方法会导致服务器按指定顺序尝试它们——第一个成功的身份验证将被使用。
说明
通过指定此指令,用户可以将 mail 流量通过中间服务器路由,从而增强安全性、实现负载均衡并集中管理邮件。该指令以 flag 作为参数,在处理进出 mail 连接时激活底层代理设置。 启用后,'proxy' 指令允许进行各种配置,从而影响 mail 流量的处理方式。这可以包括诸如中继选项和认证详细信息等设置,以确保安全且高效的邮件处理。它在直接连接到电子邮件服务器受到限制或监控的场景中特别有用,能够在多个服务器实例之间实现更具弹性的邮件投递策略。 该指令可以放置在 mail 和 mail server 上下文中,使其在需要邮件服务器设置的应用中具有很强的通用性。但是,需要确保所需的 upstream 配置和额外的 mail 设置到位,才能充分利用 proxy 功能提供的特性。
配置示例
mail {
server {
listen 25;
proxy on;
proxy_pass backend_servers;
}
}请确保将此指令与适当的上游配置结合使用,以使其正常工作。
如果忽略定义后端服务器,可能会导致运行时错误,因为代理将不知道将邮件流量发送到何处。
确保邮件客户端与代理兼容,以防止邮件投递问题。
说明
`proxy_buffer` 指令对于控制在 NGINX Mail module 中代理到邮件服务器的请求如何进行缓冲至关重要。通过指定此指令,管理员可以定义 NGINX 在将传入数据传递给后端服务器之前用于存储这些数据的缓冲区大小。这样可以根据所处理邮件流量的特性来帮助管理内存使用并优化响应时间。该指令接受一个参数,该参数表示缓冲区的大小。\n\n实施后,由 `proxy_buffer` 指令定义的缓冲区允许 NGINX 累积传入数据,直到达到定义的阈值或请求完成为止。此缓冲尤其有助于防止繁忙邮件服务器上的资源耗尽,从而在高负载或处理大邮件时更平稳地处理请求。此外,通过调整此指令可以减少读取操作次数,从而在能够将数据有效地累积后再下发的场景中提升性能。\n\n需要注意的是,虽然增大缓冲区可以更高效地处理更大的负载,但这也要求服务器为这些缓冲区分配足够内存,以免影响整体服务器性能。因此,建议管理员在生产环境中进行基准测试和配置测试,以找到针对其工作负载的最佳缓冲区大小。
配置示例
mail {
proxy_buffer 16k;
}将缓冲区设置得过小可能导致请求分片,从而影响性能。
未指定 proxy_buffer 可能会导致使用默认行为,而默认行为可能不适用于所有邮件工作负载。
确保服务器分配了足够的内存以处理配置的缓冲区大小。
说明
`proxy_timeout` 指令配置邮件服务器在断开连接前等待客户端连接保持空闲的最长时间。该指令对于控制资源利用至关重要,并可确保长期连接不会不必要地占用服务器资源。 该指令接受单个参数,用于指定超时时间。时间可以用秒为单位定义,并可使用可选后缀以获得更高精度,例如 `1m` 表示一分钟或 `1h` 表示一小时。如果在连接上没有任何活动而达到指定的超时时间,服务器将终止该连接,从而为其他活动连接释放资源。这有助于管理服务器容量,尤其是在高流量环境中。 该指令可以应用于 `mail` 或 `mail server` 的上下文中,直接影响邮件服务器的性能和可靠性。正确调整此设置非常重要,因为超时时间过短可能会无意中关闭活动连接,而超时时间过长则可能导致资源浪费并在负载下造成性能下降。
配置示例
mail {
proxy_timeout 10s;
}将超时时间设置得过低可能会导致网速较慢的用户出现突然断开连接。
如果未指定此指令,默认行为可能会导致空闲连接的保持时间比必要的要长。
说明
`proxy_pass_error_message` 指令启用后,允许 NGINX 将来自上游服务器的错误消息直接返回给客户端,而不是将其屏蔽。默认情况下,NGINX 可能会对被代理服务的详细错误响应进行掩盖以提供更平滑的用户体验,但启用此指令有助于调试或提高透明度。该指令可以放在配置的 `mail` 和 `server` 上下文中,影响邮件操作期间错误的处理方式。 当你将该指令设置为 `on` 启用时,NGINX 的行为会改变,允许客户端接收后端服务返回的实际错误响应头和响应体。当被代理服务器具有特定的错误处理并可能提供对用户可能遇到的问题的洞见时,这一点尤其有用。相应地,该指令接受一个布尔标志作为参数,其中 `on` 表示应传递错误消息,`off` 表示不传递。使用该指令时需谨慎;在生产环境中启用它可能会导致错误消息中暴露敏感信息,除非妥善处理。
配置示例
mail {
server {
listen 25;
proxy_pass_error_message on;
}
}在生产环境中启用此指令时请谨慎,因为它可能会向用户暴露敏感的后端错误详细信息。
确保被代理的服务正确处理错误,以避免用原始错误输出让客户端感到困惑。
说明
`xclient` 指令在 NGINX Mail Core 中用于管理是否在发出的邮件服务器响应的 X-Client 头中包含远程客户端的 IP 地址。在需要追踪或记录真实客户端 IP 的场景中这尤其有用,尤其是当请求通过另一个服务器代理转发或在实施依赖于原始请求来源的安全措施时。 启用后,NGINX 会将客户端的 IP 插入邮件协议头的 X-Client 字段,后端邮件处理程序或日志服务可以使用该信息。该指令接受一个 flag 参数,允许管理员开启或关闭此行为。需要妥善配置此指令以避免潜在的隐私问题,因为公开客户端 IP 在并非所有场景下都是合适的。 该指令支持的上下文为 mail block 以及邮件服务器配置。这使得可以根据具体服务器实例的部署进行灵活配置,有助于维护反映真实客户端连接的日志,增强各种审计目的的可追溯性。
配置示例
mail {
xclient on;
}
启用此指令时,请确保您已了解其对隐私的影响,因为它会暴露客户端的 IP 信息。
配置错误可能会导致头部处理出现问题,具体取决于所使用的邮件服务器堆栈。
说明
`proxy_smtp_auth` 指令是一个布尔标志,用于决定是否应将 SMTP 身份验证信息从 NGINX 代理到上游邮件服务器。当设置为 'on' 时,NGINX 会将客户端提供的 SMTP 身份验证凭据传递到后端服务器,这对于维护用户会话并确保通信安全至关重要。如果将此指令设置为 'off',NGINX 将不会发送这些身份验证信息,可能会导致客户端尝试连接时发生认证失败。 当 NGINX 用作邮件服务器之前的反向代理时,此指令特别有用,它允许 NGINX 处理 SSL 终止等功能,同时仍能促成用户认证。如果客户端在 NGINX 上成功认证,这些用于认证的凭据将按指定转发到上游 SMTP 服务器。 此指令允许的上下文包括 `mail` 上下文以及 `server` 块内,这允许对每个服务器配置的认证行为进行细粒度控制。正确使用此指令对于那些需要通过代理传递认证数据才能正常工作的应用至关重要。
配置示例
mail {
server {
listen 25;
proxy_smtp_auth on;
proxy_pass backend_smtp_server;
}
}确保上游 SMTP 服务器支持与客户端相同的身份验证方法。
将此指令设置为 'off' 可能会根据邮件服务器的配置导致用户身份验证失败。
在配置 SSL/TLS 时要小心,避免通过不安全的通道暴露敏感凭证数据。
说明
当在 mail 上下文中启用 proxy_protocol 指令时,NGINX Mail Core 可以处理使用 PROXY protocol 的连接,这是一种将客户端连接信息传递给代理的标准方式。这在 NGINX 用作终止 SSL 的反向代理或将请求转发到期望接收原始客户端 IP 地址的后端服务器时尤为有用。 当该指令设置为 'on' 时,SMTP、IMAP 或 POP3 服务器将能够读取 PROXY protocol 头。这样它们就能记录正确的客户端 IP 地址,而不是看到代理的 IP 地址。在涉及负载均衡器或反向代理的场景中,这对于确保在整个请求生命周期中保留正确的客户端信息至关重要。 需要注意的是,该指令只接受一个标志值 (on 或 off),配置不当可能导致连接错误或下游服务记录不正确的客户端 IP 信息,尤其是在后端不理解 PROXY protocol 的情况下。
配置示例
mail {
server {
listen 25;
proxy_protocol on;
# Additional mail server settings
}
}确保后端服务器支持 PROXY protocol;否则,它会错误地解析头部。
如果启用了该指令,邮件服务器应配置为仅接受来自受信任的代理服务器的连接。
说明
smtp_client_buffer 指令指定为从已连接的 SMTP 客户端读取和处理数据而分配的缓冲区大小。在处理 SMTP 协议通信时,维持合适的缓冲区大小对于高效处理客户端请求至关重要,尤其是在大邮件或可能超出典型大小的命令场景下。 当与 SMTP 客户端建立连接时,NGINX 将使用定义的缓冲区大小来读取传入数据。该指令接受一个参数来定义此大小,允许管理员根据预期负载和 SMTP 流量的特性调整缓冲区规模。如果缓冲区过小,可能无法一次性读取较大的命令或邮件,从而导致失败或性能下降。因此,建议根据服务器的工作负载和性能要求对该值进行谨慎调整。 此外,可以在全局的 mail 块中设置 smtp_client_buffer,或在单独的 mail 服务器上下文中具体设置,从而为不同的应用场景提供灵活性,以便在需要时使用不同的缓冲区大小来优化性能和资源利用。理解内存使用与性能之间的平衡对于最佳配置至关重要。
配置示例
mail {
smtp_client_buffer 2k;
server {
listen 25;
protocol smtp;
}
}将缓冲区大小设置得过大可能导致不必要的内存消耗,尤其在高负载时。
确保所定义的缓冲区大小与预期的最大 SMTP 命令大小一致;值过小可能导致命令被截断。
说明
smtp_greeting_delay 指令在 NGINX Mail Core 模块中用于管理 SMTP 欢迎响应的时机。该指令指定了一个延迟(以秒为单位),NGINX 会在 SMTP 客户端连接到邮件服务器后在发送欢迎信息之前引入该延迟。该延迟通过在客户端收到响应前强制其等待,有助于缓解某些类型的垃圾邮件或连接洪水式尝试,从而在速率限制和控制滥用行为方面带来优势。 该指令接受一个参数,表示以秒为单位的时间长度。该值必须为非负整数,并将有效地影响邮件服务器与尝试建立会话的客户端之间初始交互的速度。例如,将值设置为 5 意味着客户端在连接后将等待 5 秒才接收到 SMTP 欢迎信息。 正确配置时,smtp_greeting_delay 有助于优化服务器资源,并可作为对抗某些类型拒绝服务(DoS)攻击的策略性手段,因为它可以降低服务器处理连接的速度。然而,建议平衡该延迟,以确保合法客户端不会经历不必要的等待,否则可能会对其用户体验产生负面影响。
配置示例
mail {
smtp_on;
smtp_greeting_delay 5;
}将延迟设置得过高可能会让合法用户感到沮丧,从而导致糟糕的用户体验。
请确保指定的时间以秒为单位;使用非数字值会导致配置错误。
说明
smtp_capabilities 指令在 NGINX 邮件服务器的上下文中使用,用于指定服务器在 SMTP 会话期间向客户端宣布哪些能力。该指令接受一个或多个参数,用以表示受支持的 SMTP 功能,例如 AUTH、EXPN 等。默认情况下,除非专门定义此指令,否则 NGINX 不会宣告任何功能。 在定义 smtp_capabilities 指令时,需要谨慎考虑要启用的功能。所指定的每个能力都会包含在 SMTP 握手期间的 EHLO 响应中,使客户端知道可使用哪些功能。这可以增强与依赖特定 SMTP 功能的各种电子邮件客户端的兼容性。为确保客户端能够有效利用服务器,应指定所有必要的功能。然而,重要的是只宣告服务器配置实际支持的功能,否则可能导致尝试使用不受支持功能的电子邮件客户端产生混淆并带来糟糕的用户体验。 smtp_capabilities 指令的参数必须正确格式化,并应放置在适当的邮件服务器上下文中以生效。应注意遵循正确的语法以避免错误配置。每个功能之间应以空格分隔,并且务必确保输入的空格和可用选项不会引入意外的错误或遗漏。
配置示例
mail {
server {
listen 25;
smtp_capabilities AUTH LOGIN PLAIN;
}
}确保您所宣称的所有功能实际上都被您的 NGINX 配置所支持,因为误传功能可能导致客户端错误。
不要在生产配置中包含不受支持或实验性的功能,以避免兼容性问题。
说明
`smtp_auth` 指令允许 NGINX 邮件模块定义对 SMTP 连接启用哪些认证方法。该指令必须在 `mail` 上下文中使用,并使服务器能够通过指定的方法(例如 LOGIN、PLAIN、CRAM-MD5 等)对邮件客户端进行认证。通过列出一个或多个认证机制,该指令告诉 NGINX 在验证尝试连接的 SMTP 客户端凭据时可以依赖哪些方法。如果指定了多个方法,服务器将按提供的顺序依次尝试,直到其中一种成功或全部失败为止。 在实际使用中,当客户端连接到 SMTP 服务器时,会根据服务器支持的认证方法提交其凭据。服务器随后根据 `smtp_auth` 指令中定义的机制处理这些凭据。需要注意的是,除非与安全传输协议(如 TLS)结合以在传输过程中加密认证数据,否则应避免使用不安全的方法。
配置示例
mail {
smtp_auth LOGIN PLAIN;
server {
listen 25;
}
}确保指定的身份验证方法被支持且安全,特别是 LOGIN 和 PLAIN,应使用 TLS 进行加密。
应按优先顺序列出多个身份验证方法;第一个成功的方法将用于验证客户端。
配置在重新加载 NGINX 之前可能不会生效,部署前务必测试配置。
说明
'starttls' 指令是 NGINX Mail Core 模块的一部分,用于通过启用 STARTTLS 命令来增强邮件连接的安全性。当在邮件服务器块中设置该指令时,它允许邮件服务器将现有的不安全连接升级为使用 TLS 的安全连接。这对于保护数据完整性和防止传输过程中被窃听至关重要。\n\n'starttls' 指令的行为是指示服务器监听来自客户端的 STARTTLS 命令,从而有效地表明可以切换到安全通道。为使其正常工作,该指令必须配合适当的 SSL 配置指令,例如 'ssl_certificate' 和 'ssl_certificate_key',用于指定用于建立加密连接的 SSL 证书和私钥。如果未包含这些设置,当客户端尝试建立 TLS 会话时会导致错误。\n\n'starttls' 指令的典型用法发生在邮件服务器的上下文中,以确保配置支持由邮件客户端发起的安全连接。该指令的有效性取决于 NGINX 中底层 TLS 支持的配置,因为它需要正确的 SSL 设置才能按预期工作。
配置示例
mail {
server {
listen 993;
protocol imap;
starttls;
}
}确保 SSL 证书和密钥已正确配置,以使 TLS 正常工作。
只有当客户端支持 STARTTLS 命令时,'starttls' 指令才会生效。
避免在同一 server 块中将 'starttls' 与其他相互冲突的安全指令一起使用。
说明
`proxy_protocol_timeout` 指令指定在 stream 服务器上下文中从客户端接收 PROXY protocol header 的最大时限。该指令在使用 PROXY protocol 将客户端连接信息从负载均衡器或反向代理传递到后端服务器的场景中至关重要。如果在完整头部接收完成之前达到指定的超时,将关闭连接,从而确保证不会无限期占用资源等待不完整的数据。 该指令的参数是一个时间值,可以用秒指定,也可以用类似 '1s'、'10m'、'1h' 等的时间格式。超时时间应谨慎设置,以在适应网络波动的同时平衡资源分配。过短的超时可能会在客户端较慢或高延迟的环境中导致连接过早关闭,而过长的超时则可能不必要地增加资源消耗。 通过配置 `proxy_protocol_timeout`,服务器管理员可以确保他们的 stream 应用在涉及 PROXY protocol 的连接建立过程中更健壮,从而提升性能和用户体验。该指令通常与其他与 PROXY protocol 相关的配置一起使用,以优化 stream 服务器行为。
配置示例
stream {
server {
listen 1234;
proxy_protocol_timeout 5s;
}
}请确保指定的超时时间考虑了您的网络状况;过短可能会中断合法连接。
此指令仅适用于使用 PROXY protocol 的服务器;请确保它已正确放置在此类 server blocks 中。
说明
'preread_buffer_size' 指令在 NGINX Stream Core 中定义了用于在将连接交给后端服务器之前从套接字读取初始数据的缓冲区大小。对于那些需要读取一定量数据以正确处理请求或基于接收到的初始数据确定目标后端服务器的协议来说,这个缓冲区大小至关重要。 默认情况下,缓冲区大小设置为 16k,但可以根据应用的具体需求进行调整。如果缓冲区太小,可能导致数据读取被截断,从而引发请求处理问题或将请求错误路由到后端服务器。增大缓冲区大小可以在不丢失数据的情况下容纳更大的初始数据包,但值设置过大则会消耗不必要的内存,尤其是在处理大量并发连接时。 它通常在 'stream' 或 'stream server' 上下文中声明,允许用户根据具体架构在不同情况下指定不同的大小。在调整此指令时,应仔细权衡性能与内存使用之间的平衡。
配置示例
stream {
server {
listen 1234;
preread_buffer_size 32k;
}
}将缓冲区大小设置得过小,可能会在较大的初始请求时引发问题,从而可能导致请求失败。
值设置得过大可能会引入不必要的内存开销,尤其是在为大量并发流提供服务时。
说明
`preread_timeout` 指令位于 NGINX Stream Core 模块,指定服务器在预读状态下等待的最长时间,超过该时间将关闭空闲连接。在该状态期间,NGINX 正在等待客户端发送完整请求,例如在 TCP 流处理中的数据包。如果客户端在指定的超时时间内未发送数据,NGINX 将终止连接以节省资源并防止潜在的拒绝服务攻击。简而言之,它定义了 NGINX 在流事务的初始阶段会耐心等待多长时间,然后才采取关闭连接的措施。 此指令在持续的空闲连接可能导致资源耗尽并影响整体服务器性能的环境中特别有用。该指令的参数是一个时间值,可用秒、分钟或小时表示,与 NGINX 配置中的其他超时指令类似。管理员应根据网络中客户端的预期行为谨慎平衡该超时时间,因为将其设置得过低可能会无意中中断那些在数据传输中可能出现延迟的有效连接。
配置示例
stream {
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
server {
listen 12345;
preread_timeout 30s;
proxy_pass backend;
}
}将 `preread_timeout` 设置得过低可能会由于数据传输延迟而导致合法连接被断开。
确保已配置的超时时间为客户端建立连接留出足够时间,尤其是在高延迟网络中。
说明
'pass' 指令用于在 NGINX stream 模块上下文中将客户端请求转发到指定的 upstream server,该上下文通常用于 TCP 和 UDP 流量。该指令指定一个将处理传入连接的 upstream server,从而支持负载均衡和故障转移功能。该指令可以包含选项,例如定义一个 server name 或指定端口号。 当连接匹配在 stream block 中定义的条件时,'pass' 指令会指示 NGINX 与指定的 upstream server 建立连接,并在客户端与 upstream server 之间转发数据包。这实际上使 NGINX 在 stream 流量中充当代理,提供诸如 SSL 终止和维护连接池等功能。管理员需要确保指定的 upstream server 配置正确,以避免连接失败。 该指令可以在 'stream' block 的各种上下文中使用,但主要在 'server' block 中定义,在那里指定单个 upstream 目标。这种模块化方法允许在路由和连接管理方面更灵活地工作。
配置示例
stream {
upstream backend {
server backend1.example.com:1234;
server backend2.example.com:1234;
}
server {
listen 1234;
pass backend;
}
}确保上游服务器可访问;否则连接将失败。
避免在 HTTP 上下文中使用 'pass' 指令;它特定于 stream 上下文。
注意连接处理:NGINX 会保持连接打开以提高数据传输效率,如果未正确管理,可能会导致资源问题。
说明
`proxy_downstream_buffer` 指令配置在 TCP/UDP 流上下文中从 upstream 服务器接收的响应的缓冲行为。通过将大小作为参数指定,该指令决定在将数据发送给下游客户端之前在内存中保留多少数据。如果大小设置过小,客户端在数据传输期间可能会遇到中断,因为 NGINX 必须等待从 upstream 接收到更多数据后才能发送出去。相反,缓冲区大小设置过大则可能消耗过多内存资源,可能会提高资源使用率并导致其他性能问题。\n\n该指令在数据流量高或连接速率不可预测的场景中特别有用,因为它可以在流量突增期间帮助稳定向客户端的传输。由于 `proxy_downstream_buffer` 在 `stream` 和 `stream server` 上下文中应用,它允许对每个定义的 stream 进行资源分配的精细调整。该指令的有效性会受到与速率、超时和内存限制相关的其他设置的影响,调整时应谨慎,以防在高峰负载期间产生意外的副作用。
配置示例
stream {
upstream my_upstream {
server 192.168.1.1:1234;
}
server {
listen 1234;
proxy_pass my_upstream;
proxy_downstream_buffer 64k;
}
}将缓冲区大小设置得过大可能会导致内存使用量增加。
如果缓冲区大小过小,可能会导致客户端的传输延迟或中断。
请确保在正确的上下文中使用该指令(stream 或 stream server)。
说明
在 NGINX stream 模块的 `stream` 和 `stream server` 上下文中使用 `proxy_upstream_buffer` 指令来定义用于存储发往上游服务器数据的缓冲区大小。该缓冲区可在数据转发到上游之前进行累积,这可以通过减少系统调用次数并提高吞吐量来优化性能。该指令接受单个参数,用于以字节为单位指定缓冲区大小。 在实践中,将 `proxy_upstream_buffer` 值设置得过低可能会导致发送到上游服务器的写调用次数增加,因为数据在达到较小的缓冲区限制后会立即转发。相反,将其设置得过高可能会消耗过多内存,尤其是在高负载场景中当许多连接同时处于活动状态时。因此,应根据应用需求和可用系统资源找到一个平衡点。 定义此指令的语法如下:`proxy_upstream_buffer size;`,其中 `size` 是为缓冲分配的内存量。正确配置此指令有助于调整由 NGINX 提供服务的 TCP 和 UDP 应用的性能,尤其是在高性能环境或涉及封装协议的情况中。
配置示例
stream {
server {
listen 12345;
proxy_pass backend;
proxy_upstream_buffer 512k;
}
upstream backend {
server backend1.example.com:1234;
server backend2.example.com:1234;
}
}将缓冲区大小设置得过低会导致过多的系统调用,从而对性能产生负面影响。
将缓冲区大小分配得过高可能在高峰流量期间导致内存使用量过大,可能耗尽系统资源。
说明
`proxy_upload_rate` 指令在 NGINX Stream 模块中指定被代理连接的最大上传速率。该指令支持带宽整形,适用于需要限制上传速度以防止某个用户占用过多可用带宽的场景。该值通常以字节/秒为单位定义,会直接影响服务器上上传活动的总体性能。 配置后,如果连接尝试以超过定义速率的速度上传数据,NGINX 会暂停传输以执行带宽限制。这有助于在多个用户之间平衡负载并维护所有连接的服务质量。该指令可应用于 `stream` 或 `stream server` 上下文,从而允许在多个服务器实例场景中进行灵活配置。 需要注意的是,指定的上传速率应反映考虑到服务器能力和预期工作负载的现实限制。建议在部署前在预生产环境中仔细测试不同的值,以找到最佳的配置平衡。此外,将上传速率设置得非常高可能会由于网络栈的高开销而引入性能问题。
配置示例
stream {
server {
listen 12345;
proxy_pass backend_server;
proxy_upload_rate 1m;
}
}确保速率值是实际可行的,以避免性能问题。
如果上游服务器无法良好处理背压,则该指令可能无法按预期生效。此外,在未进行适当调优的情况下使用此指令可能导致带宽未被充分利用,因此必须谨慎考虑这些设置。
说明
指令 `proxy_download_rate` 在 NGINX 的 Stream 模块中使用,用于限制通过代理流连接发送给客户端的数据速率。在需要控制带宽使用或在多个客户端之间确保公平资源分配的场景中,这尤其有用。该指令的参数是一个数值,指定最大数据传输速率,单位为字节/秒。 当设置该指令后,NGINX 会将此限制应用于由代理发起的下载,从而更容易管理服务器的总体负载并优化性能。它通过监控发送到客户端的数据包并在传输速率超过指定限制时调整流量来工作。这可以防止网络饱和,并通过更均匀地分配带宽来改善用户体验,尤其是在高峰使用时段。重要的是,该指令可以全局设置,也可以根据每个服务的独特需求专门为各个 `stream` 服务器定制。 要实现 `proxy_download_rate`,该指令必须放置在 `stream` 上下文中或位于 `stream server` 块内。同样需要注意的是,该指令仅在作为流代理时适用,其效果可能会因其他网络配置而有所不同。
配置示例
stream {
server {
listen 12345;
proxy_pass backend_server;
proxy_download_rate 1024; # Limit download rate to 1KB/s
}
}将此指令设置为非常高的值可能导致无意的带宽占用,影响其他服务。
确保你的后端服务能够根据设置的下载速率处理连接,以避免瓶颈。
说明
`proxy_requests` 指令在 NGINX Stream 模块中用于将流连接转发到上游服务器,使 NGINX 能够作为 TCP 和 UDP 流量的反向代理。该指令允许管理员指定是否应在指定的 stream server 块中接受代理请求。启用时,NGINX 可以通过维护连接状态来处理会话,并允许客户端与上游服务器通过已配置的 stream 代理设置进行通信。 该指令接受一个参数,可设置为 `off` 或 `on`。将其设置为 `on` 允许 NGINX 将传入请求作为代理请求处理,而 `off` 则禁用此功能,实际效果是终止任何传入连接而不进行代理。在使用此指令时需要考虑应用行为,因为错误使用可能导致意外的连接关闭或在代理被禁用时尝试连接时服务不可用。 在实际使用中,`proxy_requests` 的使用必须与其他 stream 指令仔细配合,以确保网络请求的正确流动和路由。例如,与 `proxy_pass` 指令组合使用时,它可以简化涉及多个上游服务器以维护用户会话或数据流的复杂网络场景。
配置示例
stream {
server {
listen 1234;
proxy_requests on;
proxy_pass backend_servers;
}
}使用 `proxy_requests off;` 可能会无意中阻止有效的代理请求,导致连接被终止。
确保将该指令设置在正确的上下文中(即 'stream' 或 'stream server'),因为在其他上下文中使用会导致配置错误。
说明
`proxy_responses` 指令在 NGINX 的 `stream` 上下文中使用,用于指定在 NGINX 关闭连接之前允许从上游服务器接收多少个响应。该指令在处理 TCP/UDP 流量时尤其有用,因为与上游服务器保持稳定的通信通道对于性能和可靠性至关重要。如果为该指令指定一个整数参数,NGINX 会记录接收到的响应数量,一旦达到指定的限制便会自动关闭连接。这在上游服务器已知会提供有限响应量的场景中,或在实现特定的响应处理速率时,会有所帮助。 使用 `proxy_responses` 时,可以通过选择与需求相符的数字来简单地控制其行为。例如,如果您预期在峰值负载下会有大量服务器响应,将该指令设置为较大的数值可能有利。另一方面,较小的数值可以确保连接不会比必要的时间更长地保持打开,从而将资源使用降到最低。在配置该指令时,务必考虑与上游服务的协议特性和连接模式,因为过早关闭连接可能导致不必要的重传或数据包丢失。
配置示例
stream {
upstream my_upstream {
server backend1.example.com:1234;
server backend2.example.com:1234;
}
server {
listen 1234;
proxy_pass my_upstream;
proxy_responses 5;
}
}请记住,将该数值设置得过低可能会导致有效响应因连接过早关闭而被丢弃。
如果连接长时间保持打开且未得到妥善处理,过高的数值可能导致资源耗尽。
说明
`proxy_half_close` 指令用于 NGINX 的 Stream 模块上下文,具体用于 `stream` 和 `stream server` 配置。启用时(设置为 'on'),它允许服务器在客户端完成发送数据并关闭连接后关闭 upstream 连接。在某些协议中,upstream 服务器在客户端断开后可能仍需继续处理数据,因此此行为有助于提高资源利用效率并正确处理短暂连接。 如果未设置该指令,默认('off')情况下 NGINX 在客户端关闭后仍会保持 upstream 连接。这可能导致不必要的资源消耗,因为 upstream 会比所需时间保持打开。`proxy_half_close` 在 downstream 连接频繁且短暂的场景,或需要高效管理 socket 状态以优化性能时尤其重要。 `proxy_half_close` 指令接受一个参数:`on` 或 `off`。设置为 'on' 可启用半关闭行为,而 'off'(默认)表示 NGINX 不会在客户端断开后立即关闭 upstream 连接。此设置可根据您的应用需求和所使用协议的类型,在管理连接生命周期时提供灵活性。
配置示例
stream {
server {
listen 12345;
proxy_pass backend_servers;
proxy_half_close on;
}
}请务必仔细测试连接行为;启用此项可能会改变客户端与上游服务器之间的数据流动方式。
如果与期望会话持久性的协议一起使用,请确认 half-closing 不会导致意外断开。
说明
`proxy_ssl` 指令在 NGINX 的 stream 上下文中用于启用与上游服务器的安全套接字层 (SSL) 连接。通过将此指令设置为 'on',NGINX 在代理 TCP 或 UDP 流量时将建立 SSL 连接,在 NGINX 服务器与上游服务器之间提供加密通道。这对于保护通信非常有用,例如在与安全后端服务交互时。 该指令可以在 stream server 块中声明,其值可以为 'on' 或 'off'。当设置为 'on' 时,NGINX 期望上游服务器出示与其主机名匹配的 SSL 证书,并将执行必要的握手以建立安全连接。可能需要指定与 SSL 配置相关的附加参数,例如 `proxy_ssl_certificate` 和 `proxy_ssl_password_file`,以便成功验证和管理通信过程中使用的 SSL 证书。
配置示例
stream {
server {
listen 443;
proxy_pass backend_server;
proxy_ssl on;
}
}确保您的上游服务器已配置有效的 SSL certificate;否则 NGINX 将无法建立连接。
在没有适当的 SSL 配置(例如 `proxy_ssl_certificate`)的情况下设置 `proxy_ssl on;` 可能会导致运行时错误。
请记住启用 SSL 会增加开销;确保您的 NGINX 服务器具有足够的资源来处理。
说明
`ssl_handshake_timeout` 指令在 NGINX Stream Core 模块中用于指定服务器在建立安全连接时等待 SSL 握手完成的最大时长(以秒为单位)。正确配置该超时对于确保客户端在尝试建立安全连接时不会无限期挂起非常重要。如果超过指定的时间限制,连接将被中止,服务器会记录一条错误日志。 该指令的参数是以秒为单位指定的时间值。如果握手在指定超时之前未完成,服务器将终止连接。该指令对于需要安全连接的 high-reflection 应用尤其重要,因为在握手过程中保持低延迟对于性能和用户体验至关重要。通过根据预期的网络状况和客户端行为适当设置超时值,服务器管理员可以有效优化 SSL 连接的处理。 该指令可在 `stream` 和 `stream server` 两种上下文中声明,从而允许针对每个服务器灵活配置 SSL 超时行为。需要注意的是,该指令仅在 stream 模块中启用 SSL 时适用,应进行充分测试以确定特定用例的最佳超时值。
配置示例
stream {
server {
listen 443;
ssl_handshake_timeout 10s;
ssl_preread on;
}
}在使用此指令之前,请确保在 NGINX 的 stream 配置中启用了 SSL,因为它仅在该上下文中生效。
将超时设置得过低可能会导致在握手较慢时合法客户端被断开连接,尤其是在高延迟网络中。
说明
`ssl_alpn` 指令对于定义 NGINX Stream 模块使用的 ALPN 协议至关重要。通过允许客户端在 SSL/TLS 握手期间协商要使用的应用层协议,`ssl_alpn` 有助于为各种协议(例如 HTTP/2 和 HTTP/1.1)实现最佳性能和兼容性。 在指定时,该指令接受一个或多个协议名称作为参数,用于 ALPN 协商过程。该指令必须出现在有效的 stream 或 stream server 上下文中,表明它专门用于 TCP 或 UDP 连接,而不是用于 HTTP。如果指定了多个协议,必须按优先顺序列出它们,因为服务器会按该顺序向客户端提供。 另外,需要注意的是,如果客户端不支持任何所提供的协议,连接可能会失败,因此需要正确配置并验证支持,以确保客户端能够成功协商协议。另请确保你的 OpenSSL 版本与 ALPN 兼容,以便该指令能正确工作。
配置示例
stream {
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_alpn h2 http/1.1;
}
}确保客户端支持指定的协议,以避免连接失败。
在修改 ALPN 设置后,始终测试配置以检查兼容性问题或服务器响应。
确保你的 OpenSSL 版本在编译时启用了 ALPN 支持。
说明
`ssl_preread` 指令在 NGINX Stream 模块中用于处理通过 SSL/TLS 保护的 TCP 流。该指令允许 NGINX 执行初始 SSL 握手处理,从而能够根据客户端在握手期间发送的 Server Name Indication (SNI) 扩展确定目标后端服务器。 当启用 `ssl_preread` 时,NGINX 可以检查传入的 SSL 握手以提取 SNI 信息,这在根据客户端指定的主机名将流量路由到多个后端时尤其有用。如果将 `ssl_preread` 指令设置为 `on`,则会解析 SSL 握手,SNI 将可在配置中进一步使用,例如在 `proxy_pass` 指令中或用于影响负载均衡。这对于在同一 IP 地址上托管多个启用 SSL 的域的应用非常重要。 需要注意的是,`ssl_preread` 指令本身并不执行 SSL termination;它仅使 NGINX 能够从 SSL 握手中解析出 SNI。用户通常将该指令与其他指令或后端配置结合使用,以有效管理 SSL 流量。
配置示例
stream {
server {
listen 443;
proxy_pass backend;
ssl_preread on;
}
upstream backend {
server backend1.example.com:443;
server backend2.example.com:443;
}
}确保在你的 NGINX 构建中编译了 SSL/TLS 支持,因为 `ssl_preread` 依赖于它。
不要在 non-SSL 流上使用 `ssl_preread`,否则行为将无法预测。
基于 SNI 的路由在客户端未发送 SNI 时可能无法按预期工作。