nginx

摘要: Nginx的配置是以模块为单位来组织的,每一个模块包含一个或多个指令,指令是配置文件中的最小配置单元,一切配置项皆为指令。如http核心模块中的include、default_type、sendfile指令,都属于http模块。nginx所有模块中的

 

Nginx的配置是以模块为单位来组织的,每一个模块包含一个或多个指令,指令是配置文件中的最小配置单元,一切配置项皆为指令。如http核心模块中的include、default_type、sendfile指令,都属于http模块。

002UASMrzy7605pjKJv15&690.jpg

注意:以下配置中的“上下文”表示指令可以配置在哪些模块中。 main:顶层配置,约束服务器的行为 1 2 3 1、服务器级别核心配置 指令 上下文 语法 默认值 功能描述 user main usernobodynobyd; nobody 以哪个用户权限运行工作线程 daemon main daemonyes; yes nginx是否以守护进程运行 worker_processes main worker_processesnumber; 1 配置工作进程数。传统的web服务器(如apache)都是同步阻塞模型,一请求一进(线)程模式,当进(线)程数增达到一定程度后,更多CPU时间浪费在线程和进程切换当中,性能急剧下降,所以负载率不高。Nginx是基于事件的非阻塞多路复用(epoll或kquene)模型,一个进程在短时间内就可以响应大量的请求。建议将该值设置<=cpu核心数量,一般高于cpu核心数量不会带来好处,反而可能会有进程切换开销的负面影响。 worker_connections events worker_connectionsnumber; 1024 并发响应能力的关键配置值,表示每个进程允许的最大同时连接数。maxConnection=work_connections*worker_processes;一般一个浏览器会同时开两条连接,如果是反向代理,nginx到后服务器的连接数量也要占用2条连接数,所以,做静态服务器,一般maxConnection=work_connections*worker_processes/2;做反代理服务器时maxConnection=work_connections*worker_processes/4; use events useepoll; 根据不同的平台,选择最高效的连接处理方法 指定处理连接请求的方法。linux内核2.6以上默认使用epoll方法,其它平台请参考:http://nginx.org/en/docs/events.html备注:要达到超高负载下最好的网络响应能力,还有必要优化与网络相关的linux内核参数 worker_cpu_affinity main worker_cpu_affinitycpumask…; 无 将工作进程绑定到特定的CPU上,减少CPU在进程之间切换的开销。用二进制bit位表示进程绑定在哪个CPU内核。如8内核4进程时的设置方法:worker_cpu_affinity00000001000000100000010010000000 worker_rlimit_nofile main worker_rlimit_coresize; 受linux内核文件描述符数量限制 设置nginx最大能打开的文件描述符数量。因为Linux对每个进程所能打开的文件描述数量是有限制的,默认一般是1024个,可通过ulimit-nFILECNT或/etc/securit/limits.conf配置修改linux默认能打开的文件句柄数限制。建议值为:系统最大数量/进程数。但进程间工作量并不是平均分配的,所以可以设置在大一些。推荐值为:655350 error_log main,http,mail,stream,server,location error_log日志文件路径日志级别; error_loglogs/error.logerror; 配置错误日志文件的路径和日志级别。日志级别有debug,info,notice,warn,error,crit,alert和emerg几种。nginx的日志使用syslog输出,所以输出的日志格式是有规律的,系统运维人员可以根据日志规则进行查错或统计分析。更多说明请参考官方文档:http://nginx.org/en/docs/ngx_core_module.html#error_log pid main pid守护进程socket文件路径; pidlogs/nginx.pid 配置nginx守护进程ID存储文件路径(不是工作进程)

以上是nginx的顶层配置,管理服务器级别的行为。

nginx做为一个HTTP反向代理服务器,平时接触得最多的应该是针对http请求的相关配置了,和http模块有关的所有配置都放在http{...}配置中。

