Nginx内置变量与配置文件详解-参数说明
Nginx内置变量与配置文件详解-参数说明
$args #请求中的参数值
$query_string #同 $args
$arg_NAME #GET请求中NAME的值
$is_args #如果请求中有参数,值为"?",否则为空字符串
$uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri #同 $uri
$document_root #当前请求的文档根目录或别名
$host #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名
$hostname #主机名
$https #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent #传输给客户端的字节数
$connection #TCP连接的序列号
$connection_requests #TCP连接当前的请求数量
$content_length #"Content-Length" 请求头字段
$content_type #"Content-Type" 请求头字段
$cookie_name #cookie名称
$limit_rate #用于设置响应的速度限制
$msec #当前的Unix时间戳
$nginx_version #nginx版本
$pid #工作进程的PID
$pipe #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr #客户端地址
$remote_port #客户端端口
$remote_user #用于HTTP基础认证服务的用户名
$request #代表客户端的请求地址
$request_body #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method #HTTP请求方法,通常为"GET"或"POST"
$request_time #处理客户端请求使用的时间; 从读取客户端的第一个字节开始计时
$request_uri #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme #请求使用的Web协议,"http" 或 "https"
$server_addr #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name #服务器名
$server_port #服务器端口
$server_protocol #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status #HTTP响应代码
$time_iso8601 #服务器时间的ISO 8610格式
$time_local #服务器时间(LOG Format 格式)
$cookie_NAME #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可
$http_cookie
$http_post
$http_referer
$http_user_agent
$http_x_forwarded_for
$sent_http_NAME #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding
配置文件优化
编辑 php-fpm 配置文件,如 fastcgi.conf 或 fcgi.conf(这个配置文件名也可以自定义的,根据具体文件名修改):
找到:
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
改为:
fastcgi_param SERVER_SOFTWARE nginx;
或者
在Nginx配置文件中的http模块加入以下参数
server_tokens off;
配置模块分隔说明
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。(在做URI路由时,URI不但是名称,也是一个路径)
日志变量说明
$remote_addr 访问者客户端IP地址信息
$http_x_forwarded_for 用于在请求报文中添加一个新的字段信息
$remote_user 记录客户端用户名称
$request 记录请求的 URL 和 HTTP Protocol
$status 记录请求状态码
$body_bytes_sent 发送给客户端的数据大小 Bytes,不包括 Header 的大小;该变数与 Apache mod_log_config 的 "%B" 相容
$bytes_sent 发送给客户端的 总Bytes数
$connection 连接的序列号
$connection_requests 当前通过一个连接获得的请求数量
$msec 日志写入时间。单位为秒,精度是毫秒
$pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为"p",否则为"."
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器相关信息
$request_length 请求的长度(包括请求行,请求头和请求正文)
$request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个位元组开始,直到把最后一个字元发送给客户端后进行日志写入为止
$time_iso8601 ISO8601标准格式下的本地时间
$time_local 用户访问网站时间信息
配置参数
#使用nginx这个用户运行,更加安全
user nginx;
#pid文件位置
pid logs/nginx.pid;
#指定全局日志输出位置,notice是日志级别
error_log logs/nginx.log notice;
#开启的工作进程数量,和cpu核心数相同
worker_processes auto;
#工作进程绑定哪个cpu,进行指定,通常用不到
#worker_cpu_affinity 01 10;
#这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)一样。
#现在在linux 2.6内核下开启文件打开数为65535
worker_rlimit_nofile 65535;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 2 因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
#每个work进程可以建立的最大的链接数
worker_connections 65535;
#将日志加载到内存,一起写入日志文件。
#max:最大条目数的,如果缓存被占满,采用 LRU 算法将描述符关闭。
#inactive:设置存活时间,默认10s
#min_uses:设置在 inactive 时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是 1 次
#valid:设置检查频率,默认 60s
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
events {
epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
}
http {
#[日志格式]
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$request_time" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$content_type"'
'" $request_body"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log info;
#由 ngx_http_rewrite_module 模块提供的。用来记录重写日志的。对于调试重写规则建议开启。
#rewrite_log on;
#[limit限制]
#设置用于保存各种 key(比如当前连接数)的共享内存的参数。 5m 就是5MB,这个值应该被设置的足够大以存储(32K*5) 32byte 状态或者(16K*5) 64byte 状态。
#临时存储客户端访问IP地址的缓存区。($binary_remote_addr类型一个地址4个字节)(放在http区块下)
limit_conn_zone $binary_remote_addr zone=olda:5m;
#我们设置的值是 10,也就是说我们允许每一个IP地址最多同时打开有 10 个连接。
#olda参数是上方limit_conn_zone定义的变量(放在location区块下)
limit_conn olda 10;
#限速模块,前3M下载时不限速
limit_rate_after 3m;
#限速模块
limit_rate 512k;
#临时存储客户端访问IP地址的缓存区。(放在http区块下)
#定义请求来至同一个连接,每1秒可以接收处理一个请求
limit_req_zone $binary_remote_addr zone=olda:5m rate=1r/s;
#olda参数是上方limit_conn_zone定义的变量(放在location区块下)
#同一个连接并发只能5个请求,其余的请求丢包
limit_req zone=olda burst=5 nodelay;
#[基础设置]
#禁用ssi
ssi off;
#禁用autoindex 模块
autoindex off;
#媒体类型,标准
include mime.types;
#设置文件使用默认的mine-type,默认为text/plain
default_type application/octet-stream;
#隐藏版本号
server_tokens off;
#编码格式(字符集)
charset UTF-8;
#[信息传输]
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。如果图片显示不正常把这个改成off。
sendfile on;
#必须在sendfile开启模式才有效,节省数据包数量,尽量整合数据把一个数据包存满再发送
tcp_nopush on;
#必须在sendfile开启模式才有效告诉nginx不要缓存数据,而是一段一段的发送。当数据被拆分后,立刻发送数据。
tcp_nodelay on;
#[超时设置,单位均为秒]
#客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接(设置为0秒,就是TCP短连接了),对于后端是php,可以低一些,因为php解析快,java的话要长一些,java解析慢
keepalive_timeout 30;
#设置请求头的超时时间。我们也可以把这个设置低些,如果超过这个时间没有发送任何数据,nginx将返回request time out的错误
client_header_timeout 10;
#设置请求体的超时时间。我们也可以把这个设置低些,超过这个时间没有发送任何数据,和上面一样的错误提示
client_body_timeout 10;
#响应客户端超时时间,服务端给客户端发送数据,如果客户端迟迟不接受没超过以下时间将断开连接
send_timeout 10;
#告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
reset_timedout_connection on;
#[server_name控制]
#保存服务器名字(server_name www.xx.com这种)的hash表,如果名字太长,就需要将如下值变大为64
server_names_hash_bucket_size 64;
#存储服务器名字的值大小,默认512kb,如果一个server对应多个域名,就要加大此值
server_names_hash_max_size 512;
#[提交缓存]
#nginx 会将整个请求头都放在一个 buffer 里面,这个buffer 的大小通过配置项 client_header_buffer_size 来设置,如果用户的请求头太大,这个 buffer 装不下,那 nginx 就会重新分配一个新的更大的 buffer来装请求头,这个大 buffer 可以通过 large_client_header_buffers 来设置,这个 large_buffer 这一组 buffer,比如配置 4 8k,就是表示有四个 8k 大小的buffer 可以用。
client_header_buffer_size 32k;
#此指令规定了用于读取大型客户端请求头的缓冲区的最大数量和大小。 这些缓冲区仅在缺省缓冲区不足时按需分配。 当处理请求或连接转换到保持活动状态时,释放缓冲区。如下例子:
large_client_header_buffers 4 32k;
#此指令设置NGINX能处理的最大请求主体大小。 如果请求大于指定的大小,则NGINX发回HTTP 413(Request Entity too large)错误。如果在上传大文件,可以将此值设置大一些
client_max_body_size 8m;
#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=100000 inactive=20s;
#这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;
#open_file_cache指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。
open_file_cache_min_uses 2;
#指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置
open_file_cache_errors off;
#[压缩方面]
#开启页面压缩
gzip on;
#gzip压缩是要申请临时内存空间的,假设前提是压缩后大小是小于等于压缩前的。例如,如果原始文件大小为10K,那么它超过了8K,所以分配的内存是8 * 2 = 16K;再例如,原始文件大小为18K,很明显16K也是不够的,那么按照 8 * 2 * 2 = 32K的大小申请内存。如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
gzip_buffers 2 8k;
#进行压缩的原始文件的最小大小值,也就是说如果原始文件小于1K,那么就不会进行压缩了
gzip_min_length 1K;
# 默认值: 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_http_version 1.1;
# 默认值:1(建议选择为4)
# gzip压缩比/压缩级别,压缩级别 1-9,级别越高压缩率越大,当然压缩时间也就越长(传输快但比较消耗cpu)。
gzip_comp_level 5;
#需要进行gzip压缩的Content-Type的Header的类型。建议js、text、css、xml、json都要进行压缩;图片就没必要了,gif、jpge文件已经压缩得很好了,就算再压,效果也不好,而且还耗费cpu。
gzip_types text/HTML text/plain application/x-javascript text/css application/xml;
# 禁用IE6的gzip压缩,又是因为杯具的IE6。当然,IE6目前依然广泛的存在,所以这里你也可以设置为“MSIE [1-5].”
# IE6的某些版本对gzip的压缩支持很不好,会造成页面的假死,今天产品的同学就测试出了这个问题后来调试后,发现是对img进行gzip后造成IE6的假死,把对img的gzip压缩去掉后就正常了为了确保其它的IE6版本不出问题,所以建议加上gzip_disable的设置
gzip_disable "msie6";
#[--压缩--]
# 默认值: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_proxied any;
#尽量发送压缩过的静态文件
gzip_static on;
server { #主机字段
listen 80; #监听端口
server_name localhost; #域名
location / {
root html; #页面所在目录
index index.html index.htm index.php; #首页文件
}
#error_page 404 /404.html; #404页面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ /\.html { #指定10.0.0.0网段禁止访问文件
deny 10.0.0.0/24;
allow 172.16.1.0/24;
}
}
}
配置文件语法详解:
区域详解:
01)nginx配置文件段落划分方式---基于模块进行划分
02)核心模块区域:main 表示作为核心区域
03)事件模块区域:events 表示作为事件区域
04)HTTP模块区域:HTTP 表示作为HTTP区域
05)server模块区域:server 表示作为主机区域 # 多个server模块
06)location模块区域:location 表示作为网站路径区域 多个location模块
07)if模块区域: if 表示作为信息判断区域 多个if模块
配置文件正则:
= 精确匹配
^~ 以某个字符串开头
~ 区分大小写匹配
~* 不区分大小写匹配
!~ 区分大小写并不匹配 (新版本不可用)
!~* 不区分大小写并不匹配 (新版本不可用)
/ 通用匹配,任何都可以
错误日志级别详解:
error_log /var/log/nginx/error.log warn; --- 定义错误日志存储的路径 定义错误日志级别
日志错误级别:
debug --- 调试级别 会产生的信息比较多
info --- 信息级别 会产生的信息比较多
notice --- 通知级别 会产生的信息比较少
warn --- 警告级别 会产生错误信息 企业配置级别
error --- 错误级别 会影响服务运行 企业配置级别
crit(critical) --- 严重级别 会导致服务无法运行
alert --- 报警级别 会导致服务无法运行
emerg --- 崩溃级别 会导致服务无法运行
ulimit -a 查看内核参数
Nginx文件说明:
|-- client_body_temp
|-- conf #nginx所有配置文件的目录;(极其重要)
| |-- fastcgi.conf #fastcgi相关参数的配置文件;
| |-- fastcgi.conf.default #fastcgi.conf的原始备份文件;
| |-- fastcgi_params #fastcgi的参数文件;
| |-- fastcgi_params.default
| |-- koi-utf
| |-- koi-win
| |-- mime.types #媒体类型;
| |-- mime.types.default
| |-- nginx.conf #nginx默认的配置文件;
| |-- nginx.conf.default
| |-- scgi_params #scgi相关参数文件;(一般用不到)
| |-- scgi_params.default
| |-- uwsgi_params #uwsgi相关参数文件;(一般用不到)
| |-- uwsgi_params.default
| `-- win-utf
|-- fastcgi_temp #fastcgi临时目录;
|-- html #编译安装nginx默认站点目录;
| |-- 50x.html #错误页面优雅替代显示文件;
| `-- index.html #默认首页文件;
|-- logs #nginx默认日志路径,包括错误日志及访问日志;
| |-- access.log #nginx访问日志;
| |-- error.log #nginx错误日志;
| `-- nginx.pid #nginx的pid文件,nginx把所有进程的ID号写入此文件;
|-- proxy_temp #临时目录;
|-- sbin #nginx命令的目录,如nginx的启动命令nginx;
| `-- nginx #nginx服务启动命令;
|-- scgi_temp #临时目录;
`-- uwsgi_temp #临时目录;