NGINX配置文件 nginx.conf
1、nginx.conf结构分析
nginx配置文件中主要包括六块:main,events,http,server,location,upstream
main 块:(全局设置)主要控制 nginx子进程的所属用户/用户组、派生子进程数、
events块:控制 nginx处理连接的方式
http块:是nginx处理http请求的主要配置模块,大多数配置都在这里面进行
upstream块:用于设置一系列后端服务器,nginx做反向代理、后端服务器负载均衡相关配置,可以有多个
server块:用于指定虚拟主机域名、IP和端口,可以配置多个虚拟主机
location块:是server中对应的目录级别的控制块,URL匹配特定位置后的设置,可以有多个
他们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。
2、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;
}
}
nginx 配置文件语法
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配置超时
使用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分钟
php.ini配置
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)