首页 > 技术文章 > nginx代理与负载均衡

dlq-52 2019-09-20 21:24 原文

1.什么是代理

代理就是代为办理

2.nginx正向代理,反向代理

(1)正向代理:是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。这种代理其实在生活中是比较常见的。

(2)反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

 

(3)正向代理与反向代理的区别

区别在于形式上服务的 "对象" 不一样
正向代理代理的对象是客户端,为客户端服务
反向代理代理的对象是服务端,为服务端服务

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反向代理语法

 proxy_pass

语法:proxy_pass URL;

配置块:location、if

此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址加端口的形式,例如:

proxy_pass http://localhost:8000/uri/; 

也可以是UNIX句柄:

proxy_pass http://unix:/path/to/backend.socket:/uri/; 

还可以如上节负载均衡中所示,直接使用upstream块,例如:

复制代码
upstream backend {  
  …  
}  
 
server {  
  location / {  
    proxy_pass  http://backend;  
  }  
} 
复制代码

用户可以把HTTP转换成更安全的HTTPS,例如:

proxy_pass https://192.168.0.1; 

默认情况下反向代理是不会转发请求中的Host头部的。如果需要转发,那么必须加上配置:

proxy_set_header Host $host; 

 

5.Nginx反向代理示例

代理配置

装nginx源
vim /etc/yum.repos.d/nginx.repo
安装nginx
cd /etc/nginx/conf.d
[root@lb01 conf.d]# cat proxy_web.oldxu.com.conf server { listen
80; server_name web.oldxu.com; location / { proxy_pass http://10.0.0.7:80; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
nignx -t
systemctl restart nginx
劫持
10.0.0.5 web.oldxu.com

 

后端web配置


cd /etc/nginx/conf.d/
vim web.oldxu.com.conf

[root@web01 conf.d]# cat web.oldxu.com.conf server { listen
80; server_name web.oldxu.com; location / { root /html; index index.html; } }
mkdir /html
echo"web01...."> /html/index.html
nginx -t
ssystemctl restart nginx
劫持
10.0.0.7 web.oldxu.com
浏览器访问
 

1.什么是负载均衡

将任务分摊到多个操作单元上进行执行

2.负载均衡实现的场景

四层负载均衡:   转发   改写数据包   源IP  源端口  目标IP  目标端口  真实的目标IP 目标端口
七层负载均衡:   代理   代为办理

 

 3.七层负载均衡与四层负载均衡区别

七层负载均衡效率没有四负载均衡高。

四层负载均衡没有七层负载均衡支持的功能多,比如 url匹配 设置头部信息


负载均衡是基于代理实现的一种形式

4.七层负载均衡配置示例

 1 [root@lb01 conf.d]# cat proxy_web.oldxu.com.conf 
 2 upstream web {
 3     server 172.16.1.7:80;
 4     server 172.16.1.8:80;
 5 }
 6 
 7 server {
 8     listen 80;
 9     server_name web.oldxu.com;
10 
11     location / {
12         proxy_pass http://web;
13         include proxy_params;
14     }
15 }
16 
17 
18 [root@lb01 conf.d]# cat /etc/nginx/proxy_params 
19 proxy_http_version 1.1;
20 proxy_set_header Host $http_host;
21 proxy_set_header X-Real-IP $remote_addr;
22 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
23 
24 proxy_connect_timeout 30;
25 proxy_send_timeout 60;
26 proxy_read_timeout 60;
27 
28 proxy_buffering on;
29 proxy_buffer_size 32k;
30 proxy_buffers 4 128k;

 

 

 

#后端web配置 (为了区分,将两台web的站点配置的不一样,以便测试效果)

 1 [root@web01 conf.d]# cat web.oldxu.com.conf 
 2 server {
 3     listen 80;
 4     server_name web.oldxu.com;
 5 
 6     location / {
 7         root /html;
 8         index index.html;
 9     }
10 }

 

 5.七层负载均衡调度算法

调度算法 概述
轮询

按时间顺序逐一分配到不同的后端服务器(默认)
机器的配置一致 (web集群 硬件环境 一致)

weight

加权轮询,weight值越大,分配到的访问几率越高
机器硬件不一致的情况下使用 (硬件 pc机)

ip_hash

每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
解决问题: 能解决会话保持的问题
带来新的问题: 会造成后端负载不均衡

url_hash 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
least_conn 最少链接数,那个机器链接数少   就分发

 

 

 7.七层负载均衡后端状态

状态 概述
down 当前的server暂时不参与负载均衡
backup 预留的备份服务器
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败后, 服务暂停时间
max_conns 限制最大的接收连接数

 

 

 

 

 

 8.企业案例:使用nginx负载均衡时,如何将后端请求超时的服务器流量平滑的切换到另一台上。如果后台服务连接超时,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500,应该如何处理。

