Nginx 配置文件详解(二)

http 块配置

http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。

前面已经提到,http块中可以包含自己的全局块,也可以包含server块,server块中又可以进一步包含location块,在本书中我们使用“http全局块”来表示http中自己的全局块,即http块中不包含在server块中的部分。

可以在http全局块中配置的指令包括文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。

http 全局块配置

引入文件

在浏览器中可以显示的内容有HTML、XML、PNG、GIF及Flash等种类繁多的文本、媒体等资源,浏览器为区分这些资源,需要使用MIME Type。换言之,MIME Type是网络资源的媒体类型。Nginx服务器作为Web服务器,必须能够识别前端请求的资源类型。

#包含其他的配置文件,可以放在配置文件的任何地方,但是要注意你包含进来的配置文件一定符合配置规范
#比如说你include进来的配置是worker_processes指令的配置,而你将这个指令包含到了http块中
#这肯定是不行的
include mime.types; #  #文件扩展名与文件类型映射表

default_type  application/octet-stream; #设置输出文件类型,默认为text/plain
设置Nginx访问日志格式及存放路径

Nginx日志对于统计、系统服务排错很有用。Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志)。通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。

可以应用access_log指令的作用域分别有httpserverlocationlimit_except。也就是说,在这几个作用域外使用该指令,Nginx会报错。

#以下为主要变量说明:
# $bytes_sent	发送给客户端的总字节数
# $body_bytes_sent	发送给客户端的字节数,不包括响应头的大小
# $connection	连接序列号
# $connection_requests	当前通过连接发出的请求数量
# $msec	日志写入时间,单位为秒,精度是毫秒
# $pipe	如果请求是通过http流水线发送,则其值为"p",否则为“."
# $request_length	请求长度(包括请求行,请求头和请求体)
# $request_time	请求处理时长,单位为秒,精度为毫秒,从接受用户请求的第一个字节到发送完响应数据的实际,
# 包括接受请求数据的实际、程序响应时间、输出数据时间
# $status 服务器响应状态码
# $time_iso8601	标准格式的本地时间,形如“2017-05-24T18:31:27+08:00”
# $time_local	通用日志格式下的本地时间,如"24/May/2017:18:31:27 +0800"
# $host:客户端请求的Host头域值
# $http_referer	表示从哪个链接跳转过来
# $http_user_agent	客户端浏览器信息。
# $remote_addr	客户端IP
# $http_x_forwarded_for	当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是
# 代理服务器也要进行相关的x_forwarded_for设置。
# $request	完整的原始请求行,如 "GET / HTTP/1.1"
# $remote_user	客户端用户名称,针对启用了用户认证的请求
# $request_uri:表示完整的请求地址,如 "https://daojia.com/"
log_format main '$remote_addr$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式


# 设置访问日志
# access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
# path 指定日志的存放位置。
# format 指定日志的格式。默认使用预定义的combined。
# buffer 用来指定日志写入时的缓存大小。默认是64k,含义是日志先同步到缓存中,这样提升性能,避免每产生
# 一条日志都立即写入磁盘文件。
# gzip 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。默认是1。
# flush 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。
# if 条件判断。如果指定的条件计算为0或空字符串,那么该请求不会写入日志。
# access_log log/access.log main; 
# Nginx预定义了名为combined日志格式,如果不想使用可以如上使用自定义规则 main
access_log /var/logs/nginx-access.log buffer=32k gzip flush=1m  


# 关闭访问日志
access_log off; 
设置连接方向
# 配置连接超时时间,保持连接的时长默认为75秒,指定客户端连接保持活动的超时时间,超过这个时间服务器就
# 自动断开连接,此指令可以在http块、server块或location块中配置。
# !!!但是有些浏览器最多只保持 60 秒,所以统一设置为 60
# 与用户建立会话连接后,Nginx服务器可以保持这些连接打开一段时间
# timeout,服务器端对连接的保持时间
# header_timeout,可选项,在应答报文头部的
# Keep-Alive域设置超时时间:“Keep-Alive:timeout= header_timeout”。
# 报文中的这个指令可以被Mozilla或者Konqueror识别。
keepalive_timeout timeout [header_timeout]

