3.nginx反向代理服务器+负载均衡
nginx反向代理服务器+负载均衡
用nginx做反向代理和负载均衡非常简单,
支持两个用法: 1个proxy, 1个upstream,分别用来做反向代理,和负载均衡
以反向代理为例, nginx不自己处理php的相关请求,而是把php的相关请求转发给apache来处理.
有两台服务器,一台跑php,一台跑.html 客户端直接访问的是nginx,如果碰到.php,就会发送给apache处理,处理完成,返回给nginx,最后返回给客户端。
----这不就是传说的”动静分离”,动静分离不是一个严谨的说法,叫反向代理比较规范.
现在我们实现一个简单的反向代理:
1.在上面的课程中,我们在学习让nginx处理php的时候做了如下的配置,现在我们不让nginx跑php了,那么就要把相关的东西注释掉(如下图)

并添加如下一句:proxy_pass http://192.168.1.200:8080; 协议必须要有

注释掉之后,我们再访问192.168.1.200/test-if.php(因为80端口是默认的,可以不写,而且监听80端口的还是nginx,所以处理这次请求的还是nginx) 直接出现下载框。因为此时.php对于nginx来说只是一个文本文件而已,所以会出现下载。
2.进入apache

进入apache配置文件,做两件事:

2.1此时不能再Listen80了,因为nginx已经占了80端口了。我们改为8080

2.2把vhost引入进来

2.3启动apache,测试是否配置成功

访问192.168.1.200:8080 It works apache起来了。
3. 修改vhost配置文件


进行如下修改(注意不要忘记修改端口,apache服务器选择需要监听8080端口)
DocumentRoot修改成nginx的html下面:因为php文件放到了nginx的根目录中了,我想如果把php放在别的地方也是可以的吧?那时候DocumentRoot就不是nginx的目录了

注:在vituralhost的配置中,有一个选项是ServerName,该选项需配置成我们在地址栏中输入的域名一样。很多的时候我们感觉这个东西没有用,这个东西的作用是这样的:一个IP(192.168.1.200)可以绑定多个域名,比如a.com,b.com,DNS的作用就是把域名解析成IP,所以我们在地址栏输入不同的域名a.com或者b.com,都会被解析成同一个ip(.200),但是服务器如何区别你访问的到底是a.com还是b.com呢,就是通过域名来做区别的,域名和ServerName对应,那么服务器就知道用哪个VituralHost来作响应了。
4. 编译支持mysql gd等的apache 的php。因为前面我们讲的是php和nginx,php是以独立进程运行的(fpm),现在这里,我们让nginx作为反向代理服务器,也就是nginx本身不处理php,而是让apache去处理php,也就是apache和php配合,所以以前编译的php不能够用了,需要重新编译。要去掉fpm选项(--enable-fpm)。
注:nginx的php –enable –fpm
apache 的php –with-apxs2=/usr/local/httpd/bin/apxs
这就是编译nginx的php和编译apache的php的区别

访问test.php(test.php中有一幅图片和一个随机数,图片是静态资源,随机数是动态生成的)

