Skip to content

Commit e18e9d7

Browse files
authored
Add HTTP/3 support (#1531)
1 parent 358f546 commit e18e9d7

7 files changed

Lines changed: 49 additions & 2 deletions

File tree

group_vars/all/helpers.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ site_hosts: "{{ site_hosts_canonical | union(site_hosts_redirects) }}"
4040
multisite_subdomains_wildcards: "{{ item.value.multisite.subdomains | default(false) | ternary( site_hosts_canonical | map('regex_replace', '^(www\\.)?(.*)$', '*.\\2') | list, [] ) }}"
4141
ssl_enabled: "{{ item.value.ssl is defined and item.value.ssl.enabled | default(false) }}"
4242
cron_enabled: "{{ site_env.disable_wp_cron and (not item.value.multisite.enabled | default(false) or (item.value.multisite.enabled | default(false) and item.value.multisite.cron | default(true))) }}"
43-
sites_use_ssl: "{{ (wordpress_sites | select_sites('ssl.enabled', 'true') | length) > 0 }}"
43+
sites_using_ssl: "{{ wordpress_sites | dict2items | selectattr('value.ssl.enabled', 'equalto', true) | items2dict }}"
44+
first_site_using_ssl: "{{ (sites_using_ssl | dict2items | first | default(None, True)) }}"
45+
sites_use_ssl: "{{ sites_using_ssl | length > 0 }}"
4446

4547
composer_authentications: "{{ vault_wordpress_sites[site].composer_authentications | default([]) }}"
4648
# Default `type` is `http-basic`.

group_vars/all/security.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ ferm_input_list:
88
dport: [https]
99
filename: nginx_accept_https
1010
delete: "{{ not (sites_use_ssl | bool) }}"
11+
- type: dport_accept
12+
dport: ['443']
13+
protocol: udp
14+
filename: nginx_accept_http3
15+
delete: "{{ not (nginx_http3_enabled and (sites_use_ssl | bool)) }}"
1116
- type: dport_accept
1217
dport: [ssh]
1318
saddr: "{{ ip_whitelist }}"

roles/wordpress-setup/defaults/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ nginx_sites_confs:
88
enabled: false
99

1010
nginx_http2_enabled: true
11-
nginx_http3_enabled: false
11+
nginx_http3_enabled: true
1212

1313
# HSTS defaults
1414
nginx_hsts_max_age: 31536000

roles/wordpress-setup/tasks/nginx.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323

2424
- import_tasks: "{{ playbook_dir }}/roles/common/tasks/disable_challenge_sites.yml"
2525

26+
- name: Copy Nginx Wordpress site include folder
27+
copy:
28+
src: templates/includes
29+
dest: "{{ nginx_path }}"
30+
mode: '0755'
31+
notify: reload nginx
32+
2633
- name: Create Nginx available sites
2734
template:
2835
src: "{{ item.src }}"
@@ -68,6 +75,8 @@
6875
loop: "{{ wordpress_sites | dict2items }}"
6976
loop_control:
7077
label: "{{ item.key }}"
78+
vars:
79+
is_first_site_use_ssl: "{{ (first_site_using_ssl.key == item.key) if first_site_using_ssl else false }}"
7180
notify: reload nginx
7281
tags: nginx-includes
7382

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Add Alt-Svc header to negotiate HTTP/3.
2+
add_header alt-svc 'h3=":443"; ma=86400';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# QUIC transport (HTTP/3 specific)
2+
quic_retry on;
3+
quic_gso on;

roles/wordpress-setup/templates/wordpress-site.conf.j2

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ server {
66
{% block server_id -%}
77
listen {{ ssl_enabled | ternary('[::]:443 ssl', '[::]:80') }};
88
listen {{ ssl_enabled | ternary('443 ssl', '80') }};
9+
10+
{% if nginx_http3_enabled and ssl_enabled -%}
11+
# Listen on UDP for QUIC+HTTP/3
12+
listen [::]:443 quic{% if is_first_site_use_ssl %} reuseport{% endif -%};
13+
listen 443 quic{% if is_first_site_use_ssl %} reuseport{% endif -%};
14+
{% if is_first_site_use_ssl -%}# there has to be one listen quic directive with `reuseport` for working QUIC responses in current nginx version, using the first site.
15+
{% endif %}
16+
{% endif %}
17+
918
http2 {{ nginx_http2_enabled | default(false) | ternary('on', 'off') }};
1019
http3 {{ nginx_http3_enabled | default(false) | ternary('on', 'off') }};
1120
server_name {{ site_hosts_canonical | union(multisite_subdomains_wildcards) | join(' ') }};
@@ -35,6 +44,11 @@ server {
3544
sendfile off;
3645

3746
{% endif -%}
47+
48+
{% if nginx_http3_enabled and ssl_enabled -%}
49+
include includes/directive-only/quic-tune.conf;
50+
include includes/directive-only/http3-negotiate.conf;
51+
{% endif %}
3852
{% endblock -%}
3953

4054
{% block cache_conditions -%}
@@ -303,12 +317,24 @@ server {
303317
listen [::]:443 ssl;
304318
listen 443 ssl;
305319
{% endif -%}
320+
306321
listen [::]:80;
307322
listen 80;
323+
324+
{% if nginx_http3_enabled and ssl_enabled -%}
325+
# Listen on UDP for QUIC+HTTP/3
326+
listen [::]:443 quic;
327+
listen 443 quic;
328+
{% endif %}
329+
308330
http2 {{ nginx_http2_enabled | default(false) | ternary('on', 'off') }};
309331
http3 {{ nginx_http3_enabled | default(false) | ternary('on', 'off') }};
310332
server_name {{ host.redirects | join(' ') }};
311333

334+
{% if nginx_http3_enabled and ssl_enabled -%}
335+
include includes/directive-only/quic-tune.conf;
336+
{% endif %}
337+
312338
{{ self.https() -}}
313339

314340
{{ self.acme_challenge() -}}

0 commit comments

Comments
 (0)