Update docs
This commit is contained in:
parent
ee35b61ded
commit
79a6814d4e
3 changed files with 95 additions and 6 deletions
|
|
@ -163,6 +163,7 @@ waf-host-02 | instance-c
|
||||||
- fail_timeout # Время восстановления сервера (дефолт 15с)
|
- fail_timeout # Время восстановления сервера (дефолт 15с)
|
||||||
- balancing_method # Метод балансировки: least_conn, ip_hash, random и др.
|
- balancing_method # Метод балансировки: least_conn, ip_hash, random и др.
|
||||||
- proxy_next_upstream_codes # HTTP-коды для proxy_next_upstream (дефолт: 500,502,503,504)
|
- proxy_next_upstream_codes # HTTP-коды для proxy_next_upstream (дефолт: 500,502,503,504)
|
||||||
|
- x_sid_check # Маршрутизация в Angie по X-Sid заголовку (дефолт: false)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Таблица `sp_info` (кэш API данных)
|
#### Таблица `sp_info` (кэш API данных)
|
||||||
|
|
@ -558,7 +559,69 @@ proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Именование контейнеров
|
## Маршрутизация по X-Sid
|
||||||
|
|
||||||
|
### Проблема
|
||||||
|
|
||||||
|
Когда два разных тенанта WAF имеют одинаковый FQDN — возникает конфликт:
|
||||||
|
- На уровне Angie: два server-блока с одинаковым `server_name` — Angie выберет первый
|
||||||
|
- На уровне nginx внутри контейнера: два server-блока с одинаковым `server_name` — nginx выберет первый
|
||||||
|
|
||||||
|
### Решение
|
||||||
|
|
||||||
|
Используется комбинация двух механизмов:
|
||||||
|
|
||||||
|
**1. `x_sid_check = true` в `apps_settings` — решает проблему на уровне Angie:**
|
||||||
|
|
||||||
|
Вместо `server_name domain.ru` генерируется `server_name _` и map блок:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
map $http_x_sid $x_sid_upstream_https_443 {
|
||||||
|
default "";
|
||||||
|
"10111" "secure10111_443_domain.ru";
|
||||||
|
"10112" "secure10112_443_domain.ru";
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name _;
|
||||||
|
location / {
|
||||||
|
if ($x_sid_upstream_https_443 = "") { return 444; }
|
||||||
|
proxy_pass http://$x_sid_upstream_https_443;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Клиент должен передавать заголовок `X-Sid: {l7ResourceID}` в каждом запросе.
|
||||||
|
|
||||||
|
**Ограничения `x_sid_check`:**
|
||||||
|
- `proxy_pass` с переменной не использует keepalive пул upstream
|
||||||
|
- max_fails/fail_timeout для контейнера не работают
|
||||||
|
- Для Angie → контейнер (`127.0.0.1`) это некритично
|
||||||
|
|
||||||
|
**2. Блочный режим (`one_container = false`) — решает проблему внутри контейнера:**
|
||||||
|
|
||||||
|
Конфликтующие SID разносятся по разным контейнерам. Каждый контейнер содержит только свои SID — конфликта server_name внутри контейнера нет.
|
||||||
|
|
||||||
|
При блочном режиме также генерируются отдельные Angie конфиги:
|
||||||
|
- `angie-ptaf-{clientTitle}_block1.conf` — SID блока 1
|
||||||
|
- `angie-ptaf-{clientTitle}_block2.conf` — SID блока 2
|
||||||
|
|
||||||
|
Если FQDN одинаковый в разных блоках — нужно включить `x_sid_check = true` для этих ресурсов чтобы Angie корректно маршрутизировал между блоками.
|
||||||
|
|
||||||
|
### Итоговая схема при одинаковых FQDN
|
||||||
|
|
||||||
|
```
|
||||||
|
x_sid_check = true + one_container = false + sid_block
|
||||||
|
|
||||||
|
Клиент (X-Sid: 10111, Host: domain.ru)
|
||||||
|
→ Angie: map[$http_x_sid] → upstream блока 1 → контейнер block1
|
||||||
|
→ nginx block1: server_name domain.ru → upstream к origin тенанта 1
|
||||||
|
|
||||||
|
Клиент (X-Sid: 10112, Host: domain.ru)
|
||||||
|
→ Angie: map[$http_x_sid] → upstream блока 2 → контейнер block2
|
||||||
|
→ nginx block2: server_name domain.ru → upstream к origin тенанта 2
|
||||||
|
```
|
||||||
|
|
||||||
Имя Docker-контейнера формируется динамически на основе hostname хоста:
|
Имя Docker-контейнера формируется динамически на основе hostname хоста:
|
||||||
|
|
||||||
|
|
@ -810,7 +873,16 @@ UPDATE client_info SET shm_size = 8 WHERE client_title = 'CLIENT001';
|
||||||
UPDATE apps_settings SET balancing_method = 'least_conn' WHERE l7resourceid = 12345;
|
UPDATE apps_settings SET balancing_method = 'least_conn' WHERE l7resourceid = 12345;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Включить блочный режим (разбивка SID по контейнерам)
|
### Включить маршрутизацию по X-Sid для ресурса
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Включить x_sid_check для конкретного ресурса
|
||||||
|
UPDATE apps_settings
|
||||||
|
SET x_sid_check = true
|
||||||
|
WHERE l7resourceid = 10111;
|
||||||
|
```
|
||||||
|
|
||||||
|
Клиент должен передавать заголовок `X-Sid: 10111` в каждом запросе.
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
-- Три блока SID, каждый в своём наборе контейнеров
|
-- Три блока SID, каждый в своём наборе контейнеров
|
||||||
|
|
|
||||||
|
|
@ -314,6 +314,7 @@ WHERE client_title = 'CLIENT001';
|
||||||
| `fail_timeout` | INTEGER | Время восстановления сервера (сек) | `15` |
|
| `fail_timeout` | INTEGER | Время восстановления сервера (сек) | `15` |
|
||||||
| `balancing_method` | TEXT | Метод балансировки upstream | `NULL` |
|
| `balancing_method` | TEXT | Метод балансировки upstream | `NULL` |
|
||||||
| `proxy_next_upstream_codes` | TEXT | HTTP-коды для proxy_next_upstream | `'500,502,503,504'` |
|
| `proxy_next_upstream_codes` | TEXT | HTTP-коды для proxy_next_upstream | `'500,502,503,504'` |
|
||||||
|
| `x_sid_check` | BOOLEAN | Маршрутизация в Angie по X-Sid заголовку | `false` |
|
||||||
|
|
||||||
### Используемые запросы
|
### Используемые запросы
|
||||||
|
|
||||||
|
|
@ -345,7 +346,8 @@ SELECT
|
||||||
max_fails,
|
max_fails,
|
||||||
fail_timeout,
|
fail_timeout,
|
||||||
balancing_method,
|
balancing_method,
|
||||||
proxy_next_upstream_codes
|
proxy_next_upstream_codes,
|
||||||
|
x_sid_check
|
||||||
FROM apps_settings
|
FROM apps_settings
|
||||||
WHERE client_title = $1
|
WHERE client_title = $1
|
||||||
ORDER BY l7resourceid ASC;
|
ORDER BY l7resourceid ASC;
|
||||||
|
|
@ -364,6 +366,9 @@ ALTER TABLE apps_settings
|
||||||
|
|
||||||
ALTER TABLE apps_settings
|
ALTER TABLE apps_settings
|
||||||
ADD COLUMN IF NOT EXISTS proxy_next_upstream_codes TEXT DEFAULT '500,502,503,504';
|
ADD COLUMN IF NOT EXISTS proxy_next_upstream_codes TEXT DEFAULT '500,502,503,504';
|
||||||
|
|
||||||
|
ALTER TABLE apps_settings
|
||||||
|
ADD COLUMN IF NOT EXISTS x_sid_check BOOLEAN DEFAULT FALSE;
|
||||||
```
|
```
|
||||||
|
|
||||||
### Кастомные поля (подробно)
|
### Кастомные поля (подробно)
|
||||||
|
|
@ -403,7 +408,16 @@ WHERE l7resourceid = 12345;
|
||||||
proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
|
proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;
|
||||||
```
|
```
|
||||||
|
|
||||||
#### upstream_angie_custom / upstream_nginx_custom
|
#### x_sid_check
|
||||||
|
|
||||||
|
При `true` — Angie маршрутизирует запросы по заголовку `X-Sid` вместо `server_name`. Используется когда один и тот же FQDN присутствует в разных тенантах WAF. В связке с блочным режимом (`one_container = false`) даёт полное решение проблемы конфликта FQDN.
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Включить маршрутизацию по X-Sid для ресурса
|
||||||
|
UPDATE apps_settings SET x_sid_check = true WHERE l7resourceid = 10111;
|
||||||
|
```
|
||||||
|
|
||||||
|
Клиент должен передавать заголовок `X-Sid: {l7resourceid}` в каждом запросе.
|
||||||
|
|
||||||
**Режим:** REPLACE (полная замена keepalive директив)
|
**Режим:** REPLACE (полная замена keepalive директив)
|
||||||
|
|
||||||
|
|
@ -641,6 +655,9 @@ SELECT client_title FROM client_info WHERE debug = true;
|
||||||
-- Клиенты с индивидуальным образом
|
-- Клиенты с индивидуальным образом
|
||||||
SELECT client_title, docker_image FROM client_info WHERE docker_image IS NOT NULL;
|
SELECT client_title, docker_image FROM client_info WHERE docker_image IS NOT NULL;
|
||||||
|
|
||||||
|
-- Ресурсы с маршрутизацией по X-Sid
|
||||||
|
SELECT client_title, l7resourceid FROM apps_settings WHERE x_sid_check = true;
|
||||||
|
|
||||||
-- Клиенты в блочном режиме
|
-- Клиенты в блочном режиме
|
||||||
SELECT client_title, sid_block FROM client_info WHERE one_container = false;
|
SELECT client_title, sid_block FROM client_info WHERE one_container = false;
|
||||||
|
|
||||||
|
|
|
||||||
4
nginx.go
4
nginx.go
|
|
@ -525,7 +525,7 @@ func writeNginxStandardSettings(f *os.File, customDirectives string, proxyNextUp
|
||||||
f.WriteString(fmt.Sprintf(" proxy_next_upstream %s;\n", proxyNextUpstream))
|
f.WriteString(fmt.Sprintf(" proxy_next_upstream %s;\n", proxyNextUpstream))
|
||||||
f.WriteString(" proxy_http_version 1.1;\n")
|
f.WriteString(" proxy_http_version 1.1;\n")
|
||||||
f.WriteString("\n")
|
f.WriteString("\n")
|
||||||
f.WriteString(" #proxy_set_header X-Real-IP $remote_addr;\n")
|
f.WriteString(" proxy_set_header X-Real-IP $remote_addr;\n")
|
||||||
f.WriteString(" proxy_set_header X-Forwarded-For $remote_addr;\n")
|
f.WriteString(" proxy_set_header X-Forwarded-For $remote_addr;\n")
|
||||||
f.WriteString(" proxy_set_header Connection $proxy_connection;\n")
|
f.WriteString(" proxy_set_header Connection $proxy_connection;\n")
|
||||||
f.WriteString(" proxy_set_header Upgrade $http_upgrade;\n")
|
f.WriteString(" proxy_set_header Upgrade $http_upgrade;\n")
|
||||||
|
|
@ -980,4 +980,4 @@ func generateCustomServerBlock(f *os.File, res ResourceData, block CustomServerB
|
||||||
f.WriteString(fmt.Sprintf(" proxy_pass %s://%s;\n", protocol, upstreamName))
|
f.WriteString(fmt.Sprintf(" proxy_pass %s://%s;\n", protocol, upstreamName))
|
||||||
f.WriteString(" }\n")
|
f.WriteString(" }\n")
|
||||||
f.WriteString("}\n\n")
|
f.WriteString("}\n\n")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue