文章目录
- 一、高级配置
- 网页的状态页
- Nginx第三方模块
- 变量
- 访问日志
- Nginx压缩功能
- https功能
- 自定义小图标
- 二、重写功能(rewrite)
- if指令
- return指令
- set指令
- break指令
- rewrite指令
- 防盗链
一、高级配置
网页的状态页
状态页显示的是整个服务器的状态而非虚拟主机的状态。
状态页用于输出nginx的基本状态信息。
Active connections:
当前处于活动状态的客户端连接数,包括连接等待空闲连接数=reading+writing+waiting
accepts:
#统计总值,Nginx自启动后已经接受的客户端请求的总数。
handled:
#统计总值,Nginx自启动后已经处理完成的客户端请求总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接。
requests:
#统计总值,Nginx自启动后客户端发来的总的请求数。
Reading:
#当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足。
Writing:
#当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大。
Waiting:
#当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于active – (reading+writing)
注意:
这个界面展示的信息还是比较重要,故我们可以用访问控制,或者增加验证的模块的方式,使得这些参数较为安全。
可以用压力测试工具来模拟并发连接
while : ;do ab -c 1000 -n 10000 http://192.168.91.100/;sleep 1;done#注意需要安装httpd-tools
Nginx第三方模块
echo模块
不识别echo这个命令,所以需要额外安装echo模块。
基本步骤:
1.首先获取到第三方模块
2.yum安装完之后,用命令(nginx -V)查看相关函数
3.停止nginx服务,并重新编译
验证成功。
变量
内置变量
变量 | 含义 |
---|---|
$remote_addr; | 存放了客户端的地址,注意是客户端的公网IP |
$proxy_add_x_forwarded_for | 此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段,多个IP之间用逗号分隔,如果请求中没有X-Forwarded-For,就使用$remote_addrthe 。穿透的时候会用到这个变量。 |
$args; | 变量中存放了URL中的参数,字符串变量 。http://www.222.org/main/index.do?id=20190221&partner=search;返回结果为: id=20190221&partner=search |
document_root; | nginx软件的根目录,在系统中的真正位置。 |
$document_uri; | 保存了当前请求中不包含参数的URI,注意是不包含请求的指令。客户端打在浏览器中 url |
$host; | 服务器地址 |
$limit_rate | 如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置,则显示0 |
$remote_port; | 客户端的端口 |
$remote_user; | 虚拟用户登录nginx(经过Auth Basic Module验证的用户名) |
$request_body_file; | 做反向代理时发给后端服务器的本地资源的名称 |
$request_method; | 请求资源的方式,GET/PUT/DELETE等 |
$request_filename | 当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,如:/apps/nginx/html/main/index.html |
$request_uri; | 包含请求参数的原始URI不包含主机名,相当于:$document_uri? $args,。如https:// www.baidu.com/main/index.do?则是/main/index.do?id=20190221&partner=search |
$scheme; | 请求的协议,例如:http,https,ftp等 |
$server_protocol; | 保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等 |
$server_addr; | 保存了服务器的IP地址 |
$server_name; | 请求的服务器的主机名 |
$server_port; | 请求的服务器的端口号 |
$http_< name> | name为任意请求报文首部字段,表示记录请求报文的首部字段 |
$http_user_agent; | 客户端浏览器的详细信息 |
$http_cookie; | 客户端的cookie信息 |
location /main {index index.html;#指示当请求的 URI 为 /main/ 时,默认返回 index.html 文件。default_type text/html;#文件默认类型为text/htmlecho "hello world,main-->";echo $remote_addr;echo $args;echo $arg_user;echo $document_root;echo $document_uri;echo $host;echo $http_user_agent;echo $http_cookie;echo $request_filename;echo $scheme;echo $scheme://$host$document_uri?$args;}
测试curl 'http://www.cxk.com/main?user=wyf&title=person' -b uid=100
自定义变量
如果需要自定义变量名称和值,使用指令 set $变量名 变量值
访问日志
日志格式
访问日志是记录客户端即用户的具体请求内容信息,而在全局配置模块中的error_log是记录nginx服务器运行时的日志保存路径和记录日志的level,因此两者是不同的,而且Nginx的错误日志一般只有一个。而访问日志可以在不同server中定义多个,定义一个日志需要使用access_log指定日志的保存路径,使用log_format指定日志的格式,格式中定义要保存的具体日志内容。
日志格式可以根据上述的内置变量,自己添加。
如果在子配置文件中,用到自定义的日志格式,一定要将include写在日志格式下方,否则不生效。
自定义json 格式日志
在主配置文件夹中加入
log_format access_json '{"@timestamp":"$time_iso8601",''"host":"$server_addr",''"clientip":"$remote_addr",''"size":$body_bytes_sent,''"responsetime":$request_time,''"upstreamtime":"$upstream_response_time",''"upstreamhost":"$upstream_addr",' '"http_host":"$host",''"uri":"$uri",''"xff":"$http_x_forwarded_for",''"referer":"$http_referer",''"tcp_xff":"$proxy_protocol_addr",''"http_user_agent":"$http_user_agent",''"status":"$status"}';
Nginx压缩功能
支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,这样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相应的CPU资源。
配置指令 | 功能 |
---|---|
gzip on/ off; | 启用或禁用gzip压缩,默认关闭 |
gzip_comp_level level; | 压缩比由低到高从1到9,默认为1 |
gzip_disable “MSIE [1-6].”; | 禁用IE6 gzip功能;后面跟的是正则表达式 |
gzip_http_version 1.0 /1.1; | 启用压缩功能时,协议的最小版本,默认HTTP/1.1 |
gzip_buffers number size; | 指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k; |
gzip_types mime-type …; a.txt | 指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错 |
gzip_vary on / off; | 如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开 |
gzip_static on / off; | 预压缩,先压缩好,不用临时压缩,消耗cpu |
注意:gzip不压缩图片!!!
https功能
Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
证书类型:
https过程
-
客户端发起HTTPS请求
用户在浏览器里输入一个https网址,然后连接到服务器的443端口。 -
服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥。 -
传送服务器的证书给客户端
证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等。 -
客户端解析验证服务器证书
这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书中公钥对该随机值进行非对称加密。 -
客户端将加密信息传送服务器
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
- 服务端解密信息
服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值。
- 服务器加密信息并发送信息
服务器将数据利用随机值进行对称加密,再发送给客户端。
- 客户端接收并解密信息
客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容。
自签名证书生成过程
进入该文件夹下,先修改Makefile文件。
配置ssl
nginx 的https 功能基于模块ngx_http_ssl_module实现,因此如果是编译安装的nginx要使用参数ngx_http_ssl_module开启ssl功能,但是作为nginx的核心功能,yum安装的nginx默认就是开启的,编译安装的nginx需要指定编译参数–with-http_ssl_module开启。
ssl on | off;
#为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代
listen 443 ssl;ssl_certificate /path/to/file;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件ssl_certificate_key /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件
访问成功。
自定义小图标
favicon.ico 文件是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件,但是当浏览器请求的favicon.ico文件不存在时,服务器会记录404日志,而且浏览器也会显示404报错。
二、重写功能(rewrite)
Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression)即正则表达式,因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为自动访问,另外还可以在一定程度上提高网站的安全性。
if指令
用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:
if (条件匹配) { action
}
使用正则表达式对变量进行匹配。if指令认为条件为true,否则认为为flase,变量与表达式之间使用以下符号链接。
符号 | 含义 |
---|---|
= | 比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false |
!= | 比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false |
~ | 区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假 |
!~ | 区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假 |
~* | 不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假 |
!~* | 不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真 |
-f 和 !-f | 判断请求的文件是否存在和是否不存在 |
-d 和 !-d | 判断请求的目录是否存在和是否不存在 |
-x 和 !-x | 判断文件是否可执行和是否不可执行 |
-e 和 !-e | 判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接) |
注意:如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
注意:if执行顺序有先后,前面的if语句执行完后,会停止匹配。
return指令
return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置。
return语句的格式
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code url; #返回给客户端的URL地址
set指令
set可以定义变量,变量值可以是固定的,也可以是nginx的内置变量。
break指令
用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和location if块中使用。
简单来说:在同一location中,如果break后面有set rewrit return if等指令不执行,其他指令继续执行。
这边就不显示服务端端口号了,说明break指令生效。
rewrite指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理。
rewrite可以配置在 server、location、if
语法格式
rewrite regex replacement(www.baidu.com) [flag];
注意:如果在同一级配置块中存在多个rewrite规则,那么会自上而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301。
rewrite flag 使用介绍
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型
- 跳转型指由客户端浏览器重新对新地址进行请求。
- 代理型是在WEB服务器内部实现跳转。
flag说明:
flag | 含义 |
---|---|
redirect | 临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302 |
permanent | 重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301 |
break | 重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用;适用于一个URL一次重写 |
last; | 重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用;适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户301 |
场景:若bj代表北京,但现在又出现一个宝鸡也可用bj代表,故两者可能会发生冲突,所以决定使用beijing代表北京,baoji代表宝鸡。但为了不造成之前用户的流失需要将bj重定向至北京。
这边的$1表示后项引用。
整个网页的跳转
break和last的区别
break是立即终止匹配,使用该url进行访问。
last是停止本停止本location中的 匹配,开启新一轮的 location 匹配。
防盗链
防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名,正常的referer信息有以下几种:
none:#请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息
blocked:#请求报文有referer首部,但无有效值,比如为空
server_names:#referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string:#自定义指定字符串,但可使用作通配符。示例: * .nginx.org www.nginx.
regular expression:#被指定的正则表达式模式匹配到的字符串,要使用开头,例如:.* \ .nginx \ . com
首先第二台服务器上配置一个网站(有图片)
<html>
<body>
<h1>this is nginx </h1>
<img src="http://192.168.232.10/a.jpg"/>
</body>
</html>
盗用成功。
利用重定向返回图片。
location ~* \.(jpg|gif|swf|png)$ { root /data/nginx/pc;valid_referers none blocked *.pc.com pc.com; if ( $invalid_referer ) {rewrite ^/ http://www.pc.com/error.png;#return 403}}~* \.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件
Valid_referers:设置信任的网站,可以正常使用图片。
None :浏览器中 referer 为空的情况,就是直接在浏览器访问图片。
Blocked :referer 不为空的情况 ,但是值被代理或防火墙删除了,这些值不以 http://或https://开头。后面的网址或者域名:referer 中包含相关字符串的网址。
If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer 为1,则执行后面的操作,即进行重写或返回 403 页面。