一、 反向代理
1、代理服务基本概述
反向代理是通过内网访问外网,反向代理只能代理一台
代理服务器接收接受客户端的连接请求,将请求转发费内网的服务器,并将服务器上得到的结果返回给客户端,此时代理服务器对外就是反向代理服务器。
2、正向代理和反向代理
正向代理:客户端<——> 代理 <——> 服务端
反向代理:客户端 ----> 代理 -----> 服务端(用于公司集群架构)
区别在于服务 ”对象“ 不一样
正向代理的对象是客户端,为客户服务。
反向代理的对象是服务端,为服务端服务。
3、nginx代理支持的代理协议
4、nginx反向代理场景实践
1、proxy代理服务器,配置监听eth0的80端口,使10.0.0.0网段的用户,能够通过代理服务器访问到后端的172.16.1.7的8080端口内容
#1、编辑代理配置文件
[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@lb01 conf.d]# cat proxy_web.yangdan.com.conf
server {
listen 80;
server_name web.yangdan.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;
}
}
#2、检测语法,并重启,设置开机自启动
[root@lb01 conf.d]# nginx -t
[root@lb01 conf.d]# systemctl restart nginx
[root@lb01 conf.d]# systemctlenable nginx
2、web01 服务器上 配置一个网站,监听在8080端口,仅172网段能访问
#1、编辑web01后端配置文件
[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@web01 conf.d]# cat web.yngdan.com.conf
server {
listen 80;
server_name web.yangdan.com;
location / {
root /html;
index index.html;
}
}
#2、创建站点目录
[root@web01 conf.d]# mkdir /html
#3、把web01写入到站点目录下的index.html下
[root@web01 conf.d]# echo "web01" > /html/index.html
#4、检测语法、并重启nginx服务
[root@web01 conf.d]# systemctl restart nginx
5、扩展知识
服务器默认有65535个端口,通常系统服务需要占用部分端口:1~10000
配置一台主机作为nginx代理服务,最多支持5w的tcp连接,因为端口数受限
配置一台后端的应用服务,最多能支持2w-3w左右的tcp连接,因为当一个请求过来
nginx代理通过随机端口--请求-->nginx应用服务--通过-->随机端口--请求-->php动态程序--通过-->随机端口-->mysql
二、负载均衡
6、负载均衡
就是将工作任务进行平衡、分摊到多个操作进行运行。
负载均衡提供了一种透明且廉价有效的方法扩展服务器和网络设备、加强网络数据处理能力、增强吞吐量、提高网路络的可用性和灵活性。
7、四层负载均衡 (转发)(传输层)
四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。效率高,性能快
四层负载均衡的效率高、能力强。四层是基于ip+端口的;
8、七层负载均衡(代理)(应用层)
七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。功能多,效率低。
基于 URL 等应用层信息的负载均衡;
基于 MAC 地址的二层负载均衡和基于 IP 地址的三层负载均衡。
图片.png
9、七层负载均衡配置实例
#1、进到conf.d目录里、准备nginx负载均衡
[root@lb01 ~]# cd /etc/nginx/conf.d
[root@lb01 conf.d]# cat proxy_web.oldxu.com.conf
upstream web {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name web.oldxu.com;
location / {
proxy_pass http://web;
include proxy_params;
}
}
#2、将nginx负载均衡文件proxy_prarms写到一个文件里,方便调度使用
[root@web ~]# cd /etc/nginx/con.d
[root@lb01 conf.d]# cat /etc/nginx/proxy_params
proxy_http_version 1.1;
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;
#后端web配置 (为了区分,将两台web的站点配置的不一样,以便测试效果)
[root@web01 conf.d]# cat web.oldxu.com.conf
server {
listen 80;
server_name web.oldxu.com;
location / {
root /html;
index index.html;
}
}
10、nginx负载均衡调度算法
11、nginx负载均衡后端状态
12、七层负载均衡实现多台登录测试
1、在 172.16.1.8 和 172.16.1.7 安装 phpmyadmin
分别进行测试-->测试登录
wget [https://files.phpmyadmin.net/phpMyAdmin/4.8.4/phpMyAdmin-4.8.4-all-languages.zip](https://files.phpmyadmin.net/phpMyAdmin/4.8.4/phpMyAdmin-4.8.4-all-languages.zip)
#1、安装phpadmin(web01、web02都装)
[root@web01 ~]# cd /etc/nginx/conf.d
[root@web01 conf.d]# cd /code
[root@web01 code]# rz phpMyAdmin-4.8.4-all-languages.zip
[root@web01 code]# unzip phpMyAdmin-4.8.4-all-languages.zip
#2、配置phpadmin远程连接到数据库
[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、接入负载均衡 ------> 代理后端两台
#配置负载均衡
[root@lb01 ~]# cd /etc/nginx/conf.d
[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;
}
}
3、既希望能够实现流量的均摊,又希望会话的问题得以保持, 所以引入了redis
#1、安装Redis
[root@redis ~]# yum install redis -y
#2、配置redis
[root@redis ~]# sed -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
#3、启动redis
[root@redis ~]# systemctl enable redis
[root@redis ~]# systemctl start redis
#4、改造php, session写本地修改为写入redis中 (所有的web上都需要配置)
前提: 已经安装过了redis的模块---> php71w-pecl-redis
#1、修改php存储session至redis中
[root@web01 ~]# 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、将修改后的配置文件,推送至web02
[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"