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

时间:2013-04-05 14:08:54

标签: nginx playframework reverse-proxy playframework-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参数,没有运气。如果我是第一次请求该网站,则浏览器会响应(cssjs个文件,例如127.0.0.1/dev/assets/stylesheets/main.css),状态为200但没有内容 - Content-Length: 0 。下次用304回复时,仍然没有内容。

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

我将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

使用本地域的更多内容更类似于最终的生产环境,因此调试一些url依赖的东西更容易,比如ie。饼干。

答案 1 :(得分:0)

尽管这并没有直接回答您的问题,但我通过传递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