相信非常多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额。那到底它有什么作用呢?可能非常多人未必了解。

 

说到反向代理,可能非常多人都听说,但详细什么是反向代理,非常多人预计就不清楚了。

摘一段百度百科上的描写叙述:

Html代码  nginx代理人server结合tomcat采用_nginx
  1. 反向代理(Reverse Proxy)方式是指以代理server来接受internet上的连接请求,然后将请求转发给内部网络上的server,并将从server上得到的结果返回给internet上请求连接的client,此时代理server对外就表现为一个server。  

  这里讲得非常直白。反向代理方式实际上就是一台负责转发的代理server,貌似充当了真正server的功能。但实际上并非,代理server仅仅是充当了转发的作用,而且从真正的server那里取得返回的数据。这样说,事实上nginx完毕的就是这种工作。我们让nginx监听一个port,譬如80port,但实际上我们转发给在8080port的tomcat,由它来处理真正的请求。当请求完毕后,tomcat返回,但数据此时没直接返回,而是直接给nginx,由nginx进行返回。这里。我们会以为是nginx进行了处理。但实际上进行处理的是tomcat。

说到上面的方式。或许非常多人又会想起来,这样能够把静态文件交由nginx来进行处理。对。非常多用到nginx的地方都是作为静态伺服器,这样能够方便缓存那些静态文件,比方CSS,JS,html。htm等文件。

 

闲话就不多说了。我们直接来看看nginx怎么使用。

 

 

1)要用到的软件当然要下载啦。

到nginx官网下一个。http://nginx.org/en/download.html能够到这里去下。

我如今用的版本号是1.1.7。但基本上以后的版本号都兼容,并且我们用到的并不涉及到太底层的,应该不会有什么变化。

这里,因为我的是windows,当然下windows版啦。下完后首先要启动吧。进入到nginx目录。直接start nginx就OK了。

比方我下载后放在D:\software\developerTools\server\nginx-1.1.7,直接cmd后cd D:\software\developerTools\server\nginx-1.1.7。有些不习惯命令行的可能会奇怪,它没有进行到那个目录。windows并不会在分区间跳转,除非你自己指定了。所以我们要直接d:例如以下:

nginx代理人server结合tomcat采用_html_02

然后。我们直接start nginx。这里或许你会看到一个窗体一闪而过,依据我们使用tomcat的经验,假设一闪而过,证明有错误了,是吧?但实际上不是。

nginx代理人server结合tomcat采用_反向代理_03

此时我们打开任务管理器,能够看到两个nginx.exe在那里好好的。

这说明我们已经启动了,至于为什么两个,我们这里不深究。

nginx代理人server结合tomcat采用_nginx_04

如今,我们已经启动了nginx,这时就能够启动tomcat,想着直接訪问http://localhost就能够直接訪问tomcat了。

先不急,我们来看看启动后的nginx是如何的。直接訪问http://localhost能够看到:

nginx代理人server结合tomcat采用_xml_05

     我们能够看到nginx启动成功,如今訪问是直接进到nginx的文件夹里面了。

 

那么这些实际上是在哪里配置的。这就涉及到nginx的一个重要配置文件nginx.conf了。

 

2)我们能够看到nginx目录内有一个conf目录。当中有好几个文件。其它先无论。我们打开nginx.conf,能够看到一段:

nginx代理人server结合tomcat采用_xml_06

  这段代码在server里面,相当于一个代理服务器,当然能够配置多个。

以下我们细致来分析一下:

listen:表示当前的代理服务器监听的port,默认的是监听80port。注意,假设我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。

server_name:表示监听到之后须要转到哪里去,这时我们直接转到本地。这时是直接到nginx目录内。

location:表示匹配的路径,这时配置了/表示全部请求都被匹配到这里

root:里面配置了root这时表示当匹配这个请求的路径时。将会在这个目录内寻找对应的文件,这里对我们之后的静态文件伺服非常实用。

index:当没有指定主页时,默认会选择这个指定的文件。它能够有多个,并按顺序来载入。假设第一个不存在,则找第二个,依此类推。

以下的error_page是代表错误的页面,这里我们临时不用,先无论它。

 

那我们知道了详细的配置了,怎么让它訪问localhost时转到tomcat时。

实际上就改动两个地方:

Java代码  nginx代理人server结合tomcat采用_nginx
  1. server_name localhost:8080;  
  2.   
  3. location / {  
  4.     proxy_pass http://localhost:8080  
  5. }  

  我们就改动了上面两个地方,我的tomcat在8080port,能够依据自己的须要改动。这里有一个新元素proxy_pass。它表示代理路径,相当于转发,而不像之前说的root必须指定一个目录。

此时我们改动了文件,是不是就意思着必须先关了nginx再又一次启动了,事实上不必,nginx能够又一次载入文件的。

我们直接执行:

Html代码  nginx代理人server结合tomcat采用_nginx
  1. nginx -s reload  

高兴得太早了,我们发现有一个错误:

nginx代理人server结合tomcat采用_html_09

  什么来的。45行发现错误。不希望在那一行找到},于是我们细致找,发现我们增加的proxy_pass非常奇怪,没有;号结尾。这就是问题了。直接改动,然后再执行一下,发现没错误,OK了。

 

假设不想直接载入,而仅仅是想看看自己的配置文件有没有问题。能够直接输入:

Xml代码  nginx代理人server结合tomcat采用_nginx
  1. nginx -t  

