使用反向代理在 Tomcat 子文件夹中部署 Java Web
Deploy Java Web in Tomcat Subfolder Using Reverse Proxy
我在将 Java Web 项目部署到 Tomcat 时遇到问题。
在localhost(开发环境)下,我可以部署成功。我可以通过访问 http://localhost:8080/project
.
来访问该项目
我试图在服务器上部署它。当然,我可以使用 http://server_ip:8080/project
访问该项目。
如您所见,该项目位于 TOMCAT_HOME/webapps/project
.
当我将它与由 Nginx 提供支持的反向代理一起使用时。这是 Nginx 的配置:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080/project;
}
}
正常情况下,我可以使用http://example.com
访问项目,nginx会获取http://127.0.0.1:8080/project
中的内容。确实如此,但我无法获取静态文件。
我使用<c:url>
标签加载静态文件:
<link rel="stylesheet" type="text/css" href="<c:url value="/assets/css/style.css" />" />
当我使用 http://server_ip:8080/project
访问网站时,一切正常。而 href 的值将是 /project/assets/css/style.css
.
但是当我使用http://example.com
访问网站时,href的值仍然是/project/assets/css/style.css
,所以我会得到一个404错误。因为这个URL就是/project/project/assets/css/style.css
。但是,该文件位于 /assets/css/style.css
谁能帮我解决这个问题?非常感谢。
尝试进行显式 location
匹配,如下所示:
server {
listen 80;
server_name example.com;
location ^~ /project {
proxy_pass http://127.0.0.1:8080/project;
}
location ^~ / {
deny all;
}
}
解释:
location ^~ /project {}
(注意:不适用于正则表达式)
^~
导致请求开头区分大小写匹配。这意味着 /project
、/project/logo.jpg
等都将被匹配。这也会在匹配时立即停止位置扫描。
我使用以下配置解决了这个问题。
这是nginx.conf
:
server {
listen 80;
server_name example.com;
location ~ ^/(WEB-INF)/ {
deny all;
}
location ~* ^.+.(css|js|jpeg|jpg|gif|png|ico|svg|eof|otf|ttf|woff) {
root /usr/local/tomcat/webapps/AppName/;
expires 24h;
access_log off;
}
location / {
proxy_pass http://127.0.0.1:8080;
}
}
这是 ${TOMCAT_HOME}/conf
中的 server.xml
:
(在Engine
标签中添加以下内容)
<Host name="example.com" appBase="webapps/AppName"
unpackWARs="true" autoDeploy="true">
<Alias>www.example.com</Alias>
<Context path="" docBase="${catalina.base}/webapps/AppName"
reloadable="true" allowLinking="true">
</Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="appname_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
我在将 Java Web 项目部署到 Tomcat 时遇到问题。
在localhost(开发环境)下,我可以部署成功。我可以通过访问 http://localhost:8080/project
.
我试图在服务器上部署它。当然,我可以使用 http://server_ip:8080/project
访问该项目。
如您所见,该项目位于 TOMCAT_HOME/webapps/project
.
当我将它与由 Nginx 提供支持的反向代理一起使用时。这是 Nginx 的配置:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080/project;
}
}
正常情况下,我可以使用http://example.com
访问项目,nginx会获取http://127.0.0.1:8080/project
中的内容。确实如此,但我无法获取静态文件。
我使用<c:url>
标签加载静态文件:
<link rel="stylesheet" type="text/css" href="<c:url value="/assets/css/style.css" />" />
当我使用 http://server_ip:8080/project
访问网站时,一切正常。而 href 的值将是 /project/assets/css/style.css
.
但是当我使用http://example.com
访问网站时,href的值仍然是/project/assets/css/style.css
,所以我会得到一个404错误。因为这个URL就是/project/project/assets/css/style.css
。但是,该文件位于 /assets/css/style.css
谁能帮我解决这个问题?非常感谢。
尝试进行显式 location
匹配,如下所示:
server {
listen 80;
server_name example.com;
location ^~ /project {
proxy_pass http://127.0.0.1:8080/project;
}
location ^~ / {
deny all;
}
}
解释:
location ^~ /project {}
(注意:不适用于正则表达式)
^~
导致请求开头区分大小写匹配。这意味着 /project
、/project/logo.jpg
等都将被匹配。这也会在匹配时立即停止位置扫描。
我使用以下配置解决了这个问题。
这是nginx.conf
:
server {
listen 80;
server_name example.com;
location ~ ^/(WEB-INF)/ {
deny all;
}
location ~* ^.+.(css|js|jpeg|jpg|gif|png|ico|svg|eof|otf|ttf|woff) {
root /usr/local/tomcat/webapps/AppName/;
expires 24h;
access_log off;
}
location / {
proxy_pass http://127.0.0.1:8080;
}
}
这是 ${TOMCAT_HOME}/conf
中的 server.xml
:
(在Engine
标签中添加以下内容)
<Host name="example.com" appBase="webapps/AppName"
unpackWARs="true" autoDeploy="true">
<Alias>www.example.com</Alias>
<Context path="" docBase="${catalina.base}/webapps/AppName"
reloadable="true" allowLinking="true">
</Context>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="appname_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>