# 下面配置的含义是,在服务器端保持连接的时间设置为60 s,发给用户端的应答报文头部中Keep-Alive域的
#超时时间设置为50 s。
keepalive_timeout 60 50

# 一次长连接允许发起的最大请求数量,用户与服务器建立连接后,通过此连接可以发起的最多多少次请求,
# 此指令可以在http块、server块或location块中配置。
# Nginx服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制
# 用户通过某一连接向Nginx服务器发送请求的次数。默认是100
keepalive_requests number;

#对某些老版本的浏览器不使用长连接,none表示对老版本浏览器不做禁用 msie6 表示对微软的IE6禁用长连接
#该参数可以定义在http{}段中,也可以定义在server{}段中、location{}段中
keepalive_disable [msie6|safari|none] 

设置 TCP 相关
#指定是否使用sendfile系统调用来传输文件。
#sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和
#用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。
#sendfile 是一个系统调用,直接在内核空间完成文件发送,不需要先 read 再 write,没有上下文切换开销。
#默认为off,可以在http块,server块,location块。
sendfile on; 


#设置sendfile最大数据量,此指令可以在http块、server块或location块中配置
#其中,size值如果大于0,Nginx进程的每个worker process每次调用sendfile()传输的数据量最大不能超过
#这个值(这里是128k,所以每次不能超过128k);如果设置为0,则无限制。默认值为0。
# sendfile_max_chunk size;
sendfile_max_chunk 128K;

#tcp_nopush 是 FreeBSD 的一个 socket 选项,对应 Linux 的 TCP_CORK,Nginx 里统一用 tcp_nopush
#来控制它,并且只有在启用了 sendfile 之后才生效。启用它之后,数据包会累计到一定大小之后才会发送,
#减小了额外开销,提高网络效率。
#只有在sendfile启用时,改参数启用才生效
#该参数可以定义在http{}段中,也可以定义在server{}段中、location{}段中 
tcp_nopush on; 

#TCP_NODELAY 也是一个 socket 选项,启用后会禁用 Nagle 算法,尽快发送数据,某些情况下可以节约
#200ms(Nagle 算法原理是:在发出去的数据还未被确认之前,新生成的小数据先存起来,凑满一个 MSS 或者
#等到收到确认后再发送)。Nginx 只会针对处于 keep-alive 状态的 TCP 连接才会启用 tcp_nodelay。
tcp_nodelay on;

#可以看到 TCP_NOPUSH 是要等数据包累积到一定大小才发送,TCP_NODELAY 是要尽快发送,二者相互矛盾。实际上,它们确实可以一起用,最终的效果是先填满包,再尽快发送。
设置 gzip 相关

Nginx是一个高性能的HTTP和反向代理服务器,默认提供了gzip的压缩模块:ngx_http_gzip_module
模块的最开头便介绍道:能帮助我们减少一半甚至更多的传输数据大小。

#我们在上线前,代码(JS、CSS 和 HTML)会做压缩,图片也会做压缩。对于文本文件,在服务端发送响应之前进行
#GZip 压缩也很重要,通常压缩后的文本大小会减小到原来的 1/4 - 1/3。
#是否开启gzip功能,也就是在服务器响应客户端是是否把响应数据进行压缩,默认为off
#这个参数可以设置在在http{}段中、server{}段中、location {}段中 
gzip on;

#用于设置在使用压缩功能时,是否发送带有Vary:Accept-Econding头的响应信息。该参数主要是告诉数据
#接收方,数据经过了压缩
#开启效果是客户端接收的响应头部中增加了 Accept-Ecoding:gzip的信息。
gzip_vary on;

#压缩等级.1压缩比最小,处理速度快.9压缩比最大,比较消耗cpu资源,处理速度最慢,
#但是因为压缩比最大,所以包最小,传输速度快
gzip_comp_level 6; 

#gzip实现压缩的时候使用缓冲的大小,第一个参数是缓存空间个数,第二个是缓存大小。
#认情况下size大小为一个内存页,4K或者8K,取决于系统一个内存页的大小。
#这个参数可以设置在在http{}段中、server{}段中、location {}段中
gzip_buffers 16 8k; 

