Маршрутизация трафика Nginx на основе домена.

Вопрос или проблема

Я совсем новичок в 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 для достижения желаемого результата:

Шаги по настройке

  1. Разделите конфигурации на отдельные серверные блоки:

    В вашем случае это означает определение двух отдельных серверных блоков в файле конфигурации Nginx: один для my-domain.dev и другой для apis.my-domain.dev.

  2. Конфигурация для 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;
       }
    }
  3. Конфигурация для 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".

Будьте внимательны к деталям и тестируйте изменения в контролируемой среде, прежде чем применять их в продакшене.

Оцените материал
Добавить комментарий

Капча загружается...