Nginx反向代理负载均衡

一:反向代理

1.1 什么是反向代理

在互联网请求里,如果外网用户直接对后端的服务器进行访问是非常不安全的;这里使用反向代理,客户将请求发送带代理服务器上,通过代理服务器向后端的服务器完成资源的请求,并且从后端服务器上得到的结果返回给外网用户,就是反向代理


image.png

二:正向代理

2.1 什么是正向代理

正向一般是指内网访问外网使用的.例如我们国内访问不了谷歌,我们可以通过一个正向代理服务器,请求发到代理服务器上,代理服务器能访问谷歌,这样由代理去谷歌获取数据,在返回给我们

image.png

三:Nginx反向代理配置

3.1 nginx代理配置参数说明

3.1.1 proxy_pass

Syntax: proxy_pass URL;                  ##将后端web的内网ip+端口填在这个模块里
Default: —
Context: location, if in location, limit_except
http://localhost:8000/uri/
http://192.168.56.11:8000/uri/
http://unix:/tmp/backend.socket:/uri/

3.1.2 传递给后端服务器的请求头信息

Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location

# 用户请求的时候 HOST 的值是 www.cxy.com, 那么代理服务会像后端传递请求的还是 www.cxy.com,为什么要传递这个模板,应该如果一台后端服务器上有多个虚拟站点,而且站点的端口都一样;这样代理服务器只会通过ip+端口访问在后端服务器里/etc/nginx/conf.d/里配置文件排在最前面的那个站点服务;如果加上请求头部信息,就可以代理服务器就可以通过域名去区分虚拟站点
proxy_set_header Host $http_host;

# 将$remote_addr 的值放进变量 X-Real-IP 中, $remote_addr 的值为客户端的 ip
proxy_set_header X-Real-IP $remote_addr;

# 客户端通过代理服务访问后端服务, 后端服务通过该变量会记录真实客户端地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

3.1.3 代理到后端的TCP连接数,响应,返回等超时时间

#nginx 代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location

#nginx 代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location

#后端服务器数据回传给 nginx 代理超时时间
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

3.1.4 代理缓冲区

#nignx 会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location

#设置 nginx 代理保存用户头信息的缓冲区大小
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location

#proxy_buffers 缓冲区
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

3.2 Nginx反向代理服务器常用配置

可以直接将配置写入到/etc/nginx/proxy_params里,直接调用

[root@lb01 ~]# cat /etc/nginx/proxy_params 
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

然后直接在location配置代理时,调用这个proxy_params

location / {
    proxy_pass http://127.0.0.1:8080;
    include proxy_params;
}

四:反向代理测试

测试环境.png

4.1 配置web01-7上的nginx站点服务

[root@web01-7 conf.d]# cat /etc/nginx/conf.d/www.conf 
server {
    listen 172.16.1.7:80;
        server_name test.cxy.com;
        location / {
        root /code/test/;
        index index.html;
 }
}

[root@web01-7 conf.d]# cat /etc/nginx/conf.d/vvv.conf 
server {
    listen 172.16.1.7:80;
        server_name vvv.cxy.com;
        location / {
        root /code/vvv/;
        index index.html;
 }
}

[root@web01-7 conf.d]# cat /code/test/index.html 
test 01
[root@web01-7 conf.d]# cat /code/vvv/index.html 
vvv test

4.2 配置代理服务器lb01上的代理服务

4.2.1 安装nginx

4.2.2 代理lb01的配置

[root@lb01-5 ~]# cat /etc/nginx/conf.d/proxy_web.conf 
server {
    listen 80;
        server_name test.cxy.com;
    location / {
        proxy_pass http://172.16.1.7:80;

  }
}

server {
    listen 80;
        server_name vvv.cxy.com;
    location / {
        proxy_pass http://172.16.1.7:80;
   }
}

如果只按上述配置之后,当访问test.cxy.com和vvv.cxy.com的时候,访问的都是vvv这个站点,这里没有设置请求头不信息转递,所以代理不知道访问的是哪个,只能通过ip+端口去访问,而这个2个站点目录的端口和ip都是一样的,就是以/etc/nginx/conf.d/下的配置文件谁排在前面谁就优先访问

完整的配置如下

#先创建调用代理参数
[root@lb01-5 ~]# vim /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;

#直接在代理配置文件里面调用
[root@lb01-5 ~]# vim /etc/nginx/conf.d/proxy_web.conf 

server {
        listen 80;
        server_name test.cxy.com;
        location / {
                proxy_pass http://172.16.1.7:80;
                include proxy_params;       #直接调用参数文件
}


}

