diff --git a/roles/archive_web/templates/nginx.d.conf.j2 b/roles/archive_web/templates/nginx.d.conf.j2
index 17e2beabc8e411e39dd41e0bcc25e482a12d898c..e1dda57f83ebabb53d263f0e67b04ed08beaa0d5 100644
--- a/roles/archive_web/templates/nginx.d.conf.j2
+++ b/roles/archive_web/templates/nginx.d.conf.j2
@@ -16,9 +16,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ archive_domain }};
 
     access_log   /var/log/nginx/{{ archive_domain }}/access.log reduced;
diff --git a/roles/archmanweb/templates/nginx.d.conf.j2 b/roles/archmanweb/templates/nginx.d.conf.j2
index 3c51fe125b053cc51ee0b48101e43dd4a838f9c0..b32e0c145119bd5edb124eaa650628397231c899 100644
--- a/roles/archmanweb/templates/nginx.d.conf.j2
+++ b/roles/archmanweb/templates/nginx.d.conf.j2
@@ -23,9 +23,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ archmanweb_domain }};
 
     access_log   /var/log/nginx/{{ archmanweb_domain }}/access.log reduced;
diff --git a/roles/archweb/templates/ipxe.archlinux.org.j2 b/roles/archweb/templates/ipxe.archlinux.org.j2
index dd6c6f374d165307ef596d2bc1549910bf6eabf2..956741ad0347173fe99e5a0921e0e18cac3d2533 100644
--- a/roles/archweb/templates/ipxe.archlinux.org.j2
+++ b/roles/archweb/templates/ipxe.archlinux.org.j2
@@ -16,9 +16,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ domain['domain_name'] }};
 
     access_log   /var/log/nginx/{{ archweb_domain }}/access.log reduced;
diff --git a/roles/archweb/templates/maintenance-nginx.d.conf.j2 b/roles/archweb/templates/maintenance-nginx.d.conf.j2
index e9f743772ac7276aa3b98853594f23d32c25e1e6..332fb120971c4eecba9f88377a8e40b3aab95089 100644
--- a/roles/archweb/templates/maintenance-nginx.d.conf.j2
+++ b/roles/archweb/templates/maintenance-nginx.d.conf.j2
@@ -21,9 +21,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ domain }};
 
     access_log   {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
@@ -60,9 +58,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ domain }};
 
     access_log   {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
@@ -98,9 +94,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ service_domain }};
 
     access_log   {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
diff --git a/roles/archweb/templates/nginx.d.conf.j2 b/roles/archweb/templates/nginx.d.conf.j2
index 186befa292592a4ae0d96ce462b63a49951608e9..284da1c4d2af597fb8a7f55140404b843ba581f8 100644
--- a/roles/archweb/templates/nginx.d.conf.j2
+++ b/roles/archweb/templates/nginx.d.conf.j2
@@ -54,9 +54,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ domain['domain'] }};
 
     access_log   /var/log/nginx/{{ archweb_domain }}/access.log reduced;
@@ -102,9 +100,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ archweb_domain }};
 
     access_log   /var/log/nginx/{{ archweb_domain }}/access.log reduced;
diff --git a/roles/archwiki/templates/nginx.d.conf.j2 b/roles/archwiki/templates/nginx.d.conf.j2
index 0be7fe3187b7254fdeb86c4466cec916dad46900..a886a16d9d0acbbbbb1e87186d4acb3b221e7985 100644
--- a/roles/archwiki/templates/nginx.d.conf.j2
+++ b/roles/archwiki/templates/nginx.d.conf.j2
@@ -59,9 +59,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ archwiki_domain }};
 
     access_log   /var/log/nginx/{{ archwiki_domain }}/access.log reduced;
diff --git a/roles/aurweb/templates/nginx.d.conf.j2 b/roles/aurweb/templates/nginx.d.conf.j2
index a594ef98c7e84e8e84ded8fafa3f3390589f80fe..cb8837584189ea8d9758cd1852570cea829d99ae 100644
--- a/roles/aurweb/templates/nginx.d.conf.j2
+++ b/roles/aurweb/templates/nginx.d.conf.j2
@@ -35,9 +35,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ aurweb_domain }};
 
     access_log   /var/log/nginx/{{ aurweb_domain }}/access.log main;
