error_logar/loginx/error.log info;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit]
pid ar/runinx.pid;
#进程文件
worker_rlimit_nofile65535;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit-n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
#工作模式与连接数上限
events
{
use epoll;
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
worker_connections65535;
#单个进程最大连接数(最大连接数=连接数*进程数)
}
#设定http服务器
http
{
include mime.types;#文件扩展名与文件类型映射表
default_typeapplication/octet-stream; #默认文件类型
charset utf-8; #默认编码
server_names_hash_bucket_size128; #服务器名字的hash表大小
准确的名字和通配符名字作为哈希值被存储在哈希表中,这些哈希值被绑定到监听端口上,每一个监听的端口有三个哈希值:
一个准确名字的哈希值;
一个由星号开始名字的哈希值;
一个由星号结尾名字的哈希值。
该哈希值大小的优化配置分阶段进行,因此,在CPU的缓存中在最少失误的情况下找到该名字。
准确名字的哈希值首先被搜索;如果一个名字没有通过准确名字的哈希值找到,那么将会使用由星号开始名字的哈希值搜索,如果仍然没有搜索到,那么会使用由星号结尾名字的哈希值搜索。需要理解的一点是--搜索通配符名字哈希值要慢于搜索准确名字哈希值,这是由于名字是通过域名部分搜索所致。
注意,通配符的特殊形式".nginx.org"是被存储在通配符名字哈希表中,而不是存储在准确名字哈希表中;如果仍然没有找到,那么就会继续使用正则表达式的方法测试查找,理论上这是一种最慢的方法,并且也不能扩展。
基于这些原因,最好尽可能使用确切名称。例如,如果一台服务器被请求最多的名字是nginx.org和www.nginx.org,那么更高效率的定义是将它们明确规定:
1. server {
2. listen 80;
3. server_name nginx.org www.nginx.org *.nginx.org;
4. …
5. }
而不要使用这种简单的格式:
1. server {
2. listen 80;
3. server_name .nginx.org;
4. …
5. }
如果你定义了大量的服务器名字,或者是定义了少见的长的服务器名字,那么你需要在http级别(或者叫区段)调整指令"server_names_hash_max_size"和"server_names_hash_bucket_size"的值。指令"server_names_hash_bucket_size"默认值可以是32、64或者是其他值,这依赖于CPU缓存行(ache line)的大小。如果默认值为32,当你定义"too.long.server.name.nginx.org"作为服务器的名字,那么Nginx将会在启动时失败,并且显示如下错误信息:
1. could not build the server_names_hash,
2. you should increase server_names_hash_bucket_size: 32
在以下情况时,应该设置该指令的值为以前值的两倍:
1. http {
2. server_names_hash_bucket_size 64;
3. …
如果你指定了大量的服务器名字,那么将会遇到另一个错误信息:
1. could not build the server_names_hash,
2. you should increase either server_names_hash_max_size: 512
3. or server_names_hash_bucket_size: 32
应该首先尝试设置"server_names_hash_max_size"的值接近于服务器名字的数量。如果修改这个指令的值仍然没有起到作用,或者是当Nginx的启动太慢时,才去尝试增加指令"server_names_hash_bucket_size"的值。如果服务器仅监听在一个端口,那么Nginx根本就不会检测服务器的名字(也不会为该端口建立哈希表)。然而,却有一个例外,如果指令"server_name"的值是一个捕获的正则表达式,那么Nginx不得不执行一个表达式来获取捕获。
client_header_buffer_size32k;
该指令用于设置缓存头的大小,这个缓存用于存放从客户端发送到Nginx服务器的请求头。对于绝大多数的请求,1k的缓冲区大小是完全足够的。然而如果有大的cookie在请求头中或者是请求头是来自于一个wap客户端的请求头,那么1k的大小可能不能够容纳下这种请求头的,因此Nginx将会为其分配一个大一点的缓存,这个值可以使用large_client_header_buffers指令设置。
large_client_header_buffers4 64k;
客户请求头缓冲大小,nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取,如果设置过小HTTP头/Cookie过大 会报400 错误nginx 400 bad request,如果超过buffer,就会报HTTP 414错误(URI Too Long)
nginx接受最长的HTTP头部大小必须比其中一个buffer大,否则就会报400的HTTP错误(BadRequest)。
client_max_body_size8m;
该指令用于设定接受客户端请求体的最大值,在客户端请求头中通过Content-Length表明,即能上传文件的大小。如果客户端请求体大于指定的值,那么客户端将会收到一个"Request Entity Too Large"(413)的错误,
sendfile on;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on;#防止网络阻塞
即数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。
keepalive_timeout120;#长连接超时时间,单位是秒
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m
为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。
fastcgi_connect_timeout300;
指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout300
向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。;
fastcgi_read_timeout300;
接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。
fastcgi_buffer_size64k;
指定读取FastCGI应答第一部分需要用多大的缓冲区,这里可以设置为fastcgi_buffers指令指定的缓冲区大小,上面的指令指定它将使用1个16k的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过1k),但是你如果在fastcgi_buffers指令中指定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存。
fastcgi_buffers 464k;
指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答,如上所示,如果一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,如果大于256k,增大于256k的部分会缓存到fastcgi_temp指定的路径中,当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值,比如你的站点大部分脚本所产生的页面大小为256k就可以把这个值设置为16 16k,或者4 64k 或者64 4k,但很显然,后两种并不是好的设置方法,因为如果产生的页面只有32k,如果用4 64k它会分配1个64k的缓冲区去缓存,而如果使用64 4k它会分配8个4k的缓冲区去缓存,而如果使用16 16k则它会分配2个16k去缓存页面,这样看起来似乎更加合理。
fastcgi_busy_buffers_size128k;
fastcgi_temp_file_write_size128k;
在写入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次也没有被使用,那么这个文件将被移除。
fastcgi_cache_use_stale errortimeout invalid_header http_500;
#gzip模块设置
gzip on;
#该指令用于开启或关闭gzip模块(on/off)
gzip_min_length 1k;
#设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers 4 16k;
#设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,按照原始数据大小以16k为单位的4倍申请内存。
gzip_http_version1.0;
#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2;
# gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
gzip_typestext/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_disable msie6;
#对哪些浏览器不启用压缩;
gzip_vary on;
和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
#limit_zone crawler$binary_remote_addr 10m;
#开启限制IP连接数的时候需要使用