可以在负载均衡添加如下配置proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;意思是,当其中一台返回错误码404,500...等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率。

    nginx本身是有剔除机制,  指的是 后端的nginx没有正常工作
    proxy_next_upstream nginx是正常工作,只不过后端的php或者其他程序出现问题  502

server {
    listen 80;
    server_name xuliangwei.com;

    location / {
        proxy_pass http://node;
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
    }
}

 

 9.七层负载均衡实现Redis会话共享? redis

(1)粘性session
粘性session是指Ngnix每次都将同一用户的所有请求转发至同一台服务器上,及Nginx的 IP_hash。

(2)session复制
即每次session发生变化时,创建或者修改,就广播给集群中的服务器,使所有的服务器上的session相同。

(3)session持久化 ( 慢 )
将session存储至数据库中,像操作数据一样操作session。

(4)session共享
缓存session至内存数据库中,使用redis ( 内存-->刷到磁盘 ),memcached (内存数据库)。

 

思路:
--------------------------------------------------------------------------
1.在 172.16.1.8 和 172.16.1.7 安装 phpmyadmin
分别进行测试-->测试登录

#1.安装phpmyadmin(web01和web02上都装)
[root@web01 conf.d]# cd /code
[root@web01 code]# wget https://files.phpmyadmin.net/phpMyAdmin/4.8.4/phpMyAdmin-4.8.4-all-languages.zip
[root@web01 code]# unzip phpMyAdmin-4.8.4-all-languages.zip

#2.配置phpmyadmin连接远程的数据库
[root@web01 code]# cd phpMyAdmin-4.8.4-all-languages/
[root@web01 phpMyAdmin-4.8.4-all-languages]# cp config.sample.inc.php config.inc.php
[root@web01 phpMyAdmin-4.8.4-all-languages]# vim config.inc.php
/* Server parameters */
$cfg['Servers'][$i]['host'] = '172.16.1.51';

--------------------------------------------------------------------------
2.接入负载均衡 ---> 代理至后端2台主机

[root@lb01 conf.d]# cat proxy_php.oldxu.com.conf
upstream php {
server 172.16.1.7;
server 172.16.1.8;
}

server {
listen 80;
server_name php.oldxu.com;
location / {
proxy_pass http://php;
proxy_set_header Host $http_host;
}
}

--------------------------------------------------------------------------
3.发现无法正常登陆
1.解决方法:
在负载均衡上配置 ip_hash 会话保持 ( 造成用户仅访问后端的某一台主机 )
[root@lb01 conf.d]# cat proxy_php.oldxu.com.conf
upstream php {
ip_hash;
server 172.16.1.7;
server 172.16.1.8;
}

server {
listen 80;
server_name php.oldxu.com;
location / {
proxy_pass http://php;
proxy_set_header Host $http_host;
}
}

--------------------------------------------------------------------------
4.既希望能够实现流量的均摊,又希望会话的问题得以保持, 所以引入了redis

1)安装redis
[root@db01 ~]# yum install redis -y
2)配置redis
[root@db01 ~]# sed -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
3)启动redis
[root@db01 ~]# systemctl enable redis
[root@db01 ~]# systemctl start redis


4) 改造php, session写本地修改为写入redis中 (所有的web上都需要配置)
前提: 已经安装过了redis的模块---> php71w-pecl-redis

1.修改php存储session至redis中
[root@db01 ~]# vim /etc/php.ini
session.save_handler = redis
session.save_path = "tcp://172.16.1.51:6379?weight=1"


2.修改php-fpm 注释默认存储session的位置
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session

3.将修改后的配置文件,推送至172.16.1.8
[root@web01 ~]# scp /etc/php.ini root@172.16.1.8:/etc/
[root@web01 ~]# scp /etc/php-fpm.d/www.conf root@172.16.1.8:/etc/php-fpm.d/www.conf

4.重启172.16.1.7 172.16.1.8两台服务器的php-fpm
[root@web02 conf.d]# systemctl restart php-fpm

5) 测试效果
1.浏览器登录测试 (ok)

2.查看redis的sessionID和 浏览器cookie中提交的sessionID是否一致
[root@db01 ~]# redis-cli
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:38ecc8696c70a7252d943e7cb9b20f70"

--------------------------------------------------------------------------
10.SLB负载均衡 + ECS 云主机 ( 120 块钱 --> 按量付费 )

ECS 云主机 ===> 服务器 ( Linux 操作系统 安装 Nginx PHP )
SLB 产品 ===> 开源技术 ( Tengine LVS ) 手动配置负载均衡没什么区别

1) 购买云主机 ( 按量 ---> 释放 )
2) 配置云主机环境 Nginx +PHP
2) 购买SLB负载均衡 ( 按量 ---> 释放 )
3) 集成 SLB+ECS
4) DNS解析

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



推荐阅读