在Play框架上如何在同一端口运行多个应用程序

4
我是新手,正在使用Play框架。我使用的是Play 2.0.2版本,希望在同一端口上运行多个应用程序。
它应该像这样:http://localhost:9000/Project1/(controller)http://localhost:9000/Project2/(controller) 我发现可以在不同的端口上运行,但没有找到关于在同一端口上运行的信息。
这是否可能?
3个回答

7

您无法在同一端口上运行两个应用程序,这不仅是Play的问题。

使用前端HTTP服务器来代理应用程序。如果您只需要运行Java应用程序,则nginx是一个很好的选择,如果您需要与依赖于Apache特定功能的PHP系统一起工作,则也可以使用Apache代理

总体而言:您需要设置服务器以侦听端口80,然后为每个应用程序添加一个服务器块(在Apache中的虚拟主机),使用一些伪域名,如 http://app1.loc http://app2.loc 等,并将它们添加到您的 hosts 文件,以使它们在您的系统中可用。接下来,将每个服务器块配置为不同端口上的应用程序的代理(nginx):

server {
  server_name app1.loc www.app1.loc;
    listen 80;

    location / {
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:9021;
            proxy_redirect http://127.0.0.1:9021/ http://app1.loc/;
    }
}

然后在9021端口启动你的第一个应用程序。

对于其他应用程序,每次使用不同的端口进行相同的操作。

最后,为了确保您始终在所需的9021端口上运行app1,请编写一个bash脚本(或在Windows中的bat文件),该脚本将始终以相同的设置运行它,即run.sh

#!/bin/bash
play "~run 9021";

1
nginx 可以很好地处理 PHP,例如使用 php-fpm。 - Kim Stebel
对的,无论如何,一些旧的PHP系统在很大程度上依赖于一些Apache特定的功能(至少是开箱即用的),所以我不喜欢(个人)与nginx“斗争” :) 相反,我更喜欢使用单独的机器作为服务器或者...使用nginx代理apache :) - biesior
是的,但只要涉及到 PHP,我就不会推荐使用 Apache。Nginx 文档中有大量的应用程序特定配置。 - Kim Stebel

5
仅仅通过play框架是不可能实现的,因为每个应用程序都在自己独立的进程中运行,而且同一时间只能有一个进程监听一个端口。您可以在9001和9002端口上运行您的play应用程序,然后在9000端口上运行像nginx这样的服务器,并配置它将不同URL的请求路由到您的play应用程序中。
请参考这个例子:http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html 您的情况下唯一的区别是您将有一个带有两个location块的server {...}块。 它会像这样:
upstream play1 {
      server localhost:9001;
}

upstream play2  {
      server localhost:9002;
}

server {
    listen       localhost:9000;
    server_name  www.example.com;

    access_log  /var/log/nginx/log/www.example.access.log  main;
    error_log  /var/log/nginx/log/www.example.error.log;
    root   /usr/share/nginx/html;
    index  index.html index.htm;

    ## send requests to play1 ##
    location /Project1/ {
        proxy_pass  http://play1;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    ## send requests to play2 ##
    location /Project2/ {
        proxy_pass  http://play2;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

谢谢回复。只想确认一件事。会有一个服务器实例还是两个(每个项目一个)。 - Abdul Rafae
除非您想要多个虚拟主机,例如 project1.example.com 和 project2.example.com,否则您只需要一个服务器实例。 - Kim Stebel
@KimStebel - 对我来说这个不起作用。我可以请求索引操作,但是资产没有加载(应用程序尝试从http://127.0.0.1:9000/assets/stylesheets/main.css加载CSS。我希望从http://127.0.0.1:9000/Project1/assets/stylesheets/main.css或直接从http://127.0.0.1:9001/assets/stylesheets/main.css加载)。我正在使用Play 2.1 Java版本。 - Lukasz R.

0
如果您计划在同一台服务器上托管多个应用程序或负载均衡多个应用程序实例以实现可伸缩性或容错性,您可以使用前端HTTP服务器。 请注意,使用前端HTTP服务器永远不会比直接使用Play服务器获得更好的性能。您可以查看此链接:如何为Play 2框架设置前端HTTP服务器

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接