Nginx配置说明

#######日志配置#######
#1.access_log指令
#access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log
#1.access_log指令
#access_log path [format [buffer=size [flush=time]]];
#access_log path format gzip[=level] [buffer=size] [flush=time];
#access_log syslog:server=address[,parameter=value] [format];
#access_log off;
#默认值: access_log logs/access.log combined;
#配置段: http, server, location, if in location, limit_except
#gzip压缩等级/buffer设置内存缓存区大小/flush保存在缓存区中的最长时间/不记录日志:access_log off;
#使用默认combined格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;

#2.log_format指令
# 格式名称
#语法: log_format name string …;默认值: log_format combined “…”;配置段: http
#log_format有一个默认的无需设置的combined日志格式,相当于apache的combined日志格式,如下所示:
#log_format  combined  '$remote_addr - $remote_user  [$time_local]  '
    #                               ' "$request"  $status  $body_bytes_sent  '
    #                               ' "$http_referer"  "$http_user_agent" ';
#如果nginx位于负载均衡器,squid,nginx反向代理之后,
#web服务器无法直接获取到客户端真实的IP地址了。
#$remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录 客户端IP地址和客户端请求的服务器地址。
#log_format  porxy  '$http_x_forwarded_for - $remote_user  [$time_local]  '
    #                         ' "$request"  $status $body_bytes_sent '
    #                        ' "$http_referer"  "$http_user_agent" ';
#日志格式允许包含的变量如下:
#$remote_addr, $http_x_forwarded_for 记录客户端IP地址
#$remote_user 记录客户端用户名称
#$request 记录请求的URL和HTTP协议
#$status 记录请求状态
#$body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。
#$bytes_sent 发送给客户端的总字节数。
#$connection 连接的序列号。
#$connection_requests 当前通过一个连接获得的请求数量。
#$msec 日志写入时间。单位为秒,精度是毫秒。
#$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。
#$http_referer 记录从哪个页面链接访问过来的
#$http_user_agent 记录客户端浏览器相关信息
#$request_length 请求的长度(包括请求行,请求头和请求正文)。
#$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
#$time_iso8601 ISO8601标准格式下的本地时间。
#$time_local 通用日志格式下的本地时间。

#3. open_log_file_cache指令
#语法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
#    open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
#open_log_file_cache off;
#默认值: open_log_file_cache off;
#配置段: http, server, location
#max 设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。
#inactive 设置存活时间,默认是10s
#min_uses 设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次
#valid 设置检查频率,默认60s
#off 禁用缓存

#4. log_not_found指令
#语法: log_not_found on | off;
#默认值: log_not_found on;
#配置段: http, server, location
#是否在error_log中记录不存在的错误。默认是。

#5. log_subrequest指令
#语法: log_subrequest on | off;
#默认值: log_subrequest off;
#配置段: http, server, location
#是否在access_log中记录子请求的访问日志。默认不记录。

#6. rewrite_log指令
#由ngx_http_rewrite_module模块提供的。用来记录重写日志的。对于调试重写规则建议开启。 Nginx重写规则指南
#语法: rewrite_log on | off;
#默认值: rewrite_log off;
#配置段: http, server, location, if
#启用时将在error log中记录notice级别的重写日志。

#7. error_log指令
#语法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];
#默认值: error_log logs/error.log error;
#配置段: main, http, server, location
###########日志配置######################################

 ####################################
    #upstream 每个设备的状态:
    #down 表示单前的server暂时不参与负载
    #weight  默认为1.weight越大,负载的权重就越大。
    #max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
    #fail_timeout:max_fails 次失败后,暂停的时间。
    #backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
    #
    #ip_hash;ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session
    # 不能在一些情况下使用:
    # 1/ nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。
# 2/ nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。
#upstream_hash:为了解决ip_hash的一些问题,可以使用upstream_hash这个第三方模块,这个模块多数情况下是用作url_hash的,但是并不妨碍将它用来做session共享
#hash   $http_x_forwarded_for;.
#这样就改成了利用x_forwarded_for这个头作因子,在nginx新版本中可支持读取cookie值,所以也可以改成:
#hash   $cookie_jsessionid;
    #
    ###################################

#http://www.cnblogs.com/lidabo/p/4169396.html
   # location 匹配可用   return xxx 来验证
   #正则前缀 [~|~*] [区分|不区分大小写]
   #普通前缀 [=|^~|@|空] [区分|不区分大小写]
   #匹配符优先级: "=" > "空精确" > "^~" > "~或~*" > "空"
   #^ 表示“非”,~ 表示“正则”;
   #“空” 特点:匹配以指定模式开始的 URI不支持正则表达式
   #“@” 内部访问符,一般用于错误页面等
 
   #匹配规则 先匹配普通location (再匹配正则表达式)
   ##普通 最大前缀匹配规则: url:/prefix/mid/t.html    location /prefix/mid/ {}| location /prefix/ {} 于是选的是location /prefix/mid/ {}
 
   #“普通location”的最大前缀匹配结果与继续搜索的“正则location ”匹配结果的决策关系。
   ##如果继续搜索的“正则location ”也有匹配上的,那么“正则location ”覆盖 “普通location ”的最大前缀匹配
   ##(因为有这个覆盖关系,所以造成有些同学以为正则location 先于普通location 执行的错误理解);
   ##但是如果“正则location ”没有能匹配上,那么就用“普通location ”的最大前缀匹配结果。
 
   #########仅使用最大前缀的情况[^~|=|exact match]#########
   #通常的规则是,匹配完了“普通location ”指令,还需要继续匹配“正则location ”,
   #但是你也可以告诉Nginx :匹配到了“普通location ”后,不再需要继续匹配“正则location ”了,
   #要做到这一点只要在“普通location ”前面加上“^~ ”符号(^ 表示“非”,~ 表示“正则”,字符意思是:不要继续匹配正则)。
   #除了上文的“^~ ”可以阻止继续搜索正则location 外,你还可以加“= ”。
   #那么如果“^~ ”和“= ”都能阻止继续搜索正则location 的话,那它们之间有什么区别呢?
   #区别很简单,共同点是它们都能阻止继续搜索正则location ,
   #不同点是“^~ ”依然遵守“最大前缀”匹配规则,然而“= ”不是“最大前缀”,而是必须是严格匹配(exact match )。
 
   #当“最大前缀”匹配恰好就是一个“严格精确(exact match )”匹配,照样会停止后面的搜索
   #假设当前配置是:location /exact/match/test.html { 配置指令块1},
   #   location /prefix/ { 配置指令块2}
   #   location ~ \.html$ { 配置指令块3} ,
   #如果我们请求 GET /prefix/index.html ,则会被匹配到指令块3 ,因为普通location /prefix/ 依据最大匹配原则能匹配当前请求,但是会被后面的正则location 覆盖;
   #当请求GET /exact/match/test.html ,会匹配到指令块1 ,因为这个是普通location 的exact match ,会禁止继续搜索正则location 。

##############################ServerName#############################################
   #server_name: 多个域名之间以空格分隔
   #【*.xxx.yyy】 ===【.xxx.yyy】 后缀
   #【nginx.*】 前缀
   #【localhost xxxx yyyyy】 不为有效域名 nginx只查找请求的HTTP头中的域名但并不判断域名是否有效
   #【""】 告诉nginx捕捉所有没有hostname的请求,或者hostname没有在其它server_name中指定的。
   #执行顺序【准确的server_name匹配】>【以通配符开始的字符串】>【以通配符结束的字符串】>【匹配正则表达式】 只有有一项匹配以后就会停止搜
   ##############################ServerName#############################################

评论