Nginx反向代理与负载均衡

更新日期: 2019-03-13 阅读: 2.3k 标签: nginx

反向代理

反向代理指的是以代理服务器接收用户的的访问请求,代理用户向内部服务器重新发起请求,最后把内部服务器的响应信息返回给用户。这样,代理服务器对外就表现为一台服务器,而访问内部服务器的客户端用的就是代理服务器,而不是真实网站访问用户。

为什么使用反向代理

  • 可以起到保护网站安全的作用,因为任何来自Internet的请求都必须先经过代理服务器。
  • 通过缓存静态资源,加速Web请求。
  • 实现负载均衡

反向代理例子

环境说明

假如有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内网服务器
  • 两台机器都安装nginx
  • moli-05服务器访问是wordpress博客,域名blog.syushin.org
  • 虚拟机实验环境,就都关闭防火墙了

配置虚拟主机
moli-04机器上编辑虚拟主机配置文件,内容如下:

[root@moli-04 extra]$ cat blog.syushin.org.conf 
server{
    listen    80;
    server_name    blog.syushin.org;
    
    location / {
        proxy_pass http://192.168.30.7;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    } 
}

更改hosts文件
windows上修改hosts文件,添加配置

192.168.93.129 blog.syushin.org

浏览器测试

访问地址是192.168.93.129,出现的界面的05机器的页面,配置成功。


负载均衡

负载均衡的功能

  • 对用户的访问请求进行调度管理
  • 对用户的访问请求进行压力分担

负载均衡集群在运行时,一般是通过一个或者多个前端负载均衡器将客户访问请求发到后端的一组服务器上。

Nginx负载均衡

严格来说,Nginx仅仅是作为Nginx Proxy反向代理的使用的,但是因为这个反向代理功能表现的效果是负载均衡机器的效果,因此nginx负载均衡是特殊的反向代理。

实现Nginx负载均衡的主要组件:

Nginx模块说明
ngx_http_proxy_moduleproxy代理模块,用于把请求发送给服务器节点或upstream服务器池
ngx_http_upstream_module负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

upstream模块介绍

ngx_http_upstream_module模块支持的代理方式有proxy_pass,fastcgi_pass等,主要使用proxy_pass。

upstream模块允许nginx定义一组或多组节点服务器组,使用时通过proxy_pass代理把网站的请求发送到定义好的对应的节点组中。

示例:创建节点服务器池

upstream blog {
    server 192.168.30.5:80 weight=5;
    server 192.168.30.6:81 weight=10;
    server 192.168.30.7:82 weight=15;
}

upstream:创建节点服务器组的关键字,必须有;
blog:节点服务器组的名字,必须有,可自定义名字;
server:关键字,后面可加IP或者域名或者IP:端口,不指定端口默认80;
weight:权重,数值越大被分配的请求越多。默认为1

设置节点服务器的状态值除了weight之外,还有:
max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
fail_timeout:max_fails次失败后,暂停的时间。
down:表示当前的节点服务器不参与负载,标志机器永远不可用,可配合iP_hash使用
backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

使用域名的upstream

upstream blog2{
    server www.syushin.com weight=5;
    server blog.syushin.org down;
    server blog.syushin.cc backup;
}

调度算法

rr轮询(默认调度算法,静态调度算法)

按客户端请求顺序把客户端的请求逐一分配到不同的后端节点服务器。

wrr(权重轮询,静态调度算法)
在rr轮询的基础上加上权重,使用该算法的时候,权重和用户访问成正比,权重值越大,被转发的请求就越多。
比如有30个请求,2台服务器A(10.0.0.1)和B(10.0.0.2),如果希望A处理10个请求,B处理20个请求,可以这样定义:

upstream pools{
    server 10.0.0.1 weight=1;
    server 10.0.0.2 weight=2;
}

ip_hash(静态调度算法)
每个请求按客户端IP的hash结果分配,当新的请求到达,先将客户端IP通过哈希算法哈希出一个值,在随后的分配客户端请求中,客户IP的哈希值只要相同,就会被分配到同一台服务器。

upstream blog_pool{
    ip_hash;
    server 192.168.30.5:80;
    server 192.168.30.6:8090;
}

注意:当使用ip_hash时,不能有weight和backup。

least_conn算法
least_conn算法会根据后端服务器的连接数来觉得分配情况,哪台服务器连接数最少就分发多的请求。

调度算法除了上面所列的(常用)还有很多,就不一一列举了。

http_proxy_module模块

http_proxy_module可以将请求转发到另外一台服务器,在反向代理中,会通过location功能匹配指定的URI,然后把收到符合匹配的URI的请求通过proxy_pass抛给定义好的upstream节点池。

http_proxy模块参数

参数说明
proxy_set_header设置http请求header项传给后端服务器节点,例如:可实现让代理后端的服务器节点获取访问客户端用户的真实IP地址
client_body_buffer_size用于指定客户端请求主体缓冲区大小
proxy_connect_timeout表示反向代理后端节点服务器连接的超时时间,即发起握手等候响应的超时时间
proxy_send_timeout表示代理后端服务器的数据回传时间,即在规定时间内后端服务器必须传完所有数据,否则nginx将断开这个连接
proxy_read_timeout设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的响应时间,其实是nginx已经进入后端的排队之中等候处理的时间
proxy_buffer_size设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小
proxy_buffers设置缓冲区的数量和大小,nginx从代理的后端服务器获取的响应信息,会设置到缓冲区
proxy_busy_buffers_size用于设置相同很忙时可以使用的proxy_buffers大小,官方推荐的大小为 proxy_buffers * 2
proxy_trmp_file_write_size指定proxy缓存临时文件的大小

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/2352

相关推荐

前端如何通过Nginx代理做到跨域访问API接口

Nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。对于浏览器来说,访问的就是同源服务器上的一个url

nginx找不到js css文件怎么办

js、css都算静态资源,之所以请求不到是因为nginx做代理后的虚拟路径和静态资源的请求路径不一致导致的。只需要更改root的配置就可以了。

nginx去掉url中的index.php

使用情境:我想输入www.abc.com/a/1后,实际上是跳转到www.abc.com/index.php/a/1,配置Nginx.conf在你的虚拟主机下添加:如果你的项目入口文件在一个子目录内,则.

Nginx配置https和wss

常见的服务器有三种:Nginx、IIS、Apache,都可以配置https,但是没必要全部知道,因为Nginx可以起到反向代理的作用,会配置Nginx就足够了。在/etc/nginx/conf.d目录下新建https.conf

nginx做http向https的自动跳转

首先让nginx服务器监听两个端口,分别是80端口和443端口,注意监听443端口的时候需要配置证书的认证以及创建自签名证书!关于证书的认证的以及创建自签名的证书,nginx的配置如下,只给出了两个server的配置,可以直接复制到http块中。

Nginx解析PHP的原理 | CGI、FastCGI及php-fpm的关系

php-fpm采用master/worker架构设计, master进程负责CGI、PHP公共环境的初始化及事件监听操作。worker进程负责请求的处理功能。在worker进程处理请求时,无需再次初始化PHP运行环境,这也是php-fpm性能优异的原因之一

nginx自定义变量与内置预定义变量

nginx可以使用变量简化配置与提高配置的灵活性,所有的变量值都可以通过这种方式引用:$变量名,而nginx中的变量分为两种,自定义变量与内置预定义变量

总结nginx中的location配置

Location指令是nginx中最关键的指令之一,location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应,这其中较难理解的是多个location的匹配顺序,本文会作为重点来解释和说明。

nginx 配置proxy_pass URL末尾加与不加/(斜线)的区别

nginx在配置proxy_pass的时候 URL结尾加斜线(/)与不加的区别和注意事项,加/斜线的情况;不加/斜线的情况

Nginx 禁止某 IP 访问

总有一些不怀好意的人来访问我的网站,而且频率还很高,所以就用简单的方式禁止访问,就用 Nginx 来实现。想要添加黑名单,只要在 blocksip.conf 中添加 IP ,然后 reload 即可。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!