nginx的配置:main配置段说明
一.正常运行的必备配置:
一、user username [groupname];
指定运行worker进程的用户和组javascript
二、pid /path/to/pidfile_name;
指定nginxf进程的pid文件路径。php
三、worker_rlimit_nofile #;
指定一个worker进程所可以打开的最大文件句柄数(最大文件描述符数量);css
若是没设置的话,这个值为操做系统的限制。设置后你的操做系统和Nginx能够处理比“ulimit -a”更多的文件,因此把这个值设高,这样nginx就不会有“too many open files”问题。html
四、worker_rlimit_sigpending #;java
设定每一个用户可以发往worker进程的信号的数量;node
五、server_tokens python
并不会让nginx执行的速度更快,但它能够关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。nginx
二.优化性能相关的配置:
一、worker_processes #;
worker进程的个数;一般其数值应该为CPU的物理核心数减1;(高版本可使用”auto“参数)git
二、worker_cpu_affinity cpumask ...;
0000
0001
0010
0100
1000
绑定启动的worker进程到指定的CPU上
worker_processes 6;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000;
说明:CPU个数<进程数,服务器须要发生进程切换;nginx工做在一个进程响应多个请求的模型下,多个worker进程在没有请求的状况下工做在睡眠态,
只有有请求到达后内核调用worker进程到CPU中执行,这样就会形成上下文切换和进程会在CPU上制造缓存,执行完成后worker进程会退出CPU进入睡眠态,
缓存失效,然后来进入的worker进程会从新生成缓存,形成服务器性能下降。
能够在系统启动时将除了系统启动的其余CPU隔离出来,绑定worker进程到指定CPU上,CPU的使用权就是特定的worker进程,能够大大提升服务器性能。
三、ssl_engine device;
在存在ssl硬件加速器的服务器上,指定所使用的ssl硬件加速设备;web
四、timer_resolution t;
时间解析度,值大些好,越小越精致,可是消耗大,
每次内核事件调用返回时,都会使用gettimeofday()来更新nginx缓存时钟;timer_resolution用于定义每隔多久才会由gettimeofday()更新一次缓存时钟;x86-64系统上,gettimeofday()代价已经很小,能够忽略此配置;
五、worker_priority nice;
-20,19之间的值;让worker以指定nice值工做,-20~19nice值越低就会优先获取CPU资源; ps axo comm,pid ,nice
三.事件相关的配置
一、accept_mutex [on|off]
是否打开Ningx的负载均衡锁;此锁可以让多个worker进轮流地、序列化地与新的客户端创建链接;而一般当一个worker进程的负载达到其上限的7/8,master就尽量再也不将请求调度此worker;
二、lock_file /path/to/lock_file;
lock文件(accept_mutex指的负载均衡锁)
三、accept_mutex_delay #ms;
accept锁模式中,一个worker进程为取得accept锁的等待时长;若是某worker进程在某次试图取得锁时失败了,至少要等待#ms才能再一次请求锁;
四、multi_accept on|off;
是否容许一次性地响应多个用户请求;默认为Off;
五、use [epoll|rtsig|select|poll];
定义使用的事件模型,建议让nginx自动选择;
六、worker_connections #;
每一个worker可以并发响应最大请求数;
四.用于调试、定位问题: 只调试nginx时使用
一、daemon on|off;
是否让ningx运行后台(守护进程的方式启动nginx);默认为on,调试时能够设置为off,使得全部信息去接输出控制台;
二、master_process on|off
是否以master/worker模式运行nginx;默认为on;调试时可设置off以方便追踪;
三、error_log /path/to/error_log level;
级别以notice,debug,info,warn,error,crit模式,debug输出最多,crir输出最少
错误日志文件及其级别;默认为error级别;调试时可使用debug级别,但要求在编译时必须使用--with-debug启用debug功能;
五.网络链接相关的设置:
一、keepalive_timeout time;
保持链接的超时时长;默认为75秒;
参数的第一个值指定了客户端与服务器长链接的超时时间,超过这个时间,服务器将关闭链接。参数的第二个值(可选)指定了应答头中Keep-Alive: timeout=time的time值,这个值可使一些浏览器知道何时关闭链接,以便服务器不用重复关闭,
若是不指定这个参数,nginx不会在应 答头中发送Keep-Alive信息。(但这并非指怎样将一个链接“Keep-Alive”)参数的这两个值能够不相同。
在http早期 ,每一个http请求都要求打开一个tpc socket链接,而且使用一次以后就断开这个tcp链接。使用keep-alive能够改善这种状态,即在一次TCP链接中能够持续发送多份数据而不会断开链接。经过使用keep-alive机制,能够减小tcp链接创建次数,也意味着能够减小TIME_WAIT状态链接,以此提升性能和提升httpd服务器的吞吐率(更少的tcp链接意味着更少的系统内核调用,socket的accept()和close()调用)。可是,keep-alive并非免费的午饭,长时间的tcp链接容易致使系统资源无效占用。配置不当的keep-alive,有时比重复利用链接带来的损失还更大。因此,正确地设置keep-alive timeout时间很是重要。
二、keepalive_requests n;默认为100
在一次长链接上容许承载的最大请求数;
三、keepalive_disable [msie6 | safari | none ]
对指定的浏览器禁止使用长链接;
四、tcp_nodelay on|off
对keepalive链接是否使用TCP_NODELAY选项;
tcp_nopush on;
http请求包体的最大值;经常使用于限定客户所可以请求的最大包体;根据请求首部中的Content-Length来检测,以免无用的传输;
五、client_header_timeout time;
读取http请求首部的超时时长;
指令指定读取客户端请求头标题的超时时间。这里的超时是指一个请求头没有进入读取步骤,若是链接超过这个时间而客户端没有任何响应,Nginx将返回一个”Request time out” (408)错误。
六、client_body_timeout time;
读取http请求包体的超时时长;
指令指定读取请求实体的超时时间。这里的超时是指一个请求实体没有进入读取步骤,若是链接超过这个时间而客户端没有任何响应,Nginx将返回一个”Request time out” (408)错误。
七、send_timeout time;
发送响应报文的超时时长;默认为60秒
指令指定了发送给客户端应答后的超时时间,Timeout是指没有进入完整established状态,只完成了两次握手,若是超过这个时间客户端没有任何响应,nginx将关闭链接。
八、reset_timeout_connection
告诉nginx关闭不响应的客户端链接。这将会释放那个客户端所占有的内存空间。
六.对客户端请求的限制:
一、limit_except method ... { ... }
指定对范围以外的其它方法的访问控制;
limit_except GET {
allow 172.16.0.0/16;
deny all;
}
二、client_max_body_size SIZE;
http请求包体的最大值;经常使用于限定客户所可以请求的最大包体;根据请求首部中的Content-Length来检测,以免无用的传输;
三、limit_rate speed;
限制客户端每秒钟传输的字节数;默认为0,表示没有限制;
四、limit_rate_after time;
nginx向客户发送响应报文时,若是时长超出了此处指定的时长,则后续的发送过程开始限速;
四、limit_conn perip 200;
limit_conn限制每个IP并发链接数是200;
5 、limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one burst=3 nodelay;
用于按key限制请求的处理速率,特别适用于限制单个IP的请求处理速率。
本例中,设置了10m字节的共享空间来存储key,即$binary_remote_addr,共享空间的名字是one,限制请求的处理速率为一秒一个。
下面limit_req中指定了burst参数为5,表示最多容许五个请求排队,超过的就直接返回503状态了。
我们限制的请求处理速率是一秒一个,burst参数为5。意思就是在某一秒内,容许有1个正常请求+5个excessive请求被处理,多的就要被503了。
若是没有nodelay参数,那么最多burst个excessive请求则按rate参数规定的速率延迟发送给后端。
若是有nodelay参数,则表示这些excessive请求会立马发送给后端。因此这种状况下,后端请求到达的速率可能不止rate这么多。
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req zone=one burst=3 nodelay;
测试参考地址:http://mp.weixin.qq.com/s?__biz=MzI5ODExMjk4Ng==&mid=402812915&idx=1&sn=e8fca3a91539c152398c6fb01c9dcef6&mpshare=1&scene=1&srcid=100834dW5nyrd7PKiRgnxYk2#rd
六、limit_conn_zone $binary_remote_addr zone=perip:10M
limit_conn perip 200;
一个是限制并发链接
要限制链接,必须先有一个容器对链接进行计数,"zone=" 给它一个名字,能够随便叫,这个名字要跟下面的 limit_conn 一致
$binary_remote_addr = 用二进制来储存客户端的地址,1m 能够储存 32000 个并发会话
limit_conn_zone $binary_remote_addr zone=perip:10M
limit_conn perip 200;
测试参考地址:http://storysky.blog.51cto.com/628458/642970/
七.文件操做的优化:
一、sendfile on|off
是否启用sendfile功能; 可让sendfile()发挥做用。sendfile()能够在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据以前在用户空间申请数据缓冲区。
以后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是当即将数据从磁盘读到OS缓存。由于这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效
二、aio on|off
是否启用aio(异步IO模式)功能;
、directio size | off
当size大于等于时,是否启用直接IO模式功能。(直接IO模式表示不在内存中缓存)
三、open_file_cache max=N [inactive=time]|off
是否打开文件缓存功能;
max: 缓存条目的最大值;当满了之后将根据LRU算法进行置换;
inactive: 某缓存条目在指定时长时没有被访问过期,将自动被删除;默认为60s;
缓存的信息包括:
文件句柄、文件大小和上次修改时间;
已经打开的目录结构;
没有找到或没有访问权限的信息;
四、open_file_cache_errors on|off
是否缓存文件找不到或没有权限访问等相关信息;
五、open_file_cache_valid time;
多长时间检查一次缓存中的条目是否超出非活动时长,默认为60s;
六、open_file_cache_min_use #;
在inactive指定的时长内被访问超此处指定的次数地,才不会被删除;
八.对客户端请求的特殊处理:
一、ignore_invalid_headers on|off
是否忽略不合法的http首部;默认为on; off意味着请求首部中出现不合规的首部将拒绝响应;只能用于server和http;
二、log_not_found on|off
是否将文件找不到的信息也记录进错误日志中;
三、resolver address;
指定nginx使用的dns服务器地址;
四、resover_timeout time;
指定DNS解析超时时长,默认为30s;
五、server_tokens on|off;
是否在错误页面中显示nginx的版本号;
九.nginx代理设置优化:
proxy_pass http://127.0.0.1:8080; #来自jsp请求交给tomcat处理
proxy_redirect off;
proxy_set_header Host $host; #后端的Web服务器能够经过X-Forwarded-For获取用户真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90; #nginx跟后端服务器链接超时时间(代理链接超时)
proxy_read_timeout 90; #链接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 6 32k; #proxy_buffers缓冲区,网页平均在32k如下的话,这样设置
proxy_busy_buffers_size 64k;#高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
十.内存及磁盘资源分配:
一、client_body_in_file_only on|clean|off
HTTP的包体是否存储在磁盘文件中;非off表示存储,即便包体大小为0也会建立一个磁盘文件;on表示请求结束后包体文件不会被删除,clean表示会被删除;
二、client_body_in_single_buffer on|off;
HTTP的包体是否存储在内存buffer当中;默认为off;
三、cleint_body_buffer_size size;默认为16K
nginx接收HTTP包体的内存缓冲区大小;(超出将存储到硬盘上。使用client_body_temp_path)
这个指令能够指定链接请求实体的缓冲区大小。若是链接请求超过缓存区指定的值,那么这些请求实体的总体或部分将尝试写入一个临时文件。
四、client_body_temp_path dir-path [level1 [level2 [level3]]];
HTTP包体存放的临时目录;
client_body_temp_path /var/tmp/client/ 1 2
五、client_header_buffer_size size;
正常状况下接收用户请求的http报文header部分时分配的buffer大小;默认为1k;
指令指定客户端请求头部的缓冲区大小。绝大多数状况下一个请求头不会大于1k,不过若是有来自于wap客户端的较大的cookie它可能会大于 1k,Nginx将分配给它一个更大的缓冲区,这个值能够在large_client_header_buffers里面设置。
六、large_client_header_buffers number size;
存储超大Http请求首部的内存buffer大小及个数;
指定客户端一些比较大的请求头使用的缓冲区数量和大小。请求字段不能大于一个缓冲区大小,若是客户端发送一个比较大的头,nginx将返回”Request URI too large” (414)一样,请求的头部最长字段不能大于一个缓冲区,不然服务器将返回”Bad request” (400)。
缓冲区只在需求时分开。默认一个缓冲区大小为操做系统中分页文件大小,一般是4k或8k,若是一个链接请求最终将状态转换为keep- alive,它所占用的缓冲区将被释放。
六、client_max_body_size 200M;
http请求包体的最大值;经常使用于限定客户所可以请求的最大包体;根据请求首部中的Content-Length来检测,以免无用的传输;
指令指定容许客户端链接的最大请求实体大小,它出如今请求头部的Content-Length字段。若是请求大于指定的值,客户端将收到一个”Request Entity Too Large” (413)错误。记住,浏览器并不知道怎样显示这个错误。
七、connection_pool_size size;
nginx对于每一个创建成功的tcp链接都会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为256;
八、request_pool_size size;
nginx在处理每一个http请求时会预先分配一个内存池,此处即用于设定此内存池的初始大小;默认为4k;
十一 压缩说明
gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减小咱们发送的数据量。
gzip_disable 为指定的客户端禁用gzip功能。咱们设置成IE6或者更低版本以使咱们的方案可以普遍兼容。
gzip_http_version 1.1;
gzip_static 告诉nginx在压缩资源以前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而容许你使用最高压缩比,这样nginx就不用再压缩这些文件了
gzip_min_length 设置对数据启用压缩的最少字节数。若是一个请求小于1000字节,咱们最好不要压缩它,由于压缩这些小的数据会下降处理此请求的全部进程的速度。
gzip_comp_level 设置数据的压缩等级。这个等级能够是1-9之间的任意数值,9是最慢可是压缩比最大的。咱们设置为4,这是一个比较折中的设置。(压缩级别,1压缩比最小处理速度最快,9压缩比最大但处理最慢,同时也最消耗CPU,通常设置为3就能够了)
gzip_buffers 4 8k; (设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流)
gzip_type 设置须要压缩的数据格式。上面例子中已经有一些了,你也能够再添加更多的格式。 text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip_proxied 容许或者禁止压缩基于请求和响应的响应流。咱们设置为any,意味着将会压缩全部的请求。gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] …
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 – 无条件启用压缩
十二 locaton 匹配说明
一、利用valid_referers指令防盗链:
HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,通常会带上Referer,告诉服务器我是从哪一个页面连接过来的,服务器借此能够得到一些信息用于处理,
例如防止未经容许的网站盗链图片、文件等。所以HTTP Referer头信息是能够经过程序来假装生成的,因此经过Referer信息防盗链并不是100%可靠,可是,它可以限制大部分的盗链
状况。
none:表示无Referer值的状况。
blocked:表示Referer值被防火墙进行假装。
server_names:表示一个或多个主机名称。从Nginx 0.5.33版本开始,server_names中可使用通配符"*"号。
location ~* \.(gif|jpg|png|swf|flv|css|js|flv|swf|jpeg)$ {
valid_referers none blocked *.zjol.com.cn *.zzhz.com.cn *.zjtdw.com; 定义合规的引用
if ($invalid_referer) { return 403; } 拒毫不合规的引用
二、nginx和php-fpm同样内建了一个状态页,对于想了解nginx的状态以及监控nginx很是有帮助。查看http://127.0.0.1/ngx_status
active connections – 活跃的链接数量
server accepts handled requests — 总共处理了多少个链接 , 成功建立多少次握手, 总共处理了多少个请求
reading — 读取客户端的链接数.
writing — 响应数据到客户端的数量
waiting — 开启 keep-alive 的状况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留链接.
location ~ ^/NginxStatus/{
stub_status on;
access_log off;
allow 127.0.0.1;
}
三、ginx.conf 配置中有个漏洞,那就是没有配置哪些目录是不容许直接访问的,在传统tomcat做为服务器的时候,tomcat自己的机制就禁止直接访问WEB-INF下的内容,
可是在nginx中,因为配置了部份内容直接从nginx转发出去,这就致使了WEB-INF目录实际上可能会被暴露出去,一旦暴漏了,那么系统架构,源代码,数据库配置文件,
系统配置文件等内容将一并泄露,这对于商业项目来说会是致命的安全隐患,再次提醒本身以及相关人士,必定要配置不容许访问的目录。
location ~ ^/(WEB-INF|META-INF)/{
deny all;
}
四、封杀特定的url特定的文件扩展名,好比.bak
location ~* \.(bak|save|sh|sql|mdb|svn|git|old|php|zip|exe|rar|asp|aspx)$ {
return 405;
}
五、
location ~ /\.ht {
deny all;
}
五、你能够对指定的目录设置访问权限。全部的网站目录应该一一的配置,只容许必须的目录访问权限。你能够经过IP地址来限制访问目录/docs/:
location /docs/ {
deny 192.168.1.1;
allow 192.168.1.0/24;}
十三 其它安全加固说明
一、封杀各类user-agent,user-agent 也即浏览器标识,每一个正常的web请求都包含用户的浏览器信息,除非通过假装,恶意扫描工具通常都会在user-agent里留下某些特征字眼,
好比scan,nmap等。咱们能够用正则匹配这些字眼,从而达到过滤的目的
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) {
return 403;
}
if ($http_user_agent ~* "" ) { return 403; }
阻止Soso和有道的机器人:
if ($http_user_agent ~* Sosospider|YodaoBot) {return 403;
二、封杀特定的http方法和行为
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 405;
}
if ($http_range ~ "\d{9,}") {
return 444;
}
三、强制网站使用域名访问,能够逃过IP扫描,
if ( $host !~* 'abc.com' ) { return 403;}
四、强制要求referer
if ($http_referer = "" ) { return 403; }