Fiddler-подобный хост и переназначение портов с помощью nginx в Linux

Я пытаюсь настроить переназначение хоста и порта в Linux, используя nginx в качестве обратного прокси.

Пока что у меня есть работающее решение по взлому гетто с использованием if директива, которая является злом.

Есть ли лучшее решение без использования if?

Что я пробовал - конфигурация nginx

/etc/nginx/nginx.conf (или какой-нибудь файл /etc/nginx/conf.d/*.conf):

server {
    listen 3000;
    server_name dev.example.com test.example.com prod.example.com
    location / {
        if ($http_host ~ dev.example.com) {
            proxy_pass 127.0.0.1:13000;
        }
        if ($http_host ~ test.example.com) {
            proxy_pass 127.0.0.1:23000;
        }
        if ($http_host ~ prod.example.com) {
            proxy_pass 127.0.0.1:33000;
        }
    }
}

/ etc / hosts:

127.0.0.1 dev.example.com
127.0.0.1 test.example.com
127.0.0.1 prod.example.com

Что я хотел бы сделать - конфигурация Fiddler HOSTS

Для тех, кто знаком с Fiddler, я пытаюсь подражать этой конфигурации HOSTS:

localhost:13000 dev.example.com:3000
localhost:23000 test.example.com:3000
localhost:33000 prod.example.com:3000

2 ответа

Решение

Используйте отдельный server блоки:

server {
    server_name dev.example.com;
    listen 3000;

    proxy_pass http://127.0.0.1:13000;
}

server {
    server_name test.example.com;
    listen 3000;

    proxy_pass http://127.0.0.1:23000;
}

И еще один для prod.example.com,

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

Используйте модуль карты:

http контекст:

map $http_host $proxy_target {
    "dev.example.com" "127.0.0.1:13000";
    "test.example.com" "127.0.0.1:23000";
    "prod.example.com" "127.0.0.1:33000";
}

server контекст:

proxy_pass $proxy_target;

Кроме того, вы можете попытаться дифференцировать только порт и использовать что-то вроде

proxy_pass 127.0.0.1:$proxy_port;

но я не уверен, сработает ли так.

Другие вопросы по тегам