Nginx 配置反向代理和负载均衡

反向代理

客户端 A 出于某种原因(如 GFW)无法访问服务器 B,但它能访问服务器 C,服务器 C 能访问服务器 A,那么客户端 A 可通过服务器 C 来访问服务器 B。此时服务器 C 就是一个代理服务器(即正向代理)。

首先将请求发送到服务器 C,服务器 C 将请求转发到服务器 B 并接收服务器 B 返回的响应,最后将响应返回给客户端 A。

客户端 A 请求某项服务器 B 上没有的资源,但服务器 C 上有此资源,服务器 B 请求服务器 C 上的资源,并将它返回给客户端 A。此时服务器 B 即是一个反向代理服务器。

客户端 A 并不知道服务器 B 上是否有它请求的资源,它只管请求、接收。

配置反向代理

将 Nginx 配置为一个反向代理服务器,只需在 location 上下文中设置 proxy_pass 指令即可。如下所示:

location / {
    proxy_pass http://192.168.0.214/;
}

此配置会将对本 Nginx(假设为服务器 A)的请求全部转发到位于 192.168.0.214 上的 Nginx(假设为服务器 B)。

客户端对服务器 A 的访问全部被转发到服务器 B,但在服务器 B 的访问日志中记录的访问 IP 是服务器 A 的地址。

记录客户端 IP

若想要在服务器的 B 的访问日志中记录客户端而非服务器 A 的 IP 地址,则需要在服务器 A 和服务器 B 中进行一些配置。在服务器 A(即代理服务器)中的配置如下:

