Назад | Перейти на главную страницу

Обратный прокси 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 одинаковых мест для статических файлов?

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

Возможно, вместо того, чтобы иметь много местоположений, вы могли бы использовать регулярное выражение для сопоставления определенного 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

У меня была связанная проблема, но моя была связана с контейнерами 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 для корректной работы.