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;
}
}