我想使用我的域名为 Tomcat 服务器设置一个 Nginx 代理,例如
example.com/demo/sample
example.com/demo/manager
example.com/demo/other_apps
...
这是我的 Nginxserver block
配置
server {
listen 80;
server_name example.com;
location /demo/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://IP_ADD_TOMCAT_SERVER:8080/;
}
location ~ /\.ht {
deny all;
}
## Only allow these request methods ##
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
## Do not accept DELETE, SEARCH and other methods ##
}
我在这里遇到了两个问题:
第一个问题:
如果TOM_CAT_INSTALL_DIR/webapps/sample/
包含静态页面hello.jsp
,则使用 URL:
example.com/demo/app1/
但不适用于 URL:
example.com/demo/app1
/
为什么必须在 URL 末尾添加斜杠才能使 nginx 代理正常工作?
第二个问题:
如果TOM_CAT_INSTALL_DIR/webapps/manager
包含index.jsp
动态网页文件,则无法使用 URL 进行工作
example.com/demo/manager/
URL 变为
例如.com/manager/....
接下来是一长串参数。
如果我手动将/demo/
字符串添加到 Web 浏览器 URL,它就会再次起作用。
我应该如何让 nginx 代理与子目录一起工作/demo/
?
更新:我发现 tomcat 管理器子目录缺少重写问题是在 index.jsp 文件中,不会request.getContextPath()
自动将 /demo/ 子目录添加到 URL 中。看来我们必须手动修改 .jsp 文件代码。
如果你像我一样不知道如何修改 jsp 代码,你可以在 Nginx 中使用以下代码来解决这个问题
# Must add the trailing '/' for both location and proxy_pass
location /demo/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://TOM_CAT_SERVER_IP_ADDR:8080/;
}
# ONLY work for manager apps, for other apps,
# You must add more rewrite rules like the below
location /manager/ {
rewrite ^/(.*)$ /demo/$1 last;
}
答案1
我认为您/
在配置设置中添加了一些额外的东西......
看看这一行:
proxy_pass http://IP_ADD_TOMCAT_SERVER:8080/;
您需要删除尾随的斜杠,它就可以正常工作。
像这样:
proxy_pass http://IP_ADD_TOMCAT_SERVER:8080;
尝试一下,看看是否顺利!!
更新#1我刚刚注意到你的另一个错误是“同样的拼写错误”location /
删除第二个斜线就可以正常工作了!!
像这样:location /demo {
而不是这样location /demo/ {
更新 #1:你可以用这个测试你的网址
$ curl -I http://yoururl.com
并看看结果如何。这样你就知道它是否有效。
更新 #3:
要与任何扩展配合使用,您的设置.jsp
都应该在您的虚拟主机中包含以下代码:
location ~ \.jsp$ {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
另外要开始/demo
工作,您需要添加下面的重写代码server_name example.com
rewrite ^/(.*)$ /demo/$1;
答案2
我的情况 http://localhost:8080/demo 第一页可以正常工作,但是图像和其他组件无法从服务器获取因此我添加了以下映射
server {
listen 80;
listen [::]:80;
server_name www.example.org example.org;
#remove /demo if it come to URI otherwise it add two time for call proxy
rewrite ^/demo(.*)$ $1;
rewrite ^/(.*)$ /demo/$1;
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}