在/usr/local/nginx/html/下,有一张图片,logo.png

Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
在浏览器中输入http://192.168.1.200/test.php
访问日志如下:
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
apache日志:可以看出访问是 200 发出的,也就是nginx服务器


Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
nginx日志:访问是100发出的,也就是我们的客户端浏览器


Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
把proxy那句话复制成10个就成集群了,但是具体是哪个响应的?那是集群负载均衡算法决定的
但是会发现复制10次,会报错,这就要用到upstream,它把n个干活的后端绑定成一个虚拟服务器,直接请求虚拟服务器
反向代理后端如果有多台服务器,自然可形成负载均衡,
但proxy_pass如何指向多台服务器?
把多台服务器用 upstream指令绑定在一起并起个组名,
然后proxy_pass指向该组
注意:在写upstream的时候,里面的server不能写http://,会报错,http://是在proxy_pass那指定的。所以下面第一幅图是错误的,第二幅图是正确的




Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
注意:这里是把图片服务器进行了负载均衡,图片服务器用的是nginx,我们没有另外再做两个单独的服务器作为图片服务器,而是直接在做反向代理的nginx上,添加了两个虚拟主机,也就是server段。我在想,图片服务器用apache应该也是可以的,让nginx完全当做反向代理来用
默认的均衡的算法很简单,就是针对后端服务器的顺序,逐个请求.
也有其他负载均衡算法,如一致性哈希,需要安装第3方模块.
(自行预习nginx第3方模块的安装,以安装ngx_http_upstream_consistent_hash为例)
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
反向代理导致了后端服务器的IP,为前端服务器的IP,而不是客户真正的IP,怎么办?
一般来说,经过代理服务器的时候,代理服务器有自己的ip,为了不丢失原来的ip,一般约定成俗,把原来客户的ip放在一个头信息里面
proxy_set_header X-Forwarded-For $romote_addr;
请求后端的php或者后端的图片的时候,它将会设置htpp协议里面的头信息,带给后端服务器,后端服务器会记录日志,在日志中,可以找到http-x-forwarded-for
后端服务器日志如下图:

Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
作业及下周实验课程
1:在虚拟机上装3个端口的nginx服务器
2:装ecshop/discuz,并做url重写
3: 利用3个端口的服务器,来实现简单的负载均衡.
下周实验:
1:数据企业名称/电话/简介等信息约2500-3000万条
2: 服务器 4台, 2G/4核(1)
8G/双核(3)
3: 目标 3000PV
设计: 服务器的架构图, 包括nginx/mysql/php/memcached的分布.
每人要出一个设计方案
在浏览器中输入http://192.168.1.200/test.php
访问日志如下:
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}
3.nginx反向代理服务器+负载均衡的更多相关文章
- Nginx 反向代理 负载均衡 虚拟主机配置
Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...
- Nginx 反向代理 负载均衡 虚拟主机
Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...
- 十.nginx反向代理负载均衡服务实践部署
期中集群架构-第十章-nginx反向代理负载均衡章节章节====================================================================== 0 ...
- 【转】Nginx 反向代理 负载均衡 虚拟主机配置
原文:http://www.cnblogs.com/itdragon/p/8059000.html Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代 ...
- Centos7.4 Nginx反向代理+负载均衡配置
Ningx是一款高性能的HTTP和反向代理服务器,配置起来也比较简单. 测试环境: 172.16.65.190 Nginx-反向代理 172.16.65.191 Ningx-Web 172.16.65 ...
- 项目实战2.2—nginx 反向代理负载均衡、动静分离和缓存的实现
实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备注 nginx VIP:172.17.11.11 反向代理服务器 开启代理功能 设置监控,调度 rs01 RIP ...
- nginx 反向代理 负载均衡
nginx反向代理 用户(浏览器) 请求网站资源 -> 直接定位到django后台(所有的请求压力,都直接给了后台) django默认对并发性 很差,并且处理网页的静态资源,效率很差 10万个并 ...
- 项目实战2.1—nginx 反向代理负载均衡、动静分离和缓存的实现
总项目流程图,详见 http://www.cnblogs.com/along21/p/8000812.html 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备 ...
- 项目实战02:nginx 反向代理负载均衡、动静分离和缓存的实现
目录 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 2.下载编译安装tengine 3.设置代理服务器的配置文件 4.启动tengine服务 5.开启后端的web服务 6.测试 实验二:ng ...
随机推荐
- C#-SqlServer连接
C#连接数据库在类方面没有java通用,不同数据库有不同的类库.在这里只做了SqlServer的连接类. public class DbLink { private string config = C ...
- [python][oldboy] * **的用法
* 和**主要用在函数的参数中, # coding=utf8 """ 三种编码: 1 python程序代码的编码 # coding=utf8 2 设置/查看python程 ...
- google chrome & preferences & languages
google chrome & preferences & languages language settings https://www.google.com/preferences ...
- HDU2013 蟠桃记【递推】
Problem Description 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!什么问题?他研究的问题是蟠桃一共有多少 ...
- 【bzoj1449/bzoj2895】[JSOI2009]球队收益/球队预算 费用流
题目描述 输入 输出 一个整数表示联盟里所有球队收益之和的最小值. 样例输入 3 3 1 0 2 1 1 1 10 1 0 1 3 3 1 2 2 3 3 1 样例输出 43 题解 费用流 由于存在一 ...
- HDU——1395 2^x mod n = 1(取模运算法则)
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- BZOJ 4555 [Tjoi2016&Heoi2016]求和 ——分治 NTT 多项式求逆
不想多说了,看网上的题解吧,我大概说下思路. 首先考察Stirling的意义,然后求出递推式,变成卷积的形式. 然后发现贡献是一定的,我们可以分治+NTT. 也可以直接求逆(我不会啊啊啊啊啊) #in ...
- (转)Java字符串整形(例:0001)
原文地址:https://blog.csdn.net/xuexiiphone/article/details/51372692 caseID = preFix + String.format(&quo ...
- bzoj 4311 向量 时间线建线段树+凸包+三分
题目大意 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 分析 按时间线建线段树 大致 ...
- 转 整理 Linux服务器部署系列之一—Apache篇
花了差不多一天,参考了几个博客,终于初步配成功了 Apache,先总结一下: 如果apache安装成为linux的服务的话,可以用以下命令操作: service httpd start 启动 serv ...