当前位置: 首页 > Linux

Linux运维-nginx反向代理与负载均衡

时间:2023-04-06 19:28:16 Linux

反向代理反向代理是指代理服务器收到用户的访问请求,代理用户重新向内部服务器发起请求,最后将内部服务器的响应信息返回给用户.这样,代理服务器对外表现为一个服务器,访问内部服务器的客户端使用代理服务器,而不是真正的网站访问用户。为什么使用反向代理可以起到保护网站安全的作用,因为任何来自互联网的请求都必须先经过代理服务器。通过缓存静态资源来加速网络请求。实现负载均衡反向代理实例环境说明假设有两台服务器AB。服务器A提供web资源,只提供内网访问。服务器B有两张网卡,一张和服务器A在同一个内网,一张在外网。此时用户C直接访问服务器A是不可行的,此时服务器B可以代理用户C访问服务器A的请求。hostname网卡IP描述moli-04ens33192.168.30.6内网IP,代理服务器moli-04ens37192.168.93.129外网IP,代理服务器moli-05ens33192.168.30.7内网服务器两台机器都安装了nginxmoli-05服务器访问的是wordpress博客,域名blog.syushin.org虚拟机实验环境,全部关闭防火墙配置虚拟主机moli-04机编辑虚拟主机配置文件,内容如下:[root@moli-04extra]$catblog.syushin.org.confserver{listen80;服务器名称blog.syushin.org;location/{proxy_passhttp://192.168.30.7;proxy_set_header主机$host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}}更改hosts文件在windows上修改hosts文件,添加配置192.168.93.129blog.syushin.org浏览器测试访问地址为192.168.93.129,界面出现05机器的页面,配置成功。负载均衡功能负载均衡对用户访问请求进行调度管理,对用户访问请求进行压力分担。负载均衡集群在运行时,通常会通过一个或多个前端负载均衡器将客户端访问请求发送到一组后端。在服务器上。Nginx负载均衡严格来说只是作为一个NginxProxy反向代理,但是因为这个反向代理功能的效果是负载均衡机的效果,所以nginx负载均衡是一种特殊的反向代理。实现Nginx负载均衡的主要组件:Nginx模块描述ngx_http_proxy_moduleproxy代理模块,用于向服务器节点或上游服务器池发送请求ngx_http_upstream_module负载均衡模块,可实现网站的负载均衡功能和节点的健康检查。upstream模块引入了ngx_http_upstream_module模块的支持代理方法包括proxy_pass、fastcgi_pass等,主要使用proxy_pass。upstream模块允许nginx定义一组或多组节点服务器组,通过proxy_pass代理向定义的对应节点组发送网站请求。示例:创建节点服务器池upstreamblog{server192.168.30.5:80weight=5;服务器192.168.30.6:81权重=10;server192.168.30.7:82weight=15;}upstream:创建节点服务器组关键字,必须有;blog:节点服务器组名称,必须有,可以自定义名称;server:关键字,后跟IP或域名或IP:端口,如果不指定端口,默认为80;weight:权重,值越大分配的请求越多。默认为1设置节点服务器的状态值。除了权重之外,还有:max_fails:允许请求失败的次数。默认为1。当超过最大数量时,返回proxy_next_upstream模块定义的错误。fail_timeout:max_fails次失败后,暂停的时间。down:表示当前节点服务器不参与负载,表示本机永远不可用,可与iP_hash配合使用backup:当所有其他非备机宕机或忙时,请求备机.所以这台机器会是压力最小的。upstreamupstreamblog2{serverwww.syushin.comweight=5;服务器blog.syushin.org宕机;serverblog.syushin.ccbackup;}调度算法rr轮询(默认调度算法,静态调度算法)通过client的请求顺序将client的请求一一分配给不同的后端节点服务器。wrr(weightedround-robin,静态调度算法)在rrround-robin的基础上增加权重。使用此算法时,权重与用户访问量成正比。权重值越大,转发的请求越多。比如有30个请求,2台服务器A(10.0.0.1)和B(10.0.0.2),如果想让A处理10个请求,B处理20个请求,可以这样定义:upstreampools{server10.0.0.1权重=1;server10.0.0.2weight=2;}ip_hash(静态调度算法)每个请求根据客户端IP的hash结果进行分配。当有新的请求到达时,首先通过哈希算法将客户端IP哈希为一个值。在后续的分配客户端请求中,只要客户端IP的哈希值相同,就会分配到同一个服务器。上游博客池{ip_hash;服务器192.168.30.5:80;server192.168.30.6:8090;}注意:使用ip_hash时不能有权重和备份。least_conn算法least_conn算法会根据后端服务器的连接数来考虑分配,连接数最少的服务器会分配更多的请求。调度算法除了上面列举的(常用的)还有很多,就不一一列举了。http_proxy_module模块http_proxy_module可以将请求转发到另一个服务器。在反向代理中,它会通过location函数匹配指定的URI,然后通过proxy_pass将匹配到匹配URI的请求抛到定义的上游节点池中。http_proxy模块参数参数说明proxy_set_header设置http请求头项到后端服务器节点,例如:代理后端的服务器节点可以获取到客户端用户的真实IP地址client_body_buffer_size用于指定客户端请求bodybuffersizeproxy_connect_timeout表示反向代理后端节点服务器连接的超时时间,即发起握手和等待响应的超时时间proxy_send_timeout表示代理后端服务器,即后端服务器的数据返回时间必须在规定的时间内传输完所有数据,否则nginx会断开连接开启此连接proxy_read_timeout设置nginx从代理后端服务器获取信息的时间,表示连接建立成功后,nginx等待响应后台服务器时间。其实就是nginx进入后端队列等待处理的时间。大小,缓冲区的默认大小等于命令proxy_buffers设置的大小。proxy_buffers大小,官方推荐大小为proxy_buffers*2proxy_trmp_file_write_size指定代理缓存临时文件的大小proxy_pass格式:proxy_passURL;示例如下:proxy_passhttp://blog.syushin.com/;proxy_passhttp://192.168.30.7:8080/uri;proxy_passhttp://tmp/www.sock;URL可以是域名,IP地址也可以是socket文件。proxy_pass的配置有几点需要注意:例1location/upload/{proxy_passhttp://192.168.30.7;}例2location/upload/{proxy_passhttp://192.168.30.7/;#注意多了一个斜杠}例3location/upload/{proxy_passhttp://192.168.30.7/blog/;}例4location/upload/{proxy_passhttp://192.168.30.7/blog;}Ifserver_name是blog.syushin.com,请求http://blog.syushin.com/uploa...时,上面例子1-4的请求结果是:例子1:http://192.168.30.7/upload/index。html例子2:http://192.168.30.7/index.html例子3:http://192.168.30.7/blog/index.html例子4:http://192.168.30.7/blogindex.html