#内容长度大于多少字节时才压缩,页面字节数从header偷得content-length中获取。
#默认是20,不管页面多大都进行压缩.建议设置成大于1k的字节数,小于1k可能会越压越大。
#因为对于数据量大压缩才明显,小数据压缩不明显而且还消耗资源。也就是当响应页面大于该值时才启用压缩。
#响应页面大小可以通过HTTP响应头中的Content-Length指令获取。不过由于ngx_http_gzip_module
#通常使用Chunked动态编码压缩,所以Conten-Length或不存在或者被忽略,该指令不起作用。
#这个参数可以设置在在http{}段中、server{}段中、location {}段中
gzip_min_length 1k; 

#默认情况下,nginx不会对被代理的请求进行压缩,它通过Via头识别请求是不是被代理过。如果要对被代理的请求
#进行压缩,可以配置这个参数
#off	不压缩所有被代理的请求
#expired	如果返回头包含Expires,则开启压缩
#no-cached	如果返回头包含Cache-Control,值为no-cache,则开启压缩
#no-store	如果返回头包含Cache-Control,值为no-store,则开启压缩
#private	如果返回头包含Cache-Control,值为private,则开启压缩
#no_last_modified	如果返回头没有包含Last-Modified,则开启压缩
#no_etag	如果返回头没有包含ETag,则开启压缩
#auth	如果请求头包含Authorization,则开启压缩
#any	压缩所有被代理请求
gzip_proxied no-cache no-store private expired auth;

#gzip_disable 指令接受一个正则表达式,当请求头中的 UserAgent 字段满足这个正则时,
#响应不会启用 GZip,这是为了解决在某些浏览器启用 GZip 带来的问题。特别地,指令值 msie6 
#等价于 MSIE [4-6]\.,但性能更好一些。另外,Nginx 0.8.11 后,msie6 并不会匹配 UA 包含 SV1 
#的 IE6(例如 Windows XP SP2 上的 IE6),因为这个版本的 IE6 已经修复了关于 GZip 的若干 Bug。
gzip_disable "msie6";

#默认 Nginx 只会针对 HTTP/1.1 及以上的请求才会启用 GZip,因为部分早期的 HTTP/1.0 客户端在处理 GZip
#时有 Bug。现在基本上可以忽略这种情况,于是可以指定 gzip_http_version 1.0 来针对 HTTP/1.0 及以上的请
#求开启 GZip。
gzip_http_version 1.0; 

#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn.
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

#当开启时,如果客户端浏览器不支持压缩,那么Nginx将返回解压后的数据;如果支持压缩将忽略此选项。
gunzip_static on; 
设置客户端相关
#客户端请求首部超时时间,定义服务器读取客户端请求首部的最长时间,如果在段时间内
#客户端无法完成发送完整的客户端请求首部信息,则返回给客户端408超时错误信息。默认60秒。
#该参数可以定义在http{}段中,也可以定义在server{}段中。
client_header_timeout 60s; 

#读取HTTP请求的包体的超时时长,道理和上面一样。默认也是60秒
#该参数可以定义在http{}段中,也可以定义在server{}段中。
client_body_timeout 60s; 

#设置读取客户端请求头的缓冲区大小,通常来说1K就够用,但是如果客户端请求中包含一个比较大的cookies或者是来自WAP客户端,
#那么1K就不够了,这是可能收到Nginx 400的错误,而且不是每次都收到,所以排查困难。一般这个大小都是系统分页的倍数。可用
#getconf PAGESIZE来获取。
client_header_buffer_size 4k; 

#设置允许的客户端最大请求包体大小,客户端发一个特别大的请求,服务器拒绝。默认1M。
#这个参数可以设置在http{}段中、server{}段中以及location {}段中。
#在允许用户上传时的场景下,设置这个很有用。用户上传时它的body首部中的Content-length就会
#有上传的这个包的大小。
client_max_body_size 1m; 

#发送响应超时时长,服务器端要发送响应数据给客户端,客户端不接收或者因某种原因客户端没有收到,那么服务端最多等多久
#这个不是说整个响应的传输时长。这个超时时间生效条件是在客户端和服务器成功建立连接之后,
#这个参数可以设置在在http{}段中、server{}段中以及location {}段中
send_timeout 60s; 

#限制客户端每秒上传的字节数量,就是为了避免把服务器带宽都占用了。默认0,无限制。
#这个参数可以设置在在http{}段中、server{}段中、location {}段中以及if in location中
limit_rate 0; 

