nginx【nginx配置】

1.配置总览

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}
  • 1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  • 2、events块:只有一个events块,配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • 3、http块:只有一个http块,http块可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • 4、server块:配置虚拟主机的相关参数,一个server中可以有多个location块。
  • 5、location块:配置请求的路由,以及各种页面的处理情况。

2.配置详解

  1.全局块

user nobady nobady;
描述://nginx运行时使用的用户,及用户组,默认是nobady nobady;nobady是linux中一个特殊的用户组,具体细节可以自己百度
作用://nginx运行时要对一些文件读取,改写。所以必须要使用对这些文件有对应权限的用户,才能完成读写操作
worker_processes 8;
描述://设置nginx进程数,默认为1
作用: //开得越多,处理请求的量越大,但是相应的,占用的内存也会变大,一般一个就够了,可以通过增加链接数来增加并发量。但是如果你的服务器存在大量oi操作,比如gzip压缩。那么你可以适当增加进程数量。但是最好不要超过你的cpu核心数,不然主线程很容易会掉
error_log /usr/local/nginx/logs/error.log info; //error_log 
描述:// 错误日志定义类型,[ debug | info | notice | warn | error | crit ]
作用://这个并非是全局块专有的配置项,在events、http、server、location中都可以设置,它们之间的区别就是,在全局块中设置,那么此配置将对所有块生效,如果在局部块设置,http,server,location,请注意error_log日志并不能自定义格式
那么他只生效于当前块,如在全局块中设置,那么在局部块中,没有设置error_log的局部块,所有的日志文件将会都写入到/usr/local/nginx/logs/error.log 中,如果同时设置了全局全和局部块,那么作用范围越精确的优先级越高
案例://error_log 日志存放地址 日志格式
access_log /usr/local/nginx/logs/host.access.log combined
描述:// 访问日志,默认格式为combined,access_log 可以使用自定义的日志格式
log_format access '$remote_addr - $remote_user [$time_local]
描述://自定义的日志格式,可以作为access_log第二个参数使用,请注意access_log使用前,需要先定义
作用: //自定义日志输出那些内容,具体使用方法,常用参数
pid /usr/local/nginx/logs/nginx.pid;
描述://指定nginx在linux系统运行时pid的存放目录
worker_rlimit_nofile 65535; 
描述: //指定nginx在运行时最多能打开的多少个文件文件,现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4 万时就有进程可能超过10240了,这时会返回502错误

  2.events块

use epoll;
描述: //nginx使用的事件模型
拓展://事件模型了解
worker_connections 65535;
描述: //单个进程最大连接数(最大连接数=连接数*进程数,根据硬件调整,和前面工作进程配合起来用,尽量大,但是给cpu预留10%的缓冲。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
keepalive_timeout 60;
描述://keepalive超时时间,默认是60s,切记这个参数也不能设置过大!否则会导致许多无效的http连接占据着nginx的连接数,终nginx崩溃!
拓展: //什么是keepalive
client_header_buffer_size 4k;
描述://客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
  //分页大小可以用命令getconf PAGESIZE 取得。
  //[root@web001 ~]# getconf PAGESIZE
  //4096
  //但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数
open_file_cache max=65535 inactive=60s;
描述: //这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

 
open_file_cache_valid 60s;
描述: //这个是指多长时间检查一次缓存的有效信息。语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.
open_file_cache_min_uses 1;
描述: //open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值
,文件描述符在cache中总是打开状态.
open_file_cache_errors on;
描述: //open_file_cache_errors on | off 默认值:open_file_cache_errors off使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误.

  3.http块

include mime.types;
描述://文件扩展名与文件类型映射表
default_type application/octet-stream;
描述://默认文件类型
charset utf-8;
描述://默认编码
server_names_hash_bucket_size 128;
描述: //服务器名字的hash表大小保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,
使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。
因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.
client_header_buffer_size 32k;
描述: //客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。
large_client_header_buffers 4 64k;
描述: //客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取。
 