diff --git a/roles/dbscripts/templates/nginx.d.conf.j2 b/roles/dbscripts/templates/nginx.d.conf.j2
index 2943dcc82d224f4da4f9c79df96f2fe64366456d..86e349c02c88b40fb376957c9a91e60378af0c68 100644
--- a/roles/dbscripts/templates/nginx.d.conf.j2
+++ b/roles/dbscripts/templates/nginx.d.conf.j2
@@ -3,9 +3,7 @@ proxy_cache_path  /var/lib/nginx/cache levels=1:2 keys_zone=auth_cache:5m inacti
 server {
     listen       80;
     listen       [::]:80;
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ repos_domain }} {{repos_rsync_domain}};
     root         /srv/ftp;
 
diff --git a/roles/debuginfod/templates/nginx.d.conf.j2 b/roles/debuginfod/templates/nginx.d.conf.j2
index b9396f0867cb575cc95bb918c500cb128bcf3941..b5d7bb68dec4ee63bf3d5c4173485d681f785895 100644
--- a/roles/debuginfod/templates/nginx.d.conf.j2
+++ b/roles/debuginfod/templates/nginx.d.conf.j2
@@ -16,9 +16,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ debuginfod_domain }};
 
     access_log   /var/log/nginx/{{ debuginfod_domain }}/access.log reduced;
diff --git a/roles/fluxbb/templates/nginx.conf.j2 b/roles/fluxbb/templates/nginx.conf.j2
index 563cfb13e5c4dc0bd973bc5f375ec276bf804400..5701ef712dfcee6f8cb8b1f5362f0fcde07ffa51 100644
--- a/roles/fluxbb/templates/nginx.conf.j2
+++ b/roles/fluxbb/templates/nginx.conf.j2
@@ -23,9 +23,7 @@ limit_req_zone $binary_remote_addr zone=bbslimit:10m rate=10r/s;
 limit_req_status 429;
 
 server {
-    listen 443 ssl;
-    listen [::]:443 ssl;
-    http2  on;
+    include snippets/listen-443.conf;
     server_name {{ fluxbb_domain }};
     root {{ fluxbb_dir }};
     index index.php;
diff --git a/roles/grafana/templates/nginx.d.conf.j2 b/roles/grafana/templates/nginx.d.conf.j2
index 7a8583a0f27d0a2dabed37abbef5e7485aeb5ac1..288e9290f3cb14e483bb8dde988b13ede77b6e27 100644
--- a/roles/grafana/templates/nginx.d.conf.j2
+++ b/roles/grafana/templates/nginx.d.conf.j2
@@ -25,9 +25,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ grafana_domain }};
 
     access_log   /var/log/nginx/{{ grafana_domain }}/access.log main;
diff --git a/roles/hedgedoc/templates/nginx.d.conf.j2 b/roles/hedgedoc/templates/nginx.d.conf.j2
index d1257ce2a06ae1f20691714eb14f3c9b2698dddf..7c97d697419403225b214f32dfe26b562e21d03d 100644
--- a/roles/hedgedoc/templates/nginx.d.conf.j2
+++ b/roles/hedgedoc/templates/nginx.d.conf.j2
@@ -24,9 +24,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ hedgedoc_domain }};
 
     access_log   /var/log/nginx/{{ hedgedoc_domain }}/access.log main;
diff --git a/roles/keycloak/templates/nginx.d.conf.j2 b/roles/keycloak/templates/nginx.d.conf.j2
index 622e396c302004f581b7bfa4d3dd88f33823ff5a..d0e637be3da7633eac4d1080216727d443a81833 100644
--- a/roles/keycloak/templates/nginx.d.conf.j2
+++ b/roles/keycloak/templates/nginx.d.conf.j2
@@ -16,9 +16,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ keycloak_domain }};
 
     access_log   /var/log/nginx/{{ keycloak_domain }}/access.log reduced;
diff --git a/roles/mailman/templates/nginx.d.conf.j2 b/roles/mailman/templates/nginx.d.conf.j2
index eceb66e002ae67e2c7864f5299e1aab942ef14a4..e9b3016cf64c2d4be61ed32140594d3962df7e58 100644
--- a/roles/mailman/templates/nginx.d.conf.j2
+++ b/roles/mailman/templates/nginx.d.conf.j2
@@ -35,9 +35,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ lists_domain }};
 
     access_log   /var/log/nginx/{{ lists_domain }}/access.log main;
diff --git a/roles/maintenance/templates/nginx-maintenance.conf.j2 b/roles/maintenance/templates/nginx-maintenance.conf.j2
index 2493c1b78c2c3b9d177d36e23d6137ae6b2da86d..b4ab855180e9feea80ba9f187bd4f8deb688b106 100644
--- a/roles/maintenance/templates/nginx-maintenance.conf.j2
+++ b/roles/maintenance/templates/nginx-maintenance.conf.j2
@@ -17,9 +17,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ domain }};
 
     access_log   {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
@@ -56,9 +54,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ domain }};
 
     access_log   {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
@@ -94,9 +90,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ service_domain }};
 
     access_log   {{ maintenance_logs_dir }}/{{ service_domain }}-access.log reduced;
