第2章 配置指南
标签:精通Nginx
精通Nginx 个人笔记
参考文档: Jack Zhou的专栏 Nginx:配置指南(2)
本章主要内容:
+ 基本配置格式
+ Nginx全局配置参数
+ 使用include文件
+ Http的server部分
+ 虚拟服务器部分
+ location————where? when? how?
+ mail的server部分
+ 完整的示例配置文件
基本配置
- 基本的Nginx配置文件由若干部分组成,每一个部分都是通过下列方法定义的
<section> {
<directive> <parameters>;
}
Nginx的全局配置参数
#定义Nginx运行的用户和用户组,如果忽略用户组,那么用户组的名字等于用户的用户组
user user group;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#主进程ID的文件
pid /var/run/nginx.pid;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
#工作模式与连接数上限
events {
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}
使用include文件
- 在Nginx的配置文件中,include文件可以在任何地方,以便增强配置文件的可读性,并且能够使得部分配置文件重新使用。使用include文件,要确保被包含的文件自身有正确的Nginx语法,即配置指令和块
include /opt/local/etc/nginx/vhost/*.conf
- 如果没有给定全路径,那么Nginx会依据它的主配置文件路径进行搜索
nginx -t -c <path-to_nginx.conf> # 测试nginx的配置文件,只检查语法
http的server部分
- 本部分的指令用于处理Http连接
客户端指令
- 这一组指令用于处理客户端连接本身的各个方面,以及不同类型的客户端
客户端指令
指令 | 说明 |
---|---|
chunked_transfer_encoding | 发送给客户端的响应中允许禁用Http/1.1标准的块传输编码 |
client_body_buffer_size | 为了阻止临时文件写到磁盘,可以通过该指令为客户端请求体设置缓存大小,默认的缓存大小是两个内存页面 |
client_body_in_file_only | 用于调试或者是进一步处理客户端请求体。该指令能够将客户端请求体强制写入磁盘 |
client_body_in_single_buffer | 为了减少拷贝的操作,使用该指令强制Nginx将整个客户端请求体保存在单个缓存中 |
client_body_temp_path | 定义一个命令路径用于保存客户端请求体 |
client_body_timeout | 指定客户体成功读取的两个操作之间的时间间隔 |
client_header_buffer_size | 设置用户请求头所使用的buffer大小,当请求头大于1KB时会用到 |
client_header_timeout | 设置用户请求头的超时时间 |
client_max_body_size | 设置所能接收的最大请求体的大小,如果大于这个设置,返回413(Request Entity Too Large)错误 |
keepalive_disable | 禁止那些浏览器使用keepalive功能 |
keepalive_requests | 在keepalive连接上所允许请求的最大资源数量,默认为100; |
keepalive_timeout | 设定keepalive连接的超时时长,0表示禁止长连接,默认启用为75s |
large_client_header_buffers | 定义最大数量和最大客户端请求头的大小 |
msie_padding | 为了填充响应的大小至512字节,对于MSIE客户端,大于400的状态代码会被添加注释以便满足512字节,通过启用该命令可以阻止这种行为 |
msie _ refresh | 对于MSIE客户端,可启用发送一个refresh头,而不是重定向 |
文件I/O指令
- 这些指令用于控制Nginx如何投递静态文件,以及如何管理文件描述符
指令 | 说明 |
---|---|
aio | 启用异步文件I/O。该指令对于现代版本的FreeBSD和发布的Linux都有效。在FreeBSD系统下,aio可能被用于sendfile预加载数据。在Linux下需要directio指令,自动禁用sendfile |
directio | 用于启用操作系统特定的标志或者功能提供大于给定参数的文件。在Linux系统下使用 aio时需要使用该指令 |
directio_alignment | 设置 directio 的算法。默认值为512,通常足够了,但是在Linux的XFS下推荐增加为4K |
open_file_cache | 配置一个缓存用于存放打开的文件描述符、目录查询和文件查询错误 |
open_file_cache_errors | 按照 open_file_cache,启用文件查询错误缓存 |
open_file_cache_min_uses | open_file_cache缓存的文件描述符保留在缓存中,使用该指令配置最少使用文件描述符的次数 |
open_file_cache_valid | 指定对open_file_cache缓存有效性检查的时间间隔 |
postpone_output | 指定Nginx发送给客户端最小的数值,如果可能的话,没有数据会发送,直到达到此值 |
read_ahead | 如果可能的话,内核将预读文件到设定的参数大小。目前支持FreeBSD和Linux(Linux会忽略大小) |
sendfile | 使用sendfile(2)直接复制数据从一个到另一个文件描述符 |
sendfile_max_chunk | 设置在一个 sendfile(2) 拷贝中最大数据的大小,这是为了阻止worker“贪婪” |
Hash指令
这组hash指令控制Nginx分配给某些变量多大的静态内存。在启动和重新配置时,Nginx会计算需要的最小值。在Nginx发出警告时,你几乎只需要调整一个*_hash_max_size指令的参数值就可以达到效果。*_hash_bucket_size变量被设置了默认值,以便满足多处理器缓存行降低检索所需要的检索查找,因此基本不需要改变
Http hash指令
指令 | 说明 |
---|---|
server_names_hash_bucket_size | 指定用于保存server_name哈希表大小的“桶” |
server_names_hash_max_size | 指定的server_name哈希表的最大大小 |
types_hash_bucket_size | 指定用于存放哈希表的“桶”的大小 |
types_hash_max_size | 指定哈希类型表的最大大小 |
variables_hash_bucket_size | 它指定用于存放保留变量“桶”的大小 |
variables_hash_max_size | 指定存放保留变量最大哈希值的大小 |
Socket指令
- 这些指令描述了Nginx如何设置创建TCP套接字的变量选项
Socket指令
指令 | 说明 |
---|---|
lingering_close | 指定如何保持客户端的连接,以便用于更多数据的传输 |
lingering_time | 在使用 lingering_close指令的连接中,使用该指令指定客户端连接为了处理更多的数据需要保持打开连接的时间 |
lingering_timeout | 结合lingering_close,该指令显示Nginx在关闭客户端连接之前,为获得更多数据会等待多久 |
reset_timedout_connection | 使用这个指令之后,超时的连接将会被立即关闭,释放相关的内 存。默认的状态是处于FIN _ WAIT1,这种状态将会一直保持连接 |
send_lowat | 如果非零,Nginx将会在客户端套接字尝试减少发送操作 |
send_timeout | 在两次成功的客户端接收响应的写操作之间设置一个超时时间 |
tcp_nodelay | 启用或者禁用TCP _ NODELAY选项,用于keep-alive连接 |
tcp_nopush | 仅依赖于 sendfile的使用。它能够使得Nginx在一个数据包中尝试发送响应头,以及在数据包中发送一个完整的文件 |
一个Http配置部分的示例
http {
include /opt/local/etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
server_names_hash_max_size 1024;
}
- 在nginx.conf文件中上面的这部分内容跟随在全局配置指令之后。
虚拟server部分
任何由关键字server开始的部分都被称作“虚拟服务器”部分。它描述的是一组根据server_name指令逻辑分割的资源,这些虚拟服务器响应Http请求,因此它们都包含在http部分中。
一个虚拟服务器由listen和server_name指令组合定义,listen指令定义了一个IP地址/端口组合或者是UNIX域套接字路径
listen address[:port];
listen port;
listen unix:path;
- listen指令唯一地标识了在Nginx下的套接字绑定
listen指令的参数
指令 | 说明 | 注解 |
---|---|---|
default_server | 定义这样一个组合: address:port默认的请求被绑定在此 | |
Setfib | 为套接字监听设置相应的FIB | 仅支持FreeBSD,不支持UNIX域套接字 |
backlog | 在listen()的调用中设置backlog参数调用 | 在FreeBSD系统中默认值为 −1,而在其他的系统中为511 |
rcvbuf | 在套接字监听中设置 SO_RCVBUF 参数 | |
sndbuf | 在套接字监听中设置 SO_SNDBUF参数 | |
accept_filter | 设置接受的过滤器:dataready或者httpready dataready | 仅支持FreeBSD |
deferred | 设置 accept()调用的TCP_DEFER_ACCEPT | 仅支持Linux |
bind | 为 address:port套接字对打开一个单独的 bind()调用 | 如果任何其他特定套接字参数被使用,那么一个单独的 bind()将会被隐式地调用 |
ipv6only | 设置 IPV6_V6ONLY参数的值 | 只能在一个全新的开始设置。不支持UNIX域套接字 |
ssl | 表明该端口仅接受HttpS的连接 允许更紧凑的配置 | |
so_keepalive | 为TCP监听套接字配置keepalive |
+ server_name指令是相当简单的,但可以用来解决一些配置问题。它的默认值为”“,这意味着server部分没有server_name指令,对于没有设置Host头字段的请求将会匹配该server处理。这种情况可用于,例如,丢弃这种缺乏Host头的请求
server {
listen 80;
return 444;
}
Host头匹配流程图
Locations——where,when,how
- location指令可以用在虚拟服务器server部分,并且意味着提供来自客户端的URI或者内部重定向访问。除少数情况外,location也可以被嵌套使用,它们被作为特定的配置尽可能地处理请求。
location定义如下:
location [modifier] uri {...}
或
location @name {…}
- 命名location仅对内部访问重定向,在进入一个location之前它会保留被请求的URI部分。命名location只能够在server级别定义。
修饰符 | 处理方式 |
---|---|
= | 使用精确匹配并且终止搜索 |
~ | 区分大小写的正则表达式匹配 |
~* | 不区分大小写的正则表达式匹配 |
^~ | 如果该location是最佳的匹配,那么对于匹配这个location的字符串不再进行正则表达式检测。注意这不是一个正则表达式匹配——它的目的是优先于正则表达式的匹配 |
mail的server部分
完整的样本配置文件
user www;
worker_processes 12;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
use /dev/poll;
worker_connections 2048;
}
http {
include /opt/local/etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
server_names_hash_max_size 1024;
server {
listen 80;
return 444;
}
server {
listen 80;
server_name www.example.com;
location / {
try_files $uri $uri/ @mongrel;
}
location @mongrel {
proxy_pass http://127.0.0.1:8080;
}
}
}