Nginx, Docker, Django, один сервер и n-микросервисов
Есть сервер, на нём в Docker запущены (ну допустим) 2 сайтика (в теории их может быть n-сайтов/сервисов). Я хочу чтобы они выглядели так: http://ip-addr/app_1 и http://ip-addr/app_2 Т.е. я хочу указывать через путь к конкретному сервису/сайту на моём сервере. У меня работает если я использую для каждого сервиса/сайта свой порт: http://ip-addr:1234 и http://ip-addr:4321 Проксрование идёт через Nginx (test_1 и test_2 это мои сайтики в контейнерах)
upstream test_1 {
server web_2:9000;
}
server {
listen 4321;
location / {
proxy_pass http://test_1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
upstream test_2 {
server web_2:8000;
}
server {
listen 1234;
location / {
proxy_pass http://test_2;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
Вопрос: как правильно настроить конфигурационный файл Nginx чтобы доступ к моим сервисам/сайтам был через путь, а не через порт? И можно ли это сделать без SSL-сертификата и без доменного имени? Из имеющегося только IP адрес сервера? Нужно ли в docker-compose.yaml мне как-то специально настраивать раздел Nginx?
для варианта с портами сделано так:
nginx:
build: ./nginx
ports:
- 1234:1234
- 4321:4321
depends_on:
- web_1
- web_2
Спасибо!
Ответы (1 шт):
Вопрос: как правильно настроить конфигурационный файл Nginx чтобы доступ к моим сервисам/сайтам был через путь, а не через порт?
Все это делается исключительно средствами Nginx. Ниже будет конфиг.
И можно ли это сделать без SSL-сертификата и без доменного имени? Из имеющегося только IP адрес сервера?
Можно.
SSL сертификат не нужен, если вам не нужен HTTPS. А если нужен, получите бесплатный на Letsencrypt, вот интерактивная инструкция, но тогда и домен потребуется прикупить.
Нужно ли в docker-compose.yaml мне как-то специально настраивать раздел Nginx?
В docker-compose.yaml нужно пробросить порт 80:80, тогда будет открываться по IP адресу. Главное, чтобы этот порт был свободен. Если занят, то либо освобождайте, либо делайте проксирование уже на том веб-сервере, который его занял.
ports:
- 80:80
Настройка Nginx
Чтобы раскидать трафик на 2 приложения, в Nginx нужна одна секция server, и 2 location /app_1 и /app_2 с проксированием.
Но приложениям будет передаваться путь /app_1/some-uri, а если хотите без этого префикса, просто /some-uri, то нужно сделать rewrite и немного поменять proxy_pass, ниже так и сделано.
upstream test_1 {
server web_1:9000;
}
upstream test_2 {
server web_2:8000;
}
server {
listen 80 default_server;
location /app_1/ {
rewrite ^/app_1/(.*) /$1 break;
proxy_set_header Host $host;
proxy_pass http://test_1$uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
}
location /app_2/ {
rewrite ^/app_2/(.*) /$1 break;
proxy_set_header Host $host;
proxy_pass http://test_2$uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
}
}