diff --git a/roles/matrix/templates/nginx.d.conf.j2 b/roles/matrix/templates/nginx.d.conf.j2
index 85fdc500f40a4f48dfefc05a57a557e8affca11f..d2dc9ac556f1cff68f1b401d040fd0caa8fc531d 100644
--- a/roles/matrix/templates/nginx.d.conf.j2
+++ b/roles/matrix/templates/nginx.d.conf.j2
@@ -22,9 +22,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ matrix_domain }};
 
     access_log   /var/log/nginx/{{ matrix_domain }}/access.log reduced;
diff --git a/roles/mirrorsync/templates/nginx.d.conf.j2 b/roles/mirrorsync/templates/nginx.d.conf.j2
index 4eb9cd844612f9fc117f0bd73264937b5d019298..26bd998948b50c81ca87599339219a0ec64b2740 100644
--- a/roles/mirrorsync/templates/nginx.d.conf.j2
+++ b/roles/mirrorsync/templates/nginx.d.conf.j2
@@ -1,9 +1,7 @@
 server {
     listen       80;
     listen       [::]:80;
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ item.value.mirror_domain }};
     root         {{ item.value.target }};
 
diff --git a/roles/mta_sts/templates/nginx.d.conf.j2 b/roles/mta_sts/templates/nginx.d.conf.j2
index abdced5403433f8cc54c83827c82f3db3573f6c0..992e529a8d53803d9a71aa919314ec0d6e511f87 100644
--- a/roles/mta_sts/templates/nginx.d.conf.j2
+++ b/roles/mta_sts/templates/nginx.d.conf.j2
@@ -18,9 +18,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  mta-sts.{{ config.domains | join(' mta-sts.') }};
 
     access_log   /var/log/nginx/{{ domain }}/access.log reduced;
diff --git a/roles/nginx/defaults/main.yml b/roles/nginx/defaults/main.yml
index 19c93170904d037bfed234b948aed519d90bea85..abc8e3ba7179f2ee1b27bea8bb80d6f1e35d1b04 100644
--- a/roles/nginx/defaults/main.yml
+++ b/roles/nginx/defaults/main.yml
@@ -1,3 +1,4 @@
 letsencrypt_validation_dir: "/var/lib/letsencrypt"
 nginx_firewall_zone:
 nginx_extra_modules: []
+nginx_enable_http3: false
diff --git a/roles/nginx/tasks/main.yml b/roles/nginx/tasks/main.yml
index 1129b280c9319ffaebe38f6529c5853fd7f125f6..5c0420f86e4cc17a2e55843907641d2902c7b21c 100644
--- a/roles/nginx/tasks/main.yml
+++ b/roles/nginx/tasks/main.yml
@@ -19,11 +19,12 @@
     - snippets
 
 - name: Copy snippets
-  template: src={{ item }} dest=/etc/nginx/snippets owner=root group=root mode=0644
+  template: src={{ item }} dest=/etc/nginx/snippets/{{ item | regex_replace('\\.j2$', '') }} owner=root group=root mode=0644
   with_items:
     - letsencrypt.conf
     - sslsettings.conf
     - headers.conf
+    - listen-443.conf.j2
   notify:
     - Reload nginx
 
@@ -66,6 +67,7 @@
   with_items:
     - http
     - https
+    - "{{ 'http3' if nginx_enable_http3 else omit }}"
   when: configure_firewall
   tags:
     - firewall
diff --git a/roles/nginx/templates/headers.conf b/roles/nginx/templates/headers.conf
index d427430373b3ebda009fe5518b3cee417e34ae1b..9e3a1eff3b4d0b235ec17f4e3ef66ef51b83b530 100644
--- a/roles/nginx/templates/headers.conf
+++ b/roles/nginx/templates/headers.conf
@@ -1 +1,4 @@
 add_header Strict-Transport-Security $hsts_header always;
