Day57-Nginx反向代理与负载均衡初步应用
- 1. Nginx代理介绍
- 2. Nginx代理常见模式
- 2.1 正向代理
- 2.2 反向代理
- 2.3 正向与反向代理区别
- 3. Nginx代理支持协议
- 4. Nginx反向代理场景实践
- 5. lb01安装部署nginx
1. Nginx代理介绍
1)在没有代理的情况下,都是客户端直接请求服务端,服务端直接响应客户端。
2)租客租房,中介代理
3)在有代理模式的情况下,客户端往往无法直接向服务端发起请求,而是需要使用到中间代理服务,来实现客户端和服务通信。
4)为什么要使用代理功能?
- 提高访问效率。
- 承担单机无法处理的大并发流量请求。
- 满足7&24不宕机不丢数据需求。
2. Nginx代理常见模式
Nginx作为代理服务, 按照应用场景模式主要分为正向代理、反向代理两种模式
2.1 正向代理
*正向代理,早期的应用场景主要用于局域网内的电脑内部上网,主要解决的痛点是早期企业带宽有限,用户上网拥挤,速度慢,以及上网行为管理。目前带宽已不是问题,并且智能路由器等实现上网管理功能,因此正向代理应用已不那么流行了。
2.2 反向代理
反向代理的核心应用场景为用于公司后台网站集群架构中,客户端->代理<–>服务端,解决的主要痛点是单台机器无法承受大量并发用户的服务请求。需要有多台服务器同时处理请求。
2.3 正向与反向代理区别
1.服务的"对象"不同
正向代理代理的对象是局域网内的上网客户端,为其服务。
反向代理代理的对象是服务端,为上网的用户提供服务服务。
2.架设位置不同
正向代理架设在企业办公上网出口位置。
反向代理架设在企业网站服务器的前端。
3.代理作用不同
正向代理解决局域网上网提速、节约网站带宽、管控员工上网行为。
反向代理解决单台网站服务器撑不住流量并发问题,同时保障网站7X24不间断提供服务的需求。
3. Nginx代理支持协议
1.Nginx作为代理服务,可支持的代理协议非常的多,具体如下图
2.Nginx作为反向代理,常常会用到如下几种代理协议,如下图所示
Grpc:
链接: https://www.jianshu.com/p/9c947d98e192
链接: http://doc.oschina.net/grpc?t=58008
gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
websocket
链接: https://www.zhihu.com/question/20215561
链接: https://baike.baidu.com/item/WebSocket/1953845?fr=aladdin
3.最后我将企业常用反向代理模式与Nginx反向代理模块对应关系总结如下表格
反向代理模式 | Nginx反向代理模块 |
---|---|
http、websocket、https | ngx_http_proxy_module |
fastcgi | ngx_http_fastcgi_module |
uwsgi | ngx_http_uwsgi_module |
grpc | ngx_http_v2_module |
4. Nginx反向代理场景实践
1)Nginx反向代理配置语法示例
Syntax: proxy_pass URL;
Default: —
Context: location, if in location, limit_except
#示例
proxy_pass http://localhost:8000/uri/
proxy_pass http://10.0.0.7:8000/uri/
proxy_pass http://unix:/tmp/backend.socket:/uri/
2)Nginx反向代理配置实例
角色 | 外网IP(NAT) | 内网IP(LAN) | 主机名 |
---|---|---|---|
反向代理 | eth0:10.0.0.5 | eth1:172.16.1.5 | lb01 |
Web服务 | eth1:172.16.1.7 | web01 |
3)web01、web02服务器, 分别配置虚拟主机
#web01服务器配置测试虚拟主机
[root@web01 ~]# cat /etc/nginx/conf.d/01_test.etiantian.org.conf
#server{
# listen 80;
# server_name _default;
# return 404;
#}
server {
listen 80;
server_name test.etiantian.org;
charset utf-8;
location / {
root /usr/share/nginx/html/test;
index index.html index.htm;
}
}
[root@web01 conf.d]# mkdir /usr/share/nginx/html/test
[root@web01 conf.d]# echo "web01" >/usr/share/nginx/html/test/index.html
[root@web01 conf.d]# systemctl restart nginx
[root@web01 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.7
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@web01 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.7
web01
#web02服务器配置测试虚拟主机
[root@web02 ~]# cat /etc/nginx/conf.d/01_test.etiantian.org.conf
server{
listen 80;
server_name _default;
return 404;
}
server {
listen 80;
server_name test.etiantian.org;
charset utf-8;
location / {
root /usr/share/nginx/html/test;
index index.html index.htm;
}
}
[root@web02 conf.d]# mkdir /usr/share/nginx/html/test
[root@web02 conf.d]# echo "web02" >/usr/share/nginx/html/test/index.html
[root@web02 conf.d]# systemctl restart nginx
[root@web02 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.8
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@web02 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.8
web02
4)proxy代理服务器, 配置监听eth0的80端口,使10.0.0.0网段的用户,能够通过代理服务器访问到后端的172.16.1.7的80端口站点内容
[root@lb01 conf.d]# cat /etc/nginx/conf.d/blog.etiantian.org.conf
server {
listen 80;
server_name test.etiantian.org;
location / {
proxy_pass http://172.16.1.7:80;
proxy_set_header Host $http_host; #nginx代理携带请求头请求后端Web节点
}
}
[root@lb01 conf.d]# systemctl enable nginx
[root@lb01 conf.d]# systemctl start nginx
更多见day57-oldboy最牛.txt
5)抓包分析Nginx代理处理整个请求的过程
扩展作业
6)添加发往后端服务器的请求头信息, 如图
Syntax: proxy_set_header field value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http, server, location
# 客户端请求Host的值是blog.etiantian.org, 那么代理服务会像后端请求时携带Host变量为blog.etiantian.org
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;
7)代理的向后端请求时使用的HTTP协议版本。默认1.0版本。如果使用长连接,建议调整为1.1版本协议。
Syntax: proxy_http_version 1.0 | 1.1;
Default: proxy_http_version 1.0;
Context: http, server, location
This directive appeared in version 1.1.4.
# proxy_http_version 1.1;
8)代理到后端的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
5. lb01安装部署nginx
- 使用官方仓库安装Nginx
#yum install nginx -y 可能优先使用epel里的源,怎么确保我们配置的官方优先。
[root@web01 ~]# rpm -qa yum-plugin-priorities
[root@web02 ~]# yum install yum-plugin-priorities -y
[root@web01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
priority=1 #增加优先参数,使得官方源优先epel源。
#安装Nginx
[root@web01 ~]# yum install nginx -y
- 配置Nginx进程运行的用户
[root@web01 ~]# useradd -u1111 www -s /sbin/nologin -M
[root@web01 ~]# sed -i '/^user/c user www;' /etc/nginx/nginx.conf
[root@web01 ~]# grep "^user" /etc/nginx/nginx.conf
- 启动Nginx,并将Nginx加入开机自启
[root@web01 ~]# systemctl start nginx
[root@web01 ~]# systemctl enable nginx
[root@web01 ~]# lsof -i :80 #查看端口对应的服务
[root@web01 ~]# nginx -v #查看版本
nginx version: nginx/1.20.1
[root@web01 ~]# curl 10.0.0.5 #welcome to Nginx 表示正常。
实验1:
[root@lb01 conf.d]# vim 01_test.etiantian.org.conf
server {
listen 80;
server_name test.etiantian.org;
location / {
proxy_pass http://172.16.1.7:80;
proxy_set_header Host $http_host;
}
}
[root@lb01 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.5
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
实验2:
[root@lb01 conf.d]# vim 01_test.etiantian.org.conf
server {
listen 80;
server_name test.etiantian.org;
location / {
proxy_pass http://172.16.1.7:80;
proxy_set_header Host $http_host; #实现Nginx代理携带host字段请求节点。
}
}
# 成功
[root@lb01 conf.d]# curl -H "Host:test.etiantian.org" 10.0.0.5
web01
- 拆分不同的后端服务器提供访问。
1.动静分离。
2.不同的动态业务分离。
网站集群:一个项目下的
www.etiantian.org #
www.etiantian.org/dynamic/xx//xxxx #动态服务器集群
www.etiantian.org/regi/xx//xxxx #注册登录服务器集群
www.etiantian.org/regi/xx//xxxx #手机服务器集群
......
二级页面:
tongzhuang.etiantian.org
neiyi.etiantian.org
image.etiantian.org
静态服务:独立域名
image.ett.com
[root@web01 conf.d]# cat location01.etiantian.org.conf
server {
listen 80;
server_name www.etiantian.org;
#www.etiantian.org
location / {
proxy_pass http://172.16.1.7:80;
proxy_set_header Host $http_host;
}
#www.etiantian.org/dynamic/xx//xxxx #动态服务器集群
location /dynamic/ {
proxy_pass http://172.16.1.8:80; ##动态
proxy_set_header Host $http_host;
}
#www.etiantian.org/regi/xx//xxxx #注册登录服务器
location ^~ /regi/ {
proxy_pass http://172.16.1.9:80; #注册登录服务器集群
proxy_set_header Host $http_host;
}
#www.etiantian.org/regi/xx//xxxx #手机服务器集群
#location ^~ $http_user_agent = 安卓英文 {
proxy_pass http://172.16.1.9:80; ##手机服务器集群
proxy_set_header Host $http_host;
}
##静态
location ~* \.(gif|jpg|jpeg)$ {
proxy_pass http://172.16.1.10:80;
proxy_set_header Host $http_host;
}
}
- 负载均衡 backend服务器池
1)基本负载均衡实验
[root@lb01 conf.d]# cat 01_test.etiantian.org.conf
upstream backend {
#server backend1.example.com weight=5;
#server backend2.example.com:8080;
#server unix:/tmp/backend3;
server 172.16.1.7 weight=2; #默认80端口
server 172.16.1.8 weight=1; #默认80端口
#server 8080.etiantian.org:8080 backup; #热备
#server backup2.example.com:8080 backup; #热备
}
server {
listen 80;
server_name test.etiantian.org;
location / {
proxy_pass http://backend;
#proxy_pass http://a.etiantian.org:80;
proxy_set_header Host $http_host;
}
}
配置web01:
[root@web01 conf.d]# cat 01_test.etiantian.org.conf
server{
listen 80;
server_name _default;
return 404;
}
server {
listen 80;
server_name test.etiantian.org;
charset utf-8;
location / {
root /usr/share/nginx/html/test;
index index.html index.htm;
}
}
server {
listen 8080;
server_name test.etiantian.org;
charset utf-8;
location / {
root /usr/share/nginx/html/test8080;
index index.html index.htm;
}
}
配置web02:
[root@web02 conf.d]# cat 01_test.etiantian.org.conf
server{
listen 80;
server_name _default;
return 404;
}
server {
listen 80;
server_name test.etiantian.org;
charset utf-8;
location / {
root /usr/share/nginx/html/test;
index index.html index.htm;
}
}
systemctl restart nginx
# 实现效果:
[root@web02 conf.d]# curl -H "host:test.etiantian.org" 10.0.0.8
web02
[root@web02 conf.d]# curl -H "host:test.etiantian.org" 10.0.0.7
web01
结果:
[root@lb01 conf.d]# for n in {1..100}; do curl test.etiantian.org;sleep 1;done
web01
web02
web01
web01
web02
web01
web01
web02
2)测试backup功能
[root@lb01 conf.d]# cat 01_test.etiantian.org.conf
upstream backend {
#server backend1.example.com weight=5;
#server backend2.example.com:8080;
#server unix:/tmp/backend3;
server 172.16.1.7 weight=2; #默认80端口
server 172.16.1.8 weight=1; #默认80端口
#server 8080.etiantian.org:8080 backup; #热备
#server backup2.example.com:8080 backup; #热备
}
server {
listen 80;
server_name test.etiantian.org;
location / {
proxy_pass http://backend;
#proxy_pass http://a.etiantian.org:80;
proxy_set_header Host $http_host;
}
}
#host解析
[root@lb01 conf.d]# grep 80 /etc/hosts
172.16.1.7 web01 8080.etiantian.org
关掉web02 nginx:pkill nginx,然后回到lb01访问
[root@lb01 conf.d]# for n in {1..100}; do curl test.etiantian.org;sleep 1;done
web02
web02
web02
web01-8080
web01-8080
web01-8080
web02
web02