Nginx инвертируют прокси во вложенных местоположениях

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

Моя исходная конфигурация - что-то вроде этого:

location /app1{
    ...
    proxy_pass http://127.0.0.1:8081/app1;
}

location /app2{
    ...
    proxy_pass http://127.0.0.1:8082/app2; 
}

...

Для добавления статических директив файла, я могу добавить вложенное местоположение к каждому местоположению как это:

location /app1{
    ...
    proxy_pass http://127.0.0.1:8081/app1;
    location ~* \.(css|js|ico|gif|jpg|jpeg|png)$ {
        expires 1d;
        ...
        proxy_pass http://127.0.0.1:8081;
    }
}

location /app2{
    ...
    proxy_pass http://127.0.0.1:8082/app2;
    location ~* \.(css|js|ico|gif|jpg|jpeg|png)$ {
        expires 1d;
        ...
        proxy_pass http://127.0.0.1:8082;
    }
}

Так как у меня есть что-то как 30 приложений, я пытаюсь упростить код до чего-то вроде этого:

location /app1{
    ...
    proxy_pass http://127.0.0.1:8081/app1;
    include static_file_config.conf;
}

location /app2{
    ...
    proxy_pass http://127.0.0.1:8081/app2;
    include static_file_config.conf;
}

Существует ли способ, которым я могу упростить код, таким образом, я не заканчиваю 30 идентичными местами для статических файлов?

Обратите внимание на то, что каждое приложение служит своим собственным статическим файлам.

3
задан 15 February 2015 в 14:46
2 ответа

Возможно, вместо того, чтобы иметь много местоположений, вы могли бы использовать регулярное выражение для сопоставления определенного URI с вашим вышестоящим приложением:

location ~ /(app)(\d+) {
   proxy_pass http://127.0.0.1:808$2/$1$2;
   include static_file_config.conf;
}

Вы можете увидеть, как это работает здесь: https: // regex101 .com / r / sM3eS9 / 1

3
ответ дан 3 December 2019 в 06:32

У меня была связанная проблема, но моя была связана с контейнерами Docker, и я решил ее, выполнив следующие действия:

server {
   listen       80;
   server_name  some_application_name;
   port_in_redirect off;
   location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:5555;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location /api {
            rewrite ^/api(.*)$ $1 break;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:5000;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}

Вышеуказанное имеет контейнер, работающий на 5555, и .NET Core Api, работающий на 5000, и я не хотел изменять маршруты в .NET api, поэтому переписывание гарантировало, что маршрут был правильным для API для корректной работы.

0
ответ дан 3 December 2019 в 06:32

Теги

Похожие вопросы