反向代理nginx和Play 2.1应用程序的子目录



目标

使用nginx设置多个Play 2.1应用程序,每个应用程序使用不同的子目录。

127.0.0.1:4000上运行的App1应该可以在127.0.0.1/dev下访问
127.0.0.1:5000上运行的App2应该可以在127.0.0.1/test 下访问

配置

nginx.conf

worker_processes  1;
error_log  logs/error.log;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    upstream app1 {
        server 127.0.0.1:4000;
    }
    upstream app2 {
        server 127.0.0.1:5000;
    }
    server {
        listen       80;
        server_name  localhost;
        location /dev {
            rewrite /(.*) /$1 break;
            proxy_pass http://app1;
        }
        location /test {
            rewrite /(.*) /$1 break;
            proxy_pass http://app2;
        }        
    }
}

App1-application.conf

application.context=/dev

App2-application.conf

application.context=/test

问题

使用此配置,我可以访问这两个应用程序,但只加载html代码。没有加载所有静态文件(css、js、images(。

我认为这是缓存问题。我尝试过不同的nginx参数,但没有成功。如果我第一次请求该站点,浏览器会以状态200响应(对于cssjs文件,例如127.0.0.1/dev/assets/stylesheets/main.css(,但不包含内容-Content-Length: 0。下一次,它以304进行响应,但仍然没有内容。

我不确定这是nginx还是Play 2.1配置问题。

我将感谢任何帮助。

使用本地,如http://test.loc/http://dev.loc,而不是依赖子文件夹。虽然application.context应该工作,但我看到许多帖子抱怨他们没有。。。

更重要的是,使用本地域更类似于最终生产环境,所以调试一些依赖url的东西更容易,比如cookie。

尽管这不能直接回答您的问题,但我通过传递X-Script-Name参数:使其在HAProxy中工作

frontend  public
  bind *:80
  use_backend playapp if { path_beg /playapp }
backend playapp
  acl is-ssl  dst_port 443
  reqadd X-Script-Name: /playapp
  reqadd X-Scheme: https  if is-ssl
  option forwardfor
  server playapp1 127.0.0.1:9000 check

最新更新