cookie算法访问服务器
- 在多台后台服务器的环境下,为了确保一个客户只和一台服务器通信,势必使用长连接。常见的有使用nginx自带的ip_hash来做,但如果前端是CDN,或者说一个局域网的客户同时访问服务器,导致出现服务器分配不均衡,以及不能保证每次访问都粘滞在同一台服务器。如果基于cookie可以在保持长连接的同时还保证了服务器的压力均衡,ngx_http_sticky_module可以实现此功能。
- 客户端client请求访问服务 -> DNS服务器将域名解析到cdn -> cdn(nginx,squid,varnish)反向代理 -> nginx反向代理到后端服务器取东西 -> webserver
下载解压ngx_http_sticky_module
[root@server1 /mnt]# yum install -y unzip.x86_64
[root@server1 /mnt]# unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
在nginx源码文件夹中重新预编译,添加此模块
重新编译,覆盖之前的二进制文件,编辑配置文件添加模块
[root@server1 /mnt/nginx-1.20.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --add-module=/mnt/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
[root@server1 /mnt/nginx-1.20.1]# make
[root@server1 /mnt/nginx-1.20.1/objs]# \cp -f /mnt/nginx-1.20.1/objs/nginx /usr/local/nginx/sbin/nginx
先按f12,再按f5刷新,即可查看到cookie访问记录,且采用cookie的方式访问时会锁定服务器,避免切换服务器时都需要每次输出密码的麻烦
限制对代理 HTTP 资源的访问
使用 NGINX 和 NGINX Plus,可以限制:
1、每个键值的连接数(例如,每个 IP 地址)
2、每个键值的请求率(一秒或一分钟内允许处理的请求数)
3、连接的下载速度
请注意,IP 地址可以在 NAT 设备后面共享,因此应谨慎使用 IP 地址限制。
限制连接数
vim nginx.conf
nginx -s reload
创建download目录放一张图
[root@server1 /usr/local/nginx/html/download]# mkdir /usr/local/nginx/html/download
[root@server1 /usr/local/nginx/html/download]# mv 'Screenshot from 2021-09-05 10-15-42.png' vim.jpg
重载nginx,浏览器访问成功
做压测,-c并发数10,-n请求数10,即10个请求一起发送,因为我们上边做了限制,所以会有访问失败的请求
[root@foundation25 Pictures]# ab -c10 -n 10 http://172.25.25.1/download/vim.jpg
大部分请求都失败,日志是准确的,要到日志里看
[root@server1 /usr/local/nginx/html/download]# cat /usr/local/nginx/logs/access.log
将并发数改为1即符合我们的限制,不会有失败的
限制请求率
- 速率限制可用于防止 DDoS(分布式拒绝服务攻击) 攻击,或防止上游服务器同时被过多请求淹没。该方法基于以下leaky bucket
- 算法:请求以各种速率到达存储桶并以固定速率离开存储桶。
修改配置文件,用limit_req_zone 指令设置参数。该指令是在http {}级别上定义的, 这种方法允许将不同的区域和请求溢出参数应用于不同的上下文。我们设置允许相同标识的客户端的访问频次,这里限制的是每秒1次
压测,超过速率的9个全部失败
处理过多的请求
- 请求仅限于符合limit_req_zone 指令中定义的速率。如果请求数量超过指定的速率并且共享内存区域已满,NGINX 将响应错误。由于流量往往是突发的,因此在流量突发期间返回错误以响应客户端请求并不是最好的情况。
- NGINX 中这种过多的请求可以被缓冲和处理。limit_req 指令的burst参数设置等待以指定速率处理的最大请求数
修改配置文件,超出zone限制的请求会被放入数目为5的队列中。重载nginx
现在虽然超过了我们设置的只允许一秒一个请求,但可以被放入队列中,一秒处理一个,最后只用了9秒多是因为请求本身就不用多久,第十个已经是最后一个了,请求完自然就结束了
只排一次队
即第一秒处理一个,多的放入容纳5个请求的队列,再多的就直接被拒绝
重载nginx访问。如下,因为我们请求了10次所以1+5只会有6个成功
限制带宽
请求10次,一次大概两秒
自动索引:下载方便
当访问location时未指定路径,且路径下无主页文件时,开启自动索引将会显示该location的目录结构
Nginx expire缓存配置
Nginx expire缓存配置: 缓存可以降低网站带宽,加速用户访问
访问server/path/x.jpg时,将会访问nginx工作目录下的html下的path内的x.jpg
日志轮询
[root@server1 nginx]# cd /opt/
[root@server1 opt]# ls
[root@server1 opt]# vim nginx.sh #脚本内容
#!/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`
给脚本执行权限直接执行,可以看到日志记录成功
添加crontab任务以实现每24小时即一天记录一次日志
crontab -e
00 00 * * * /opt/scripts/nginxlog.sh &> /dev/null
chmod -R 700 /usr/local/nginx/logs
中文乱码
先往测试页面写入写中文
浏览器访问,有乱码
修改配置文件
重载nginx,清理浏览器缓存后重新访问
防止域名恶意解析到服务器IP
- 防止域名恶意解析到服务器IP(有的网站会把域名解析到你的网站地址上去),需要在访问时配置拒绝的域名到服务器ip的解析,可以设置访问哪个域名就被拒绝返回500状态码
本地做了简单测试
重定向
比如访问我哪个域名就会定向到我指定的网页,我还是用本地做了测试
访问显示301重定向
输入ip访问,重定向到了指定网页
80->443 80端口转至443端口
修改配置文件,对如图内容取消注释,启用443,修改证书密钥文件名
添加重写规则
使用脚本生成pem文件
将生成的pem拷贝至nginx conf目录下
重新加载nginx,查看端口是否打开
访问http:server,会重定向至https