上一篇文章我们主要介绍的Nginx的架构,其实主要是Nginx包含了哪些内容,有哪些功能和技术点。知道了这些,我们就可以猜到,Nginx的配置大部分和这些功能有关系。下面逐步介绍一些常见配置。
首先进入nginx安装目录的conf文件夹下,备份一下默认的配置文件,防止修改错了恢复不了:
cp nginx.conf nginx.conf.bak
下面我们介绍几种常用配置:
入门配置
静态页面配置
动静分离
图片防盗配置
黑白名单配置
下载限速配置
日志配置
先看一个简单配置
备份完可以编辑文件了,首先删除配置文件里的全部内容,然后编写下面这样的配置:
Nginx里面也是分为一个个配置块的,和大部分代码一样,用大括号括起来。比如上面的events {。。。}就是一个配置块。
注意配置块的名称(events)和左大括号直接要有空格。
配置块里面的以分号结尾的一行(如 worker_connections 1024;)就是该配置块的一个属性。
上面这个简单的配置共有一个外部属性(worker_processes)和两个配置块(events、http)。以下是各个部分的含义:
1 worker_processes 属性表示的是worker进程的进程数
2 events 表示对事件的配置
2.1 events中worker_connections的含义是最大链接数
3 http表示对http请求的配置
3.1 http中的include属性表示引入的意思,示例中表示nginx的配置文件引入了mime.types文件
3.2 default_type表示请求响应的默认数据类型
3.3 sendfile属性值为on表示启用sendfile,sendfile的作用是在底层拷贝数据的时候可以跳过应用,直接从内核拷贝到网卡,加快速度
3.4 keepalive_timeout表示长连接的一个保活时间,一个连接请求完并不是立马销毁,通过这个属性可以等一段时间,以便下次有请求继续用
3.5 server 配置块代表配置一个虚拟机,用来启动并响应
3.5.1 server中的listen属性表示监听的端口,不能和其它重复
3.5.2 server中server_name用来配置域名,分发请求的时候会根据访问的域名和配置的域名的对应关系分发
3.5.3 server中location表示其中一个请求的地址 后面可以加斜杠,等于号等正则表达式方式匹配,其中的内容是对应的链接和页面,root表示页面所载目录
上面的配置只是初级的很少的一部分配置,我们一一解释了都是什么意思。接下来启动测试一下,首先检测一下配置文件有没有错误:
然后启动,访问:
没有问题!
自定义一个页面
接下来在安装目录的html文件夹下面新建www/test目录,进入test,新建test.html文件,输入内容 hello nginx test!
然后去nginx中增加对此页面的配置:
listen端口与原来的监听一样也可以,因为可以设置不一样的域名,也就是server_name;
server_name可以写域名www.test.com,也可以写正则表达式形式,如 *.test.com,可以同时配置多个。
配置完后,去检查一下配置是否正确:
没问题后,不用重启nginx,重新加载一次配置文件即可:
由于配置了域名访问,所以要给本机host加一个域名配置:
然后从浏览器访问一下:
可以看到访问成功!
注意,如果不想带端口,可以把nginx设置为80默认端口。
还可以将root配置到location外面:
这样server中无论配置几个location都可以继承server中的root。
实现动静分离
很多时候为了负载更高一些,会把静态文件(如css,js,图片等)和动态文件(如html,jsp等)进行分开。也即是常说的动静分离。这也是可以在nginx中配置的。
首先在上面的www目录中新建路径 static目录,往里面拷贝一个图片test.jps:
然后修改test.html文件,加入图片的展示:
保存后,访问页面可以看到效果:
可以看到图片展示失败,是因为图片的位置并不在我们配置的root属性的目录下面。
下面我们把静态文件也配置到nginx中:
新增一个location,路径为/static,里面配置目录root为文件的路径,现在重新加载,直接访问图片试试:
可以看到访问找不到,原因是因为静态文件配置了/static路径,location里面又配置了root,那么在目录中找文件的时候默认会再加上一个static,真实的寻找路径是 html/www/static/static路径,这个路径是没有的因此404。下面吧root改为alias别名方式:
保存从新加载,可以看到访问成功:
所以如果我们的设置的文件在static目录下,设置的路径本来也是/static,就不能用root,但是如果我们设置的文件夹是static,但是静态文件在文件夹下的css文件夹中,那么可以用root,路径设置为/css即可。为了防止混乱,最好静态文件都建议用alias。此时修改html文件:
访问页面就可以了:
正则表达式也是常用的配置方式,下面介绍一种正则表达式的配置:
正则表达式匹配了以几种后缀结尾的文件,这时候使用root就可以,然后可以访问图片:
可以看到路径直接变成了根路径,我们在static下面新建一个image文件夹,把图片剪切到里面,
这时候在后面带上/image/test.jpg即可:
可见上面这种正则表达式配置可以把static下面二级路径下的所有静态文件都访问到,这是一种配置所有静态文件省事的方式,但是正则表达式遗忘性比较大,所以使用哪种方式看个人。此时修改html文件即可访问到:
页面是:
上面介绍了三种location的配置方式,还有一种是直接用等号写死的:
上面直接等于了一个/baidu.html的路径,下面使用proxy_pass属性代理了百度的官网,关于反向代理后面会讲。此时访问baidu.html可以直接访问到百度官网:
防盗链配置
防盗链就是防盗的,主要是别的网站使用本网站的图片等资源就视为被盗了,因此要做特殊防盗配置。配置如下:
valid_referers属性表示只允许*.test.com的域名访问图片,下面的if是判断不是设定的域名的时候,返回403.我们在server_name后面在配置一个域名:
然后访问新的:
可以看到图片是不显示的,查看状态
可以看到图片返回403。此时直接输入图片地址还是可以访问的,我们把配置再改一下:
把防盗配置中的none blocked去掉,这样单独直接访问图片也没法访问了:
只能在网站里看图片:
黑白名单配置
经常爬数据机器刷的ip,可以设置为黑名单禁止访问,首先在别的机器上面访问一下当前配置的nginx:
目前可以访问到,然后在安装目录的配置文件目录下新建黑名单文件 black.ip,输入一下内容:
修改nginx配置文件,引入黑名单:
这个既可以防盗http下面,作为总的黑名单,也可以放到单独一个server下面,现在在别的机器上再次访问:
提示403,已经进入黑名单了!
下面设置白名单,先把黑名单的include注释掉,然后再黑名单的同一个目录新建一个白名单white.ip:
配置一个ip ,设置数值为1,然后修改配置文件:
文件中修改了两个地方,geo是引入白名单,并设置出了白名单之外的默认值是0,location里面做了判断,只要是0的就不在白名单之列,一律返回403,下面在白名单机器上访问:
看到可以成功,在其他机器上访问页面:
可以看到对应的location路径已经不能访问了。白名单功能适合单独由内网访问的系统。
网络限速配置
打开带图片的页面,可以发现图片加载的速度相当快,这是浏览器下载图片的速度快!
下面修改配置文件进行限速:
limit_rate_after表示小于2k的部分不限速,大于的部分限速。limit_rate表示如果限速那么限速下载的速度为1k。然后我们从新打开页面,发现图片加载非常慢:
限速成功!如果是一个压缩文件下载限速,也是同样的道理。
日志配置
nginx的日志配置主要使用两个属性,log_format设置日志格式,access_log用来定义日志级别,日志位置。在原来默认的配置文件中都能看到,可以在备份中查看:
常见的日志变量:
$remote_addr, $http_x_forwarded_for 记录客户端IP地址
$remote_user记录客户端用户名称
$request记录请求的URL和HTTP协议(GET,POST,DEL,等)
$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通用日志格式下的本地时间。
下面我们先加一个简单的日志:
日志格式很简单,文件还是同样的日志文件,把原来的日志备份走,新建一个日志,从新打开日志,执行repon
然后刷新两次页面,查看日志:
可以看到日志里面只记录了ip地址,我们再把日志内容丰富一下:
'$remote_addr-$remote_user-[$time_local]-$request';
打印出ip,远程用户,时间,和访问地址,再次刷新查看日志:
再次丰富日志,打印请求状态,发送给用户的字节数,并记录从哪个页面访问过来的:
log_format main '$remote_addr-$remote_user-[$time_local]-"$request"-$status-$body_bytes_sent-"$http_referer"';
刷新页面,查看日志:
再次丰富日志格式,记录客户端浏览器相关信息等:
log_format main '$remote_addr-$remote_user-[$time_local]-"$request"-$status-$body_bytes_sent-"$http_referer"-"$http_user_agent"-"$http_x_forwarded_for"';
这个格式和默认的基本一样了,大家也应该都知道每个部分的含义了,刷新查看:
自己使用的时候,根据需求配置日志格式即可。
配置的时候,文件还可以根据网址命名,如:
access_log logs/$host.access.log main;
如果原来没有这个文件,那就需要创建,创建需要权限,要在整体配置文件的第一行加上
user root;
reopen一下,然后刷新页面,可以看到对应的网址的日志进入到了对应的日志文件中:
有的时候配置生成日志文件不成功是因为没有加上user root。上面再日志的格式上也加上了,日志文件中也会打印:
我们把生成的日志文件删除,user root注释掉,这样肯定不会生成新日志文件,如果要从日志中查看原因,需要设置error日志,并设置为debug日志:
刷新并查看error日志:
日志中显示,我们并没有访问该域名日志文件的权限,因此failed,这样根据debug日志能很好的调试问题!
平时都这样error的日志量肯定很大,可以针对指定客户端,进行debug日志输出,
events {
debug_connection 192.168.1.100;
debug_connection 192.168.168.128;
}
这样其他客户端访问就不会打debug日志!