什么是代理?
所谓代理就是一个代表、一个渠道
此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程
正向代理:
正向代理最大的特点是客户端明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息
反向代理:
由于企业当中一台服务器不能承受负载,所以会通过部署多台服务器来解决访问人数限制的问题
多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色
实验环境:三台配备了nginx的虚拟机
nginx服务器:vm1
客户端:vm2 vm3
在服务器vm1中,编辑/usr/local/nginx/conf/ngix.conf配置文件
nginx -t
nginx -s reload
在真机中配置/etc/hosts文件
在真机中测试
curl www.westos.org
2.负载均衡
我们已经明确了所谓代理服务器的概念,那么接下来,nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?
这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量
请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则
所以我们将服务器接收到的请求按照规则分发的过程,称为“负载均衡”
接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
当所有代理服务器都故障时将服务器本身设置为备用机
每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
hash自动匹配到固定代理服务器让客户进行访问,除非这个服务器停止运行才会调度到新的服务器,或者有新的域名访问才会重新调度
动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是ginx默认不支持fair算法,如果要使用这种调度算法,需要安装upstream_fair模块
按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。这种调度算法要使用的话也需要安装nginx的hash软件包
nginx并不支持一些算法,当我们需要使用时则需要进行拓展
比如sticky模块,nginx本身不支持,当在配置文件中写入并调用时会汇报出错
所以需要算法拓展
Sticky是基于COOKIE的一种负载均衡解决方案,通过分发和识别COOKIE,使来自同一个客户端的请求落在同一台服务器上,默认COOKIE标识名为route:
1.客户端首次发起访问请求,nginx接收后,发现请求头没有COOKIE,则以轮询方式将请求分发给后端服务器。
2.后端服务器处理完请求,将响应数据返回给nginx。
3.此时nginx生成带route的COOKIE,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值。
4.客户端接收请求,并保存带route的COOKIE。
5.当客户端下一次发送请求时,会带上route,nginx根据接收到的COOKIE中的route值,转发给对应的后端服务器。
区别:
1.ip hash,根据客户端的IP的hash进行匹配绑定,
客户端将会与一个后端服务器绑定,一定程度上解决了集群部署环境下session共享的问题
2.sticky,根据服务器给客户端的COOKIE,客户端再次请求时会带上此COOKIE,nginx会把有此COOKIE的请求转发到颁发COOKIE的服务器上
算法检测时报错
我们需要对nginx进行扩展,先将sticky注释掉,并停止nginx服务
4.nginx限流
cd html/
mkdir downloads
cd downloads/
lftp 172.25.254.250
> cd pub/docs/
> get vim.jpg
> exit
du -h vim.jpg
在真机执行压力测试命令,设定并发用户数为10,请求总数为10,成功10个
ab -c10 -n 10 http://172.25.254.1/downloads/vim.jpg
在server1中编辑配置文件
limit_conn_zone $binary_remote_addr zone=addr:10m;location /download/ {limit_conn addr 1;}
//$binary_remote_addr 表示通过remote_addr这个标识来做限制
//zone=addr:10m 表示生成一个大小为10M,名字为addr的内存区域
真机中
ab -c10 -n 10 http://172.25.254.1/download/vim.jpg ##部分被拒绝
在真机执行压力测试,设定并发用户数为1,请求总数为10,则请求全部通过
ab -c1 -n 10 http://172.25.254.1/downloads/vim.jpg ##全部通过
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
//rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次
...
server {
location / {limit_req zone=one;
# limit_req zone=one burst=5
# limit_req zone=one burst=5 nodelay;
}
}
重新在真机执行压力测试,因为每秒只通过一个,则其余9个被拒绝
在配置文件中设定一次访问5个,超过的排队等待,因为上一个实验设定每秒通过1个请求,则访问2次,差不多10秒
location / {
# limit_req zone=one;limit_req zone=one burst=5
# limit_req zone=one burst=5 nodelay;
}
}
编辑配置文件,设定请求无延迟,在上一个实验的情况下,只能执行1次,即5个请求,重启服务
location / {
# limit_req zone=one;
# limit_req zone=one burst=5limit_req zone=one burst=5 nodelay;
}
}
server {
location /download/ {
# limit_conn addr 1; #限制并发数limit_rate 50k; #限制带宽}
}
在真机中执行压力测试,文件大小为444k,访问5次,限制带宽50k,大概需要40s
ab -c1 -n 5 http://172.25.254.1/download/vim.jpg
5.平滑升级当服务器在运行的时候我们想升级版本的情况下就需要用到平滑升级
平滑升级可以在服务器运行的状态下最大限度的保持数据的完整性
安装一个比当前版本高的nginx,解压,重新编译
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio
make
注意:此处不需要make install
make之后备份原程序,将升级版本拷贝覆盖原程序
cd /usr/local/nginx/sbin
\cp -f nginx nginx.old 备份
cd ~/nginx1.21.1/objs
\cp -f nginx /usr/local/nginx/sbin #新程序覆盖替换
ps ax | grep nginx 查看当前nginx进程
kill -USR2 原主进程pid 开启新版本
kill -WINCH 原主进程pid 关闭原worker进程但保留主进程:为了回退
curl localhost -I 查看当前nginx版本
回退的过程与更新相反,先还原nginx程序,唤醒进程,回收新版本,并关闭即可
还原nginx程序:cp -f nginx.old nginx
唤醒原进程: kill -HUP 29636
回收新版本的worker进程: kill -WINCH 29761
关闭新版本主进程: kill -QUIT 29761
6.nginx配置管理
当我们在访问浏览器时为了下载软件更加方便,可以在配置文件中设定自动索引
vim nginx.conf
///location /download/ {limit_conn addr 1;#limit_req zone=one burst=5 nodelay;#limit_rate 50k; ##注释autoindex.on;
///
nginx -t
nginx -s reload
缓存可以降低网站带宽,加速用户访问。
编辑配置文件,设定对图片等进行缓存,缓存时间为1年,在此期间访问就会减少访问时间
vim nginx.conf
///location /download/ {limit_conn addr 1;#limit_req zone=one burst=5 nodelay;#limit_rate 50k;autoindex on;} 在此位置下方进行设定location ~ .*\.(gif|jpg|png)$ { 对图片等进行缓存expires 365d;root html;}
///
nginx -s reload
在真机中,使用curl命令访问素材文件,可以看到缓存至2022年
curl -I 172.25.254.1/download/vim.jpg
编写一个脚本,设定打开nginx时会生成日志文件,命名格式为前一天
cd /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`
chmod +x nginx.sh
./nginx.sh
cd /usr/local/nginx/logs/
ls --> access_2021-08-31.log
在配置文件中设定使浏览器访问指定目录时不生成日志文件
nginx -t
nginx -s reload
在浏览器访问
172.25.254.1/status 刷新会增加访问次数,但不会有日志生成
cd ../logs
ls
cat access.log 为空
在真机中使用curl命令访问该目录,有日志生成
curl -I 172.25.154.1/statuscat access.log 会产生日志文件
在配置文件中设定指定目录只能指定主机访问访问,拒绝其他所有请求
cd conf/
vim nginx.conf
///location /status {stub_status on;access_log off;allow 172.25.254.51;deny all;}
///
nginx -t
nginx -s reload
当其他主机访问172.25.254.1/status时报错
nginx默认不支持中文字符,在浏览器访问时,中文会变成乱码。
在nginx发布文件中加入一行中文,在浏览器中试访问,为乱码
cd /usr/local/nginx/html/
echo hello\n你好 > index.html
在浏览器访问时中文是乱码
1)拒绝访问,报错500
切入配置目录,编辑配置文件,设定在访问本机时,返回500,重启服务。此时使用curl命令访问本机,会显示http报错500
cd /usr/local/nginx/conf/
vim nginx.conf
///server {listen 80;server_name localhost;return 500;
///
nginx -s reload
curl -I localhost HTTP/1.1 500 Internal Server Error
当在浏览器中访问server1主机时,也会报错500
2)将所有访问重定向至指定域名
编辑配置文件,设定将所有访问请求重定向至指定域名,重启服务,此时使用curl命令访问本机,会显示访问地址为http://www.westos.org
vim nginx.conf
///server {listen 80;server_name localhost;rewrite ^(.*) http://www.westos.org permanent;
///
nginx -s reload
curl -I localhost Location: http://www.westos.org
编辑配置文件,将80端口定向到443端口
vim nginx.conf
///server {listen 443 ssl;server_name www.westos.org;ssl_certificate cert.pem;ssl_certificate_key cert.pem;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root html;index index.html index.htm;}}
server {listen 80;server_name www.westos.org;rewrite ^/(.*)$ https://www.westos.org/$1 permanent;#location / {# proxy_pass http://westos;# }}
生成证书,并移动到配置目录中,检测语法,重启服务。此时检测端口
cd /etc/pki/tls/certs
make cert.pem 生成证书
mv cert.pem /usr/local/nginx/conf
nginx -t
nginx -s reload
netstat -antlup | grep 443
cd ..(nginx)
cd html
mkdir bbs
mv bbs/ /
vim nginx.conf
///
server { listen 80;server_name www.westos.org;#rewrite ^/(.*)$ https://www.westos.org/$1 permanent;rewrite ^/bbs$ http://bbs.westos.org permanent;rewrite ^/bbs/(.*)$ http://bbs.westos.org/$1 permanent;#rewrite ^/(.*)$ http://bbs.westos.org/$1 permanent;#location / {# proxy_pass http://westos;# }}
server {listen 80;server_name bbs.westos.org;location / {root /bbs;index index.html;}}
在真机使用curl命令可以查看
vim nginx.conf
///
server { listen 80;server_name www.westos.org bbs.westos.org;#rewrite ^/(.*)$ https://www.westos.org/$1 permanent;#rewrite ^/bbs$ http://bbs.westos.org permanent;#rewrite ^/(.*)$ http://bbs.westos.org/$1 permanent;if ($host = "bbs.westos.org") {rewrite ^/(.*)$ http://www.westos.org/bbs/$1 permanent;}
#server { ##全部注释
# listen 80;
# server_name bbs.westos.org;
#
# location / {
# root /bbs;
# index index.html;
# }
# }
在真机先做地址解析,使用curl命令可以查看
172.25.254.1 www.westos.org bbs.westos.org
盗链:
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
防盗链:
WEB应用防火墙通过实现URL级别的访问控制,对客户端请求进行检测。
如果发现图片、文件等资源信息的HTTP请求来自于其它网站,则阻止盗链请求,节省因盗用资源链接而消耗的带宽和性能。
盗链主机vm2
防盗主机vm1
在我们的vm1当中/usr/local/nginx/html下建立一个目录download
目录内下载一张图片,假设盗链这张图片
配置server2盗链主机
cd /usr/local/nginx/html
vim test.html
\\\
hello中国
配置完毕
在浏览器当中通过vm2的IP进行访问,图片盗取成功
vim /usr/local/nginx/conf/nginx.conf
location ~ \.(jpg|png)$ {valid_referers none blocked www.westos.org;if ($invalid_referer) {return 403; 只能通过www.westos.org域名进行访问,否则将会403拒绝rewrite ^/ http://www.westos.org/daolian.jpg; 为了盗链效果,添加盗链图片}}