目录
一、nginx的下载与安装
二、nginx的配置
三、nginx的测试
四、nginx的其他配置
五、nginx的应用扩展
六、nginx的并发优化
七、nginx的平滑升级
八、nginx限流
九、nginx自动索引
十、nginx自动缓存设置
十一、nginx的日志轮询
十二、nginx的日志可视化管理——goaccess
十三、nginx的实时访问监控
十四、nginx默认发布页面的中文显示
十五、nginx的加密访问控制——https
十六、nginx的重定向
十七、nginx的防盗链
本章总结
nginx官方文档:
nginx documentationhttp://nginx.org/en/docs/
(1)解压文件安装包
(2)源码编译三部曲之第一步:<./configure>
这一步是校验软件与操作系统的依赖性的。
以下参数分别表示 安装的模块和指定的路径(自编译软件一般都指定在如下路径),然后根据校验结果安装相应的依赖。
下图显示缺少PCRE依赖,所以导致相关的模块无法进行安装。
安装时在相应的模块名称后添加<-devel>,所有依赖的开发包后缀都是这样。
源码编译三部曲之第二步:
上一步检查完依赖性通过后,会在当前目录下生成
目录,可以直接使用make命令编译。
编译完成后会在当前目录下生成二进制安装文件
源码编译三部曲之第三步:
安装时必须在源码的一级目录下。
(3)nginx的使用
安装完成后,进入到刚才指定的安装目录下,这里包含了软件的所有配置文件。
为了方便使用,对应用创建一个软链接(通俗点讲也就是快捷方式)。
检测语法,启动程序,查看进程。
启动后nginx程序就可以使用了。进程列表中也出现了相应进程。
#启动nginx
#关闭nginx
注意:如下图所示,当80端口被占用时,启动将会失败
(4)nginx的默认发布目录
在本机或远程主机访问装有nginx的服务器时,会自动显示nginx的发布目录。测试如下:
(1)编辑nginx的主配置文件
具体更改如下:
添加RS主机及端口
添加server,表示的是,所有通过80端口访问www.westos.org的请求都会转发的
模块下,这个模块就是上一步添加RS主机的模块。
配置更改完成后需要检测语法并重新载入nginx的配置
nginx -t #检测nginx语法
nginx -s reload #重新载入nginx配置
nginx -s stop #关闭nginx
在客户机中设置解析,将上一步中设置的www.westos.org解析为server1的真实IP地址。
客户机进行多次访问后,可以看到已经通过nginx实现负载均衡了。
基本原理是,当访问www.westos.org域名后,解析到server1的VS服务器上,服务器上的nginx将对访问这个域名的请求均衡到两台westos域的RS主机上(也就是上一步中更改nginx配置时做的改动)。从而实现了负载均衡。
注意:nginx相对于之前的方法优点是:(1)自带健康检测功能,(2)不用配置RS主机的临时IP地址(172.25.254.100)
(1)、nginx.conf配置文件中的backup表示,当检测到后端的所有RS主机故障后,就自己上。
测试:在客户机中访问
(2)、nginx.conf配置文件中设置RS服务器的权重。
测试:在客户机中测试,负载按照RS权重比例分配。
(3)nginx.conf配置文件中设置ip_hash实现客户端IP和RS服务器一对一。
测试:在客户机中访问VS调度服务器,只会分配到第一个RS
(4)nginx.conf配置文件中设置节点下线
常用于RS节点维护时,将节点下线。
测试:关闭了server2节点后,客户机访问时只能访问server3
本次用到的扩展包名:nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
由于nginx是静态编译,所以每次增加新功能时都需要重新编译。
(1)增加扩展包需要重新编译,所以需要先进入nginx源路经执行
make clean #删除编译
(2)重新编译: 最后一项为扩展包路径
编译完成后,将指定文件
(3)编译时的优化设置
——压缩编译大小
——隐藏nginx的版本信息
测试:隐藏前
隐藏后:
(4)扩展功能应用——基于浏览器cookie的认证
先更改nginx配置文件
然后,测试:
在浏览器中访问
清除浏览器的缓存后,重新进入网站,可以看到已经切换到server3。但是无论刷新多少次,仍然一直是server2。想要改变的话,就得重新清除浏览器缓存了。
开启浏览器的页面审查,可以看到当前页面是基于cookie的,只要cookie不变,页面也不会变化。
(1)为nginx创建用户,并更改配置文件指定用户
测试:nginx程序的用户已指定为nginx用户了
(2)nginx开机启动脚本
编辑脚本:
在目录下编辑
测试:先关闭nginx,然后使用systemctl脚本启动nginx
nginx -s stop #关闭nginx
systemctl start nginx #启动nginx
(3)nginx调优之
——调整可调用CPU数量。
进入nginx的安装目录下,按以下步骤更改配置文件。
推广:多核心的分配与绑定
worker_processes 2; //最多开启8个
worker_cpu_affinity 01 10; //cpu有多少个核,就有几位数,1代表内核开启,0代表内核关闭
——并发连接数
先更改配置文件:可以连接到65535个并发过万。也就是每个worker同时可以处理的连接量。
再更改系统中的限制查看系统默认硬件限制。更改系统对APP硬件资源的限制。
更改系统对APP硬件资源的限制(和上一步中的并发连接数设定一致)。注意:此文件即改即生效。
注意:
worker_processes //工作进程数
worker_connections //单个工作进程并发连接数
nginx作为http服务器时:max_clients = worker_processes * worker_connections
nginx作为反向代理服务器时:max_clients = worker_processes * worker_connections / 2
(1)下载nginx的新版本的安装包,并解压,同时按照上述方法关闭debug和隐藏版本信息。
(2)检测新版本的依赖性,并指定安装路径(和之前一模一样)
./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx --add-module=/mnt/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
(3)直接
(4)备份旧版本程序
(5)将新版本的程序复制到目录下
注意:由于目标路径已经存在此文件,所以需要加上参数<-f>强制复制
(6)记录正在运行的nginx的主进程的
(7)升级新程序
强制关闭旧程序的主进程pid,会在下边出现一个新的主进程。
kill -USR2 17151 #用到旧版本的pid
(8)接管nginx
kill -WINCH 26941 #这里用到旧版本的pid号
(9)测试
curl命令访问本机,可以看到nginx已经升级。
注意:这个过程是平滑的。也就是说,在客户端感受不到VS服务器升级的过程。
(10)nginx版本回退——四步走
*还原nginx程序: cp -f nginx.old nginx
*唤醒原进程:kill -HUP nginx
*回收新版本的worker进程:kill -WINCH 27066
关闭新版本主进程:kill -9 27066
测试:虽然新版本的进程也在,但是只有旧版本的进程生效。
关闭新版本进程
在nginx的默认发布目录中放一个500K的文件,通过客户机下载来测试限流。
这时候在浏览器中已经可以访问了。
(1)更改nginx配置文件的并发连接数。
第一个框表示先创建一个10M的内存区域,名称为addr。第二个框表示并发连接数为1
测试:在客户端进行如下压力测试
ab -c10 -n10 http://172.25.254.1/download/iso7.gif
压力测试,-c10表示10个并发,-n10表示请求10次
查看server1的日志,是次访问中只有一次成功。意味着并发连接数最多为1.
(2)更改nginx配置文件的请求速率。
第一个框表示每秒请求率为1r。
测试:在客户端进行如下压力测试
ab -c1 -n10 http://172.25.254.1/download/iso7.gif
压力测试,-c1表示1个并发,-n10表示请求10次
nginx更改前:在server1的日志中看到10个请求都成功。
nginx更改后:由于每秒钟钟只能处理一个请求,所以在server1的日志中看到10个请求只成功了一个。
(3)限制速率后如何处理过多的请求——排队
测试:在客户端测试,10个请求用时9秒多
查看server1的nginx的日志,可以看到限流了,但是每个请求都成功了
(4)限制流量
测试:
ab -c1 -n10 http://172.25.254.1/download/iso7.gif
nginxg限流前:
nginx限流后:可以看到总量不辨,限制100k后共需要20秒
测试:通过浏览器访问 发布目录时,无法访问目录下的索引,只能显示具体的文件。
更改配置:
重新载入nginx配置后测试:
一般用于网站静态图片等,可以有效降低网站带宽,加速用户访问。
更改配置文件:表示html发布目录下的gif等格式的文件缓存365天更新一次。
测试:在客户端中使用curl命令进行测试,可以查看到过期时间为一年之后。
一般服务器的访问量会导致nginx的日志增长非常快,所以需要对时间久的日志做一个备份/截断。
创建脚本——
#脚本内容
#!/bin/bash
cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
然后添加定时任务:每天整点执行此脚本来截断/备份日志。
效果测试:
执行此脚本后,产生了 一个备份的日志文件。原本的日志文件已经清零。
(1)下载并解压软件包:
(2)源码编译三部曲:
检查依赖性:
./configure --enable-utf8 --enable-geoip=legacy
发现缺少这个依赖性,所以安装这个依赖性的软件包
发现缺少这个开发包,安装!
make:
make install:
最后默认安装到这个目录下
(3) 添加监控命令
goaccess /usr/local/nginx/logs/access.log -o /usr/local/nginx/html/report.html --log-format=COMBINED --real-time-html
#日志读取目录,输出为nginx发布目录的report.html文件,设置日志格式,显示时间
这个命令执行后,会占用终端,可以使用
(4)测试:在浏览器中输入server1的report页面,显示如下。
由于之前编译nginx的时候添加了status模块,所以可以在配置文件中直接调用。
这个模块功能是实时统计访问情况。
测试结果:
实时监控的优化:
新增的三条分别为:关闭本机访问记录,允许本机访问,禁止其他所有用户访问
在次测试:
由于只允许本机用户访问,所以浏览器无法访问。但可以通过本机的命令行查看到。
在nginx的默认发布页面中编辑一段中文。通过浏览器访问到为乱码。
更改配置文件:
设置字体
清除浏览器缓存后重新测试:站点可以正常显示中文。
但是会报错:原因是没有证书。所以接下来要创建证书
创建证书:
移动证书并重新载入配置:
测试:证书完成后,查看到443端口已启用,就可以通过加密访问
浏览器中测试:由于证书为经过认证,所以会提示有风险。
防止网站被恶意攻击致瘫痪,可以限制用户对网站的访问,将用户的访问请求重定向到一个固定值或者其他网站。
(1)防止域名恶意解析到服务器IP:
测试:
在客户端中使用curl命令访问nginx服务器IP,可以看到被重定向到一个固定值。
(2)重定向到指定网站:(用于引流)
测试:
在客户机中使用curl命令测试,可以看到此IP已经重定向到指定网站了。再测试指定网站,访问请求被正常调度到了负载均衡节点上。
(3)重定向到指定端口——<80/http>重定向到<443/https>
当通过域名访问时,就会重定向到上一模块的443端口,然后通过443端口访问
测试:
在客户端通过curl命令看到301表示永久重定向(302表示临时),通过浏览器访问,自动跳转到
(4)多层重定向——www.westos.org/bbs 重定向bbs.westos.org:
定义一个网站
需要实现的功能是:当访问
时,可以正常访问;当访问 时,实际上跳转到 网站上。
测试:
通过curl命令可以看到访问
但是,当访问
优化前后对比:
(5)bbs.westos.org 重定向www.westos.org/bbs:
复制bbs.westos.org目录的发布文件到www.westos.org的发布目录下
测试:
当访问bbs.westos.org的时候,会自动重定向到
防盗链:防止网站正常显示从其他网站盗取过来的文件,对文件的原网站是一种侵权。
在一台RS服务器的apache的发布页面中,盗取以下网站的图片。
在浏览器中访问server2的IP,可以直接看到原网站的图片。
分析,这个server2上并没有图片,而这里显示的图片是从
为了防止这种情况的产生,需要在图片所在主机中开启防盗链功能。
表示只有通过
访问图片时,可以访问。否则一律拒绝。
测试:
也可以使用盗链重定向
如果不是通过域名访问的,可以将访问文件重定向到指定文件。
测试:
在之前的
注意:一般来说,防盗链重定向时,尽量不要重定向到自己的域名,因为这样消耗的也是自己网站的流量
1、nginx官方文档
Admin Guide | NGINX Plushttps://docs.nginx.com/nginx/admin-guide/
2、nginx的反向代理机制
当客户端访问VS调度器时,调度器访问后端的RS节点,RS节点服务器中实际看到的是VS访问。也就是说整个过程中RS对客户端是透明的。VS根据客户端的请求从RS中拿到数据,再以自己的名义反馈给客户端。客户端只能看到VS,而不能看到RS,起到了保护RS的作用
3、nginx的默认发布目录
转发到westos模块中列出来的设备
4、nginx中的location的优先级
nginx的location优先级 - Captain_Li - 博客园
5、http状态码
http状态码200,300,404等是什么意思 - cjwxf - 博客园
6、nginx的中文显示乱码,可以把字符集设置添加在全局变量中。