【转】Nginx反向代理转发tomcat
http://blog.csdn.net/mlc1218559742/article/details/53117520
最近刚接触nginx,在网上查阅了相关资料,看到最多的形容nginx的词就是反向代理,反向代理是什么了?一直都不是很理解,于是在网上查了反向代理,下面给出百度百科对反向代理的解释。
百度百科解释:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
通过上面的解释很容易理解nginx反向代理的意思,也就是说nginx就相当于代理服务器。客户端发出请求,并不是直接被tomcat服务器接收处理,而是要先经过nginx,nginx再转发给tomcat服务器;tomcat处理完成返回结果后,也是先经过nginx,nginx再返回客户端。在整个过程中,nginx貌似充当了真正的服务器,其实并不是,nginx只是起到了转发的作用。
根据反向代理的特性,我们可以把不需要服务器处理的静态资源(HTML,js,CSS等)直接让nginx处理,JSP等让服务器处理,这样就减轻了服务器的压力。
下面来实现一下利用nginx代理转发tomcat的实例:
1.环境配置
安装nginx,安装步骤可参考: Linux系统下Nginx的安装
安装tomcat,tomcat安装很简单,直接压缩包解压就行,这里就不再细说。
2.运行环境
nginx安装完成并启动过后,在浏览器直接输入Linux系统的IP地址,即可访问,如下所示:
3.配置解析
看到这是不是很好奇,为什么直接输入IP就可以进入nginx,是在哪配置的了?看一下nginx的配置文件,一般默认在nginx文件夹下有个conf文件夹,里面有个nginx.conf,打开发现里面有一段如下配置:
这段代码是在配置文件中的server中,一个server相当于一个代理服务器,可以配置多个server。
里面几个属性的意思分别是:
listen:代表当前代理服务器的访问端口号,默认是80端口。如果要配置多个server,这里的默认端口需要改变,要不然系统不知道进入哪个代理服务。
server_name:表示代理服务需要转发的地址,默认是localhost。
location:表示匹配客户端发送请求的路径,这里“/”代表所有请求的路径都能匹配。
root:表示请求别匹配到后,会在这个文件夹内寻找相应的文件,root对后面静态资源的处理很重要。
index:如果代理没有指定主页,将默认进入index配置下寻找主页,可以配置多个,第一个主页找不到,访问第二个,以此类推。
error_page:代表发生错误后进入的相关错误页面,下面的location也是处理错误的相关配置。
PS:刚刚说的nginx.conf路径在安装的时候是可以通过–conf-path=配置的,我在安装的时候就指定了“/etc/nginx/nginx.conf” 这个路径。但是我还在默认路径下面找配置文件,确实能找到,但是nginx服务用的并不是这个,而是我安装时指定的配置文件。所以在后面的操作中就悲剧了,怎么改配置文件都没反应,一开始以为什么地方配置的不对,浪费了好几个小时的时间,所以在此提醒大家一下。题外话,接下来说正事。
3.配置转发tomcat
转发tomcat的配置很简单,只需要在原来的配置上面修改两个地方,如下:
这里配置的proxy_pass属性表示代理路径,nginx可以直接转发到该链接。
PS:只配置了一个server情况下,server_name可有可无,系统不会加载该配置。有多个server情况下,server_name必须要配置,nginx服务会根据该配置匹配。
修改完配置过后,别急着重启nginx服务,怎么?还有东西要配置? 当然不是,nginx支持热部署,也就是修改配置文件过后,不需要重启服务生效,只需要让nginx重新加载一下即可,很方便吧。如果在加载配置之前想检查一下配置文件是否有语法错误,可以输入“nginx -t”来检查错误。如下:
接下来刷新刚刚访问nginx的页面,发现访问的页面已经变成我们要转发的tomcat了,页面如下:
页面效果和我们直接输入“http://172.16.21.92:8080/”的效果一样。
4.动、静资源分离
上面说了根据nginx反向代理的特性,可以实现客户端访问静态资源时,不请求tomcat服务器,减少服务器压力。要想实现该功能同样的需要配置nginx.conf的server配置,如下:
上面代码新加了一个location配置,用于过滤静态文件,当客户端请求这些静态文件时,nginx会转发到“/usr/local/ROOT/”文件夹下(ROOT文件夹是从tomcat的webapps里面拷贝出来的),从而不需要请求服务器。
这时再刷新访问nginx的页面,发现页面没有变化,但是点击tomcat首页"Security Considerations HOW-TO"连接,发现报404错误,如下图:
这时为什么了? 原因是这个html页面是在tomcat 的webapps里面的docs文件夹下,但是我们配置静态资源转发路径是到ROOT文件夹下面,nginx找不到HTML文件,所以就报404错误。同时也验证了配置的静态资源与服务器分离是没有问题的。