指令 上下文 语法 功能描述 types http,server,location types{mime类型文件后缀;}; 配置能处理的文件类型。如:text/htmlhtmlhtmshtml; include any include文件路径; 将外部文件的内容做为配置拷贝到nginx.conf文件中。如:includemime.type;将当前目录下的mime.type配置文件拷贝到nginx配置文件中。文件路径可以是相对路径或绝对路径。文件名可以用*来表示通配符。 default_type http,server,location default_typemime类型; 文件名到后缀的映射关系。配置默认的mime类型,当在types指令中找不到请求的文件类型时,就使用default_type指定的类型。默认为text/plain类型。 access_log http,server,location,ifinlocation,limit_except access_logpath[format[buffer=size][gzip[=level]][flush=time][if=condition]];
access_logoff; 关闭或开启访问日志。默认配置为:access_loglogs/access.logcombined;表示根据combined定义的日志格式,写入logs/access.log文件中,combined是http模块默认格式。如果定义了buffer和gzip其中一个参数,日志默认会先写入缓存中,当缓存满了之后,通过gzip压缩缓存中的日志并写入文件,启用了gzip压缩必须保证nginx安装的时候添加了gzip模块。缓存大小默认为64K。可以配置gzip的1~9的压缩级别,级别越高压缩效率越大,日志文件占用的空间越小,但要求系统性能也越高。默认值是1。http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log log_format http log_format格式名称日志格式; 定义http访问日志的格式,在日志格式中可以访问http模块的内嵌变量,如果变存在的话,会做为日志输出。如:remoteaddr,remoteaddr,request等,更多变量请参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#variables sendfile http,server,location,ifinlocation sendfileon|off; 启用内核复制模式。作为静态服务器可以提高最大的IO访问速度。传统的文件读写采用read和write方式,流程为:硬盘>>kernelbuffer>>userbuffer>>kernelsocketbuffer>>协议栈,采用sendfile文件读写的流程为:硬盘>>kernelbuffer(快速拷贝到kernelsocketbuffer)>>协议栈,很明显sendfile这个系统调用减少了内核到用户模式之间的切换和数据拷贝次数,直接从内核缓存的数据拷贝到协议栈,提高了很大的效率。这篇文章介绍比较详细:http://xiaorui.cc/?p=1673 tcp_nodelay http,server,location off|on; tcp_nopush http,server,location off|on; tcp_nodelay和tcp_nopush这两个参数是配合使用的,启动这两项配置,会在数据包达到一定大小后再发送数据。这样会减少网络通信次数,降低阻塞概率,但也会影响响应及时性。比较适合于文件下载这类的大数据通信场景。 keepalive_timeout http,server,location keepalive_time65; 客户端到服务器建立连接的超时时长,超过指定的时间服务器就会断开连接。默认为75秒。降低每个连接的alive时间可在一定程度上提高可响应连接数量,所以一般可适当降低此值 gzip http,server,location,ifinlocation gzipon|off; 开启内容压缩,可以有效降低客户端的访问流量和网络带宽 gzip_min_length http,server,location gzip_min_lengthlength; 单位为k,默认为20k。内容超过最少长度后才开启压缩,因为太短的内容压缩效果不佳,且压缩过程还会浪费系统资源。这个压缩长度会作为http响应头Content-Length字段返回给客户端。建议值:1000 gzip_comp_level http,server,location gzip_comp_level1~9; 压缩级别,默认值为1。范围为1~9级,压缩级别越高压缩率越高,但对系统性能要求越高。建议值:4 gzip_types http,server,location gzip_typesmime-type…; 压缩内容类型,默认为text/html;。只压缩html文本,一般我们都会压缩js、css、json之类的,可以把这些常见的文本数据都配上。如:text/plaintext/cssapplication/jsonapplication/x-javascripttext/xmlapplication/xmlapplication/xml+rsstext/javascript; open_file_cache http,server,location open_file_cacheoff;open_file_cachemax=N[inactive=time]; 默认值为off;设置最大缓存数量,及缓存文件未使用的存活期。建议值:max=655350(和worker_rlimit_nofile参数一致)inactive=20s; open_file_
cache_min_uses http,server,location open_file_cache_min_usesnumber; 默认为1,有效期内文件最少使有的次数。建议值:2 open_file
_cache_valid http,server,location open_file_cache_validtime; 默认为60s,验证缓存有效期时间间隔。表示每隔60s检查一下缓存的文件当中,有哪些文件在20s以内没有使用超过2次的,就从缓存中删除。采用lru算法。 server server{…} http HTTP服务器的核心配置,用于配置HTTP服务器的虚拟主机,可以配置多个 listen listenip[:端口] server 配置虚拟主机监听的IP地址和端口,默认监听本机IP地址和80或8000端口。如果只设置了IP没设端口,默认使用80端口。如果只设置了端口,没设置IP默认使用本机IP。详细配置请参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#listen server_name server_namedomain_name…; server 配置虚拟主机的域名,可以指定多个,用空格分隔。默认为空 charset http,server,location,ifinlocation charsetcharset|off; 设置请求编码,和url参数乱码问题有关。 location server,location location[=|~|~*|^~]uri{…}
location@name{…} http请求中的一个重要配置项,用于配置客户端请求服务器url地址的匹配规则。可以配置多个匹配规则 3、核心配置优化