location / {
    proxy_pass http://192.168.0.214/;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

增加一个 $proxy_add_x_forwarded_for 变量到 X-Forwarded-For 中,$proxy_add_x_forwarded_for 变量包含客户端请求头中的 "X-Forwarded-For" 与 $remote_addr 两部分,它们之间用逗号分隔。

X-Forwarded-For 是一个 HTTP 扩展头部,用来表示 HTTP 请求端的真实 IP,其格式如下:

X-Forwarded-For: client, proxy1, proxy2

若一个 HTTP 请求在到达服务器之前经过了三个代理 Proxy1、 Proxy2 和 Proxy3,它们的 IP 地址分别为 IP1、IP2 和 IP3,客户端的 IP 地址为 IP0,那在服务器端接收到的 X-Forwarded-For 中的信息如下所示:

X-Forwarded-For: IP0, IP1, IP2

Proxy3 与服务器直接相连,它会给 X-Forwarded-For 追加 IP2,表示它是在帮 Proxy2 转发请求。

IP3 可在服务器中通过 $remote_addr 获得,$remote_addr 来自 TCP 连接,表示与服务器建立 TCP 连接的设备 IP。

在服务器 B 中的配置如下:

location / {
    ...
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

$proxy_add_x_forwarded_for 变量包含客户端请求头中的 X-Forwarded-For 与 $remote_addr 两部分,其中 X-Forwarded-For 包含客户端 IP,$remote_addr 则是与服务器直接相连的代理服务器的 IP。

http {
    ...
    log_format main ‘$remote_addr - $http_x_forwarded_for‘;
    ...

$remote_addr 是与服务器直接相连的代理服务器的 IP。

$http_x_forwarded_for 变量即是 X-Forwarded-For。

负载均衡

负载均衡即是通过反向代理服务器将客户端的访问分配到不同的后端服务器。HTTP Upstream 模块(即负载均衡模块)通过一个简单的调度算法来实现后端服务器的负载均衡。它目前支持 4 种调度算法,如下所示:

  • 轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,宕机的服务器会被自动剔除。

  • ip_hash

    每个请求按访问 IP 的 hash 结果分配,这使得来自同一个 IP 的访问固定到同一台后端服务器,有效解决了动态网页存在的 session 共享问题。

  • fair(第三方)

    此算法可以根据页面大小和加载时间长短智能地进行负载均衡,即根据后端服务器的响应时间来分配请求,响应时间短的优先分配。

    Nginx 通过 upstream_fair 模块来支持 fair。

  • url_hash(第三方)

    此算法根据访问 url 的 hash 结果来分配请求,使得每个 url 定向到同一个后端服务器,这可以进一步提高后端缓存服务器的效率。

    Nginx 通过 hash 软件包来支持 url_hash。

轮询算法

一个使用轮询算法(带权值)的负载均衡配置如下所示:

server {
    ...
    location / {
        proxy_pass http://webservers;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

upstream webservers {
    server 192.168.0.214 weight=1 down;
    server 192.168.0.179 weight=1 max_fails=2 fail_timeout=2;
    server 127.0.0.1:8080 backup;
}

在 upstream 上下文中,可通过 server 指令指定后端服务器的 IP 和端口,还可设定每个后端服务器在负载均衡调度中的状态。常用的状态如下所示:

down,表示当前的 server 暂时不参与负载均衡。

backup,预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时会请求 backup 机器。

max_fails,允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。

fail_timeout(和 fail_timeout 一起使用),在经历了 max_fails 次失败后暂停服务的时间。

weight 参数用来指定轮询权值,其值越大,分配到的访问机率越高,它主要用于后端每个服务器性能不均的情况下。

ip_hash 算法

一个使用 ip_hash 算法的负载均衡配置如下所示:

server {
    ...
    location / {
        proxy_pass http://webservers;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

upstream webservers {
    ip_hash

    server 192.168.0.214 weight=1 max_fails=2 fail_timeout=2;
    server 192.168.0.179 weight=1 max_fails=2 fail_timeout=2;
}

调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能有 backup,也不能指定 weight 权值。

若存在 backup 服务器,且负载均衡将某个用户分配到该服务器,那么此用户将一直不能访问服务器。

原文地址:https://www.cnblogs.com/reghao/p/8536628.html

时间: 2024-10-06 14:21:27

Nginx 配置反向代理和负载均衡的相关文章

nginx配置反向代理和负载均衡

一.反向代理 说明:应该有一个nginx服务器有多个应用服务器(可以是tomcat),本文使用一台虚拟机,安装一个nginx,多个tomcat,来模拟 upstream tomcats{ server 192.168.25.148:8080; server 192.168.25.148:8081; } server { listen 80; server_name tomcat.taotao.com; #charset koi8-r; #access_log logs/host.access.l

nginx简单反向代理和负载均衡(ubuntu)

nginx简单反向代理与负载均衡 环境:三台ubuntu 12.04.5 虚拟机    均装有nginx 1.1.19 以下u1(192.168.240.129) ,u2(192.168.240.130),u3(192.168.240.131)代表三台虚拟机 简单的反向代理配置:(u1反向到u2) u1的配置: server { listen 80 default_server; server_name  a.jh.net; index index.html index.php root /ho

实践NGINX的反向代理与负载均衡

实践NGINX的反向代理与负载均衡 安装nginx过程 [[email protected] opt]# yum install pcre-devel openssl-devel -y [[email protected] opt]# wget -q http://nginx.org/download/nginx-1.10.2.tar.gz [[email protected] opt]# useradd nginx -s /sbin/nologin -M [[email protected]

Tomcat:利用Apache配置反向代理、负载均衡

Apache 反向代理.负载均衡 准备工作 1.  2 个tomcat实例 2.  安装Apache server2.2 基于apache server配置反向代理 在这个配置中,只使用到了apache server,没有使用到tomcat. 1)  ${apacheserver}/conf/extra/httpd-vhosts.conf在配置一个使用反向代理的虚拟主机 <VirtualHost *:80> ServerAdmin [email protected] ServerName ww

Apache上配置反向代理以及负载均衡配置

之前一个项目需要在Apache上配置负载均衡,由于事情繁多,时间紧迫,没有时间去弄. 今天抽时间测试了一把,至少是可以进行代理了. 现将如何配置反向代理和负载均衡分别描述. 1.反向代理 步骤: (1)在Apache的配置文件httpd.conf中打开反向代理的模块 #----------------------------------------------- LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_conne

nginx实现反向代理与负载均衡

nginx在LB Cluster集群中也可以扮演一定的角色,即反向代理与负载均衡.在一个Web服务中,来自客户端的请求可以经由nginx服务器转发至后端服务器,并且按照一定的算法实现负载均衡. 1.反向代理 1)在192.168.10.17/24与192.168.10.77/24主机上安装nginx,提供web服务. 编辑两台主机的主页文件内容分别为 inode17 page 和inode77 page 2)主机172.16.10.66提供nginx的反向代理服务 为了与后端主机进行通信,此主机

nginx 作为反向代理实现负载均衡的例子

nginx 这个轻量级.高性能的 web server 主要可以干两件事情: 〉直接作为http server(代替apache,对PHP需要FastCGI处理器支持): 〉另外一个功能就是作为反向代理服务器实现负载均衡 以下我们就来举例说明如何使用 nginx 实现负载均衡.因为nginx在处理并发方面的优势,现在这个应用非常常见.当然了Apache的 mod_proxy和mod_cache结合使用也可以实现对多台app server的反向代理和负载均衡,但是在并发处理方面apache还是没有

Nginx的反向代理及负载均衡

1.集群的简介 简单来说,集群就是指一组相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点都是运行各自服务的独立服务器.这些服务器之间可以彼此通信,协同向用户提供应用程序.系统资源和数据,并以单一系统的模式加以管理.当用户客户机请求集群系统时,集群给用户的感觉就是一个单一的服务器,而实际上用户请求的是一组集群服务器. 集群主要包括几大特点:高性能.价格有效性.可伸缩性.高可用性.透明性.可管理性和可编程性. 2.负载均衡集群 常见的负载均衡的架构包括有负载均衡集群.高

nginx实现反向代理及负载均衡

一.反向代理 1.什么是反向代理 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Internet上的web服务器发起请求,最终达到客户机上网的目的(也就是正向代理). 而反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理