0

I've a backend and a frontend that run in two containers in Docker, and both are accessible from my browser with their ports:

localhost:8081 # frontend
localhost:8082 # backend

Now, I want to use an Nginx server that receives all the traffic (port 80) and redirects:

localhost -> to frontend
localhost/api -> to the backend

After trying almost everything in nginx.conf file (nothing worked), I found in an SO Question that the file I must modify is:

/etc/nginx/sites-enabled/default

So I try to modify it, and now nginx runs. And with runs, I mean that at least when I access localhost, nginx welcome page is shown. However, I still can't make my nginx route traffic (proxy way, not redirect).

Right now my docker-compose file has the following look (snippet for nginx plus those two services):

  nginx:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./Dockerfiles/nginx/default:/etc/nginx/sites-enabled/default
    links:
      - frontend
      - backend
    depends_on:
      - frontend
      - backend
  frontend:
    build: ./Dockerfiles/frontend
    volumes:
      - ./Dockerfiles/frontend/www/src:/usr/src/app
      - ./logs/frontend/httpd:/var/logs/httpd
    ports:
      - "8081:3000"
    links:
      - backend
  backend:
    build: ./Dockerfiles/backend
    volumes:
      - ./Dockerfiles/backend/www:/var/www/html
      - ./logs/backend/httpd:/var/logs/httpd
    ports:
      - "8082:80"
    links:
      - "database"
      - "redis"
    depends_on:
      - database
      - redis

My default file as said before, for nginx config is:

server {
        listen 80 default_server;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.php index.nginx-debian.html;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                #try_files $uri $uri/ =404;
            proxy_pass http://frontend:8081/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }

        location /api {
            proxy_pass http://backend:8082/public/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }

}

And when I try to access my /api url for example, the error that nginx is telling my is:

nginx_1 | 2018/12/17 21:44:09 [error] 6#6: *1 open() "/usr/share/nginx/html/api" failed (2: No such file or directory), client: 172.20.0.1, server: localhost, request: "GET /api HTTP/1.1", host: "localhost"

Which seems like it's trying to retrieve a file from local filesystem (something that I can't understand, given the conf. files).

Any lead, idea or tip?

1 Answer 1

2

Put your server config in: /etc/nginx/conf.d/default.conf, not in sites-enabled.

Docs: https://hub.docker.com/_/nginx/

Also, you will face a different problem later. Change http://frontend:8081/; to http://frontend:3000/;. Because nginx is contacting the frontend container directly, not throughout the host.

Sign up to request clarification or add additional context in comments.

4 Comments

I've changed the config like: ./Dockerfiles/nginx/mysite.conf:/etc/nginx/conf.d/mysite.conf in the volume, and changed the ports as you said. However, the problem remains. It still seems to be looking for files locally.
May it be because I do need to add a command to the container, in order to make it load this config file?
You don't need to do that. Can you please try with default.conf instead of mysite.conf?
That's it!!! God bless u. It wasn't taking the config file because of the name. Please update the answer to better fit the problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.