nginx系列3——nginx反向代理、动静分离、负载均衡

nginx反向代理、动静分离、负载均衡

反向代理

要说反向代理,我们就先要理解正向代理 ,下面我们就谈谈正向代理和反向代理吧。

正向代理

一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。(摘自百度百科)
如下图:


正向代理

正向代理好比,你去找工作,首先你不知道哪里有工作,但是你可以把你的要求信息告诉别人,这时别人知道你想找什么样的工作了。他就帮你问,然后又合适的工作后,别人告诉你这里有符合你要求的工作,你就可以去试试了。

正向代理总结就一句话:代理端代理的是客户端。

反向代理

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


反向代理

反向代理好比,你去超市或者购物中心购物,超市、购物中心就好比一个代理。你只关心你去超市、购物中心购买你想买的商品,具体商品从哪里来你并不关心。但是超市本没有商品,所以超市、购物中心自身去进货,这个过程你并不知道,没有感知。这时代理端代理的是超市、购物中心,你并看不到供货商。

反向代理总结就一句话:代理端代理的是服务端。

下面我们就来看看nginx的反向代理如何做了

反向代理前后如图:

反向代理前后

nginx反向代理其实主要通过配置proxy_pass参数即可代理到某个服务器
vim /usr/local/nginx/conf/nginx.conf
添加如下配置即可:

  location / {  //在对应的 location 中配置,配置中的监听端口为80
         proxy_pass http://127.0.0.1:8080
     }
 ```
启动`tomcat`、`nginx`,`/usr/local/nginx/sbin/nginx`
浏览器访问,`http://192.168.58.149` 如下图所示:
![nginx代理tomcat](http://upload-images.jianshu.io/upload_images/1972470-fc3a1fcd34f28d73.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
但是当我们访问`http://192.168.58.149/demo.jsp`,如下图:
`demo.jsp`,将demo.jsp拷贝到`tomcat`中`ROOT`下,中代码如下:
```java
 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>Welcome to my demo.jsp</title>
 </head>
 <body>
 Welcome to my demo.jsp<br/>
 remote ip is:  <%-- <%=request.getHeader("real_ip") %> --%> <br/>
 nginx server ip is: <%=request.getRemoteAddr()%>
 </body>
 </html>
 ```
![nginxip](http://upload-images.jianshu.io/upload_images/1972470-7641158585cdc833.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我们得到的是`nginx`代理服务器的`ip`,但是我们并不想要代理服务器的ip,我们想要的是客户端真实的访问ip,因此我们可以通过`nginx`中获取真实`ip`,然后传给真实服务器。
同样,我们需要到`nginx.conf`中配置,如下:`proxy_set_header real_ip $remote_addr;`
```xml
location / {
         #设置真实ip
         proxy_set_header real_ip $remote_addr;  //real_ip 设置变量名,可以通过web端获取
         proxy_pass http://127.0.0.1:8080;//代理8080端口的tomcat服务器
     }

同时,demo.jsp页面中打开remote ip is: <%=request.getHeader("real_ip") %> <br/>
接下来,重启nginx,访问浏览器
/usr/local/nginx/sbin/nginx -s reload
如图:

nginx真实ip

反向代理到这里就完毕了,接下来就说说动静分离


动静分离

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路(摘自夏天的森林的博客)。

动静分离简单的概括是:动态文件与静态文件的分离。

为什么要做动静分离?

在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件,否则动态文件。因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗。当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决。

动静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里我们将静态资源放到nginx中,动态资源转发到tomcat服务器中。

因此,动态资源转发到tomcat服务器我们就使用到了前面讲到的反向代理了。

动静分离的原理很简单,通过location对请求url进行匹配即可,具体配置如下:

vim /usr/local/nginx/conf/nginx.conf

 //动态资源
 location ~ \.(jsp|jspx|do|action)(\/.*)?$ { //动态请求转发到tomcat服务器,匹配方式可自定义
           #设置真实ip
           proxy_set_header real_ip $remote_addr;  //real_ip 设置变量名,可以通过web端获取
           proxy_pass http://127.0.0.1:8080;
       }
//静态资源 
location ~ .*\.(js|css|htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { //静态资源到nginx服务器下static(具体目录自定义)获取
           root static;
       }

nginx下创建static文件夹

mkdir /usr/local/nginx/static,并且拷贝1.pngstatic

启动tomcatnginx,访问http://192.168.58.149/1.pnghttp://192.168.58.149/demo.jsp,如图:
静态资源:

静态资源

动态资源:
动态资源

动静分离也结束啦,赶紧去试试吧!


负载均衡

负载均主要衡解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力。主要根据算法策略将请求分摊到多台后台服务器处理。我们以weight(权重)策略为例:

负载均衡

nginx实现负载均衡主要通过upstream,以两个tomcat服务器为例:192.168.58.149:8080192.168.58.150:8080
nginx.conf配置如下:
http 下配置:

      upstream balance {
           #weight 值越大,负载权重越大,请求次数越多             
           #max_fails 允许请求失败的次数,超过失败次数后,转发到下一个服务器,当有max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查   
           #fail_timeout 指定时间内无响应则失败, 在以后的fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
           #down 表示当前server不参与负载
           #backup 其他非backup server都忙的时候,backup server作为备用服务器,将请求转发到backup服务器
           server 192.168.58.149:8080 weight=1 max_fails=2 fail_timeout=30s;
           server 192.168.58.150:8080 weight=1 max_fails=2 fail_timeout=30s;
           server 192.168.58.151:8080 down;
           #server 192.168.58.152:8080 backup;
    }
    
    location / {
          #设置真实ip
          proxy_set_header real_ip $remote_addr;  #real_ip 设置变量名,可以通过web端获取
          proxy_pass http://balance;//配置上面添加的负载服务器
    }
    

注意upstream和server为同级

启动149的tomcat、150的tomcatnginx,访问浏览器试试吧:
连续访问两次效果图如下:
第一次:

149tomcat

第二次:
150tomcat

除了上面提到的weight权重策略,还有ip_hash、url_hash哈希策略,后续有时间再补上吧。

哎,今天貌似废话有点多了,下次注意点哈!

接下来打算先更新,nginx系列5——nginx+keepalived实现高可用,谢谢关注,有不对的地方望指出,谢谢!

作者:逐暗者(转载请注明出处)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容