Если вы запускаете веб-сайт или API, скорее всего, вам придется иметь дело с доменами, поддоменами и этой надоедливой проблемой CORS. Давайте разберем все шаг за шагом и настроим все гладко.

Настройка доменов и поддоменов в Nginx

Nginx делает настройку нескольких доменов и поддоменов очень простой. Вам просто нужно настроить серверные блоки (также известные как виртуальные хосты), чтобы указать Nginx, какой домен должен указывать куда.

В этом случае мы используем Nginx в качестве обратного прокси. Это означает, что Nginx будет получать входящие запросы и пересылать их на соответствующие серверы на основе поддомена. Эта настройка полезна для балансировки нагрузки, безопасности и централизованного управления запросами.

Чтобы обеспечить безопасную маршрутизацию всего трафика через HTTPS, настройте редирект с порта 80 на 443:

server {
    listen 80;
    server_name example.com *.example.com;
    return 301 https://$host$request_uri;
}

Если вы хотите обрабатывать как основной домен (example.com), так и несколько поддоменов (api.example.comblog.example.com и т.д.) динамически, вы можете извлечь поддомен и проксировать запросы соответствующим образом:

server {
    listen 443 ssl;
    server_name *.example.com;

    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    set $subdomain "default";
    if ($host ~* ^(.+?)\.example\.com$) {
        set $subdomain $1;
    }

    location / {
        proxy_pass http://backend.$subdomain.example.com;
        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_set_header Connection "upgrade";
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Authorization $http_authorization;
    }
}

Эта конфигурация динамически извлекает поддомен из запроса и проксирует запрос на соответствующий сервер бэкенда (backend.<subdomain>.example.com). Кроме того, она обеспечивает правильную передачу всех необходимых заголовков.

Теперь просто включите конфигурацию и перезапустите Nginx:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Готово! Ваш домен и все поддомены теперь должны работать с HTTPS и динамической прокси-передачей.

Работа с CORS (Кросс-доменные запросы) в Nginx

CORS — это то, что блокирует ваш фронтенд от вызова API, размещенного на другом домене. Если ваш фронтенд находится на app.example.com и ваш API на api.example.com, вам нужно разрешить кросс-доменные запросы.

Чтобы ваш API принимал запросы с другого домена, вам нужно добавить правильные заголовки в Nginx.

server {
    listen 443 ssl;
    server_name api.example.com;

    ssl_certificate /etc/nginx/ssl/api.example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/api.example.com.key;

    location / {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';

        if ($request_method = OPTIONS) {
            return 204;
        }
    }
}

Это позволяет любому получить доступ к вашему API, что нормально для публичных API, но рискованно для частных.

Хотите ограничить доступ к app.example.com? Сделайте это вместо этого:

add_header 'Access-Control-Allow-Origin' 'https://app.example.com';

Браузеры иногда отправляют запрос OPTIONS перед тем, как сделать фактический вызов API. Если вы не обработаете его, все сломается. Вот как разрешить предварительные запросы:

location / {
    if ($request_method = OPTIONS) {
        add_header 'Access-Control-Allow-Origin' 'https://app.example.com';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';
        return 204;
    }
}

Заключение

Правильная настройка доменов, поддоменов и CORS в Nginx не так уж сложна, как только вы знаете, что нужно подправить. С правильной настройкой вы сможете избежать головной боли и поддерживать ваши приложения в рабочем состоянии. Удачного кодирования!