我正在为 Java 和 Django 开发配置 Amazon EC2 机器。我们选择的堆栈是 Nginx,作为 :80 端口上的顶级侦听器,并将请求传递给相应的应用程序,对于 Tomcat 通过 :8080,对于 uWSGI 通过 .sock。
我已经按以下方式配置了 nginx:
server {
listen 80;
server_name test.myproject.com;
rewrite ^/(.*)$ /myproject/$1;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name test.myotherproject.com;
rewrite ^/(.*)$ /myotherproject/$1;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name web1.myhost.com.br;
location /static/ {
root /home/ubuntu/projects/hellow/;
}
location / {
uwsgi_pass unix:/var/run/uwsgi.sock;
include uwsgi_params;
uwsgi_param SCRIPT_NAME '';
}
}
第一个“服务器”条目重定向到 tomcat webapp .war,并且它运行正常。第三个重定向到 uWSGI sock,它也运行正常。第二个是问题所在。它的配置方式与第一个相同,但是当我访问http://test.myotherproject.com我的浏览器出现 404 错误并显示以下消息:
HTTP Status 404 - /myotherproject/myotherproject/user/redirectPermission
type Status report
message /myotherproject/myotherproject/user/redirectPermission
description The requested resource is not available.
Apache Tomcat/7.0.33
/user/redirectPermission 是一个有效页面,应用程序的预期行为是在第一次访问时转到该页面,以对用户进行身份验证。问题在于附加的第二个 /myotherproject/ 部分,我无法弄清楚为什么或在哪里发生这种情况。请注意,上面给出 404 的 URL 是:http://test.myotherproject.com.br/myotherproject/user/redirectPermission。此外,除了将其端口更改为 8080 之外,tomcat 在 server.xml 文件中没有额外的配置,并且 war 位于 webbapps 中,名为 myotherproject.war (tomcat7.x/webapps/myotherproject.war)。有人知道如何正确配置此设置吗?提前致谢,Salvia
答案1
你能做一个简单的测试吗?
$ curl -I http://test.myproject.com/myproject
$ curl -I http://test.myotherproject.com/myotherproject
如果我没记错的话,第二个输出是向 /myotherproject/user/redirectPermission 返回 301 (或类似代码),根据重写规则,它被重写为 /myotherproject/myotherproject/user/redirectPermission :
rewrite ^/(.*)$ /myotherproject/$1;
如果这确实是问题,则解决方案是使两个应用程序都在根上下文中提供服务,但在 Tomcat 上配置为虚拟主机,以便它根据 Host 标头决定为哪个应用程序提供服务(您可能需要将此标头从 nginx 明确传递到 Tomcat)。
但正确的解决方案是仅根据位置规则将整个请求转发给 Tomcat,并让 Tomcat 按照它想要的方式处理它。
答案2
您可以尝试更改 proxy_pass 位置而不是重写规则:
proxy_pass http://127.0.0.1:8080/myotherproject/;
myotherproject 的第二部分可能被附加在 Tomcat 应用程序规则内。