nginx常用配置


1. nginx.conf
2.upstream配置
3.location匹配规则
4.其他

一.nginx.conf
常用配置:
1、user #指定使用的用户和用户组,例如 user www www
2、worker_processes #指定衍生的工作进程数,一般为cpu总核数或其2倍;利用ps –ef |grep “nginx”可以查看到有一个主nginx,其他几个衍生的工作进程数
3、error_log #指定nginx错误日志的路径和级别,级别分为debug,info,notice,warn,error,crit(debug最详细,crit最少)
4、pid ,#指定nginx主进程id的文件存放路径
5、worker_rlimit_nofile ,一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。Ps:默认的linux文件句柄数为1024,在高并发web应用时必须修改。
6、events内部设置:
6.1 use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ,#使用的网络I/O模型,epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
6.2 worker_connections 允许的连接数,要小于系统的文件句柄数
7、http内部设置:
7.1 include mime.types(文件扩展名与文件类型映射表, 一定要有!!) 
7.2 charset utf-8; #默认字符集,如不确定网站字符集,则不要设置,通过html的meta标签指定。
#user nobody;
worker_processes 12;
error_log /opt/logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 51200
events {
    use epoll;
    worker_connections 10240;
}
http {
    #设定http服务器 include mime.types(包含的mime.types文件,指定支持的MIME)          log_format main … upstream backend1 {#负载均衡的后端服务 }
upstream backend2 { }
server {#对外提供的虚拟主机 … location /{ } } }

二.Upstream配置
2.1 轮询方式(默认)
默认的负载均衡方式,适用:后端服务器性能差不多情况,每个请求按时间顺序逐一分配到不同的后端服务器(例子中的14和15) ,如果后端服务器down掉,能自动剔除。
upstream bakend {  
      server 192.168.0.14;    
      server 192.168.0.15;  
  }
2.2 weight 指定轮询几率,weight和访问比率成正比.适用:后端服务器性能不均的情况。 upstream bakend {
         server 192.168.0.14 weight=10;
        server 192.168.0.15; #默认为1    
}
假如有11个请求,将有10个打到14上,默认是1 2.3 ip_hash 根据来源IP和后端配置来做hash分配,确保固定IP只访问一个后端。
upstream bakend {
        ip_hash;
        server 192.168.0.14;
        server 192.168.0.15;
    }
ip_hash优点: ip下的某个客户端和某个后端就能建立起稳固的session ip_hash不适用场合: nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用 的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。 注意: 无法将权重(weight)与ip_hash联合使用来分发连接。 backup无法和ip_hash指令搭配使用。
2.4 fair 根据后端服务的响应时间来分配,响应时间短的后端优先分配。
upstream bakend {
        server 192.168.0.14;
        server 192.168.0.15;
        fair;
    }
注意:这种方式,需要nginx安装Upstream Fair Balancer 模块
2.5 自定义hash 根据给定的字符串进行Hash分配,例如根据请求的url进行分配(适用后端有本地缓存)
upstream bakend {
         192.168.0.14;
         server 192.168.0.15;
         hash $request_uri;
         hash_method crc32;   
}
注意:这种方式,需要安装Upstream Hash 模块
2.6 其他 upstream每个后端的可设置参数为:
    1.down: 表示此台server暂时不参与负载。
    2.weight: 默认为1,weight越大,负载的权重就越大。
    3.max_fails: 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误。
   4.fail_timeout: max_fails次失败后,暂停的时间。
   5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器,应急措施。

三.location匹配规则 语法规则:
location [=|~|~*|^~] /uri/ {…} 1、= 开头表示精确匹配 
2、^~ 开头表示uri以某个常规字符串开头。 
3、~ 开头表示区分大小写的正则匹配  ~*  开头表示不区分大小写的正则匹配  !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则 
4、/ 通用匹配,任何请求都会匹配到。 注意:nginx会优先选择rewrite,然后再进入location nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。 多个location的匹配次序: 首先匹配 =,其次匹配^~, 再次是按nginx.conf文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。 注意:如果字符串以^~开头的,当匹配成功时,不会继续匹配正则表达式 但如果不是以^~开头,当匹配成功时,还会继续下面的正则表达式匹配,如果正则表达式匹配成功,将进入对应的规则里处理请求,如果正则不成功,才会进入之前的字符串匹配的location里进行处理。具体见下页的例子!
[img]http://dl2.iteye.com/upload/attachment/0124/0542/69e76245-36f2-3789-8cfb-1bb4b2c01a27.png" alt="

[/img]
  例子: / -> configuration A
/index.html -> configuration B
/documents/document.html -> configuration C
/images/1.gif -> configuration D
/documents/1.jpg -> configuration E (虽然在C匹配成功了,但没有以^~开头,所以继续要和下面的正则匹配)
注意:即使上面location的次序随意上下改动,匹配结果还是一样的。
四.压缩-其他
1.gzip 开启或者关闭gzip模块 语法: gzip on|off 默认值: gzip off 作用域: http, server, location, if (x) location
2.gzip_buffers 缓存设置 语法: gzip_buffers number size 默认值: gzip_buffers 4 4k/8k 作用域: http, server, location 例子: gzip_buffers 4 16k;//设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,按照原始数据大小以16k为单位的4倍申请内存。 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
3.gzip_comp_level -压缩比设置 语法: gzip_comp_level 1..9 默认值: gzip_comp_level 1 作用域: http, server, location
4.gzip_min_length –允许压缩的页面最小字节数 语法: gzip_min_length length 默认值: gzip_min_length 0 作用域: http, server, location 注意: gzip_comp_level,gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。 gzip_min_length 1k;//设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。 建议设置成大于1k的字节数,小于1k可能会越压越大。
5.gzip_http_version http版本 语法: gzip_http_version 1.0|1.1 默认值: gzip_http_version 1.1 作用域: http, server, location
6.gzip_proxied 语法: gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] … 默认值: gzip_proxied off 作用域: http, server, location
7.gzip_types 匹配MIME压缩 语法: gzip_types mime-type [mime-type ...] 默认值: gzip_types text/html 作用域: http, server, location
注意:
1、gzip_http_version 识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。 注:21世纪都来了,现在除了类似于百度的蜘蛛之类的东西不支持自解压,99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可。
2、gzip_proxied Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含”Via”的 header头。 off – 关闭所有的代理结果数据的压缩 expired – 启用压缩,如果header头中包含 “Expires” 头信息 no-cache – 启用压缩,如果header头中包含 “Cache-Control:no-cache” 头信息 no-store – 启用压缩,如果header头中包含 “Cache-Control:no-store” 头信息 private – 启用压缩,如果header头中包含 “Cache-Control:private” 头信息 no_last_modified – 启用压缩,如果header头中不包含 “Last-Modified” 头信息 no_etag – 启用压缩 ,如果header头中不包含 “ETag” 头信息 auth – 启用压缩 , 如果header头中包含 “Authorization” 头信息 any – 无条件启用压缩
3、gzip_types 匹配MIME类型进行压缩,(无论是否指定)”text/html”类型总是会被压缩的。注意:如果作为http server来使用,主配置文件中要包含文件类型配置文件 (默认include mime.types,当前目录下的mime.types文件),例如: http { include mime.types; ...... }
五.ip限制
在server内,或者在location内
location / {
    deny 192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16; deny all;
}
六.内置变量
$nginx_version
$args, 请求中的参数;
$content_length, HTTP请求信息里的"Content-Length";
$content_type, 请求信息里的"Content-Type";
$document_root, 针对当前请求的根路径设置值;
$document_uri, 与$uri相同;
$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$request_method, 请求的方法,比如"GET"、"POST"等;
$remote_addr, 客户端地址;
$remote_port, 客户端端口号;
$remote_user, 客户端用户名,认证用;
$request_filename, 当前请求的文件路径名
$request_uri, 请求的URI,带参数;
$uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。
题外话: Nginx的一些内置变量都是从http请求头而来的 比如$request_uri, $content_length,$content_type http请求头 Referer:客户机通过这个头,告诉服务器,客户机是从哪个页面来的(防盗链) User-Agent: 说明客户机操作系统信息,以及浏览器信息 Cookie:客户机通过这个头,可以带点数据给服务器
七.日志
1、设置日志格式 log_format name format [format…] 注意:name在nginx.conf不能重复 2、设置日志文件路径 access_log path [format [buffer=size|off]]
3、日志切割(定时任务) mv kill -USR1 nginx主进程号 重启生成新的日志文件
注意:
1、Log_format有一个默认的、无需设置的combined日志格式设置,具体参数如下: Log_format combined ‘$remote_addr - $remote-user[$time_local]’ ‘“$request” $status $body_bytes_sent’ ‘“http_referer” “http_user_agent”’
2、如果是access_log off将关闭日志输出 如果没有指定format,用默认的combined格式输出 3、nginx主进程号,可以通过nginx.conf的pid配置找到 [/size]

猜你喜欢

转载自kedamaomao.iteye.com/blog/2366712