2017年4月17日工作日记

1.公司需要,当有不对的url访问的时候,404页面不能暴露我们的信息,包括TOMCAT的版本号,目前我们的暴露了信息,要求整改。

tomcat的配置文件中应该有指定错误码的情况下跳转到哪个页面。查询了一下,在web.xml文件中可以配置<error-page>。

首先是在...\target\mt-web\WEB-INF下的web.xml中配置,但是无论如何不生效。

后来经过mentor提点,发现是在tomcat的Apache/conf/web.xml(和server.xml在同一个位置)。

在这件事上耽误了很多时间,原因还是对tomcat以及编译环境不是很了解,不知道apache/conf/下还有个web.xml

这也就是说,两个web.xml,各自负责些什么内容呢?

【tomcat的conf文件夹下的web.xml文件是对全局都有效的,而web-inf文件夹下的web.xml只对当前应用有效,我的理解是,非法的url根本无法被传递到mt-web来处理,而是直接抛给tomcat的web.xml】


今天下班后,分别下载两个xml文件,对比内容。后续来添加。

【通过查看两个文件,可以得知,conf下的xml文件几乎没有根据我们的工程改进过,而到我们的工程war包里可以找到web-inf文件的web.xml文件,正常情况下,各个url根据web-inf/web.xml的规定来调用指定action,但是当tomcat发生404的时候,这个异常应该是抛给Apache的web.xml,而不是web-inf的web.xml来处理】

在做这件事期间,我尝试着eclipse中用jetty起我们的包。由于我升级了es到5.2,在java6中不能运行,于是我就在build path中更改了jre,结果被mentor指出,在build path中修改jre是修改编译环境的jre,运行环境的jre应该在run configurations中修改。同时编译环境的jre应该尽量低版本,因为如果编译环境版本高于运行环境版本,容易报错。



2.由于原有开发机tomcat总是自动停止,迁移调度框架测试环境的tomcat到新的机器上面。

首先要把日志文件清一下,否则scp需要太长时间了。然后用scp命令把调度框架的两个tomcat复制到新的环境,更改server.xml文件结尾处<Context docBase>标签代表的位置信息(把原测试环境的位置改成tomcat在当前环境的位置),最后更改nginx中的配置,启动新的2个tomcat,然后重启nginx即可。

这期间发生两件事需要记录一下。

a)在很久以前,nginx文件夹叫nginx1.6.0,启动nginx之后,我把这个文件夹改名叫nginx,期间nginx未曾重启。这次修改了配置文件后,sbin/nginx -t检查配置文件时候,说找不到配置文件,这个地址是.../nginx1.6.0/conf/... 也就是因为我是在启动nginx后再改名导致的。解决办法:1.将nginx文件夹按照提示改回原名,重启。注意,nginx文件夹不是不能改名,而是要在启动之前改名。

b)2个tomcat,其中一个是从调度框架的线上环境scp过来的,所以启动nginx之后,能拿到线上环境的数据。这个是我的错误。线上环境的war包,htdocs文件夹中一定配置的是线上数据库,es,redis的地址,因此,迁移测试环境,却从线上环境复制Tomcat会导致很大的问题。我应该及时发现的。

下班后要及时查阅一下,配置线上Tomcat和测试环境的Tomcat的DB,ES和redis的地址的文件是存在哪里的。


3.对问题1的延展,能否在nginx中配置404情况的定向页面呢。

网上查询,nginx的配置文件果然有error_page选项,但是如何配置却走了不少弯路。

先说最后成功的配置方法。

a)在http部分,增加fastcgi_intercept_errors on; 
    proxy_intercept_errors on;两句话。

b)在server部分,增加

    error_page  404  /a.html;
    location = /a.html {
        root html;
    }

这样,当发生404问题时,就会重定向到html/a.html页面。

走了很多弯路,根本问题就是location没有写对。

而且,经过尝试,两个参数必须都设置为on才能成功,根据以下的解释,我的理解是proxy_intercept_errors负责后端,决定是否拦截nginx指向的tomcat服务器发来的错误状态码,fastcgi_intercept_errors负责前端,决定是否根据nginx的设置,由nginx来处理错误状态码

【fastcgi_intercept_errors这个指令指定是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。
你必须明确的在error_page中指定处理方法使这个参数有效,正如Igor所说“如果没有适当的处理方法,nginx不会拦截一个错误,这个错误不会显示自己的默认页面,这里允许通过某些方法拦截错误。】

【proxy_intercept_errors当上游服务器响应头回来后,可以根据响应状态码的值进行拦截错误处理,与error_page 指令相互结合。用在访问上游服务器出现错误的情况下。


4.个人理解,我们工程,有很多包,打war包用maven工具,是根据根目录的pom.xml文件来打包,根pom.xml中指定了各个包分别打包

而mt-web中有web.xml文件,指定了url请求的处理方式。

展开阅读全文

没有更多推荐了,返回首页