client_max_body_size 8m;
描述: //设定通过nginx上传文件的大小
sendfile on;
描述: //开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
autoindex on;
描述: //开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on;
描述: //此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用,告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。就是说数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞
tcp_nodelay on;
描述: //告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值
keepalive_timeout 120;
描述: //长连接超时时间,单位是秒
 
FastCGI
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
keys_zone=TEST:10m inactive=5m;
描述: //FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
这个指令为FastCGI缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间

fastcgi_connect_timeout 300;
描述: //指定连接到后端FastCGI的超时时间

fastcgi_send_timeout 300;
描述: //向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间

fastcgi_read_timeout 300;
描述: //接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间

fastcgi_buffer_size 64k;
描述: //指定读取FastCGI应答第一部分 需要用多大的缓冲区,这里可以设置为fastcgi_buffers指令指定的缓冲区大小,上面的指令指定它将使用1个 16k的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过1k),
但是你如果在fastcgi_buffers指令中指定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存 fastcgi_buffers 4 64k; 描述://指定本地需要用多少和多大的缓冲区来 缓冲FastCGI的应答,如上所示,如果一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,如果大于256k,增大 于256k的部分会缓存到fastcgi_temp指定的路径中,
当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值 的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值,比如你的站点大部分脚本所产生的页面大小为 256k就可以把这个值设置为16 16k,或者464k 或者64 4k,
但很显然,后两种并不是好的设置方法,因为如果产生的页面只有32k,如果用464k它会分配1个64k的缓冲区去缓存,而如果使用64 4k它会分配8个4k的缓冲区去缓存,而如果使用16 16k则它会分配2个16k去缓存页面,这样看起来似乎更加合理• fastcgi_buffers 4 64k; 描述: //这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffers的两倍 fastcgi_temp_file_write_size 128k; 描述: //在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍 fastcgi_cache TEST 描述: //开启FastCGI缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU负载,并且防止502错误。但是这个缓存会引起很多问题,因为它缓存的是动态页面。具体使用还需根据自己的需求 fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; 描述://为指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟 fastcgi_cache_min_uses 1; 描述: //缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数,如上例,如果在5分钟内某文件1次也没有被使用,那么这个文件将被移除
gzip模块设置
gzip  on;  
描述:  //开启压缩 

gzip_min_length 2k; 
描述: //设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于2k的字节数,小于2k可能会越压越大。

gzip_buffers 4 16k; 
描述: //设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。 
 # 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。 

gzip_comp_level 5; 
描述: //压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间 