server {
        listen 80;
        server_name vvv.cxy.com;
        location / {
                proxy_pass http://172.16.1.7:80;
                include proxy_params;     #直接调用参数文件
}

检查语法,重载nginx

[root@lb01-5 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01-5 ~]# systemctl reload nginx

4.2.3 测试访问

修改window hosts文件 : 10.0.0.5 test.cxy.com vvv.cxy.com

image.png
image.png

查看web07服务器nginx访问日志
因为代理参数里有设置请求头信息,所以访问日志里面会记录真实访问的ip地址


image.png

五:反向负载均衡

5.1 什么是负载均衡

当用户大量访问web服务器的时候,单台服务器肯定难以负荷,我们就会使用多台web服务器组成集群,前端使用Nginx负载均衡,将请求分散打到我们的后端服务器集群中,实现负载的分发,那么会大大提升系统的吞吐率、请求性能、高容灾


image.png

5.2 四层负载均衡和七层负载均衡

四层负载均衡指的就是OSI七层模型中的传输层,只需要对客户端请求进行TCP/IP协议的包转发就可以实现负载均衡,通俗的讲就是通过匹配ip地址+端口去分发;

七层负载均衡指的是OSI七层中的应用层,可以通过访问的内容去做负载均衡,可以支持http,https,ftp等协议,现在常用的都是七层负载,因为它可以做很多访问规则,例如可以实现 http 信息的改写、头信息的改写、安全应用规则控制、 URL 匹配规则控制、以及转发、 rewrite等


四层负载均衡应用场景.png

5.3 反向负载均衡配置语法

Nginx实现负载均衡需要使用到proxy_pass代理模块;通过将客户端的请求代理转发至一组upstream虚拟服务池中


image.png

Nginx upstream虚拟配置语法

Syntax: upstream name { ... }
Default:    —
Context:    http

//upstream例子
upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;
    server backup1.example.com  backup;
}
server {
         location / {
                proxy_pass http://backend
                include proxy_params;
    }
}

5.4 配置测试

web01上配置

[root@web01-7 test]# cat /etc/nginx/conf.d/www.conf 
server {
    listen 172.16.1.7:80;
        server_name test.cxy.com;
        location / {
        root /code/test/;
        index index.html;
 }
}

web02上配置

[root@web02-8 test]# cat /etc/nginx/conf.d/www.conf 
server {
        listen 172.16.1.8:80;
        server_name test.cxy.com;
        location / {
        root /code/test/;
        index index.html;
}
}

web03上配置

[root@web02-8 test]# cat /etc/nginx/conf.d/www.conf 
server {
        listen 172.16.1.9:80;
        server_name test.cxy.com;
        location / {
        root /code/test/;
        index index.html;
}
}

lb01上的配置

[root@lb01-5 conf.d]# cat /etc/nginx/conf.d/proxy_web.conf
upstream cxy {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
    server 172.16.1.9:80;
}


server {
    listen 80;
        server_name test.cxy.com;
    location / {
        proxy_pass http://cxy;
         include proxy_params;
}
}

测试访问:
修改window hosts文件:10.0.0.5 test.cxy.com
每刷新一次,页面都会轮询到后面三台web服务器

5.5 Nginx负载均衡后端状态

down                     当前server暂时不参与负载均衡
backup                   预留的备份服务器
max_fails                允许请求失败的次数
fail_timeout             经过max_fails失败后,服务暂停时间
max_conns                限制最大的接收连接数

配置用法

[root@lb01-5 conf.d]# vim /etc/nginx/conf.d/proxy_web.conf
upstream cxy {
        server 172.16.1.7:80 down;           #这台服务器不参与服务调度
        server 172.16.1.8:80 backup;         #这台服务器做为备份服务器,常规不参与调度,当其他服务器出现故障时,参与服务
        server 172.16.1.9:80 max_fails=1 fail_timeout=10s;  #当请求这台服务器出现1次失败之后,等待10s之后在继续请求
        server 172.16.1.10:80 max_conns=1;    #只允许一个tcp请求
}

5.6 Nginx负载均衡调度算法

轮询             按时间顺序逐一分配到不同的后端服务器(默认)
weight          加权轮询,weight值越大,分配到的访问几率越高
ip_hash         每个请求按访问ip的hash结果分配,这样来自同一个ip固定访问一个后端服务器
url_hash        按照访问url的hash结果来分配请求,是每个url定向到同一个后端服务器
least_conn      最少连接数,哪个机器连接数少就分发那个

weight配置实例

upstream cxy {
        server 172.16.1.7:80 ;
        server 172.16.1.8:80 ;
        server 172.16.1.9:80 weight=5;
}

ip_hash配置实例

upstream cxy {
        ip_hash;
        server 172.16.1.7:80 ;
        server 172.16.1.8:80 ;
        server 172.16.1.9:80 ;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容