将 nginx 配置为 tomcat/uWSGI 代理

将 nginx 配置为 tomcat/uWSGI 代理

我正在为 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 应用程序规则内。

相关内容