gzip_types text/plain application/x-
javascript text/css application/xml;
描述: 
  默认值: gzip_types text/html (默认不对js/css文件进行压缩) 
 1.压缩类型,匹配MIME类型进行压缩 
 2.不能用通配符 text/* 
 3.(无论是否指定)text/html默认已经压缩  
 4.设置哪压缩种文本文件可参考 conf/mime.types 

gzip_http_version 1.0  
描述: //值为1.0和1.1 代表是否压缩http协议1.0,选择1.0则1.0和1.1都可以压缩 

gzip_disable "MSIE [1-6]\.";  
描述: //IE6及以下禁止压缩 

gzip_proxied expired no-cache no-store private auth; 
描述: //Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含"Via"的 header头。 
参数:
 1. 默认值:off   
 2.off - 关闭所有的代理结果数据的压缩 
 3.expired - 启用压缩,如果header头中包含 "Expires" 头信息 
 4.no-cache - 启用压缩,如果header头中包含 "Cache-Control:no-cache" 头信息 
 5.no-store - 启用压缩,如果header头中包含 "Cache-Control:no-store" 头信息 
 6.private - 启用压缩,如果header头中包含 "Cache-Control:private" 头信息 
 7.no_last_modified - 启用压缩,如果header头中不包含 "Last-Modified" 头信息 
 8.no_etag - 启用压缩 ,如果header头中不包含 "ETag" 头信息 
 9.auth - 启用压缩 , 如果header头中包含 "Authorization" 头信息 
 10.any - 无条件启用压缩 

gzip_vary on; 
描述: //给CDN和代理服务器使用,针对相同url,可以根据头信息返回压缩和非压缩副本 

limit_zone crawler $binary_remote_addr 10m;
描述: //开启限制IP连接数的时候需要使用

负载均衡配置

upstream www.xx.com  {
1.轮询
upstream bakend {
     ip_hash;
     server 192.168.0.14 weight=10;
     server 192.168.0.15 weight=10;
server 192.168.0.16 down;   }; 描述:根据时间顺序分配服务器
参数: a. weight:表示权重,权重越高,表示被访问的几率越大,0.14服务被访问的几率是50%,0.15是50% b. ip_hash:根据访问ip的hash去分配服务器 作用:如果某个用户在a服务器上登录了,并且a服务器上存储了他的身份信息,那么如果后续访问的请求被分发到了b服务器上,那么就会造成会话信息丢失。通过设置ip_hash的话,就可以让同一个ip地址,一直被分发到同一个服务器,
这样就避免了会话信息缺失的现象
c. down:表示当前服务暂时挂起,不参与负载;
d. backup:表示当前服务作为备用服务,只有其他非backup服务down或者忙了的时候才会参与负载。
e. max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误


f. fail_timeout:在max_fails失败后,服务挂起时间


2.权重
upstream bakend {
     ip_hash;
     server 192.168.0.14 weight=30;
     server 192.168.0.15 weight=70;
  };
描述:根据时间顺序分配服务器
参数: a. weight:表示权重,权重越高,表示被访问的几率越大,0.14服务被访问的几率是30%,0.15是70%
3.以服务器响应时间来分配请求,响应时间短的优先(第三方库)
 upstream backend {


ip_hash;


server 192.168.0.14;


server 192.168.0.15;


fair;


}


描述:以服务器的响应时间来分配请求
注意:server中不能配置weight
4.按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
 upstream backend {


ip_hash;


server 192.168.0.14;


server 192.168.0.15;


hash $reqquest_uri;


hash_method crc32;


}


描述:以服务器的响应时间来分配请求
注意:server中不能配置weight
参数:
  按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。


  在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
}  

  4.server块

server    {
listen 80;
描述:监听端口号
server_name www.xxx.com www.yyy.com;
描述: 监听请求域名 可以设置多个,需要用空格隔开
root html;
描述: 根目录,例:客户端请求的地址是http://www.xxx.com/web/index.html;那么映射到nginx所在的服务器上就是html/web/index.html;
注意: root也可以设置在location中,一旦在server和location中都设置了root,那么优先生效的将会是location中的root
index index.html index.htm index.php;
描述:首页,可配置多个首页
}

  5.location块

server  {
  location  .*\.(js|css)  { //匹配所有的js和css请求
描述:location是我们可配置的最小块,它就相当于一个路由,可以细致化的去定义如何处理收到的请求,例:收到js|css请求,收到img该如何处理,我们可以修改其匹配规则,去匹配处理不同的请求。
root html;//资源根目录
error_log
  }
}

 注解

  1.日志格式

1.默认日志格式 combined
日志内容:// http, server, location, if in location, limit_except3.自定义日志格式 a.日志格式参数说明 (1).$remote_addr 与$http_x_forwarded_for //用以记录客户端的ip地址; (2).$remote_user //用来记录客户端用户名称; (3).$time_local //用来记录访问时间与时区; (4).$request //用来记录请求的url与http协议; (5).$status //用来记录请求状态;成功是200, (6).$body_bytes_sent //记录发送给客户端文件主体内容大小; (7).$http_referer //用来记录从那个页面链接访问过来的; (8).$http_user_agent //记录客户端浏览器的相关信息;
b.案例
log_format access test '$http_x_forwarded_for-$remote_user-$time_local-$request'  //表明创建一个名为test的日志格式,输出格式为:客户端ip地址-客户端用户名称-访问时间-请求的url与http协议

  2.事件模型

 #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll]; epoll模型
 #是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
 #补充说明:
 #与apache相类,nginx针对不同的操作系统,有不同的事件模型
 #A)标准事件模型
 #Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
 #B)高效事件模型
 #Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
 #Epoll:使用于Linux内核2.6版本及以后的系统。
 #/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX6.5.15+ 和 Tru64 UNIX 5.1A+。
 #Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。