配置示例:javascript
location /basic_status { stub_status; }
页面展现含义:php
Active connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106 Active connections: 活动状态的链接数; accepts:已经接受的客户端请求的总数; handled:已经处理完成的客户端请求的总数; requests:客户端发来的总的请求数; Reading:处于读取客户端请求报文首部的链接的链接数; Writing:处于向客户端发送响应报文过程当中的链接数; Waiting:处于等待客户端发出请求的空闲链接数;
指令:css
在http区域定制日志格式
用法:log_format name string ...;
name指定一个格式名称,string可使用nginx核心模块及其它模块内嵌的变量指定格式。html
可在每一个server中,或location中指定一个日志存放路径
用法:前端
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off;
指定日志存放路径path,格式format,缓冲区大小buffer,也可启用压缩日志,指定压缩级别gzipjava
定义一个缓存保存活跃的日志文件描述符数据
用法:nginx
open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off;
max:缓存的最大文件描述符数量;
min_users:在inactive指定的时长内访问大于等于此值方可被看成活动项;
inactive:非活动时长;
valid:验证缓存中各缓存项是否为活动项的时间间隔;
配置示例:web
log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" "$gzip_ratio"'; access_log /var/logs/nginx-access.log combined buffer=32k; open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
将用户请求的URI基于regex所描述的模式进行检查,然后完成替换;
URL重写是一个很是有用的功能,若是一个网站在改进的过程当中结构发生变化,无需客户端更改已保存访问地址仍可正常访问;提高网站安全性,如放盗链行为。正则表达式
syntax: rewrite regex replacement [flag] Context: server, location, if
将用户请求的URI基于regex所描述的模式匹配检查,匹配到时将其替换成replacement指定的新URI;
rewrite指令在同一级配置块中存在多条rewrite规则,会按照顺序自上而下逐一执行;被某一规则替换完成后,从新开始新一轮检查,所以自己具备循环机制,flag所表示的标志位可控制循环机制;若是replacement是以http://或其余协议开头的字符串,则直接以重定向方式返回给客户端;
另外,rewrite指令接收到的URI是不包含host地址的,例如http://cutemsyu.com/articles/...,不包含"cutemsyu.com" ,在写regex规则时应当注意。后端
[flag] 可用标识以下:
Example:
#flag 是last的一个例子 server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... } #若是上面的rewrite规则写在location中,则应该使用break标识,防止死循环,若是循环超过10此,返回500错误码 location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; }
syntax: return code [text]; return code URL; return URL; context: server, location, if
中止处理并返回一个状态码给客户端。
syntax: if (condition) { ... } context: server, location
引入一个新的配置上下文,知足条件时执行配置块中的指令
condition为判断条件,支持三种设置方法:
其中 比较操做符有:
文件及目录存在性判断:
Example:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; }
Example:
#访问video.cutemsyu.com 跳转至v.cutemsyu.com server { listen 80; server_name video.cutemsyu.com; rewrite ^(.*) http://v.cutemsyu.com$1 ; ... }
默认状况下nginx进行rewrite后都会自动添加旧地址中参数部分,在replacement末尾添加"?"便可屏蔽旧地址中的参数
Example:
##原来的访问的url为http://cutemsyu.com/article/nature/index.php?id=22341 rewrite ^/article/nature/(.*) http://cutemsyu.com/article/natrue.html permanent 重写以后访问的URL为http://cutemsyu.com/article/nature.html?id=22341 也就是说原有的参数部分它会自动补上 rewrite ^/article/nature/(.*) http://cutemsyu.com/article/natrue.html? permanent 重写以后的URL为http://cutemsyu.com/article/nature.html,没有原来的参数部分
一般为了加快客户端访问资源响应时间,服务器不会一次性将所有资源响应给客户端,首先传回网页的文本内容,当客户端解析文本内容中的图片、视频等资源时会再次向服务器发起请求。当某个站点将图片连接指向其余服务器,给其余服务器形成负担,这就是非法的盗链行为。咱们在搭建服务站点时要有意识防范盗链行为。
http协议头部中referer头域表示访问当前资源的源地址,根据referer中的源地址URL来判断是否来自本站,如非本站的地址,采起阻断措施防止盗链。
syntax: valid_referers none | blocked | server_names | string ...; context: server,location;
valid_referers 指令根据规则检测头域中referer中值是否合法,若是非法内嵌变量 $invalid_referer 值为1.
参数含义:
string,定义字符串形式。
Example:
#若是发现盗链,重写连接为指定的表示禁止盗用的图片 server { listen 80; server_name v.cutemsyu.com; location ~* ^.+\.(gif|jpg|png|flv|mp4|swf)$ { valid_referers none blocked server_names *.cutemsyu.com ~\.google\. if ($invalid_referer) { rewrite ^/ http://v.cutemsyu.com/images/forbbiden.jpg } } }
压缩文本数据,提高网络响应速度,做为静态服务器使用颇有必要开启,压缩文本将节省大量带宽,同时提高响应速度。可是若是做为反向代理服务器则须要考虑,压缩功能是否应该由后端服务器承担,以此减轻前端服务器CPU压力。
该模块功能是对指定类型数据使用gzip方法压缩
做用域Context: http, server, location
此模块gzip功能启用或禁用
压缩过滤器,仅对指定的MIME类型进行压缩处理
设置压缩级别1-9,默认值为1压缩速率最快,压缩比最低
启用压缩功能的响应报文大小阈值,小于该置不进行压缩。防止有些小数据压缩以后更大的状况,推荐值为1024
压缩数据使用缓冲区大小,size默认为内存分页大小
旧版本的浏览器对于gzip功能支持不完善,对于该指令配置的正则信息与浏览器类型匹配,匹配成功的响应不进行压缩处理
nginx做为反向代理服务器接收后端服务器响应结果压缩控制
解压模块,该模块对于不支持压缩功能的浏览器请求,响应结果若是被压缩则将其解压后返回给客户端。适用于某些以gzip方式压缩过存储的数据。
做用域Context: http, server, location
提示该模块不是默认编译内容,编译选项--with-http_gunzip_module
gunzip on |off ;
是否开启该模块功能
用于解压数据使用的缓冲区空间配置
静态压缩模块,该模块容许发送预压缩数据,若是客户端请求的数据已被压缩过,且客户端支持gzip压缩,则直接返回压缩数据。
做用域Context: http, server, location
提示该模块不是默认编译内容,编译选项--with-http_gzip_static_module
gzip on; gzip_comp_level 3; gzip_types text/html text/css text/xml text/plain application/javascript; gzip_min_length 1024; gzip_disable "MISE [4-6]\."; gzip_buffers 8 16K; gunzip on; #支持自动解压功能
HTTP协议属于明文协议,经过抓包就可获取一些隐私数据。HTTPS经由超文本传输协议HTTP通讯,可是数据包由SSL/TLS 安全协议加密,实现加密数据与认证功能。
ngx_http_ssl_module 该模块指令定义https相关设置:证书文件,私钥文件,ssl会话缓存等内容。
做用域Context: http, server
1. ssl on | off; 设定虚拟主机是否启用HTTPS协议 2. ssl_certificate file; 指定当前虚拟主机使用的PEM格式的证书文件 3. ssl_certificate_key file; 指定当前虚拟主机上与其证书相匹配的私钥文件 4. ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 支持ssl协议版本,默认为后三个 5. ssl_session_cache off | none | [builtin[:size]] [ shared:name:size ]; ssl会话缓存设置。 builtin[:size] --使用OpenSSL内建的缓存,此缓存为每worker私有。容易产生内存碎片不推荐。 shared:name:size --worker之间共享的缓存区域,size单位为bytes,1MB可存储4000个会话;name为共享缓存区域名称,多个虚拟主机可以使用同一个共享缓存区。 6. ssl_session_timeout time; 客户端可重复使用会话参数的超时时长。默认5分钟
Example:
server { listen 443 ssl; server_name www.cutemsyu.com; root /website/ssl/htdocs; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_session_cache shared:sslcache:15m; ssl_session_timeout 3m; }
值得考虑的一个问题是如何实现多个HTTPS虚拟主机监听在同一IP地址上。
状况一:每一个虚拟主机使用各自的证书文件,以下
server { listen 443 ssl; server_name www.example.com; ssl_certificate www.example.com.crt; ... } server { listen 443 ssl; server_name www.example.org; ssl_certificate www.example.org.crt; ... }
如此配置的话,客户端访问这两个站点创建SSL会话时收到的都是默认主机的证书文件。该问题是因为SSL协议形成的,SSL连接在客户端发送HTTP请求以前创建起来的,然而nginx并不知道所请求的服务主机名,所以返回默认服务器证书文件。
解决方法一:
多个HTTPS虚拟主机使用同一证书文件和私钥文件,证书和私钥配置指令在http级别设定,server共享其配置
ssl_certificate common.crt; ssl_certificate_key common.key; server { listen 443 ssl; server_name www.example.com; ... } server { listen 443 ssl; server_name www.example.org; ... }
解决办法二:
更通用的办法是使用TLS Server Name Indication extension技术,即SNI。SNI容许在客户端创建SSL会话时传递请求服务器名称,这样服务器就会知道该发送哪一个虚拟主机下的证书文件。该技术须要浏览器支持,通常主流浏览器都已支持
同时确保nginx支持SNI功能:
$ nginx -V ... TLS SNI support enabled ...
本篇文章到此结束,下篇总结nginx反向代理,fastcgi模块,感谢关注!