一、nginx.conf结构分析javascript
nginx配置文件中主要包括六块:main,events,http,server,location,upstreamphp
main 块:(全局设置)主要控制 nginx子进程的所属用户/用户组、派生子进程数、css
events块:控制 nginx处理链接的方式html
http块:是nginx处理http请求的主要配置模块,大多数配置都在这里面进行java
upstream块:用于设置一系列后端服务器,nginx作反向代理、后端服务器负载均衡相关配置,能够有多个node
server块:用于指定虚拟主机域名、IP和端口,能够配置多个虚拟主机linux
location块:是server中对应的目录级别的控制块,URL匹配特定位置后的设置,能够有多个nginx
他们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。它有本身的特殊指令,不须要在其余地方的应用。web
二、nginx配置命令解释正则表达式
nginx中每条配置命令都必需要以分号“;”结束!
user nobody; //配置nginx 子进程使用的用户和组 worker_processes 1; //配置nginx工做进程数,建议跟指定CPU数量同样多 error_log logs/error.log notice; //配置错误日志的存放位置,错误日志的级别有:debug,info,notice,warn,error,crit pid logs/nginx.pid; //指定nginx master pid的存放路径 worker_rlimit_nofile 51200; //配置文件描述符数量,最大为系统最多打开文件数(ulimit -n)与nginx进程数相除,可是nginx分配请求并非那么均匀,因此最好与ulimit -n 的值保持一致 events { use epoll; //使用网络I/O模型,linux系统推荐使用epoll,FreeBSD推荐使用kqueue worker_connections 1024; //容许并发链接的最大请求数,理论上每台nginx服务器的最大链接数为worker_processes*worker_connections #multi_accept on; //暂时还没了解其做用 } http { include mime.types; //包含指定的文件(能够含路径) default_type application/octet-stream; //文件类型未定时,默认类型为二进制流 #charset utf-8; //默认的字符编码集 #include upstream.conf; //可单独配置,include 进来 upstream ixdba.net{ //负载均衡器名字 ip_hash; //调度算法:轮询(默认),weight(须要设置权值weight=1;),ip_hash(来自同一个 ip的访客固定访问一个后端服务器),fair和 url_hash(第三方) server 192.168.12.133:80; server 192.168.12.134:80 down; //暂不参加负载均衡 server 192.168.12.133:8090 max_fails=3 fail_timeout=20s; //容许请求失败的次数,默认1,当超过期返回 proxy_next_upstream 定义错误; #server 192.168.12.135:8090 backup; //当算法为 ip_hash 时不可用,预留备份机器,当非 backup 机器忙或故障时启用, } //配置访问日志格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" "$http_cookie" "$http_user_agent" ' '$request_time $logid $remote_addr $server_addr $upstream_addr $host ' '"$http_x_forwarded_for" $product $subsys $tracecode $msec'; access_log logs/host.access.log main; //启用访问日志,而且指定日志采用的格式 server_names_hash_bucket_size 128; // client_header_buffer_size 4k; //客户端请求头的 headerbuffer 大小;若是自定义消息头或 cookie 大,可适当调大 large_client_header_buffers 4 32k; //客户端请求中较大的消息头的缓存最大数目和大小 client_max_body_size 4m; //容许客户端请求的最大单个文件; client_body_buffer_size 513k; open_log_file_cache max=10 inactive=60s valid=1m min_uses=2; ###max : 设置缓存中描述符的最大数量;若是缓存被占满,最近最少使用(LRU)的描述符将被关闭。 ###inactive : 设置缓存文件描述符在多长时间内没有被访问就关闭; 默认为10秒。 ###min_uses : 设置在inactive参数指定的时间里, 最少访问多少次才能使文件描述符保留在缓存中;默认为1。 ###valid :设置一段用于检查超时后文件是否仍以一样名字存在的时间; 默认为60秒。 sendfile on; //开启高效文件传输模式,将tcp_nopush和 tcp_nodelay 开启,用于防止网络阻塞 tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; #长链接 send_timeout 10; #响应客户端的超时时间,这个超时仅限于连个链接活动之间 ####FastCGI相关参数是为了改善网站的性能:减小资源占用,提升访问速度。 fastcgi_connect_timeout 50; fastcgi_send_timeout 10; fastcgi_read_timeout 10; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_intercept_errors on; gzip on; //是否开启gzip压缩(还须要和其它配置项共同起做用),实时压缩数据流 gzip_min_length 1k; // gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; policy_frame off; policy_path "<path>webserver/conf/"; policy_dtdname policy.dtd; policy_docname policy.xml; policy_logpath "<path>log/webserver"; policy_logfile policy.; policy_logsize 1600; policy_loglevel 16; proxy_connect_timeout 15s; #nginx跟后端服务器链接超时时间(代理链接超时) proxy_read_timeout 24s; #链接成功后,后端服务器响应时间(代理接收超时) proxy_send_timeout 10s; #后端服务器数据回传时间(代理发送超时) proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 64k; #proxy_buffers缓冲区,网页平均在32k如下的设置 proxy_busy_buffers_size 128k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 proxy_set_header LOGID $logid; proxy_set_header Host $http_host; uninitialized_variable_warn off; set_real_ip_from 10.0.0.0/8; real_ip_header CLIENTIP; include php.conf; #server配置单独配置,减小主配置文件复杂度 }
server块配置文件
server { listen 8234; //主机监听端口(能够是ip:port格式,默认监听127.0.0.1) server_name 192.168.12.188 www.ixdba.net; //指定 IP 地址或域名,多个用空格分开 more_set_headers 'Server: Apache'; set $php_upstream 'unix:var/php-cgi.sock'; #set $php_upstream 'unix:var/hhvm.sock'; add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST'; ####设置 access_log日志按小时切割### if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})") { set $year $1; set $month $2; set $day $3; set $hour $4; set $minutes $5; set $seconds $6; } access_log "/home/aaa/log/webserver/access.log.$year$month$day$hour" main; ####统一配置全局的rewrite规则,rewrite文件 include rewrite; #######location###能够在location里设置 proxy ,实现动静分离 location ~* /((.*)\.(.*)\/(.*)\.php){ deny all; } #图片缓存时间设置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } location ~ .*\.(js|css)?$ { expires 1h; //配置全部的js,css文件缓存1小时 } location /sample/ { root /home/aaa/sample/webroot; # index index.php; fastcgi_pass $php_upstream; include fastcgi.conf; rewrite ^/sample(/[^\?]*)?((\?.*)?)$ /sample/index.php$1$2 break; } }
4.1 break指令:
语法:break;
默认值:none
使用范围:if,server,location
做用:完成当前的规则集,再也不处理rewrite指令,须要和last加以区分
4.2 if指令:
语法:if ( condition ) { ... }
默认值:none
使用范围:server,location
做用:用于检测一个条件是否符合,符合则执行大括号内的语句。不支持嵌套,不支持多个条件&&或||处理
condition的范围:
4.2.1 变量名,可是不包括空字符串“”,或者任何以0开始的字符串
4.2.2 变量能够比较,用“=”或者“!=”
4.2.3 变量能够匹配正则表达式,用“~*”(不区分大小写)或者“~”(区分大小写),能够采用“!”来表示取反,如“!~”或者“!~*”
4.2.4 “!-f”和“-f”用来判断文件是否存在
4.2.5 “-e”和“!-e”用来文件或者目录是否存在
4.2.6 “-d”和“!-d”用来判断目录是否存在
4.2.7 “-x”和“!-x”用来判断文件是否可执行
4.2.8 正则表达式中支持“()”分组,分组的值在后面能够经过$1~$9来引用
4.3 return指令:
语法:return code;
默认值:none
使用范围:server,if,location
做用:用于结束规则的执行和返回状态码给客户端。状态码的值能够是:204,400,402~406,408,410,411,413,416以及500~504,另外非标准状态码444,表示以不发送任何的Header头来结束链接。
4.4 rewrite指令:
语法:rewrite regex replacement flag;
默认值:none
使用范围:server,if,location
做用:该指令用于重定向URI或者更改字符串的内容,指令根据配置文件中的顺序来执行。注意:rewrite只针对相对路径,即匹配的是URL地址中主机名以后的内容。若是你想匹配主机名,则须要使用 if 语句。
flag标记:
last --- 至关于Apache中的[L]标记,表示该条是最后一条规则,后面的规则不继续匹配,可是要从新发起请求
break --- 本条规则匹配完成后,终止匹配,再也不匹配后面的规则
redirect --- 返回302重定向地址,浏览器地址栏会显示跳转后的地址
premanent --- 返回301永久重定向,浏览器地址栏会显示跳转后的地址
说明:last 和 break 做用相似,可是它们之间有必定的区别。在使用 alias 指令时必需要用 last 标记,在使用 proxy_pass 指令时则要使用 break 标记。last 标记表示,在本条rewrite规则执行完成以后须要对其所在的 server 段从新发起请求,而 break 则在本条规则匹配完成以后,终止匹配,再也不对后面的的规则匹配。一般状况下,在“根location”中,如:location / { ... } 或者在 server 中直接编写的 rewrite 指令,推荐使用 last ,而在其它块儿中则推荐使用 break。
4.5 set指令:
语法:set variable value;
默认值:none
使用范围:server,location,if
做用:该指令用于定义一个变量,而且给变量进行赋值。变量的值能够是文本、一个变量或者变量和文本的联合,文本须要用引号引发来。
4.6 uninitalized_variable_warn指令:
语法:uninitalized_variable_warn on|off;
默认值: on
使用范围:http,server,location,if
做用:用于开启或者关闭记录关于未初始化变量的警告信息
nginx中可使用的全局变量:$args,$content_lenght,$content_type,$document_root,$document_uri,$host,$http_user_agent,$http_cookie,$limit_rate,$request_body_file,$request_method,$remote_addr,$remote_port,$remote_user,$request_filename,$request_uri,$query_string,$scheme,$server_protocol,$server_addr,$server_name,$server_port,$uri。
$remote_addr, $http_x_forwarded_for 记录客户端IP地址 $remote_user 记录客户端用户名称 $request 记录请求的URL和HTTP协议 $status 记录请求状态 $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。 $bytes_sent 发送给客户端的总字节数。 $connection 链接的序列号。 $connection_requests 当前经过一个链接得到的请求数量。 $msec 日志写入时间。单位为秒,精度是毫秒。 $pipe 若是请求是经过HTTP流水线(pipelined)发送,pipe值为“p”,不然为“.”。 $http_referer 记录从哪一个页面连接访问过来的 $http_user_agent 记录客户端浏览器相关信息 $request_length 请求的长度(包括请求行,请求头和请求正文)。 $request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。 $time_iso8601 ISO8601标准格式下的本地时间。 $time_local 通用日志格式下的本地时间。
使用nginx服务器若是遇到timeou状况时能够以下设置参数,使用fastcgi:
fastcgi_connect_timeout 5; 连接
fastcgi_read_timeout 10; 读取
fastcgi_send_timeout 10; 发请求
这两个选项.
fastcgi_read_timeout是指fastcgi进程向nginx进程发送response的整个过程的超时时间
fastcgi_send_timeout是指nginx进程向fastcgi进程发送request的整个过程的超时时间
为防止链接超时,在 PHP中能够调用
fastcgi_finish_request — 此函数冲刷(flush)全部响应的数据给客户端并结束请求。 这使得客户端结束链接后,须要大量时间运行的任务可以继续运行。
测试中,若是是php-fpm中的超时
将显示 502 Bad Gateway
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx</center>
</body>
</html>
keepalive_timeout 600; 链接超时时间,1分钟;0表示关闭长链接;若有文件下载时必须开启,并根据文件下载时长设定,下载时超过此值会下载失败。
proxy_connect_timeout 600; 1分钟,该指令设置与upstream server的链接超时时间
proxy_read_timeout 600; 1分钟
max_execution_time设置容许脚本运行的时间,单位为秒。若是超过了此设置,脚本返回一个致命的错误。
PHP 中set_time_limit()最大的执行时间,单位为秒。若是设置为0(零),没有时间方面的限制。会从零开始从新启动超时计数器。
max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)