博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux运维、架构之路-Nginx反向代理
阅读量:5155 次
发布时间:2019-06-13

本文共 8407 字,大约阅读时间需要 28 分钟。

一、 Nginx负载均衡和反向代理知识

1、集群概念

        一堆服务器合作做同一件事,这些机器可能需要整个技术团队架构、设计和统一协调管理,这些机器可以分布在一个机房,也可以分布在全国各个地区的多个机房。

2、集群作用

①提高网站处理用户请求能力

②提高网站稳定运行高可用性

3、集群分类

①高可用集群HA

②负载均衡集群LB

1)硬件实现负载

F5硬件设备

A10硬件设备

2)软件实现负载

Nginx(7层,1.9版本之后也支持4层负载)

LVS(4层)

Haproxy(4、7层)

说明: 所谓四层就是基于IP+端口的负载均衡;七层就是基于URL等应用层信息的负载均衡

4、负载均衡与反向代理对比

负载均衡

反向代理

对用户的访问请求进行调试管理

接收用户请求代替用户向后端访问

对用户的访问请求进行压力分担

 

5、反向代理与数据转发区别

二、反向代理部署

1、快速部署

useradd -s /sbin/nologin -M wwwmkdir -p /server/tools/cd /server/tools/wget http://nginx.org/download/nginx-1.10.3.tar.gztar xf nginx-1.10.3.tar.gzyum install pcre-devel openssl-devel -ycd /server/tools/nginx-1.10.3./configure --prefix=/application/nginx-1.10.3 --user=www --group=www  --with-http_stub_status_module  --with-http_ssl_modulemake && make installln -s /application/nginx-1.10.3/ /application/nginxln -s /application/nginx/sbin/nginx  /usr/local/sbin/nginxlsof -i:80

2、 统一编写nginx配置(web01,web02)

worker_processes  3;error_log logs/error.log error;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';                          access_log  logs/access.log  main;    include extra/www.conf;    include extra/blog.conf;    include extra/bbs.conf;    include extra/status.conf;}

3、统一两台web服务器测试环境

①web01

[root@web01 html]# cat {www,bbs}/index.html10.0.0.8 www10.0.0.8 bbs

②web02

[root@web02 html]# cat {www,bbs}/index.html10.0.0.7 www10.0.0.7 bbs

4、编辑nginx.conf配置文件实现负载功能(lb01)

worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;                       upstream server_pools {        server 10.0.0.7:80;        server 10.0.0.8:80;    }     server {        listen 80;server_name bbs.etiantian.org;        location / {            proxy_pass http://server_pools;            proxy_set_header host $host;        }    }    server {        listen 80;server_name www.etiantian.org;        location / {            proxy_pass http://server_pools;            proxy_set_header host $host;        }    }} 注:主要应用到nginx的ngx_http_upstream_module,官方例子
upstream backend {    server backend1.example.com       weight=5;    server backend2.example.com:8080;    server unix:/tmp/backend3;    server backup1.example.com:8080   backup;    server backup2.example.com:8080   backup;}server {    location / {        proxy_pass http://backend;    }}

5、浏览器测试或linux下进行web服务

[root@lb01 conf]# curl www.etiantian.org10.0.0.7 www[root@lb01 conf]# curl www.etiantian.org10.0.0.8 www[root@lb01 conf]# curl bbs.etiantian.org10.0.0.7 bbs[root@lb01 conf]# curl bbs.etiantian.org10.0.0.8 bbs注:浏览器测试之前,重启nginx服务程序(lb01 web01 web02)

6、upstream参数说明

upstream模块内参数

参数说明

server 10.0.0.8:80

负载均衡后面的RS配置,可以是IP或域名,默认80端口,高并发场景下,IP可换成域名,通过DNS做负载均衡

weigth=1

代表服务器的权重,默认值是1,权重数字越大表示接受的请求比例越大

max_fails=5

尝试连接后端主机失败的次数,这个值是配合proxy_net_upstream、fastcgi_next_upstream和memached_net_upstream这三个参数使用,当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404、502、503、Max_fails的默认值是1;企业场景下建议2-3次

fail_timeout=10s

在max_fails定义的失败次数后,距离下次检查的间隔时间,默认是10s,如果max_fails是5,就检测5次,如果5次都是502,那么会根据fail_timeout的值,等待10s再去检查,还是只检查一次,如果持续502,在不重新加载nginx配置的情况下,每隔10s都只检查一次,常规业务2~3秒比较合理

backup

热备配置(RS节点高可用),当前面RS都失败后会自动启用热备RS,这标志着这个服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求,注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup

down

这标志着服务器永远不可用,这个参数可配合ip_hash使用,类似注释效果

7、调度算法

rr

定义轮询调度算法,默认调度算法

wrr

定义权重调度算法

ip_hash

定义静态调度算法

least_conn

定义最小的连接数

三、Nginx反向代理

1、记录用户访问真实IP地址

cat nging.confworker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;                                      upstream server_pools {        server 10.0.0.7:80;        server 10.0.0.8:80;    }     server {        listen 80;       server_name bbs.etiantian.org;        location / {           proxy_pass http://server_pools;           proxy_set_header Host $host;           proxy_set_header X-Forwarded-For $remote_addr;#此模块记录用户访问真实地址        }       }   server {        listen 80;       server_name www.etiantian.org;        location / {           proxy_pass http://server_pools;       proxy_set_header Host $host;       proxy_set_header X-Forwarded-For $remote_addr;    } }}

2、Nginx反向代理参数

Nginx反向代理重要参数

参数说明

proxy_pass http://server_pools;

通过proxy_pass功能把用户的请求转向反向代理定义的upstream服务器池

proxy_set_header Host $host

在代理向后端服务器发送的http请求头中加入host字段信息,用于当后端服务器配置有多个虚拟主机时,可以识别代理的是哪个虚拟主机,这是节点服务器多虚拟主时的关键配置。

proxy_set_header X-Forwarded-For $remote_addr;

在代理向后端服务器发送的http请求头中加入X-Forward-For字段信息,用于后端服务器程序、日志等接收记录真实用户的ip,而不是代理服务器的IP,这是反向代理时,节点服务器获取用户真实IP的必要功能配置

四、企业案例:动静分离

1、配置多个upstream实现uri转发

 

/upload

10.0.0.8:80

html/www/upload

upload服务器

/static

10.0.0.7:80

html/www/static

static静态服务器

/

10.0.0.9:80

html/www

默认

 2、调用多个upstream

worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';                          upstream upload_pools {      server 10.0.0.8:80;    }    upstream static_pools {      server 10.0.0.7:80;    }    upstream default_pools {      server 10.0.0.9:80;    }     server {        listen 80;        server_name www.etiantian.org;    location /static/ {         proxy_pass http://static_pools;        proxy_set_header Host $host;        proxy_set_header X-Forwarded-For $remote_addr;    }        location /upload/ {             proxy_pass http://upload_pools;        proxy_set_header Host $host;        proxy_set_header X-Forwarded-For $remote_addr;    }     location / {             proxy_pass http://default_pools;        proxy_set_header Host $host;        proxy_set_header X-Forwarded-For $remote_addr;    }         access_log  logs/access_www.log  main;    }}

3、模拟环境

①web01

mkdir -p /application/nginx/html/www/uploadecho  "web01 upload" >/application/nginx/html/www/upload/nana.html

②web02

mkdir -p /application/nginx/html/www/staticecho  "web02 static" >/application/nginx/html/www/static/nana.html

③web02

mkdir /application/nginx/html/www -pecho  "web03 default" >/application/nginx/html/www/nana.html

④测试

curl -H host:www.etiantian.org 10.0.0.9/upload/nana.htmlcurl -H host:www.etiantian.org 10.0.0.8/upload/nana.htmlcurl -H host:www.etiantian.org 10.0.0.7/static/nana.html

4、Wireshark抓包分析

①web01

②web02

③web03

5、根据用户不同的浏览器,客户端进行转发

不同的客户端 访问不同的网站,手机和电脑 访问相同的网站----结果不同 > GET / HTTP/1.1> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2> Host: www.baidu.com> Accept: */*User-Agent-------的内容-----nginx有一个变量$http_user_agent

负载均衡配置nginx.conf

worker_processes  1;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                      '$status $body_bytes_sent "$http_referer" '                      '"$http_user_agent" "$http_x_forwarded_for"';                                        upstream upload_pools {      server 10.0.0.8:80;    }    upstream static_pools {      server 10.0.0.7:80;    }    upstream default_pools {      server 10.0.0.9:80;    }    server {        listen 80;        server_name www.etiantian.org;        location / {         if ($http_user_agent ~* "MSIE")          {            proxy_pass http://static_pools;          }         if ($http_user_agent ~* "Chrome")          {            proxy_pass http://upload_pools;          }        proxy_pass http://default_pools;               }         access_log  logs/access_www.log  main;    }}

linux中测试

[root@lb01 ~]# curl -A "iphone"  www.etiantian.org/nana.htmlwww web01[root@lb01 ~]# curl -A "android"  www.etiantian.org/nana.htmlwww web02[root@lb01 ~]# curl -A "asdasdasd"  www.etiantian.org/nana.htmlweb03 default

转载于:https://www.cnblogs.com/yanxinjiang/p/7597070.html

你可能感兴趣的文章
iOS从生成证书到打包上架-02(详细2016-10最新)
查看>>
iOS 关于内购
查看>>
vs2013 插件
查看>>
CSS3 box-shadow实现纸张的曲线投影效果
查看>>
浏览器内容双缓冲的设想
查看>>
更换已存在项目的svn的地址
查看>>
iOS获取当天0点
查看>>
js 回调函数 精析
查看>>
Orleans MultiClient 多个Silo复合客户端
查看>>
【Vue】---- 手动封装on,emit,off
查看>>
TwoSum
查看>>
C++断言与静态断言
查看>>
总结一下矩阵的基本操作
查看>>
ELK的启动脚本
查看>>
RestClient使用
查看>>
ruby国内源
查看>>
聊天软件项目TCP升级版
查看>>
nginx普通配置/负载均衡配置/ssl/https配置
查看>>
关于 HTTP 请求头的内容
查看>>
Python3.6 的字符串内建函数
查看>>