обратный прокси-сервер nginx для всех поддоменов, кроме уже определенных

#nginx #reverse-proxy #nginx-reverse-proxy

Вопрос:

У меня довольно простой вопрос, у меня есть среда, в которой у меня часто меняются поддомены, но некоторые из них также существуют, теперь я хочу переслать api.example.com кому 1.2.3.4:8080 и все другие входящие запросы на 2.3.4.5:9090 . Моя настройка до сих пор заключается в том, что я пересылаю все запросы от поддоменов api на 1.2.3.4:8080 :

 server {
        listen 80;
        listen [::]:80;
        server_name api.example.com;

        access_log /var/log/nginx/reverse-access.log;
        error_log /var/log/nginx/reverse-error.log;

        location / {
                    proxy_pass http://1.2.3.4:8080;
  }
}
 

Теперь мне нужен способ указать на все остальные поддомены 2.3.4.5:9090 .

Ответ №1:

Используйте default_server в listen . Смотрите Документы.

 server {
    listen 80;
    listen [::]:80;
    server_name api.example.com;

    location / {
        proxy_pass http://1.2.3.4:8080;
    }
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    location / {
        proxy_pass http://2.3.4.5:9090;
    }
}
 

Комментарии:

1. И даже server_name _; может быть опущен для второго серверного блока 🙂

Ответ №2:

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

 server {
        listen 80;
        listen [::]:80;
        server_name ~^(?<subdomain>. ).example.com;

        access_log /var/log/nginx/reverse-access.log;
        error_log /var/log/nginx/reverse-error.log;

        location / {
                    if ($subdomain = "api") {
                           proxy_pass http://1.2.3.4:8080;
                    }

                    proxy_pass http://2.3.4.5:9090;
        }
}