Nginx配置⽂件详解
转载⾃:
Nginx 简介
Nginx是lgor Sysoev为俄罗斯访问量第⼆的rambler.ru站点设计开发的。从2004年发布⾄今,凭借开源的⼒量,已经接近成熟与完善。Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。⽀持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且⽀持很多第三⽅的模块扩展。
nginx可以作为反向代理、负载均衡和web缓存使⽤,本节主要讲解nginx的负载均衡功能,按照不同的负载策略可以分发到不同的后端服务器。
配置⽂件详解
1. 全局配置
配置影响nginx全局的指令。⼀般有运⾏nginx服务器的⽤户组,nginx进程pid存放路径,⽇志存放路径,配置⽂件引⼊,允许⽣成worker process数等
user
语法: user user [group]
缺省值: nobody nobody
指定Nginx Worker进程运⾏⽤户,默认是nobody帐号。
error_log
语法: error_log file [ debug | info | notice | warn | error | crit ]
缺省值: ${prefix}/logs/error.log
指定错误⽇志的存放位置和级别。
include
语法: include file | *
缺省值: none
include 指令还⽀持像下⾯配置⼀样的全局包含的⽅法,例如包含⼀个⽬录下所有以".conf"结尾的⽂件: include vhosts/*.conf;
pid
语法: pid file
进程id存储⽂件。可以使⽤ kill -HUP cat /var/log/nginx.pid/ 对Nginx进⾏配置⽂件重新加载。
worker_processes
语法: worker_processes number
缺省值: 1,指定⼯作进程数。nginx可以使⽤多个worker进程(建议与本机CPU核⼼数⼀致)
实例:
user  root root;
worker_processes  24;nginx部署前端项目
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
2. events 块
配置影响nginx服务器或与⽤户的⽹络连接。有每个进程的最⼤连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个⽹路连接,开启多个⽹络连接序列化等
events
{
use epoll;
使⽤epoll的I/O 模型。linux建议epoll,FreeBSD建议采⽤kqueue,window下不指定。
补充说明:与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),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
Eventport:使⽤于Solaris 10。为了防⽌出现内核崩溃的问题,有必要安装安全补丁。
worker_connections 204800;
每个⼯作进程的最⼤连接数量。根据硬件调整,和前⾯⼯作进程配合起来⽤,尽量⼤,但是别把cpu跑到100%就⾏。每个进程允许的最多连接数,理论上每台n ginx服务器的最⼤连接数为。worker_processes*worker_connections
keepalive_timeout 60;
keepalive超时时间。
client_header_buffer_size 4k;
客户端请求头部的缓冲区⼤⼩。这个可以根据你的系统分页⼤⼩来设置,⼀般⼀个请求头的⼤⼩不会超过1k,不过由于⼀般系统分页都要⼤于1k,所以这⾥设置为分页⼤⼩。
分页⼤⼩可以⽤命令getconf PAGESIZE 取得。
open_file_cache max=65535 inactive=60s;
#这个是指多长时间检查⼀次缓存的有效信息。
#语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使⽤字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项⽬的有效信息.
open_file_cache_valid 80s;
#open_file_cache指令中的inactive参数时间内⽂件的最少使⽤次数,如果超过这个数字,⽂件描述符⼀直是在缓存中打开的,如上例,如果有⼀个⽂件在inacti ve时间内⼀次没被使⽤,它将被移除。
open_file_cache_min_uses 1;
#语法: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 块
可以嵌套多个server,配置代理,缓存,⽇志定义等绝⼤多数功能和第三⽅模块的配置。如⽂件引⼊,mime-type定义,⽇志⾃定义,是否使⽤sendfile传输⽂件,连接超时时间,单连接请求数等
1、 http 中的全局变量
http
{
pes;
设定mime类型,类型由pe⽂件定义
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';
⽇志格式设置。
$remote_addr与$http_x_forwarded_for⽤以记录客户端的ip地址;
$remote_user:⽤来记录客户端⽤户名称;
$time_local:⽤来记录访问时间与时区;
$request:⽤来记录请求的url与http协议;
$request:⽤来记录请求的url与http协议;
$status:⽤来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端⽂件主体内容⼤⼩;
$http_referer:⽤来记录从那个页⾯链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后⾯,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,⽤以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
access_log  logs/host.access.log  main;
access_log  logs/host.access.404.log  log404;
⽤了log_format指令设置了⽇志格式之后,需要⽤access_log指令指定⽇志⽂件的存放路径;
server_names_hash_bucket_size 128;
#保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的⼤⼩,并且是⼀路处理器缓存⼤⼩的倍数。在减少了在内存中的存取次数后,使在处理器中加速查hash表键值成为可能。如果hash bucket size等于⼀路处理器缓存的⼤⼩,那么在查键的时候,最坏的情况下在内存中查的次数为2。第⼀次是确定存储单元的地址,第⼆次是在存储单元中查键值。因此,如果N ginx给出需要增⼤hash max size 或 hash bucket size的提⽰,那么⾸要的是增⼤前⼀个参数的⼤⼩.
client_header_buffer_size 4k;
客户端请求头部的缓冲区⼤⼩。这个可以根据你的系统分页⼤⼩来设置,⼀般⼀个请求的头部⼤⼩不会超过1k,不过由于⼀般系统分页都要⼤于1k,所以这⾥设置为分页⼤⼩。分页⼤⼩可以⽤命令getconf PAGESIZE取得。
large_client_header_buffers 8 128k;
客户请求头缓冲⼤⼩。nginx默认会⽤client_header_buffer_size这个buffer来读取header值,如果header过⼤,它会使⽤large_client_header_buffers来读取。
open_file_cache max=102400 inactive=20s;
这个指令指定缓存是否启⽤。
例: open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使⽤字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项⽬的有效信息.
open_file_cache_min_uses 2;
语法: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错误.
client_max_body_size 300m;
设定通过nginx上传⽂件的⼤⼩
sendfile on;
sendfile指令指定 nginx 是否调⽤sendfile 函数(zero copy ⽅式)来输出⽂件,对于普通应⽤,必须设为on。如果⽤来进⾏下载等应⽤磁盘IO重负载应⽤,可设置为off,以平衡磁盘与⽹络IO处理速度,降低系统uptime。
tcp_nodelay on;
tcp_nopush on;
此选项允许或禁⽌使⽤socke的TCP_CORK的选项,此选项仅在使⽤sendfile的时候使⽤
keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置内存缓存空间⼤⼩为200MB,1天没有被访问的内容⾃动清除,硬盘缓存空间⼤⼩为30GB。
keepalive_timeout 120;
keepalive超时时间。
client_body_buffer_size 512k;
如果把它设置为⽐较⼤的数值,例如256k,那么,⽆论使⽤firefox还是IE浏览器,来提交任意⼩于256k的图⽚,都很正常。如果注释该指令,使⽤默认的client _body_buffer_size设置,也就是操作系统页⾯⼤⼩的两倍,<br>8k或者16k,问题就出现了。⽆论使⽤firefox4.0还是IE8.0,提交⼀个⽐较⼤,200k左右的图⽚,都返回500 Internal Server Error错误
#http_proxy模块。。。。。。
#gzip模块
。。。。。。
upstream bakend {
。。。。。。。
}
#server模块
。。。。。
}
2、gzip 模块
gzip_static on;
gzip_http_version  1.0;
gzip_proxied        expired no-cache no-store private auth;
gzip_vary          on;
gzip  on;
gzip_types text/plain text/css text/xml application/xml application/xml+rss application/json;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip on|off
  # 默认值: gzip off
  # 开启或者关闭gzip模块
  gzip_static on|off
  # nginx对于静态⽂件的处理模块
  # 该模块可以读取预先压缩的gz⽂件,这样可以减少每次请求进⾏gzip压缩的CPU资源消耗。该模块启⽤后,nginx⾸先检查是否存在请求静态⽂件的gz结尾的⽂件,如果有则直接返回该gz⽂件内容。为了要兼容不⽀持gzip的浏览器,启⽤gzip_static模块就必须同时保留原始静态⽂件和gz⽂件。这样的话,在有⼤量静态⽂件的情况下,将会⼤⼤增加磁盘空间。我们可以利⽤nginx的反向代理功能实现只保留gz⽂件。
  #可以google"nginx gzip_static"了解更多
  gzip_comp_level 4
  # 默认值:1(建议选择为4)
  # gzip压缩⽐/压缩级别,压缩级别 1-9,级别越⾼压缩率越⼤,当然压缩时间也就越长(传输快但⽐较消耗cpu)。
  gzip_buffers 4 16k
  # 默认值: gzip_buffers 4 4k/8k
  # 设置系统获取⼏个单位的缓存⽤于存储gzip的压缩结果数据流。例如 4 4k 代表以4k为单位,按照原始数据⼤⼩以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据⼤⼩以8k为单位的4倍申请内存。
  # 如果没有设置,默认值是申请跟原始数据相同⼤⼩的内存空间去存储gzip压缩结果。
  gzip_types mime-type [mime-type ...]
  # 默认值: gzip_types text/html (默认不对js/css⽂件进⾏压缩)
  # 压缩类型,匹配MIME类型进⾏压缩
  # 不能⽤通配符 text/*
  # (⽆论是否指定)text/html默认已经压缩
  # 设置哪压缩种⽂本⽂件可参考 pes
  gzip_min_length  1k
  # 默认值: 0 ,不管页⾯多⼤都压缩
  # 设置允许压缩的页⾯最⼩字节数,页⾯字节数从header头中的Content-Length中进⾏获取。
  # 建议设置成⼤于1k的字节数,⼩于1k可能会越压越⼤。即: gzip_min_length 1024
  gzip_http_version 1.0|1.1
  # 默认值: gzip_http_version 1.1(就是说对HTTP/1.1协议的请求才会进⾏gzip压缩)
  # 识别http的协议版本。由于早期的⼀些浏览器或者http客户端,可能不⽀持gzip⾃解压,⽤户就会看到乱码,所以做⼀些判断还是有必要的。
  # 注:99.99%的浏览器基本上都⽀持gzip解压了,所以可以不⽤设这个值,保持系统默认即可。
  # 假设我们使⽤的是默认值1.1,如果我们使⽤了proxy_pass进⾏反向代理,那么nginx和后端的upstream server之间是⽤HTTP/1.0协议通信的,如果我们使⽤nginx通过反向代理做Cache Server,⽽且前端的nginx没有开启gzip,同时,我们后端的nginx上没有设置gzip_http_version为1.0,那么Cache的url将不会进⾏gzip压缩
  gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] ...
  # 默认值:off
  # 默认值:off
  # 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 - ⽆条件启⽤压缩
  gzip_vary on
  # 和http头有关系,加个vary头,给代理服务器⽤的,有的浏览器⽀持压缩,有的不⽀持,所以避免浪费不⽀持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
  gzip_disable "MSIE [1-6]."
  #禁⽤IE6的gzip压缩,⼜是因为杯具的IE6。当然,IE6⽬前依然⼴泛的存在,所以这⾥你也可以设置为“MSIE [1-5].”
  #IE6的某些版本对gzip的压缩⽀持很不好,会造成页⾯的假死,今天产品的同学就测试出了这个问题
后来调试后,发现是对img进⾏gzip后造成IE6的假死,把对img的gzip压缩去掉后就正常了为了确保其它的IE6版本不出问题,所以建议加上gzip_disable的设置
3、upstream 模块
作为负载均衡池,可以为⼀个请求分配多个负载,防⽌单台服务器宕机后请求⽆法处理,负载均衡的策略有:轮询、加权轮询和哈希⼀致,配置如下:
#加权轮询
upstream back_openaccess {
server 10.159.39.136:12080 weight=2 max_fails=3 fail_timeout=10s;
server 10.159.39.137:12080 weight=2 max_fails=3 fail_timeout=10s;
}
#ip_hash
upstream back_openadmin {
ip_hash;
server 10.159.39.136:12081;
server 10.159.39.137:12081;
}
加权轮询配置参数:
  down 表⽰单前的server暂时不参与负载.
  weight 默认为1.weight越⼤,负载的权重就越⼤。
  max_fails :允许请求失败的次数默认为1.当超过最⼤次数时,返回proxy_next_upstream 模块定义的错误.
  fail_timeout : max_fails次失败后,暂停的时间。
  backup:其它所有的⾮backup机器down或者忙的时候,请求backup机器。所以这台机器压⼒会最轻。
  max_conns:限制分配给某台Server处理的最⼤连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表⽰不限制。注意:1.5.9之后的版本才有这个配置
4、server 模块
server {
listen      80;
server_name  "127.0.0.1";
root  /kingdee/www/;
#Open underscores_in_headers
underscores_in_headers on;
proxy_redirect off;
include  conf.d/*.conf;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。