Nginx代理与负载均衡 小记

一.Nginx代理

1.代理简介:

    代理一词在生活中并不陌生, 朋友圈的代购,街上的租房中介,银行的理财业务等等,这些都会涉及到代理。总的来说代理又分为正向代理和反向代理,简单理解正向代理代理的对象是客户,为客户端服务。反向代理则是为服务端服务。在互联网请求中,客户端往往无法直接向服务端发起请求,所以就需要用到代理服务,来实现客户端和服务端通信。

 

2.Nginx代理配置:

1台机器作为服务端,另1台机器则作为代理。

主机名             IP                       身   份   

lb01             10.0.0.4                   代理 
web01     172.16.1.7/10.0.0.7         服务端 

 

web01配置:

[root@web01 ~]#  vim /etc/nginx/conf.d/linux.proxy.com.conf
server {
listen 80;
server_name linux.proxy.com;

location / {
root /code/proxy;
index index.html;
}
}

注意:在配置代理之前,应保证 linux.proxy.com域名访问正常。

代理配置:

[root@lb01 ~]# vim /etc/nginx/conf.d/daili.conf
server {
listen 80;
server_name linux.proxy.com;

location / {
proxy_pass http://172.16.1.7:80;
}
}
[root@lb01 ~]# systemctl start nginx

补充:重启nginx后访问页面发现不是域名对应页面?

解决:检查web01机器上nginx的配置文件
使用wireshark抓包分析
可以看出,当我们只用proxy_pass代理的时候,会发现如下问题:
10.0.0.1请求10.0.0.4的时候使用的是域名
10.0.0.4请求10.0.0.7【172.16.1.7】的时候使用的是IP:port

当访问80端口的时候,没有域名的情况下,默认会去找排在最上面的那个配置文件。
所以我们需要解决这个问题,保留住最开始的请求头部信息。

2.常见代理参数配置

(1). 添加发往后端服务器的请求头信息

#用户请求的时候HOST的值是www.xxxxxx.com, 那么代理服务会像后端传递请求的还是www.xxxxx.com
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;

(2). 代理到后端的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). proxy_buffer代理缓冲区

#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.代理配置优化文件

[root@lb01 ~]# 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;

 

4.重新配置代理文件

[root@lb01 ~]# vim /etc/nginx/conf.d/daili.conf
server {
listen 80;
server_name linux.proxy.com;

location / {
proxy_pass http://10.0.0.7:80;
include /etc/nginx/proxy_params;
}
}

配置优化文件后再次访问nginx页面,显示指定域名配置。

 

二. Nginx负载均衡

1.负载均衡简介:

    Web服务器直接面向用户时往往需要承载大量并发请求,单台服务器难以负荷。在实际工作中大多使用多台Web服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现负载的分发。从而大大提升系统的吞吐率、请求性能、高容灾。

 

2.常见负载均衡软件

Nginx               支持四层负载均衡和七层负载均衡

LVS                 只支持四层负载均衡

haproxy           支持四层负载均衡和七层负载均衡

 

3.负载均衡类型

四层负载均衡:
    四层负载均衡指的是OSI七层模型中的传输层,那么传输层Nginx已经能支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载均衡,它的好处是性能非常快、只需要底层进行应用处理,而不需要进行一些复杂的逻辑。

 

七层负载均衡

    七层负载均衡它是在应用层,它可以完成很多应用方面的协议请求,比如我们说的http应用的负载均衡,它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则,所以在应用层的服务里面,我们可以做的内容就更多,那么Nginx则是一个典型的七层负载均衡SLB。

 

4.Nginx负载均衡配置

    Nginx要实现负载均衡需要用到proxy_pass代理模块配置。

    Nginx负载均衡与Nginx代理不同地方在于,Nginx的一个location仅能代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池。

 

5.负载均衡配置:

主机                外网ip                     身  份

lb01          10.0.0.4,172.16.1.4           负载均衡 
web01           172.16.1.7                      web 
web03           172.16.1.9                     web 

 

web服务器配置:【两台web配置需一样】

[root@web01 conf.d]# vim linux.node.com.conf
server {
listen 80;
server_name linux.node.com;
charset utf-8;

location / {
root /code/node;
inde index.html;
}
}

 

负载均衡服务器配置:

[root@lb01 conf.d]# vim node_proxy.conf
upstream web {
server 172.16.1.7:80;
server 172.16.1.8:80;
}

server {
listen 80;
server_name linux.node.com;

location / {
proxy_pass http://web;                         #填写虚拟服务池名字即可
include /etc/nginx/proxy_params;
}
}

 

6. Nginx调度算法

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

 

7. 负载均衡常见错误

如果后端服务器返回报错,负载均衡仍然会将请求分配到出错的web服务器。因为负载均衡只会根据调度算法将请求分配到后端,不会判断后端是否正常

解决错误的模块语法(只访问正常的机器):

[root@lb01 ~]# vim /etc/nginx/conf.d/zh.conf

upstream zh {
server 172.16.1.7:80;
server 172.16.1.9:80;
}

server {
listen 80;
server_name linux.zh.com;

location / {
proxy_pass http://zh;
include /etc/nginx/proxy_params;
proxy_next_upstream http_502 error timeout;
}
}

 

posted @ 2021-05-19 11:22  芒果~~  阅读(71)  评论(0编辑  收藏  举报