ssl preread
This commit is contained in:
parent
131eace9f5
commit
303b552451
5 changed files with 221 additions and 0 deletions
85
.gigacode/plans/nginx-ssl-preread.md
Normal file
85
.gigacode/plans/nginx-ssl-preread.md
Normal 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
|
||||
|
|
@ -57,6 +57,26 @@
|
|||
- 10.203.2.11: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:
|
||||
- virthost_name: gigacoms.ru
|
||||
listen: "80"
|
||||
|
|
|
|||
|
|
@ -188,6 +188,31 @@ nginx_robots_disallowed_uris_list: []
|
|||
# List any options here, ending with ;
|
||||
#
|
||||
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
|
||||
nginx_virthosts: []
|
||||
# - virthost_name: '{{ ansible_fqdn }}'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
# Конфигурация для {{ item.stream }}
|
||||
|
||||
|
|
@ -24,3 +73,4 @@ server {
|
|||
proxy_connect_timeout {{ item.connect_timeout }};
|
||||
{% endif %}
|
||||
}
|
||||
{% endif %}
|
||||
|
|
|
|||
41
test-nginx-stream.yml
Normal file
41
test-nginx-stream.yml
Normal 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
|
||||
Loading…
Reference in a new issue