欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

谈谈tomcat配置默认路径的注意事项

程序员文章站 2024-02-13 17:01:04
...

场景:

tomcat中部署项目,通过地址+端口直接访问项目,遇到这样的需求,一般的解决方案有几种呢?

方案:

1、tomcat中webapps中ROOT目录中的文件删除掉,将项目的内容拷贝到此目录中。

此方式个人感觉丢失项目名称,项目的语义化不明确,同时更改了tomcat的默认访问,一般不考虑。

2、更改server.xml的配置,在</Host>的上一行添加如下配置:

<Context path=""  docBase="项目名称" debug="0" reloadable="true">

前期项目就用了这种配置,去解决默认访问问题,但在实际应用中遇到了一些问题。

1)第一次将war包放到webapps中,启动项目,默认路径访问不了,只有加上项目名称才能访问,此时只能重启一次tomcat,默认路径才能访问,而且加项目名称和不加项目名称都可以访问。

2)日志打印混乱,日志丢失,今天的日志打到昨天的日志文件中。

3)如果项目中有定时任务执行,发现每次定时任务都会重复执行两次。

问题分析:

通过日志跟踪,发现项目中的spring容器启动了两次,以此可以推断项目启动了两次,这个也是日志混乱,定时任务执行两次的根本原因。为什么会启动两次呢,但为什么第一次启动的时候,项目是启动了一次,但默认路径又访问不了呢?

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
	<Context path="" debug="0" docBase="hyxzx" reloadable="true"></Context>
</Host>

1、当为Host容器,设置appBase属性时,Tomcat会自动启动此目录中的合法项目,且会自动解压war包。

2、同时通过Context设置项目的默认路径,此时会再次加载一下docBase中设置的项目,但Context中设置的项目,只能识别目录,不能识别war包,默认也不会自动解压war这也是第一次启动tomcat时,默认路径访问不了的原因。

此处说一下Context中有个属性unpackWARs=”true”,可以解压war,但解压的项目是放到Host的appBase目录中的,如果再次重启,项目依然会启动两次。

解决方法:

Host中的appBase设置的路径和Context中docBase设置的路径不要在一个目录中,如下配置

<Host name="localhost"  appBase="webroot"
            unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
	<Context path="" debug="0" docBase="../webapps/wlgz" reloadable="true"></Context>
</Host>

1、tomcat的根路径下新建一个目录webroot,此文件可以放常规项目。

2、将需要配置默认路径的项目,放到webapps中,注意:不要放war包进去,一定是解压后的项目目录。否则识别不到项目。

此处可以手动解压,如下提供一种方式:

war包上传到tomcat的根目录

进入webapps中,创建wlgz文件夹

进入wlgz文件夹,执行命令:jar -xvf ../../wlgz.war

个人理解:Context只是设置虚拟目录用的,解决的一般是上传文件的访问路径或者公众资源(这些文件不在tomcat容器中),通过此配置可以访问。

3、通过Nginx代理设置默认路径。

通过Nginx的代理配置默认路径,此时tomcat常规配置,只需要更改nginx配置即可,配置如下:

server {  
    listen       80;  
    server_name  api.ahggwl.com;
	
    large_client_header_buffers 4 16k;
    client_max_body_size 300m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_buffer_size 64k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
	
    location / {  
        proxy_pass http://api.ahggwl.com/hytapp/;
	proxy_cookie_path  /hytapp/ /;
        proxy_set_header   Host    $host:$server_port;
        proxy_set_header   X-Real-IP   $remote_addr; 
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; 
        client_max_body_size    10m;
    }
}

主要需要的配置:

server_name,此字段标识前端的ip,匹配到此server。

location中 proxy_pass配置tomcat中的项目名称。

location中配置proxy_cookie_path,防止cookie丢失。

 

参考的文章:

解决nginx使用proxy_pass反向代理时,cookie丢失的问题

http://blog.csdn.net/we_shell/article/details/45153885

设置Tomcat默认访问路径

http://blog.csdn.net/u010175124/article/details/9630329