+{% if nginx_enable_http3 %}
+add_header Alt-Svc $alt_svc_header always;
+{% endif %}
diff --git a/roles/nginx/templates/listen-443.conf.j2 b/roles/nginx/templates/listen-443.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..2dd4cfdce63ce7f2c2d4ca91be9235b8c5f76694
--- /dev/null
+++ b/roles/nginx/templates/listen-443.conf.j2
@@ -0,0 +1,7 @@
+listen 443 ssl;
+listen [::]:443 ssl;
+{% if nginx_enable_http3 %}
+listen 443 quic;
+listen [::]:443 quic;
+{% endif %}
+http2  on;
diff --git a/roles/nginx/templates/nginx-hostname-vhost.conf.j2 b/roles/nginx/templates/nginx-hostname-vhost.conf.j2
index b34be7a88af4d83a06a17f7bbe66d9012ad0d240..e19d6d6342022a438f61ff8b068f663ec22d85cc 100644
--- a/roles/nginx/templates/nginx-hostname-vhost.conf.j2
+++ b/roles/nginx/templates/nginx-hostname-vhost.conf.j2
@@ -1,6 +1,14 @@
 server {
     listen       80 default_server;
     listen       [::]:80 default_server;
+    listen       443 default_server ssl;
+    listen       [::]:443 default_server ssl;
+{% if nginx_enable_http3 %}
+    listen       443 default_server quic reuseport;
+    listen       [::]:443 default_server quic reuseport;
+{% endif %}
+    http2        on;
+    ssl_reject_handshake on;
     root         /srv/http;
 
     include snippets/letsencrypt.conf;
diff --git a/roles/nginx/templates/nginx.conf.j2 b/roles/nginx/templates/nginx.conf.j2
index 29ba71416fae23b104ce8fb717a9387456a74c4d..2a075eebf293a837af43ef1ba9836e0523dabf46 100644
--- a/roles/nginx/templates/nginx.conf.j2
+++ b/roles/nginx/templates/nginx.conf.j2
@@ -27,12 +27,13 @@ http {
     log_format main
         '$remote_addr $host $remote_user [$time_local] "$request" '
         '$status $body_bytes_sent "$http_referer" '
-        '"$http_user_agent" "$http_x_forwarded_for" $request_time';
+        '"$http_user_agent" "$http_x_forwarded_for" $request_time'
+        '$server_protocol';
 
     log_format reduced
         '$host [$time_local] "$request" '
         '$status $body_bytes_sent "$http_referer" '
-        '"$http_user_agent"';
+        '"$http_user_agent" $server_protocol';
 
     log_format json_main escape=json
         '{'
@@ -48,6 +49,7 @@ http {
         '"http_user_agent":"$http_user_agent",'
         '"http_x_forwarded_for":"$http_x_forwarded_for",'
         '"request_time":"$request_time",'
+        '"server_protocol":"$server_protocol",'
         # This was added to keep every log line unique as Loki drops
         # log line with the same timestamp and log text:
         # https://grafana.com/docs/loki/latest/overview/#timestamp-ordering
@@ -65,6 +67,7 @@ http {
         '"body_bytes_sent":"$body_bytes_sent",'
         '"http_referrer":"$http_referer",'
         '"http_user_agent":"$http_user_agent",'
+        '"server_protocol":"$server_protocol",'
         # This was added to keep every log line unique as Loki drops
         # log line with the same timestamp and log text:
         # https://grafana.com/docs/loki/latest/overview/#timestamp-ordering
diff --git a/roles/nginx/templates/sslsettings.conf b/roles/nginx/templates/sslsettings.conf
index 43d7f9382c2f6af3c3e81d6f7d4d6f689cceabc3..2f4352027a326b8303377054ec18a8b5280cad81 100644
--- a/roles/nginx/templates/sslsettings.conf
+++ b/roles/nginx/templates/sslsettings.conf
@@ -18,4 +18,17 @@ map $scheme $hsts_header {
     https   "max-age=31536000; includeSubdomains; preload";
 }
 
+{% if nginx_enable_http3 %}
+# Chrome, Firefox and curl only use the header from secure origins.
+# https://issues.chromium.org/issues/40471032
+# https://bugzilla.mozilla.org/show_bug.cgi?id=1730935
+# https://everything.curl.dev/libcurl-http/alt-svc.html
+# See headers.conf for the Alt-Svc add_header line.
+map $scheme $alt_svc_header {
+    # Keep a low max-age for HTTP/3 while testing.
+    # Bump to 2592000 when we are done testing.
+    https   'h3=":443"; ma=3600';
+}
+
+{% endif %}
 resolver 127.0.0.53;
diff --git a/roles/ping/templates/nginx.d.conf.j2 b/roles/ping/templates/nginx.d.conf.j2
index ea37574269ba60617c953c0997f5e3bcf8c524c3..d794023a9f7d5f07c0e043662d04ae31bbd33c70 100644
--- a/roles/ping/templates/nginx.d.conf.j2
+++ b/roles/ping/templates/nginx.d.conf.j2
@@ -2,9 +2,7 @@ server {
     # We don't redirect to HTTPS because a redirect is considered a captive portal.
     listen       80;
     listen       [::]:80;
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ ping_domain }};
 
     access_log   /var/log/nginx/{{ ping_domain }}/access.log reduced;
diff --git a/roles/public_html/templates/nginx.d.conf.j2 b/roles/public_html/templates/nginx.d.conf.j2
index 619ad61e357c04623cd1fee306f3c2171383164d..d795444f26ae9e0c828ee774a0642f28fac21797 100644
--- a/roles/public_html/templates/nginx.d.conf.j2
+++ b/roles/public_html/templates/nginx.d.conf.j2
@@ -17,9 +17,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ public_domain }} www.{{ public_domain }};
     root         /srv/public_html;
 
diff --git a/roles/rebuilderd/templates/nginx.d.conf.j2 b/roles/rebuilderd/templates/nginx.d.conf.j2
index bd4cc6c5a15f1e21b8d6bf1244cbb1b83fed283c..a743e78f2101fb397c970e9fa20dbe287b9d8e0c 100644
--- a/roles/rebuilderd/templates/nginx.d.conf.j2
+++ b/roles/rebuilderd/templates/nginx.d.conf.j2
@@ -16,9 +16,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ rebuilderd_domain }};
 
     access_log   /var/log/nginx/{{ rebuilderd_domain }}/access.log reduced;
