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_max 和 server_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->enderror_log 和 access_log 指令支持把日志记录到 syslog。以下配置参数将使 nginx 日志记录到 syslog:
server=address定义 syslog 服务器的地址,可以将该地址指定为附带可选端口的域名或者 IP,或者指定为 “unix:” 前缀之后跟着一个特定的 UNIX 域套接字路径。如果没有指定端口,则使用 UDP 的 514 端口。如果域名解析为多个 IP 地址,则使用第一个地址。
facility=string设置 syslog 的消息 facility(设备),RFC3164 中定义,facility可以是 kern,user,mail,daemon,auth,intern,lpr,news,uucp,clock,authpriv,ftp,ntp,audit,alert,cron,local0,local7 中的一个,默认是 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 开始可用。
