热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

5.3运维企业部分nginx反向代理

1.反向代理什么是代理?所谓代理就是一个代表、一个渠道此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通
1.反向代理

什么是代理?
所谓代理就是一个代表、一个渠道
此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程

正向代理:
正向代理最大的特点是客户端明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息

反向代理:
由于企业当中一台服务器不能承受负载,所以会通过部署多台服务器来解决访问人数限制的问题
多个客户端给服务器发送的请求,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反向代理服务器接收到的请求数量,就是我们说的负载量

请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则

所以我们将服务器接收到的请求按照规则分发的过程,称为“负载均衡”

 1)weight轮循


接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。

 2)备用机backup


当所有代理服务器都故障时将服务器本身设置为备用机

 3)ip_hash


每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。

hash自动匹配到固定代理服务器让客户进行访问,除非这个服务器停止运行才会调度到新的服务器,或者有新的域名访问才会重新调度 

4)fair智能调整调度算法


动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是ginx默认不支持fair算法,如果要使用这种调度算法,需要安装upstream_fair模块


5)url_hash


按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。这种调度算法要使用的话也需要安装nginx的hash软件包


3、算法扩展 ----sticky算法

nginx并不支持一些算法,当我们需要使用时则需要进行拓展
比如sticky模块,nginx本身不支持,当在配置文件中写入并调用时会汇报出错
所以需要算法拓展

sticky算法模块


1)工作原理


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值,转发给对应的后端服务器。


2)ip_hash与sticky的区别


区别:
1.ip hash,根据客户端的IP的hash进行匹配绑定,
客户端将会与一个后端服务器绑定,一定程度上解决了集群部署环境下session共享的问题
2.sticky,根据服务器给客户端的COOKIE,客户端再次请求时会带上此COOKIE,nginx会把有此COOKIE的请求转发到颁发COOKIE的服务器上

 算法检测时报错

我们需要对nginx进行扩展,先将sticky注释掉,并停止nginx服务

 

 4.nginx限流

1)建立实验素材

cd html/
mkdir downloads
cd downloads/
lftp 172.25.254.250
> cd pub/docs/
> get vim.jpg
> exit
du -h vim.jpg

2)限制并发连接数

在真机执行压力测试命令,设定并发用户数为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 ##部分被拒绝

3)限制每秒请求数

在真机执行压力测试,设定并发用户数为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个被拒绝 

4)排队,超过指定数量则排队访问

在配置文件中设定一次访问5个,超过的排队等待,因为上一个实验设定每秒通过1个请求,则访问2次,差不多10秒

location / {
# limit_req zone=one;limit_req zone=one burst=5
# limit_req zone=one burst=5 nodelay;
}
}

5)无延迟

编辑配置文件,设定请求无延迟,在上一个实验的情况下,只能执行1次,即5个请求,重启服务

location / {
# limit_req zone=one;
# limit_req zone=one burst=5limit_req zone=one burst=5 nodelay;
}
}

 6)限制带宽(限制网速)

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.平滑升级

当服务器在运行的时候我们想升级版本的情况下就需要用到平滑升级
平滑升级可以在服务器运行的状态下最大限度的保持数据的完整性

1)版本更新

安装一个比当前版本高的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版本

2)版本回退

回退的过程与更新相反,先还原nginx程序,唤醒进程,回收新版本,并关闭即可

还原nginx程序:cp -f nginx.old nginx
唤醒原进程: kill -HUP 29636
回收新版本的worker进程: kill -WINCH 29761
关闭新版本主进程: kill -QUIT 29761

6.nginx配置管理

1)自动索引

当我们在访问浏览器时为了下载软件更加方便,可以在配置文件中设定自动索引

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

(2)nginx expire 缓存配置

缓存可以降低网站带宽,加速用户访问。
编辑配置文件,设定对图片等进行缓存,缓存时间为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

(3)日志轮循

编写一个脚本,设定打开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

(4)禁用不必要的日志记录,以节省磁盘IO的消耗

在配置文件中设定使浏览器访问指定目录时不生成日志文件

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 会产生日志文件

(5)站点目录和文件的限制

在配置文件中设定指定目录只能指定主机访问访问,拒绝其他所有请求

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时报错

(6)中文乱码

nginx默认不支持中文字符,在浏览器访问时,中文会变成乱码。
在nginx发布文件中加入一行中文,在浏览器中试访问,为乱码

cd /usr/local/nginx/html/
echo hello\n你好 > index.html
在浏览器访问时中文是乱码

7.nginx重定向

(1) 防止域名恶意解析到服务器IP

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

(2)端口重定向

编辑配置文件,将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

(3)虚拟主机重定向


1)www.westos.org/bbs 重定向bbs.westos.org:

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命令可以查看

2)bbs.westos.org 重定向www.westos.org/bbs

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

(4)nginx盗链与防盗链

盗链:

    盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。

防盗链:

    WEB应用防火墙通过实现URL级别的访问控制,对客户端请求进行检测。
    如果发现图片、文件等资源信息的HTTP请求来自于其它网站,则阻止盗链请求,节省因盗用资源链接而消耗的带宽和性能。


 1)盗链:

盗链主机vm2
防盗主机vm1

在我们的vm1当中/usr/local/nginx/html下建立一个目录download
目录内下载一张图片,假设盗链这张图片

配置server2盗链主机

cd /usr/local/nginx/html
vim test.html
\\\


hello中国



配置完毕
在浏览器当中通过vm2的IP进行访问,图片盗取成功

2)防盗链

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; 为了盗链效果,添加盗链图片}}


推荐阅读
  • 服务器性能优化之网络性能优化
    hi,大家好,今天分享一篇后台服务器性能优 ... [详细]
  • crossorigin注解添加了解决不了跨域问题_CORS与@CrossOrigin详解
    1、跨域的基本概念a、跨域的解释要了解跨域,首先需要知晓浏览器的同源策略,简单的说就是两个请求协议、端口、主机都相同,则两个请求具有相同的 ... [详细]
  • UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
    一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射 ... [详细]
  • 变相的实现connect的超时,我要讲的就是这个方法,原理上是这样的:1.建立socket2.将该socket ... [详细]
  • DDOSDDOS的中文名叫分布式拒绝服务***,俗称洪水***DDoS***概念DoS的***方式有很多种,最基本的DoS***就是利用合理的服务请求来 ... [详细]
  • 一个不错的JDBC连接池教程(带具体例子)
    1.前言数据库应用,在许多软件系统中经常用到,是开发中大型系统不可缺少的辅助。但如果对数据库资源没有很好地管理(如:没有及时回收数据库的游 ... [详细]
  • 4种分布式Session的实现方式!老大直呼666...
    前言公司有一个Web管理系统,使用Tomcat进行部署。由于是后台管理系统,所有的网页都需要登录授权之后才能进行相应的操作。起初这个系统的用的人也不多& ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 在混合逻辑时钟这篇博客里,我介绍了关于混合逻辑时钟的基本知识,本文介绍一下MongoDB里面的混合逻辑时钟,参考ImplementationofCluster-wideLogica ... [详细]
  • 缓存的重要性就不用再强调了,@OutputCache给我们提供了一种声明的方式(对应的还有编程的方式)来控制页面和用户控件的缓存策略,这是一种最简单直接的网站优化方式。还是先来过一遍@ ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
author-avatar
手机用户2502871065
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有