diff --git a/roles/redirects/templates/nginx.d.conf.j2 b/roles/redirects/templates/nginx.d.conf.j2
index 99bd9db9dbd1cb782914cb85e7d3379d338ad0a4..8e4cf884987406ed461a8420dc4d1442dd53b27a 100644
--- a/roles/redirects/templates/nginx.d.conf.j2
+++ b/roles/redirects/templates/nginx.d.conf.j2
@@ -9,9 +9,7 @@ map $uri ${{ redirect.map | hash('md5') }} {
 server {
     listen       80;
     listen       [::]:80;
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ redirect.domain }};
 
     access_log   /var/log/nginx/{{ redirect.domain }}/access.log reduced;
diff --git a/roles/repo_archive_split_temp/templates/nginx.d.conf.j2 b/roles/repo_archive_split_temp/templates/nginx.d.conf.j2
index 0418761bae093ed9fef7573be7c9e82aa89f7ac3..5b8114b7da569b229aac1c82663a961bd4652436 100644
--- a/roles/repo_archive_split_temp/templates/nginx.d.conf.j2
+++ b/roles/repo_archive_split_temp/templates/nginx.d.conf.j2
@@ -1,9 +1,7 @@
 server {
     listen       80;
     listen       [::]:80;
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ repos_rsync_domain }};
     root         /srv/ftp;
 
diff --git a/roles/security_tracker/templates/nginx.d.conf.j2 b/roles/security_tracker/templates/nginx.d.conf.j2
index d96a29a245a0723112b2ae7444647db1e2efcf80..6eeddfdb8b937eb79e53b2ad638c493226e802c3 100644
--- a/roles/security_tracker/templates/nginx.d.conf.j2
+++ b/roles/security_tracker/templates/nginx.d.conf.j2
@@ -29,9 +29,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ security_tracker_domain }};
 
     access_log   /var/log/nginx/{{ security_tracker_domain }}/access.log reduced;
diff --git a/roles/sources/templates/nginx.d.conf.j2 b/roles/sources/templates/nginx.d.conf.j2
index 4420e20792ceee3d5183db59f3be73586a8cd9ed..3c7cdc6f530f1570b579ea542435354e0fafbc3c 100644
--- a/roles/sources/templates/nginx.d.conf.j2
+++ b/roles/sources/templates/nginx.d.conf.j2
@@ -16,9 +16,7 @@ server {
 }
 
 server {
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ sources_domain }};
 
     access_log   /var/log/nginx/{{ sources_domain }}/access.log reduced;
diff --git a/roles/syncrepo/templates/nginx.d.conf.j2 b/roles/syncrepo/templates/nginx.d.conf.j2
index c5743639e531a6341ce45b8f06a291d46b6e9137..d164c1f594aceeb306aa646a39c9b0bfa143e881 100644
--- a/roles/syncrepo/templates/nginx.d.conf.j2
+++ b/roles/syncrepo/templates/nginx.d.conf.j2
@@ -2,9 +2,7 @@
 server {
     listen       80;
     listen       [::]:80;
-    listen       443 ssl;
-    listen       [::]:443 ssl;
-    http2        on;
+    include      snippets/listen-443.conf;
     server_name  {{ domain }};
     root         /srv/ftp;