#nginx向客户端发送响应报文时,如果超出了设定的时长,那么就开始限速,这里限制的是
#客户端的下载速率,这个速率是从limit_rate中获取的。所以这里不需要指定,只需要指定
#超时时间就可以,默认是0,也就是没有时长限制。
#这个参数可以设置在在http{}段中、server{}段中、location {}段中以及if in location中
limit_rate_after 0; 
设置fastcgi相关
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
#指定连接到后端FastCGI 的超时时间。
fastcgi_connect_timeout 300; 

#读取 是指nginx进程向fastcgi进程发送request的整个过程的超时时间
fastcgi_send_timeout 300;

#发请求 是指fastcgi进程向nginx进程发送response的整个过程的超时时间
fastcgi_read_timeout 300;

#指定读取FastCGI 应答第一部分需要用多大的缓冲区
fastcgi_buffer_size 64k;

#指定本地需要用多少和多大的缓冲区来缓冲 FastCGI 的应答。
fastcgi_buffers 4 64k;

#默认值是 fastcgi_buffers 的两倍。
fastcgi_busy_buffers_size 128k;

#在写入 fastcgi_temp_path 时将用多大的数据块,默认值是 fastcgi_buffers 的两倍。
fastcgi_temp_file_write_size 128k; 
其它
#开启压缩功能的一些问题:很多WEB服务器都支持压缩比如IIS、Tomcat、Apache等。如果前端Nginx
#也开启了压缩,就相当于数据经过了2层压缩,比如如果Nginx和Tomcat都开启对JavaScript脚本进行
#压缩的话,在很多浏览器都会出现脚本运行异常的情况,只有在chrome浏览器正常。表现的现象是首次
#运行正常,再次刷新就304.你把其中一台服务器的压缩功能关闭就可以了。 
#是否打开文件缓存功能,它缓存的是文件描述符、大小、修改时间、目录结构以及查找文件时的错误,
#比如文件没有找到,如果要开启的话 open_file_cache max=N [inactive=time],设置一个最大
#缓存条目,如果满了则根据LNU算法进行置换,以及每个缓存元素的活动时长,默认60秒,也就是说在指定
#时间内没有被访问过,就会被从缓存中移除。
#这个参数可以设置在在http{}段中、server{}段中、location {}段中
open_file_cache off; 

#设置是否缓存在文件查找是出现的文件查找错误信息。这些错误信息是因为启用了open_file_cache功能才会有的
#默认是OFF则表示不缓存错误信息,这个参数可以设置在在http{}段中、server{}段中、location {}段中
#该参数要在open_file_cache on时才有意义
open_file_cache_errors off; 

#设置多久检测一次缓存内容的是否有效,默认60秒,该参数要在open_file_cache on时才有意义
#这个参数可以设置在在http{}段中、server{}段中、location {}段中
open_file_cache_valid 60s; 

#在非活动时长内,一个缓存条目被访问的次数超过这里定义的次数,那么这个条目即便超过了非活动时长
#也不会被删除。这个非活动时长就是open_file_cache max=N inactive=60s;中定义的。
open_file_cache_min_use 1; 

#控制如果客户端请求首部是一个无效信息,服务器是否忽略。默认是on,就是忽略。
ignore_invalid_headers on; 

#当用户访问一个文件,如果该文件不存在,是否把这个信息记录到错误日志中。默认是开启。on。
#这个参数可以设置在在http{}段中、server{}段中、location {}段中
log_not_found on; 

#是否在错误页面中显示Nginx版本号,默认是显示的,也就是ON #这个参数可以设置在在http{}段中、server{}段中、location {}段中
server_tokens off; 

server 块配置

server块和“虚拟主机”的概念有密切联系。

虚拟主机,又称虚拟服务器、主机空间或是网页空间,它是一种技术。该技术是为了节省互联网服务器硬件成本而出现的。这里的“主机”或“空间”是由实体的服务器延伸而来,硬件系统可以基于服务器群,或者单个服务器等。虚拟主机技术主要应用于HTTP、FTP及EMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。从用户角度来看,一台虚拟主机和一台独立的硬件主机是完全一样的。

