Clojure 如何在同一台服务器上运行多个环应用程序?

Clojure 如何在同一台服务器上运行多个环应用程序?,clojure,jetty,middleware,ring,Clojure,Jetty,Middleware,Ring,我不熟悉Ring(一般来说是Clojure服务器端编程)。我有一个基于环的应用程序,在“开发模式”下运行良好,也就是说,它可以监听localhost:3000,并做出适当的响应。作为部署此应用程序的一部分,我希望将该应用程序的基本URL更改为类似于myserver.com/analytics/v1,以便例如,以前转到localhost:3000/foo的请求现在应该转到myserver.com/analytics/v1/foo 我想这里有两个密切相关的问题:如何让Ring/Jetty只在某个不是

我不熟悉Ring(一般来说是Clojure服务器端编程)。我有一个基于环的应用程序,在“开发模式”下运行良好,也就是说,它可以监听
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/
,并根据需要将请求路由到我的其他应用程序?

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

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

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

这是我的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;
    }
}

下面是我如何调整@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上运行;我在端口3002上有Trac服务,或者我可以有另一个Ring应用程序或其他什么。这两个应用程序都可以通过不同的路径从www.myserver.com(端口80)访问。

谢谢您的回复!实际上,我想在同一子域的不同路径上托管多个应用程序。我可以只使用一个
服务器
块和多个
位置
块吗?太好了。像www.myserver.com/analytics/v1/foo?bar=1等请求是否也由localhost:3001提供服务?我想是的,但只是检查一下。你是说带有查询字符串的请求?我想是的……我正在使用HTTPPOST访问/analytics/v1内容,但是这些内容被重定向得很好。(任何以
/analytics/v1
开头的路径都会转换为
本地主机:3001
的相应路径)还有像/analytics/v1/add/user/foo这样的路径?是的,
/analytics/v1/Any/path/here
会映射到
本地主机:3001/Any/path/here
。很好,很高兴知道这一点。这是我所期望的,但谢谢你的确认!