连接处理方式

nginx 支持多种连接处理方式,每一种方式是否可用取决于所用的平台。在支持几种方式的平台上,nginx 会自动选择最有效的方式,然而,如果您需要明确指定使用哪一种方式,可以使用 use 指令指定。

支持以下集中处理方式:

  • select,标准方式。当平台上缺乏其他有效的方式时自动构建。--with-select-module-without-select_module 配置参数开启或者禁用此模块构建。
  • poll,标准方式,当平台上缺乏其它有效的处理方式时自动构建此模块。-with-poll_moudle-without-poll_module 配置项开启或者禁用此模块构建。
  • kqueue,在 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0, 和 macOS 使用有效。
  • epoll,在 Linux 2.6+ 上使用有效。

从 1.11.3 起支持 EPOLLRDHUP(Linux 2.6.17,glibc 2.8)和 EPOLLEXCLUSIVE(Linux 4.5,glibc 2.24)标志。一些类似于 SuSE 8.2 这样的老版本提供了对 2.4 内核支持 epll 的补丁。

  • /dev/poll,在 Solaris 7 11/99+,HP / UX 11.22+(eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+ 有效。
  • eventport,事件端口,在 Solaris 10+ 有效(由于已知问题,推荐使用 /dev/poll 方式代替)。

原文档


设置哈希

为了快速处理静态数据集,如服务器名称、map 指令值、MIME 类型、请求头字符串的名称,nginx 使用了哈希表。在开始和每次重新配置时,nginx 尽可能选择最小的哈希表,以便存储具有相同散列值的存储桶大小不会超过配置参数(哈希桶大小)。表的大小以桶为单位。调整是持续的,直到表的大小超过哈希的最大大小参数。大多数哈希具有修改这些参数对应的指令,例如,对于服务器名称哈希,它们是 server_names_hash_maxserver_names_hash_bucket_size

哈希桶大小参数与处理器的高速缓存线大小的倍数对齐。可以通过减少内存访问的次数来加快现代处理器的哈希键搜索速度。如果哈希桶大小等于处理器的高速缓存线大小,则哈希键搜索期间内存访问次数最坏的情况下将有两次 —— 一是计算桶地址,二是在桶内搜索哈希键期间。因此,如果 nginx 发出消息请求增加到哈希的最大大小或者哈希桶的大小,那么首先应该增加第一个参数。

原文档


调试日志

  • 为指定客户端做调试日志
  • 记录日志到循环内存缓冲区

要开启调试日志,需要在编译 Nignx 时增加如下配置:

./configure --with-debug ...

之后应该使用 error_log 指令设置调试级别:

error_log /path/to/log debug;

要验证 nginx 是否已经配置为支持调试功能,请运行 nginx -V 命令:

configure arguments: --with-debug ...

预构建 Linux 包为 nginx-debug 二进制文件的调试日志提供了开箱即用的支持,可以使用命令运行。

service nginx stop
service nginx-debug start

之后设置 debug 级别。Windows 的 nginx 在编译时就已经支持调试日志,因此只需设置 debug 级别即可。

请注意,重新定义日志而不指定 debug 级别将禁止调试日志。在下面的示例中,重新定义 server 上的日志级别,nginx 将不会在此服务器上做日志调试。

error_log /path/to/log debug;

http {
    server {
        error_log /path/to/log;
        ...

为了避免这种情况,重新定义日志级别应该被注释掉,或者明确指定日志为 debug 级别。

error_log /path/to/log debug;

http {
    server {
        error_log /path/to/log debug;
        ...

为指定客户端做调试日志

也可以仅为选定的客户端地址启用调试日志:

error_log /path/to/log;

events {
    debug_connection 192.168.1.1;
    debug_connection 192.168.10.0/24;
}

记录日志到循环内存缓冲区

调试日志可以被写入到循环内存缓冲区中:

error_log memory:32m debug;

debug 级别将日志写入到内存缓冲区中,即使在高负载情况下也不会对性能产生重大的影响。在这种情况下,可以使用如下 gdb 脚本来提取日志:

set $log = ngx_cycle->log

while $log->writer != ngx_log_memory_writer
    set $log = $log->next
end

set $buf = (ngx_log_memory_buf_t *) $log->wdata
dump binary memory debug_log.txt $buf->start $buf->end

原文档


记录日志到 syslog

error_logaccess_log 指令支持把日志记录到 syslog。以下配置参数将使 nginx 日志记录到 syslog:

server=address

定义 syslog 服务器的地址,可以将该地址指定为附带可选端口的域名或者 IP,或者指定为 “unix:” 前缀之后跟着一个特定的 UNIX 域套接字路径。如果没有指定端口,则使用 UDP 的 514 端口。如果域名解析为多个 IP 地址,则使用第一个地址。

facility=string

设置 syslog 的消息 facility(设备),RFC3164 中定义,facility可以是 kernusermaildaemonauthinternlprnewsuucpclockauthprivftpntpauditalertcronlocal0local7 中的一个,默认是 local7

severity=string

设置 access_log 的消息严重程度,在 RFC3164 中定义。可能值与 error_log 指令的第二个参数( level,级别)相同,默认是 info。错误消息的严重程度由 nginx 确定,因此在 error_log 指令中将忽略该参数。

tag=string

设置 syslog 消息标签。默认是 nginx

nohostname

禁止将 hostname 域添加到 syslog 的消息(1.9.7)头中。

syslog配置示例:

error_log syslog:server=192.168.1.1 debug;

access_log syslog:server=unix:/var/log/nginx.sock,nohostname;
access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;

记录日志到 syslog 的功能自从 1.7.2 版本开始可用。作为我们 商业订阅 的一部分,记录日志到 syslog 的功能从 1.5.3 开始可用。