Question

I’m new to Ring (and Clojure server-side programming in general). I have a Ring-based app that works well in “development mode”, i.e. it can listen on localhost:3000 and it responds appropriately. As part of deploying this app I’d like to change the base URL for the app to something like myserver.com/analytics/v1, so that for example a request that previously went to localhost:3000/foo should now go to myserver.com/analytics/v1/foo.

I guess I have two closely-related questions here: How can I tell Ring/Jetty to listen only at a certain URL that is not the root URL of the server? And how can I set this up so that I could add another app (for example, myserver.com/analytics/v2) without downtime for the first app? Do I need to write another Ring app that will listen on myserver.com/ and route the requests to my other apps as appropriate?

Was it helpful?

Solution

The way I'm currently handling this is let each Ring app run in it's own embedded Jetty instance, each listens on their own port, like for example: 8080 en 8085. On the server I block these ports externally, so only localhost can access them.

Then I setup Nginx to select the right app based on the subdomain:

There are more advanced setups possible, but for me this is the one with least configuration.

Here is my nginx.conf. If you want to have more configuration details, just let me know.

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;
    }
}

OTHER TIPS

Here’s how I adapted @Michiel Borkent’s nginx.conf to fit my needs:

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;
    }
}

With this situation I can just set my Ring app to serve on port 3001; I have Trac serving on port 3002, or I could have another Ring app or whatever. Both of these applications are accessible from www.myserver.com (port 80), just under different paths.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top