这能够检查配置文件里是否有错。 以下我们全部的改动都如果我们改动完毕后执行了nginx -s reload进行又一次载入配置文件,请注意。

 

一切没问题了,然后我们再又一次打开http://localhost,我们看到以下的页面:

nginx代理人server结合tomcat采用_反向代理_11

 

这时,我们发现它并非刚才的welcome页面了。而是tomcat的管理页面了。无论我们点击什么链接都是没问题的,相当于直接訪问http://localhost:8080一样。

 

3)上面我们直接试了一个小样例,让nginx进行转发,即所谓的反向代理。但实际上我们的需求不会是这种,我们须要分文件类型来进行过滤。比方jsp直接给tomcat处理,由于nginx并非servlet容器,没办法处理JSP。而html,js,css这些不须要处理的。直接给nginx进行缓存。

 

以下我们来进行一下配置,让JSP页面直接给tomcat,而html,png等一些图片和JS等直接给nginx进行缓存。

 

这时最主要用的还是location这个元素,而且涉及到一部分正则,但不难:

Xml代码  nginx代理人server结合tomcat采用_nginx
  1. location ~ \.jsp$ {  
  2.         proxy_pass http://localhost:8080;  
  3. }  
  4.           
  5. location ~ \.(html|js|css|png|gif)$ {  
  6.     root D:/software/developerTools/server/apache-tomcat-7.0.8/webapps/ROOT;  
  7. }  

  我们先要去掉之前配的location /,避免所有请求被拦截了。

 

然后我们再来看看http://localhost

nginx代理人server结合tomcat采用_xml_13

  当我们不指定jsp页面的时候,它会出现找不到。由于。此时并没有对应的location匹配,所以就会有404错误。这时就跳到了nginx自己定义的error页面去了。

 

而当我们用http://localhost/index.jsp去訪问时。我们看到了熟悉的页面:

nginx代理人server结合tomcat采用_反向代理_14

  并且图片那些都显示正常,由于图片是png的。所以直接在tomcat/webapps/ROOT文件夹下直接查找,当然,假设我们点击Manager Application HOW-TO这个链接,我们发现:

nginx代理人server结合tomcat采用_nginx_15

  它还是找不到,为什么呢?由于这是个html页面。但它并不在ROOT文件夹下,而是在docs文件夹下,但当我们匹配html时,我们却到ROOT文件夹下去找,所以还是找不到这个页面。

 

普通情况下,假设我们须要用nginx来进行静态文件伺服,一般都会把全部静态文件,html,htm,js,css等都放在同一个目录下,这样就不会有tomcat这种情况了。由于tomcat下的是属于不同的项目。这个我们就没办法了。

 

 

3)有些人会说。这些都仅仅会找一台server,但假设我们想在一台server挂了的时候,自己主动去找另外一台,这怎么办?这实际上nginx都考虑到了。

 

这时,我们之前用的proxy_pass就有大用途了。

我们把之前的第一个样例,即所有都代理的改动一下:

最后改动例如以下:

Xml代码  nginx代理人server结合tomcat采用_nginx
  1. upstream local_tomcat {  
  2.     server localhost:8080;  
  3. }  
  4.   
  5. server{  
  6.         location / {  
  7.            proxy_pass http://local_tomcat;  
  8.         }  
  9.         #......其它省略  
  10. }  

  我们在server外加入了一个upstream,而直接在proxy_pass里面直接用http://+upstream的名称来使用。

 

我们还是直接来http://localhost,还是和第一个一样的效果。全部链接都没问题,说明我们配置正确。

upstream中的server元素必需要注意。不能加http://,但proxy_pass中必须加。

 

我们刚才说能够在一个server挂了的情况下连到另外一个,那怎么弄呢?

事实上非常easy,在upstream中的local_tomcat中配置多一个server。比方我如今弄多一个jetty。port在9999,所以我们配置例如以下:

Xml代码  nginx代理人server结合tomcat采用_nginx
  1. upstream local_tomcat {  
  2.     server localhost:8080;  
  3.     server localhost:9999;  
  4. }  

  此时,我们关闭tomcat,而仅仅开jetty。我们来执行http://localhost看看效果:

nginx代理人server结合tomcat采用_nginx_18

  我们看到它请求到了jetty的页面,但因为jetty的机制,这时没有显示jetty主页,这个我们先无论。

但我们的在一个server挂的情况下自己主动使用另外一个的功能实现了。

 

 

但有时我们就不想它挂的时候訪问另外一个,而仅仅是希望一个服务器訪问的机会比另外一个大,这个能够在server最后加上一个weight=数字来指定。数字越大,表明请求到的机会越大。

 

Xml代码  nginx代理人server结合tomcat采用_nginx
  1. upstream local_tomcat {  
  2.     server localhost:8080 weight=1;  
  3.     server localhost:9999 weight=5;  
  4. }  

  这时我们给了jetty一个更高的权值,让它更有机会訪问到。实际上当我们刷新http://localhost訪问的时候发现jetty訪问机率大非常多,tomcat差点儿没机会訪问,普通情况下。假设我们必须这样用。不要相关太大,以免一个server负载太大。

当然,server另一些其它的元素,比方down表示临时不用到该服务器等等。这些能够參考nginx的wiki。或许写了一大堆,有人会有问题。那nginx怎么关闭呢?这倒是个问题,事实上直接执行nginx -s stop就能够关闭了。

 

 

基本上nginx使用如此,我们假设,在深入学习后,再次使用。