连接处理方式
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->end
原文档
记录日志到 syslog
error_log 和 access_log 指令支持把日志记录到 syslog。以下配置参数将使 nginx 日志记录到 syslog:
server=address
定义 syslog 服务器的地址,可以将该地址指定为附带可选端口的域名或者 IP,或者指定为 “unix:” 前缀之后跟着一个特定的 UNIX 域套接字路径。如果没有指定端口,则使用 UDP 的 514 端口。如果域名解析为多个 IP 地址,则使用第一个地址。
facility=string
设置 syslog 的消息 facility(设备),RFC3164 中定义,facility可以是
kern
,user
,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 开始可用。