在使用Nginx服务器提供Web服务时,利用虚拟主机的技术就可以避免为每一个要运行的网站提供单独的Nginx服务器,也无需为每个网站对应运行一组Nginx进程。虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站。

在前面提到过,每一个http块都可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)。

和http块相同,server块也可以包含自己的全局块,同时可以包含多个location块。在server全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或IP配置。

配置网络监听
# 配置网络监听,主要有三种方式
# 第一种配置监听 IP 地址
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

# 第二种配置监听端口
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

第三种配置 UNIX Domain Socket
listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Default:	

#address:IP地址,如果是 IPv6 的地址,需要使用中括号“[]”括起来,比如[fe80::1]等。

#port:端口号,如果只定义了 IP 地址,没有定义端口号,默认使用 80 端口号。

#path:socket 文件路径,如 /var/run/nginx.sock 等。

#default_server:将所在的server块作为整个web服务的默认server块。
#如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块。
#需要默认虚拟主机的原因是,当一个请求无法匹配配置文件中的所有主机域名时,就需要使用默认虚拟主机。

#setfib=number:Nginx-0.8.44 中使用这个变量为监听socket关联路由表,目前只对 FreeBSD 起作用,不常用

#backlog=number:表示TCP中backlog队列的大小。在 FreeBSD 中默认为-1,其它平台默认为 511,表示不予设置,在TCP建立三次握手的过程中,
#进程还没有开始处理监听句柄,这时backlog队列将会防止这些新连接,可如果backlog队列已满,
#还有新的客户端试图通过三次握手建立TCP连接,这时客户端将建立失败。

#revbuf=size:设置监听 socket 接收缓存区大小。

#sndbuf=size:设置监听 socket 发送缓存区大小。

#deferred:将 accept() 设置为 Deferred 模式。在设置该参数后,若用户发起建立连接请求,并且完成了TCP的三次握手,内核也不会为了
#这次的连接调度worker进程来处理,只有用户真的发送请求数据时,(内核已经在网卡中受到请求数据包),
#内核才会唤醒worker进程处理这个连接,这个参数适用于大并发的情况下,它减轻了worker进程的负担,
#当请求数据来临时,worker进程才会开始处理这个连接。

#accept_filter:设置accept过滤器,只对FreeBSD操作系统有用。

#bind:绑定当前端口/地址对。如127.0.0.1:8000。一般情况下,对于端口相同而 IP 地址不同的多个连接,
#Nginx 服务器将只使用一个监听命令,并使用 bind() 处理端口相同的所有连接。

#ssl:在当前监听的端口上建立的连接必须基于ssl协议,此标识符和Nginx服务器提供的 HTTPS 服务有关。

#默认设置监听,即监听所有地址的 80 端口和8000端口
listen *:80 | *:8000; 

举例:
#监听具体的 IP 和 具体的端口号上的连接 
listen 192.168.1.10:8000;
#监听具体 IP 上的所有连接
listen 192.168.1.10;
#监听具体端口号上的所有 IP 连接, 等同于 listen *:8000; 
listen 8000;
主机名称配置
server_name name []; # 默认server_name “”;
server_name 后可以跟多个主机名称,如server_name www.web.com web.com test.web.com;
server_name 与host的匹配优先级如下:
1、首先选择所有字符串完全匹配的server_name,如www.web.com.
2、其次选择通配符在前面的server_name,如*.web.com。
3、在其次选择通配符在后面的server_name,如www.web.*。
4、最后选择使用正则表达式才匹配的server_name,如~^.web.com$。
#支持使用通配符和正则表达式。比如 *.a.com  www.a.* 
#但是通配符只能用在三或者两段字符串组成的域名的首部或者尾部。 
其它
# 设置字符集
charset utf-8;

# 设置访问首页
#配置块:http、server、location
#index file …;#默认:index index.html;
#访问站点的URI时/,这时一般时返回网站的首页,而这与root和alias都不同,
#这里用nginx_http_index_module模块提供的index配置实现,index后可以跟多个文件参数,
#ngiunx将会按照顺序来访问这些文件
index index.php;

#定义资源文件相对于HTTP请求的根目录
#可以用在http段、server段、location段,如果用在http段,则对所有的server段生效,
#如果用在server段,则对server段下的所有的location生效。
root /home/wwwroot/hewaApi/public;

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值