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
在浏览器中输入http://192.168.1.200/test.php
访问日志如下:
apache日志:可以看出访问是 200 发出的,也就是nginx服务器
nginx日志:访问是100发出的,也就是我们的客户端浏览器
把proxy那句话复制成10个就成集群了,但是具体是哪个响应的?那是集群负载均衡算法决定的
但是会发现复制10次,会报错,这就要用到upstream,它把n个干活的后端绑定成一个虚拟服务器,直接请求虚拟服务器
反向代理后端如果有多台服务器,自然可形成负载均衡,
但proxy_pass如何指向多台服务器?
把多台服务器用 upstream指令绑定在一起并起个组名,
然后proxy_pass指向该组
注意:在写upstream的时候,里面的server不能写http://,会报错,http://是在proxy_pass那指定的。所以下面第一幅图是错误的,第二幅图是正确的
注意:这里是把图片服务器进行了负载均衡,图片服务器用的是nginx,我们没有另外再做两个单独的服务器作为图片服务器,而是直接在做反向代理的nginx上,添加了两个虚拟主机,也就是server段。我在想,图片服务器用apache应该也是可以的,让nginx完全当做反向代理来用
默认的均衡的算法很简单,就是针对后端服务器的顺序,逐个请求.
也有其他负载均衡算法,如一致性哈希,需要安装第3方模块.
(自行预习nginx第3方模块的安装,以安装ngx_http_upstream_consistent_hash为例)
反向代理导致了后端服务器的IP,为前端服务器的IP,而不是客户真正的IP,怎么办?
一般来说,经过代理服务器的时候,代理服务器有自己的ip,为了不丢失原来的ip,一般约定成俗,把原来客户的ip放在一个头信息里面
proxy_set_header X-Forwarded-For $romote_addr;
请求后端的php或者后端的图片的时候,它将会设置htpp协议里面的头信息,带给后端服务器,后端服务器会记录日志,在日志中,可以找到http-x-forwarded-for
后端服务器日志如下图:
作业及下周实验课程
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
访问日志如下: