ssl preread

This commit is contained in:
a.kazantsev 2026-07-10 19:59:55 +03:00
parent 131eace9f5
commit 303b552451
5 changed files with 221 additions and 0 deletions

View file

@ -0,0 +1,85 @@
# План добавления SSL preread map в роль nginx
## Описание задачи
Добавить поддержку создания stream-конфигураций с `ssl_preread` и `map` для маршрутизации TLS-трафика на основе SNI.
## Текущая структура
- `tasks/nginx-stream.yml` - импортирует конфигурацию stream
- `templates/nginx-stream.j2` - шаблон stream-конфигурации
- `defaults/main.yml` - переменная `nginx_streams` с примерами
## План реализации
### 1. Обновить шаблон `templates/nginx-stream.j2`
Добавить поддержку двух типов stream-конфигураций:
- **Обычный proxy** (текущий функционал)
- **SSL preread map** (новый функционал)
#### Для SSL preread map потребуется:
- `map` блок для сопоставления SNI-имён с upstream-ами
- `upstream` блоки для каждого target
- `server` блок с `ssl_preread on` и `proxy_pass $name`
### 2. Обновить `defaults/main.yml`
Добавить пример stream-конфигурации с ssl_preread:
```yaml
nginx_streams:
- stream: HTTPS_ssl_preread
listen_port: 443
type: ssl_preread
ssl_preread:
server_names:
- storagecat.ru: ocserv
default_target: https
upstreams:
- name: https
servers:
- 127.0.0.1:8443
- name: ocserv
servers:
- 127.0.0.1:9443
proxy_timeout: 4s
proxy_responses: 1
```
### 3. Обновить `tasks/nginx-stream.yml` (при необходимости)
Проверить, что задача корректно обрабатывает оба типа stream-конфигураций.
## Пример выходной конфигурации
```
# Ansible Managed: DO NOT EDIT
# Конфигурация для HTTPS_ssl_preread
map $ssl_preread_server_name $name {
storagecat.ru ocserv;
default https;
}
upstream https {
server 127.0.0.1:8443;
}
upstream ocserv {
server 127.0.0.1:9443;
}
server {
listen 443;
ssl_preread on;
proxy_protocol on;
proxy_pass $name;
proxy_timeout 4s;
proxy_responses 1;
}
```
## Шаги реализации
1. Создать новый шаблон `templates/nginx-stream-ssl-preread.j2`
2. Обновить `templates/nginx-stream.j2` для поддержки обоих типов
3. Добавить пример в `defaults/main.yml`
4. Протестировать на примере из `playbooks/vm-balancer.yml`
## Вопросы для уточнения
- [x] Формат данных: расширить текущую структуру nginx_streams
- [x] Обязательные параметры: server_names, upstream_name, default_target
- [x] Дополнительные параметры: proxy_timeout, proxy_responses, proxy_bind, proxy_connect_timeout

View file

@ -57,6 +57,26 @@
- 10.203.2.11:123 - 10.203.2.11:123
- 10.203.2.12:123 - 10.203.2.12:123
# Stream with SSL preread map
# - stream: HTTPS_ssl_preread
# listen_port: 443
# type: ssl_preread
# ssl_preread:
# ssl_preread: true
# proxy_protocol: true
# server_names:
# - storagecat.ru: ocserv
# default_target: https
# upstreams:
# - name: https
# servers:
# - 127.0.0.1:8443
# - name: ocserv
# servers:
# - 127.0.0.1:9443
# proxy_timeout: 4s
# proxy_responses: 1
nginx_virthosts: nginx_virthosts:
- virthost_name: gigacoms.ru - virthost_name: gigacoms.ru
listen: "80" listen: "80"

View file

@ -188,6 +188,31 @@ nginx_robots_disallowed_uris_list: []
# List any options here, ending with ; # List any options here, ending with ;
# #
nginx_streams: [] nginx_streams: []
# Stream example with SSL preread map
# nginx_streams:
# - stream: HTTPS_ssl_preread
# listen_port: 443
# type: ssl_preread
# ssl_preread:
# ssl_preread: true
# proxy_protocol: true
# server_names:
# - storagecat.ru: ocserv
# default_target: https
# upstreams:
# - name: https
# servers:
# - 127.0.0.1:8443
# - name: ocserv
# servers:
# - 127.0.0.1:9443
# proxy_timeout: 4s
# proxy_responses: 1
# proxy_connect_timeout: 30s
# responses: 1
# timeout: 4s
# connect_timeout: 30s
# Virtualhost example # Virtualhost example
nginx_virthosts: [] nginx_virthosts: []
# - virthost_name: '{{ ansible_fqdn }}' # - virthost_name: '{{ ansible_fqdn }}'

View file

@ -1,3 +1,52 @@
{% if item.type == 'ssl_preread' %}
# Ansible Managed: DO NOT EDIT
# Конфигурация для {{ item.stream }} (SSL preread)
{% if item.ssl_preread is defined and item.ssl_preread.server_names is defined %}
map $ssl_preread_server_name $name {
{% for mapping in item.ssl_preread.server_names %}
{% if mapping is string %}
{{ mapping }};
{% else %}
{% for hostname, target in mapping.items() %}
{{ hostname }} {{ target }};
{% endfor %}
{% endif %}
{% endfor %}
default {{ item.ssl_preread.default_target | default('https') }};
}
{% endif %}
{% if item.upstreams is defined %}
{% for upstream in item.upstreams %}
upstream {{ upstream.name }} {
{% for server in upstream.servers %}
server {{ server }};
{% endfor %}
}
{% endfor %}
{% endif %}
server {
listen {{ item.listen_port }};
{% if item.ssl_preread is defined and item.ssl_preread.ssl_preread | default(false) %}
ssl_preread on;
{% endif %}
{% if item.ssl_preread is defined and item.ssl_preread.proxy_protocol | default(false) %}
proxy_protocol on;
{% endif %}
proxy_pass $name;
{% if item.responses is defined %}
proxy_responses {{ item.responses }};
{% endif %}
{% if item.timeout is defined %}
proxy_timeout {{ item.timeout }};
{% endif %}
{% if item.connect_timeout is defined %}
proxy_connect_timeout {{ item.connect_timeout }};
{% endif %}
}
{% else %}
# Ansible Managed: DO NOT EDIT # Ansible Managed: DO NOT EDIT
# Конфигурация для {{ item.stream }} # Конфигурация для {{ item.stream }}
@ -24,3 +73,4 @@ server {
proxy_connect_timeout {{ item.connect_timeout }}; proxy_connect_timeout {{ item.connect_timeout }};
{% endif %} {% endif %}
} }
{% endif %}

41
test-nginx-stream.yml Normal file
View file

@ -0,0 +1,41 @@
---
- name: Test nginx stream template
hosts: localhost
gather_facts: false
vars:
nginx_streams:
- stream: HTTPS_ssl_preread
listen_port: 443
type: ssl_preread
ssl_preread:
ssl_preread: true
proxy_protocol: true
server_names:
- storagecat.ru: ocserv
default_target: https
upstreams:
- name: https
servers:
- 127.0.0.1:8443
- name: ocserv
servers:
- 127.0.0.1:9443
proxy_timeout: 4s
proxy_responses: 1
tasks:
- name: Render nginx stream template
ansible.builtin.template:
src: roles/nginx/templates/nginx-stream.j2
dest: /tmp/test-nginx-stream.conf
mode: '0644'
loop: "{{ nginx_streams }}"
loop_control:
loop_var: item
- name: Display rendered config
ansible.builtin.debug:
var: item
loop: "{{ nginx_streams }}"
loop_control:
loop_var: item