kuchkovsky/nginx-quic-webdav

By kuchkovsky

Updated 5 days ago

Full-featured mainline nginx with QUIC/HTTP3, SSL, aio, stream, WebDAV + dav-ext, Brotli, GeoIP2

Image
Networking
API management
Web servers
0

2.4K

kuchkovsky/nginx-quic-webdav repository overview

nginx-quic-webdav

A full-featured mainline nginx built from source with QUIC & HTTP/3, WebDAV, and a curated set of commonly used modules for reverse-proxy and media workloads.

This image includes WebDAV via ngx_http_dav_module plus dav-ext with a patch for proper hidden-file support (useful for clients that rely on correct behavior around dotfiles). The dav-ext module comes from my fork (credits to @mid1221213):

Fork (snapshot):      https://github.com/kuchkovsky/nginx-dav-ext-module
Upstream (original):  https://github.com/mid1221213/nginx-dav-ext-module

Included modules and build options

Core build options:
- --with-compat
- --with-debug
- --with-pcre-jit
- --with-threads
- --with-file-aio

HTTP (built-in):
- --with-http_ssl_module
- --with-http_v2_module
- --with-http_v3_module
- --with-http_realip_module
- --with-http_dav_module
- --with-http_stub_status_module
- --with-http_auth_request_module
- --with-http_slice_module
- --with-http_addition_module
- --with-http_flv_module
- --with-http_gunzip_module
- --with-http_gzip_static_module
- --with-http_mp4_module
- --with-http_random_index_module
- --with-http_secure_link_module
- --with-http_sub_module

Note:
- gRPC and upstream zone are built-in by default in nginx mainline (no --with flags).

Stream/Mail (dynamic built-in):
- --with-stream=dynamic
- --with-stream_ssl_module
- --with-stream_ssl_preread_module
- --with-stream_realip_module
- --with-mail=dynamic
- --with-mail_ssl_module

Dynamic built-in HTTP modules:
- --with-http_image_filter_module=dynamic
- --with-http_perl_module=dynamic
- --with-http_xslt_module=dynamic

Third-party modules:
- dav-ext (static): nginx-dav-ext-module (fork linked above)
- Brotli (dynamic): ngx_brotli
- GeoIP2 (dynamic): ngx_http_geoip2_module (MaxMind DB)
- Headers-More (dynamic): headers-more-nginx-module

Loading dynamic modules

Dynamic modules are shipped as .so files under /usr/lib/nginx/modules. They are not active until you load them near the top of nginx.conf:

# You can load the modules either directly near the top of nginx.conf,
# or by placing small *.conf files with these load_module lines into:
#   /etc/nginx/modules-enabled/
# (and including that directory from nginx.conf).
# 
# Load only the modules you use.
#
# Note: load_module directives must be evaluated before "http { }", "stream { }", etc.

# Brotli compression (HTTP)
load_module /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so;
load_module /usr/lib/nginx/modules/ngx_http_brotli_static_module.so;

# GeoIP2 (MaxMind DB based geo lookup for HTTP)
load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so;

# headers-more (add/clear/replace response/request headers beyond built-ins)
load_module /usr/lib/nginx/modules/ngx_http_headers_more_filter_module.so;

# Built-in dynamic HTTP modules
load_module /usr/lib/nginx/modules/ngx_http_image_filter_module.so;
load_module /usr/lib/nginx/modules/ngx_http_xslt_filter_module.so;
load_module /usr/lib/nginx/modules/ngx_http_perl_module.so;

# Built-in dynamic core modules (stream/mail)
load_module /usr/lib/nginx/modules/ngx_stream_module.so;
load_module /usr/lib/nginx/modules/ngx_mail_module.so;

If you do not need a feature, do not load its module.

Quick start

CLI

Default container config exposes HTTP on port 80. Quick test:

docker run --rm -p 8080:80 --name nginx-test kuchkovsky/nginx-quic-webdav:latest

Test:

curl -i http://localhost:8080/
Docker Compose
services:
  nginx:
    image: kuchkovsky/nginx-quic-webdav:latest
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80/tcp"
      - "443:443/tcp"
      - "443:443/udp"
    volumes:
      - ./config:/etc/nginx:ro
      - ./log:/var/log/nginx:rw

Start:

docker compose up -d
docker compose logs -f

Notes

  • HTTP/3 is QUIC over UDP, so you must publish 443/udp (or use host networking).
  • --with-debug does not enable debug logs by default. To enable debug logging, set error_log ... debug; in nginx.conf.
  • GeoIP2 requires a MaxMind .mmdb and geoip2 directives. The module alone does nothing.

Tag summary

Content type

Image

Digest

sha256:62334d4e3

Size

30.7 MB

Last updated

5 days ago

docker pull kuchkovsky/nginx-quic-webdav