一 nginx的代理
1常见模式
1.正向代理
2.反向代理
#区别
1.区别在于形式上服务的“对象”不一样
2.正向代理代理的对象是客户端,为客户端服务
3.反向代理代理的对象是服务端,为服务端服务
2Nginx代理服务支持协议
反向代理模式 | Nginx配置模块 |
---|---|
http、websocket、https、tomcat、Java程序 | ngx_http_proxy_module |
fastcgi(php程序) | ngx_http_fastcgi_module |
uwsgi(python程序) | ngx_http_uwsgi_module |
grpc(golang程序) | ngx_http_v2_module |
3简单配置(示例)
[root@web01 conf.d]# vim proxy.conf
server {
listen 80;
server_name linux.proxy.com;
location / {
root /code/proxy;
index index.html;
}
}
二nginx常用模块
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
# 用户请求的时候HOST的值是www.oldboy.com, 那么代理服务会像后端传递请求的还是www.oldboy.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;
#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
#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
#配置文件优化
[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;
三 七层负载均衡
1.负载均衡的作用
1.web服务器压力过大 把请求平均的分配到后端服务器上
2 公用云产品
1.SLB 阿里云产品
2.LB 青云产品
3.CLB 腾讯云产品
4.ULB ucloud产品
3 常见的负载均衡软件
1.nginx 支持四层负载均衡和七层负载均衡
2.LVS 只支持四层负载均衡
3.haproxy 支持四层负载均衡和七层负载均衡
#LVS是最快的负载均衡软件
4.负载均衡调度算法
调度算法 | 说明 |
---|---|
调度算法 | 说明 |
轮询 | 逐一的将请求平均的分配到后端 |
加权轮询 | 根据设置的权重值,将请求按比例分配至后端服务器 |
ip_hash | 根据访问来源的IP将请求始终分配到一台机器 |
url_hash | 根据访问的url,将请求始终分配到一台机器 |
least_conn | 哪一台机器接收的请求少,就将新的请求分配到哪一台机器 |
5负载均衡后端状态
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后, 服务暂停时间 |
max_conns | 限制最大的接收连接数 |
6示例
[root@lb01 ~]# vim /etc/nginx/conf.d/blog.conf
upstream blog {
server 172.16.1.7:80;
server 172.16.1.9:80;
}
server {
listen 80;
server_name linux.blog.com;
location / {
proxy_pass http://blog;
include /etc/nginx/proxy_params;
}
}
四 四层负载均衡
1什么是四层负载均衡
四层负载均衡是基于传输层协议包来封装的(如:TCP/IP),那我们前面使用到的七层是指的应用层,他的组装在四层的基础之上,无论四层还是七层都是指的OSI
2.应用场景
1.四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性;nginx就无法保证自己的服务高可用,需要依赖LVS或者keepalive。
2.tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。
3.数据库读写分离负载
4.跳板机端口映射
3.四层负载均衡特点
1、四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
2、四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)
3、四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同事的使用)
4、四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
5、通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡。
4四层负载均衡语法
Syntax: stream { ... }
Default: —
Context: main
#示例:四层负载均衡stream模块跟http模块时同一级别,不能配置在http层里面
stream {
upstream backend {
server backend1.example.com:12345 weight=5;
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
}
server {
listen 12345;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass backend;
}
}
5配置四层负载均衡
[root@lb03 ~]# vim /etc/nginx/conf.c/4lb.conf
stream {
upstream lbserver {
server 10.0.0.4:80;
server 10.0.0.5:80;
}
server {
listen 80;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass lbserver;
}
}
#检查配置并启动
[root@lb03 ~]# nginx -t
[root@lb03 ~]# systemctl restart nginx