Как настроить проксирование нескольких служб через Nginx?

Здравствуйте! <br/> <br/> У меня есть конфигурационный файл, который предназначен для настройки сервиса MARZBAN с использованием SSL. Я хотел бы добавить новые сервисы, такие как Grafana, однако возникла проблема, так как она также использует пути вида /api, что вызывает конфликт. <br/> Как мне можно решить эту проблему? <br/> <br/> <pre><code>server {
    listen 443 ssl http2;
    server_name api.test.org;

    ssl_certificate /var/lib/marzban/certs/fullchain.pem;
    ssl_certificate_key /var/lib/marzban/certs/key.pem;

    # General proxy settings for dashboard, API, docs, etc.
    location ~* /(dashboard|api|docs|redoc|openapi.json|statics|sub) {
        proxy_pass http://127.0.0.1:8000;
        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 Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # Proxy settings for Grafana
    location /grafana/ {
        proxy_pass http://127.0.0.1:3000/;
        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_redirect default;
    }
}</code></pre>
  • 21 января 2025 г. 2:04
Ответы на вопрос 2
Ваша конфигурация Nginx настроена на проксирование нескольких служб, но так как оба сервиса используют пути `/api`, вам нужно изменить маршрутизацию так, чтобы она не конфликтовала. 

Вот рекомендуемый подход:

1. Измените пути для каждой службы, чтобы они не конфликтовали. Например, вы можете переименовать путь для Grafana на `/grafana/`, как вы уже сделали, и добавить путь для API Marzban, например, на `/marzban/api/`.

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

```nginx
server {
    listen 443 ssl http2;
    server_name api.test.org;

    ssl_certificate /var/lib/marzban/certs/fullchain.pem;
    ssl_certificate_key /var/lib/marzban/certs/key.pem;

    # General proxy settings for Marzban
    location ~* /(dashboard|api|docs|redoc|openapi.json|statics|sub) {
        proxy_pass http://127.0.0.1:8000;
        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 Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    # Proxy settings for Grafana
    location /grafana/ {
        proxy_pass http://127.0.0.1:3000/;
        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_redirect default;
    }
}
```

3. Обратите внимание на то, что для Grafana вам нужно удостовериться, что она правильно обрабатывает префикс `/grafana/`. Настройте Grafana на использование этого префикса при ее конфигурации. Для этого в `grafana.ini` необходимо указать:

```ini
[server]
root_url = %(protocol)s://%(Domain)s:%(HTTP_PORT)s/grafana/
```

Таким образом, Grafana будет ожидать, что запросы идут по пути `/grafana/...`, и все будет работать корректно.

Если у вас есть еще службы, добавляйте их аналогично, выбирая уникальные пути для каждой службы, чтобы избежать конфликтов.
Либо настроить Графану на работу внутри /grafana (и остальные сервисы аналогично), либо разнести по отдельным поддоменам. Рекомендую последнее.
Похожие вопросы