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反向代理服务器+负载均衡的更多相关文章

  1. Nginx 反向代理 负载均衡 虚拟主机配置

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  2. Nginx 反向代理 负载均衡 虚拟主机

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  3. 十.nginx反向代理负载均衡服务实践部署

    期中集群架构-第十章-nginx反向代理负载均衡章节章节====================================================================== 0 ...

  4. 【转】Nginx 反向代理 负载均衡 虚拟主机配置

    原文:http://www.cnblogs.com/itdragon/p/8059000.html Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代 ...

  5. Centos7.4 Nginx反向代理+负载均衡配置

    Ningx是一款高性能的HTTP和反向代理服务器,配置起来也比较简单. 测试环境: 172.16.65.190 Nginx-反向代理 172.16.65.191 Ningx-Web 172.16.65 ...

  6. 项目实战2.2—nginx 反向代理负载均衡、动静分离和缓存的实现

    实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备注 nginx VIP:172.17.11.11 反向代理服务器 开启代理功能 设置监控,调度 rs01 RIP ...

  7. nginx 反向代理 负载均衡

    nginx反向代理 用户(浏览器) 请求网站资源 -> 直接定位到django后台(所有的请求压力,都直接给了后台) django默认对并发性 很差,并且处理网页的静态资源,效率很差 10万个并 ...

  8. 项目实战2.1—nginx 反向代理负载均衡、动静分离和缓存的实现

    总项目流程图,详见 http://www.cnblogs.com/along21/p/8000812.html 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 机器名称 IP配置 服务角色 备 ...

  9. 项目实战02:nginx 反向代理负载均衡、动静分离和缓存的实现

    目录 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 2.下载编译安装tengine 3.设置代理服务器的配置文件 4.启动tengine服务 5.开启后端的web服务 6.测试 实验二:ng ...

随机推荐

  1. [linux小技巧]批量移动文件

    for i in {1..23};do mv test$i/ ../;done

  2. BZOJ 4554 [Tjoi2016&Heoi2016]游戏 ——二分图

    出原题,直接二分图匹配即可. #include <cstdio> #include <vector> #include <cstring> using namesp ...

  3. BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】

    题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...

  4. 刷题总结——String painter(hdu2476)

    题目: Problem Description There are two strings A and B with equal length. Both strings are made up of ...

  5. [转] Makefile 基础 (6) —— Makefile 使用条件判断

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  6. hdu 4870 rating(高斯消元求期望)

    Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. hdu 3613 KMP算法扩展

    Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  8. 标准C程序设计七---101

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  9. hdu 1401(单广各种卡的搜索题||双广秒速)

    Solitaire Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  10. 数据结构自己实现——Linklist

    //单???链???表??? #include <iostream> using namespace std; typedef char datatype; typedef struct ...