Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I host my API and web app on the same domain?

I have a Rails API and a web app(using express), completely separate and independent from each other. What I want to know is, do I have to deploy them separately? If I do, how can I make it so that my api is in mysite.com/api and the web app in mysite.com/

I've seen many projects that do it that way, even have the api and the app in separate repos.

like image 765
corasan Avatar asked Jun 05 '16 22:06

corasan


People also ask

How do I run an API and a website on IIS?

There are at least 4 ways of doing what you want to do. The first two methods are for if you have 1 web server, and both applications are served from that one web server running IIS. This method also works if you have multiple web servers running behind a load-balancer, so long as the API and the Web site are running on the same server.

How do I run an API on multiple servers?

The second two methods are using what's called a "Reverse Proxy", essentially a way to route traffic from one server (the proxy server) to multiple internal servers depending on what type of traffic you're receiving. This is for when you run your web servers on a set of servers and run your API on a different set of servers.

How do I host an API on the Internet?

For hosting your API on the Internet is you need an IP Address and port to be assigned. You can use ngrock library, ngrock tunnels your localhost port to a public port so that you can host it online. 2. AWS Lambda

How do I make API calls to my own API?

Now we can make GET, POST, PUT, PATCH and DELETE API calls to our own API. Now, you've made some API calls to our application. If you want to save the final result of those API calls, you can press the s key from your keyboard and hit the enter key which will save the snapshot of the changes in a separate file as can be seen in the terminal.


2 Answers

Usually you don't expose such web applications directly to clients. Instead you use a proxy server, that forwards all incoming requests to the node or rails server.

nginx is a popular choice for that. The beginners guide even contains a very similar example to what you're trying to do.

You could achieve what you want with a config similar to this:

server {
    location /api/ {
        proxy_pass http://localhost:8000;
    }

    location / {
        proxy_pass http://localhost:3000;
    }
}

This is assuming your API runs locally on port 8000 and your express app on port 3000. Also this is not a full configuration file - this needs to be loaded in or added to the http block. Start with the default config of your distro.

When there are multiple location entries nginx chooses the most specific one. You could even add further entries, e.g. to serve static content.

like image 125
svens Avatar answered Sep 24 '22 00:09

svens


While Svens answer is completely correct for the question given. I'd prefer doing it at the DNS level so that I can change the server to a new location just in case my API or Web App experience heavy load. This helps us to run our APIs without affecting WebApp and vice-versa

DNS Structure

api.mysite.com => 9.9.9.9    // public IP address of my server
www.mysite.com = > 9.9.9.9   // public IP address of my server

Since now you'd want both your WebApp and API to run on the same server, you can use nginx to forward requests appropriately.

server {
    listen       80;
    server_name api.mysite.com;
    # ..
    # Removed for simplicity
    # ..
    location / {
        proxy_pass http://localhost:3000;
    }
}
server {
    listen      80;
    server_name www.mysite.com;
    # ..
    # Removed for simplicity
    # ..
    location / {
        proxy_pass http://localhost:8000;
    }
}

Any time in future if you are experiencing overwhelming traffic, you can just alter the DNS to point to a new server and you'd be good.

like image 22
Ronak Jain Avatar answered Sep 25 '22 00:09

Ronak Jain