| 
       
	 
	一、nginx的核心配置: 
	>>> 正常运行的必备配置: 
	1. user username [groupname]; #指定运行worker子进程的用户或组 
	 
	2. pid /path/to/pidfile_name; #指定nginx的pid文件 
	 
	3. worker_rlimit_nofile number; #worker进程能打开的文件描述符个数 
	 
	4. worker_rlimit_sigpending number; #设定每个用户能够发往worker进程的信号的数量(设定信号队列的大小); 
	>>> 优化性能相关的配置: 
	1. worker_processes number; #work进程的个数;通常其数值应该比CPU数量小 
	#woker_processes 1; 
	 
	2. worker_cpu_affinity cpumask(CPU掩码)...; #worker进程的CPU的倾向性,绑定worker进程到某个CPU上 
	#例子: 
	#worker_processes 2; #两个worker进程 
	#worker_cpu_affinity 0000(代表有4个CPU) 0001(第一个进程绑定第一个CPU上) 0010(第二个进程绑定到第二个CPU上) 
	 
	3. ssl_engine device; #在存在ssl加速设备的服务器上,指定所使用的ssl硬件加速设备; 
	#由于SSL比较消耗资源:加密、解密 
	 
	4. timer_resolution interval; #多长时间获取一次系统时间并更新nginx的缓存时钟 
	#每次内核事件调用返回时,都会使用gettimeofday()来获取系统时间更新nginx的缓存时钟;不过在X86架构的服务器上,可忽略该项 
	#timer_resolution 100ms; 100毫秒 
	5.worker_priority nice; #worker进程的优先级 
	nice为:-20,19之间的值 
	>>> 事件相关的配置 
	1. accept_mutex on|off; #是否打开nginx的负载均衡锁;默认是开启的 
	#为了实现多个worker响应均衡,打开锁后,就可以实现worker进程的负载均衡(谁拥有锁谁就接收用户的请求) 
	#但是,当打开worker的负载均衡锁后,会增加系统的开销(对请求进行调度) 
	#而通常当一个worker进程的负载达到其上限的7/8时,master就尽可能不在将请求调度至此worker; 
	 
	2. lock_file /path/to/lock_file; #负载均衡的锁文件 
	 
	3. accept_mutex_delay interval; 
	#accept锁模式中,一个worker进程为取得accept锁如果失败了,需要等待此选项定义的时长后才能继续获取锁; 
	#accept_mutex_delay 100ms; 
	 
	4. multi_accept on|off; #是否允许worker一次性接受多个请求; 
	#默认为off的 
	 
	5. use [epoll|rtsig|select|poll]; #指定使用哪种事件模型 
	#建议让nginx自行选择 
	 
	6. worker_connections number; #每个worker能够并发响应的最大请求数 
	#Web服务器上这个值最好比worker_rlimit_nofile多一些 
	#代理服务器上这个值最好是worker_rlimit_nofile的50% 
	 
	 
	>>> 用于调试、定位问题:只调试nginx时使用 
	1. daemon on|off; #是否让nginx运行于后台;默认为on,调试时应该为off 
	#在后台时,不输出信息到控制台 
	 
	2. master_process on|off; #是否让一个master管理多个worker进程运行;默认为off 
	#调试时可以启用该项,只启用master进程,方便追踪 
	 
	3. error_log /path/to/error_log level; #定义错误日志输出及日志级别 
	#调试时可以使用debug级别,但要求在编译时必须使用--with-debug启用debug功能; 
	#默认为error级别 
	二、nginx的http配置格式: 
	1. nginx的http功能使用http {}段配置: 
	http { 
	 
	} 
	 
	2. nginx必须使用虚拟主机来配置Web站点!每个虚拟主机使用一个server {}段配置: 
	server {  
	 
	} 
	 
	3. server {}需要定义在http {}之内: 
	http{ 
	server { 
	 
	} 
	} 
	 
	4. Web服务器的公共配置,需要定义在server {}之外,http {}之内 
	 
	三、nginx的http的配置参数 
	1. listen [addres:port]; #监听指定地址的端口 
	port; #监听的端口 
	default_server; #定义此server为httpd中默认的server,如果所有的server都没有定义default_server,则第一个为默认server;比如访问一个不存在的虚拟主机,默认响应的主机! 
	rcvuf=SIZE; #接收缓冲大小; 
	sndbuf=SIZE; #发送缓冲大小 
	ssl:https server; #https的地址 
	 
	2. server_name localhost localhost2; #主机名,可以多个主机名 
	#当nginx收到一个请求时,会取出其首部的server的值,而后跟众server进行比较: 
	#(1) 先做精确匹配:www.meng.com 
	#(2) 左侧通配符匹配:*.meng.com 
	#(3) 右侧通配符匹配:www.* 
	#(4) 正则表达式匹配:以波浪线开头(~^\*\.meng\.com$) 
	 
	3.server_name_hash_bucket_size 32|64|128; #hash表的大小 
	#为了实现快速主机查找,nginx使用hash表来保存主机名;  
	 
	5.location [ = | ~ | ~* | ^~ ] URI { 
	#根据用户的URI匹配location中的表达式,匹配到后做一些操作 
	#仅能在server {}或其他location中定义 
	 
	=:精确匹配;区分大小写 
	~:正则表达式匹配,区分字符大小写 
	~*:正则表达式匹配,忽略字符大小写 
	^~:只需要前半部分与URI匹配即可,不检查正则表达式 
	没有符号时,仅以起始路径匹配 
	 
	匹配优先级: 
	(1) 字符精确匹配 
	(2) 正则表达式检索(有多个,由第一个匹配到处理) 
	(3) 字符串比较 
	};  
	 
	 
	6.Location的常用参数: 
	(1) root /html; #网页根目录 
	#可以放在http {},server {},location {}中 
	Location的根目录是以root的设定路径为开始的,例如: 
	Location ^~ /images/ { 
	root /html; 
	index index.html; 
	} 
	#实际访问的地址是:http://localhost/images/index.html;但是index.html是在/html目录下的images目录里; 
	 
	(2) alias /html; #指定路径别名 
	将Location映射到alias上,例如: 
	Location ^~ /images/ { 
	alias /html; 
	} 
	#实际访问的地址是:http://localhost/images/File,但是文件所在的路径在/html中; 
	 
	 
	(3) index index.html idnex.html2; #网站首页文件, 
	 
	(4) error_page code ... [=[code]] uri; #配置错误页面重定向 
	#当对于某个请求返回错误时,如果匹配上了error_page指令中的设定的code,则重定向到新的URI中。 
	 
	(5) try_files /path [/path2 ...] uri; #多路径配置 
	#尝试匹配每一个PATH中的文件(从左到右),在第一次找到返回结果,如果都没有,则重定向到URI中(URI一定得存在); 
	 
	 
	四、网络连接相关的设置: 
	1. keepalive_timeout time; #保持连接的超时时间 
	#默认是75秒; 
	 
	2. keepalive_requests number; #保持连接上允许承载的最大请求数 
	 
	3. keepalive_disable [msie6 | safari | none]; #对指定的浏览器禁止使用长连接 
	 
	4. tcp_nodelay on|off; #对keepalive连接是否使用TCP_NODELAY选项; 
	#多个确认报文合并传过去,确认延迟(提高TCP性能) 
	#默认为on,不启动此选项 
	 
	5. client_header_timeout time; #读取http请求首部的超时时长 
	 
	6. client_body_timeout time; #读取http请求实体的超时时长 
	 
	7. send_timeout time; #发送响应的超时时长 
	五、对客户端请求的限制: 
	1. limit_except method ... { #指定客户端不能使用的方法; 
	 
	} 
	 
	2. client_max_body_size SIZE; #http请求包体的最大值; 
	#用于限制用户上传文件的大小; 
	#如果基于程序控制用户上传文件的大小(比如1g),当用户上传一个2g的文件时,只有已经传输完的包体超过1g才会通知用户文件过大,导致用户之前的操作全部白了;而基于此方法,可以直接读取请求头部的包体大小,如果过大,直接拒绝;避免做无用功; 
	 
	 
	3. limit_rate spped; #速率限制 
	限制客户端每秒传输的字节数;默认为0,表示没有限制。 
	 
	4. limit_rate_after time; #响应不限速的时长 
	nginx向客户端发送响应报文时,如果时长超出了此处指定的时长,则后续的发送过程开始限速; 
	六、文件操作的优化: 
	1. sendfile on|off; #是否启用sendfile功能 
	 
	2. aio on|off; #是否启用aio功能 
	 
	3. open_file_cache max=N [inactive=time]|off; #是否打开文件缓存功能 
	max:缓存条目的最大值;当满了以后根据LRU算法进行置换; 
	inactive timeout:如果一个缓存条目在指定时间内没有被访问过,将自动被删除;默认为60秒 
	 
	缓存的信息包括: 
	文件句柄(文件描述符)、文件大小和上次修改时间; 
	已经打开的目录结构; 
	没有找到或无权操作的信息; 
	 
	4. open_file_cache_errors on|off; #是否缓存"文件没有找到或无权操作"的信息 
	 
	5. open_file_cache_valid time; #多长时间检查一次缓存中的条目是否超出inactive时长 
	#默认为60秒 
	 
	6. open_file_cache_min_use number; #inactive时长内的访问次数超过该参数定义的值,无论inactive是否超时,都不删除; 
	七、对客户端请求的特殊处理: 
	1. ignore_invalid_headers on|off; #是否忽略不合法的http首部 
	#如果为off,当请求首部中出现不合法的http首部时,拒绝响应 
	 
	2. log_not_found on|off; #当用户访问的文件不存在时,是否将该信息记录到错误日志中 
	 
	3. resolver address; #指定nginx使用的dns服务器地址 
	 
	4. resover_timeout time; #指定dns解析超时时长,默认为30s; 
	 
	5. server_tokens on|off; #是否显示nginx的版本号 
	八、nginx的http核心模块内置变量: 
	1. $uri:当前请求的URI,不带参数 
	2. $request_uri:请求的uri,带完整参数 
	3. $host:http请求报文中的host首部,如果请求中没有host首部,则以处理此请求的虚拟主机的主机名代替 
	4. $hostname:nginx服务运行在的主机的主机名 
	5. $remote_addr:客户端IP 
	6. $remote_port:客户端端口 
	7. $remote_user:启用用户认证时,客户端输入的用户名 
	8. $request_filename:用户请求中的uri经过本地root或alias转换后映射的本地文件路径 
	9. $request_method:请求方法 
	10. $server_addr:服务器地址 
	11. $server_name:服务器域名 
	12. $server_port:服务器端口 
	13. $server_protocol:服务器向客户端发送响应时的协议,如http/1.1 
	14. $scheme:在请求中使用scheme,如https://www.magedu.com/中的scheme 
	15. $http_HEADER:匹配请求报文中指定的HEADER,例如:$http_host匹配请求报文中的host首部 
	16. $sent_http_HEADER;匹配响应报文中指定的HEADER,例如$http_content_type匹配响应报文中content-type首部 
	17. $document_root:当前请求映射到的root配置项 
	九、nginx的基本配置: 
	1.定义一个虚拟主机: 
	server { 
	listen 80; 
	server_name www.a.com; 
	root /web/html; 
	#Location = / { 
	# root index.html 
	# index index.html 
	#} 
	} 
	 
	2.定义访问控制: 
	#默认允许所有主机访问 
	allow 172.16. 
	deny all 
	 
	3.用户认证限制: 
	auth_basic "提示信息"; 
	auth_basic_user_file /etc/.nginxpasswd; 
	> htpasswd -c -m /etc/.nginxpasswd jerry 
	 
	4.索引: 
	autoindex on|off; #如果没有首页文件是否列出目录中的所有文件 
	#一般用作下载站 
	 
	5.限制: 
	limit requests; #限制同一客户端某时间内的最大请求数 
	limit conn; #限制客户端并发访问数 
	 
	6.日志设置: 
	log_format:定义日志访问格式 
	 
	7.防盗链的方法: 
	(1)valid_referers none | blocked | server_names | string ...; #定义合法的引用 
	none:通过浏览器直接访问 
	blocked:referers的首部被清除 
	server_names:来源的服务器名称(应该允许自己网站域名访问) 
	 
	(2)$invalid_referer: #定义不合法的引用 
	Location可以使用if指令: 
	if ($invalid_referer) { 
	rewrite ^/ http://www.baidu.com break; 
	} 
	 
	(1)正则表达式匹配: 
	~:与指定正则表达式模式匹配时返回"真",判断匹配与否时区分字符大小写; 
	~*:与指定正则表达式模式匹配时返回"真",判断匹配与否时不区分字符大小写; 
	!~:与指定正则表达式不匹配时返回"真",判断匹配与否时区分字符大小写; 
	!~*:与指定正则表达式不匹配是返回"真",判断匹配与否时不区分字符大小写; 
	==:等值比较 
	(2)文件及目录匹配判断 
	-f,!-f:判断指定的路径的文件是否存在 
	-d,!-d:判断指定的路径的目录是否存在 
	-e,!-e:判断指定的路径资源是否存在,文件和目录均可; 
	-x,!-x:判断执行的路径的文件是否存爱且可执行; 
	 
	8.rewrite的URL地址重写: 
	可用在server {},location {},if 
	(1)rewrite regex replacment [flag]; 
	regex:正则表达式 
	replacment:替换值 
	flag:标识位,避免死循环 
	last #一旦被当前规则匹配并重写后立即停止检查后续的其他rewrite规则,而通过重写后的规则重新发起请求,如果该请求继续能够被rewrite到,陷入循环 
	break #一旦被当前规则匹配并重写立即停止检查后续的其他rewrite规则,而后继续其他模块处理(例如直接响应) 
	redirect #返回302临时重定向 
	permanent #返回301永久重定向 
	 
	一旦陷入死循环,nginx最多循环10次,超出之后会返回500错误; 
	一般将rewrite写在location中时,都是用break标记,或者将rewrite写在if语句中; 
	 
	(2)rewrite_log on|off; #是否把重写过程记录到错误日志中,默认为off,级别为notice级别; 
	 
	(3)return code; #用于结束rewrite规则,并且为客户端返回状态码 
	可以使用的状态码有:204,400,402-400,500-504等; 
	if (condition) { 
	} 
	 
	9.stub_status: 
	location /server-status { 
	stub_status on; 
	access_log off; 
	allow 172.16.10.1/24; 
	deny all; 
	} 
	active:活跃连接数 
	server accepts handled requests:服务器读取的连接数,已经处理的连接数,正在处理的请求数 
	reading:读取的请求个数 
	writing:正在处理请求或者正在把请求发往客户端 
	wating:保持连接的状态,等待用户请求 
	 
	10.压缩功能: 
	gizp on|off 
	gizp_buffers 4 16k;申请4个单位为16k的内存作为压缩结果流缓存 
	gzip_com_level levle;:指定gzip压缩级别,1-9,级别越高,压缩比越大 
	gzip_disable regex ie6; 禁止在ie6上使用gzip压缩 
	gzip_min_length length; 最小压缩字节 
	gzip types text/palin ...; 压缩的文件类型 
	gizp_http_version 1.1; 压缩后使用什么协议传输 
	gzip_vary:让缓存服务器缓存gzip压缩过的数据 
	 
	11. nginx内置变量补充 
	ngx_http_core_module 模块在处理请求时,会有大量的变量,这些变量可以通过访问日志来记录下来,也可以用于其它 
	nginx 模块: 
	参数名称 注释 
	  1. $arg_PARAMETER HTTP 请求中某个参数的值,如/index.php?site=www.ttlsa.com,可以用$arg_site 取得 www.ttlsa.com 这个值. 
	  2. $args HTTP 请求中的完整参数。例如,在请求/index.php?width=400&height=200 中,$args 表示字符串 width=400&height=200. 
	  3. $binary_remote_addr 二进制格式的客户端地址。例如:\x0A\xE0B\x0E 
	  4. $body_bytes_sent 表示在向客户端发送的 http 响应中,包体部分的字节数 
	  5. $content_length 表示客户端请求头部中的 Content-Length 字段 
	  6. $content_type 表示客户端请求头部中的 Content-Type 字段 
	  7. $cookie_COOKIE 表示在客户端请求头部中的 cookie 字段 
	  8. $document_root 表示当前请求所使用的 root 配置项的值 
	  9. $uri 表示当前请求的 URI,不带任何参数 
	  10. $document_uri 与$uri 含义相同 
	  11. $request_uri 表示客户端发来的原始请求 URI,带完整的参数。$uri 和$document_uri 未必是用户的原始请求,在内部重定向后可能是重定向后的 URI,而$request_uri 永远不会改变,始终是客户端的原始 URI. 
	  12. $host 表示客户端请求头部中的 Host 字段。如果 Host 字段不存在,则以实际处理的 server(虚拟主机)名称代替。如果 Host 字段中带有端口,如 IP:PORT,那么$host 是去掉端口的,它的值为 IP。$host是全小写的。                   这些特性与 http_HEADER 中的 http_host 不同,http_host 只取出 Host 头部对应的值。 
	  13. $hostname 表示 Nginx 所在机器的名称,与 gethostbyname 调用返回的值相同 
	  14. $http_HEADER 表示当前 HTTP 请求中相应头部的值。HEADER 名称全小写。例如,示请求中 Host 头部对应的值 用 $http_host 表 
	  15. $sent_http_HEADER 表示返回客户端的 HTTP 响应中相应头部的值。HEADER 名称全小写。例如,用 $sent_http_content_type 表示响应中 Content-Type 头部对应的值 
	  16. $is_args 表示请求中的 URI 是否带参数,如果带参数,$is_args 值为 ?,如果不带参数,则是空字符串 
	  17. $limit_rate 表示当前连接的限速是多少,0 表示无限速 
	  18. $nginx_version 表示当前 Nginx 的版本号 
	  19. $query_string 请求 URI 中的参数,与 $args 相同,然而 $query_string 是只读的不会改变 
	  20. $remote_addr 表示客户端的地址 
	  21. $remote_port 表示客户端连接使用的端口 
	  22. $remote_user 表示使用 Auth Basic Module 时定义的用户名 
	  23. $request_filename 表示用户请求中的 URI 经过 root 或 alias 转换后的文件路径 
	  24. $request_body 表示 HTTP 请求中的包体,该参数只在 proxy_pass 或 fastcgi_pass 中有意义 
	  25. $request_body_file 表示 HTTP 请求中的包体存储的临时文件名 
	  26. $request_completion 当请求已经全部完成时,其值为 “ok” 。若没有完成,就要返回客户端,则其值为空字符串;或者在断点续传等情况下使用 HTTP range 访问的并不是文件的最后一块,那么其值也是空字符串。 
	  27. $request_method 表示 HTTP 请求的方法名,如 GET、PUT、POST 等 
	  28. $scheme 表示 HTTP scheme,如在请求 https://nginx.com/中表示 https 
	  29. $server_addr 表示服务器地址 
	  30. $server_name 表示服务器名称 
	  31. $server_port 表示服务器端口 
	  32. $server_protocol 表示服务器向客户端发送响应的协议,如 HTTP/1.1 或 HTTP/1.0 
 
 
      (责任编辑:IT) |