【问题标题】:How can I run multiple Ring apps on the same server?如何在同一台服务器上运行多个 Ring 应用程序?
【发布时间】:2013-03-31 17:58:27
【问题描述】:

我是 Ring(以及一般的 Clojure 服务器端编程)的新手。我有一个基于 Ring 的应用程序,它在“开发模式”下运行良好,即它可以监听 localhost:3000 并做出适当的响应。作为部署此应用程序的一部分,我想将应用程序的基本 URL 更改为 myserver.com/analytics/v1 之类的内容,例如,以前发往 localhost:3000/foo 的请求现在应该发往 myserver.com/analytics/v1/foo

我想我在这里有两个密切相关的问题:我怎样才能告诉 Ring/Jetty 只监听某个不是服务器根 URL 的 URL?以及如何设置它以便我可以添加另一个应用程序(例如,myserver.com/analytics/v2)而不会导致第一个应用程序停机?我是否需要编写另一个 Ring 应用程序来侦听 myserver.com/ 并将请求路由到我的其他应用程序?

【问题讨论】:

    标签: clojure jetty middleware ring


    【解决方案1】:

    我目前处理这个问题的方式是让每个 Ring 应用程序在它自己的嵌入式 Jetty 实例中运行,每个都在自己的端口上侦听,例如:8080 和 8085。 在服务器上,我在外部阻止了这些端口,因此只有 localhost 可以访问它们。

    然后我设置Nginx 以根据子域选择正确的应用程序:

    可能有更高级的设置,但对我来说这是配置最少的设置。

    这是我的 nginx.conf。如果您想了解更多配置详情,请告诉我。

    server {    listen     80;
        server_name     twitter.michielborkent.nl;
        access_log     /var/log/twitter-service.log;
    
        location / {  
            proxy_pass http://localhost:8080;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        }
    }
    
    server {    listen     80;
        server_name     tictactoe.michielborkent.nl;
        access_log     /var/log/tictactoe.log;
    
        location / {
            proxy_pass http://localhost:8085;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
        }
    }
    

    【讨论】:

    • 感谢您的回复!我实际上想在同一个子域的不同路径上托管多个应用程序。我可以只使用一个server 块和多个location 块吗?
    【解决方案2】:

    以下是我调整@Michiel Borkent 的nginx.conf 以满足我的需求的方式:

    server {
        listen 80;
        server_name www.myserver.com;
    
        location /analytics/v1/ {
            proxy_pass http://localhost:3001/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
        }
    
        location /trac/ {
            proxy_pass http://localhost:3002/trac/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
        }
    }
    

    在这种情况下,我可以将我的 Ring 应用程序设置为在端口 3001 上提供服务;我有 Trac 在端口 3002 上提供服务,或者我可以有另一个 Ring 应用程序或其他什么。这两个应用程序都可以从 www.myserver.com(端口 80)访问,只是在不同的路径下。

    【讨论】:

    • 太棒了。像 www.myserver.com/analytics/v1/foo?bar=1 等请求是否也由 localhost:3001 提供服务?我假设是这样,但只是检查。
    • 您的意思是带有查询字符串的请求?我想是的……我正在使用 HTTP POST 来访问 /analytics/v1 的东西,但是这些东西可以很好地重定向。 (任何以/analytics/v1 开头的路径都会转换为localhost:3001 的对应路径。)
    • 还有像 /analytics/v1/add/user/foo 这样的路径?
    • 是的,/analytics/v1/any/path/here 被映射到 localhost:3001/any/path/here
    • 太好了,很高兴知道这一点。这是我的预期,但感谢您的确认!
    猜你喜欢
    • 2021-03-02
    • 2019-01-26
    • 2014-05-05
    • 1970-01-01
    • 2021-03-02
    • 2019-10-29
    • 2016-05-11
    • 1970-01-01
    • 2023-02-06
    相关资源
    最近更新 更多