#nginx不同于apache服务器,当进行了大量优化设置后会魔术般的明显性能提升效果 #nginx在安装完成后,大部分参数就已经是最优化了,我们需要管理的东西并不多 #usernobody; #阻塞和非阻塞网络模型: #同步阻塞模型,一请求一进(线)程,当进(线)程增加到一定程度后 #更多CPU时间浪费到切换一,性能急剧下降,所以负载率不高 #Nginx基于事件的非阻塞多路复用(epoll或kquene)模型 #一个进程在短时间内可以响应大量的请求 #建议值<=cpu核心数量,一般高于cpu数量不会带好处,也许还有进程切换开销的负面影响 worker_processes4; #将workprocess绑定到特定cpu上,避免进程在cpu间切换的开销 worker_cpu_affinity0001001001001000 #8内核4进程时的设置方法worker_cpu_affinity00000001000000100000010010000000 #每进程最大可打开文件描述符数量(linux上文件描述符比较广义,网络端口、设备、磁盘文件都是) #文件描述符用完了,新的连接会被拒绝,产生502类错误 #linux最大可打开文件数可通过ulimit-nFILECNT或/etc/security/limits.conf配置 #理论值系统最大数量/进程数。但进程间工作量并不是平均分配的,所以可以设置的大一些 worker_rlimit_nofile65535; #error_loglogs/error.log; #error_loglogs/error.lognotice; #error_loglogs/error.loginfo; #pidlogs/nginx.pid; events{ #并发响应能力的关键配置值 #每个进程允许的最大同时连接数,work_connectins*worker_processes=maxConnection; #要注意maxConnections不等同于可响应的用户数量, #因为一般一个浏览器会同时开两条连接,如果反向代理,nginx到后端服务器的连接也要占用连接数 #所以,做静态服务器时,一般maxClient=work_connectins*worker_processes/2 #做反向代理服务器时maxClient=work_connectins*worker_processes/4 #这个值理论上越大越好,但最多可承受多少请求与配件和网络相关,也可最大可打开文件,最大可用sockets数量(约64K)有关 worker_connections65535; #指明使用epoll或kquene(*BSD) useepoll; #备注:要达到超高负载下最好的网络响应能力,还有必要优化与网络相关的linux内核参数 } http{ includemime.types; default_typeapplication/octet-stream; #log_formatmain\'$remote_addr-$remote_user[$time_local]"$request"\' #\'$status$body_bytes_sent"$http_referer"\' #\'"$http_user_agent""$http_x_forwarded_for"\'; #关闭此项可减少IO开销,但也无法记录访问信息,不利用业务分析,一般运维情况不建议使用 access_logoff #只记录更为严重的错误日志,可减少IO压力 error_loglogs/error.logcrit; #access_loglogs/access.logmain; #启用内核复制模式,应该保持开启达到最快IO效率 sendfileon; #简单说,启动如下两项配置,会在数据包达到一定大小后再发送数据 #这样会减少网络通信次数,降低阻塞概率,但也会影响响应及时性 #比较适合于文件下载这类的大数据包通信场景 #tcp_nopushon;在 #tcp_nodelayon|offon禁用Nagle算法 #keepalive_timeout0; #HTTP1.1支持持久连接alive #降低每个连接的alive时间可在一定程度上提高可响应连接数量,所以一般可适当降低此值 keepalive_timeout30s; #启动内容压缩,有效降低网络流量 gzipon; #过短的内容压缩效果不佳,压缩过程还会浪费系统资源 gzip_min_length1000; #可选值1~9,压缩级别越高压缩率越高,但对系统性能要求越高 gzip_comp_level4; #压缩的内容类别 gzip_typestext/plaintext/cssapplication/jsonapplication/x-javascripttext/xmlapplication/xmlapplication/xml+rsstext/javascript; #静态文件缓存 #最大缓存数量,文件未使用存活期 open_file_cachemax=65535inactive=20s; #验证缓存有效期时间间隔 open_file_cache_valid30s; #有效期内文件最少使用次数 open_file_cache_min_uses2; server{ listen80; server_namelocalhost; charsetutf-8; #access_loglogs/host.access.logmain; location/{ roothtml; indexindex.htmlindex.htm; } #error_page404/404.html; #redirectservererrorpagestothestaticpage/50x.html # error_page500502503504/50x.html; location=/50x.html{ roothtml; } ... } ... }