Вопрос или проблема
Я совсем новичок в nginx. После довольно длительных поисков и метода проб и ошибок мне удалось добиться того, чтобы следующее работало. Я использую nginx как часть настройки docker compose для реверс-прокси к своему фронтенду и бекенду локально. У меня есть две записи в файле hosts для my-domain.dev
и apis.my-domain.dev
, которые указывают на localhost. Перенаправление на https работает хорошо, поэтому моя локальная настройка близко напоминает развернутую.
Эта настройка nginx, похоже, работает так, как я хочу, но она настроена не так, как нужно.
У меня есть два файла:
/etc/nginx/sites-available/my-domain.dev
server {
listen 80;
listen 443;
server_name my-domain.dev www.my-domain.dev apis.my-domain.dev;
}
/etc/nginx/nginx.conf
events {
worker_connections 1024;
}
http {
upstream frontend {
server ng:4200;
}
upstream backend {
server Apis:34521;
}
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/ssl/certs/localhost.crt;
ssl_certificate_key /etc/ssl/private/localhost.key;
location / {
proxy_pass http://frontend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /api {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
Так что это работает, потому что в данный момент все мои вызовы API делаются на https://apis.my-domain.com/api/foo, и поэтому расположение совпадает с /api
, а не с apis.my-domain.com
.
Я пробовал множество различных конфигураций, но кажется, что не могу найти другую, которая работает.
Как я могу настроить конфигурацию так, чтобы весь трафик my-domain.com
направлялся на http://frontend
, а весь трафик apis.my-domain.com
направлялся на http://backend
?
Наиболее типичное решение, когда вам необходимо, чтобы (под-)домены вели себя по-разному, состоит в том, чтобы настроить их как именованные “виртуальные” серверы с двумя (или более) разными блоками серверов:
server {
server_name example.com www.example.com;
...
}
server {
server_name api.example.com
...
}
Ответ или решение
Настройка маршрутизации трафика на основе доменов в Nginx является важной задачей, особенно в ситуациях, когда вы используете сервер в качестве обратного прокси для различных компонентов. В вашем случае, задачей является маршрутизация трафика так, чтобы весь трафик, направляемый на my-domain.dev
, перенаправлялся на ваш фронтенд, а весь трафик на apis.my-domain.dev
— на ваш бэкенд.
Основная концепция, которую вы можете использовать, называется "виртуальными хостами" или "виртуальными серверами" в Nginx. Это позволяет вам определить конфигурации для каждого домена или поддомена отдельно.
Вот как вам следует обновить ваш файл конфигурации Nginx для достижения желаемого результата:
Шаги по настройке
-
Разделите конфигурации на отдельные серверные блоки:
В вашем случае это означает определение двух отдельных серверных блоков в файле конфигурации Nginx: один для
my-domain.dev
и другой дляapis.my-domain.dev
. -
Конфигурация для
my-domain.dev
:server { listen 80; listen 443 ssl; server_name my-domain.dev www.my-domain.dev; ssl_certificate /etc/ssl/certs/localhost.crt; ssl_certificate_key /etc/ssl/private/localhost.key; location / { proxy_pass http://frontend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
-
Конфигурация для
apis.my-domain.dev
:server { listen 80; listen 443 ssl; server_name apis.my-domain.dev; ssl_certificate /etc/ssl/certs/localhost.crt; ssl_certificate_key /etc/ssl/private/localhost.key; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Дополнительные рекомендации
-
Проверьте конфигурацию: После внесения изменений в конфигурацию Nginx выполните команду
nginx -t
, чтобы проверить на наличие ошибок. Это поможет избежать проблем при перезапуске сервера. -
Перезапустите Nginx: После успешной проверки конфигурации перезапустите сервис Nginx командой
systemctl restart nginx
или аналогичной в вашей системе. -
Управление сертификатами SSL: Убедитесь, что ваши сертификаты SSL правильно настроены и доступны на сервере. Это обеспечит защищенное соединение для обоих доменов.
Эти шаги помогут вам настраивать Nginx для маршрутизации трафика на основе доменов с использованием мощных возможностей виртуальных серверов. Чтобы улучшить SEO, включайте ключевые слова, такие как "маршрутизация трафика на основе домена в Nginx", "конфигурация виртуального хоста", и "обратный прокси Nginx".
Будьте внимательны к деталям и тестируйте изменения в контролируемой среде, прежде чем применять их в продакшене.