about summary refs log tree commit diff
path: root/nixpkgs/pkgs/servers/http
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/servers/http')
-rw-r--r--nixpkgs/pkgs/servers/http/angie/console-light.nix48
-rw-r--r--nixpkgs/pkgs/servers/http/angie/default.nix47
-rw-r--r--nixpkgs/pkgs/servers/http/apache-httpd/2.4.nix117
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_auth_mellon/default.nix36
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_ca/default.nix55
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_crl/default.nix43
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_cspnonce/default.nix34
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_csr/default.nix43
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_dnssd/default.nix44
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_fastcgi/default.nix38
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_itk/default.nix39
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_mbtiles/default.nix33
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_ocsp/default.nix43
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_perl/default.nix58
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_pkcs12/default.nix43
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_python/default.nix49
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_python/install.patch12
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_scep/default.nix43
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_spkac/default.nix43
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_tile/default.nix77
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_timestamp/default.nix48
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/mod_wsgi/default.nix30
-rw-r--r--nixpkgs/pkgs/servers/http/apache-modules/tomcat-connectors/default.nix34
-rw-r--r--nixpkgs/pkgs/servers/http/apt-cacher-ng/default.nix48
-rw-r--r--nixpkgs/pkgs/servers/http/bozohttpd/default.nix84
-rw-r--r--nixpkgs/pkgs/servers/http/cgiserver/0001-Add-r-flag-to-set-CGI-SCRIPT_NAME.patch37
-rw-r--r--nixpkgs/pkgs/servers/http/cgiserver/0002-Don-t-include-PII-in-logs.patch46
-rw-r--r--nixpkgs/pkgs/servers/http/cgiserver/default.nix27
-rw-r--r--nixpkgs/pkgs/servers/http/couchdb/3.nix70
-rw-r--r--nixpkgs/pkgs/servers/http/darkhttpd/default.nix35
-rw-r--r--nixpkgs/pkgs/servers/http/dave/default.nix34
-rw-r--r--nixpkgs/pkgs/servers/http/dave/go-modules.patch562
-rw-r--r--nixpkgs/pkgs/servers/http/dufs/default.nix51
-rw-r--r--nixpkgs/pkgs/servers/http/envoy/0001-nixpkgs-use-system-Python.patch83
-rw-r--r--nixpkgs/pkgs/servers/http/envoy/0002-nixpkgs-use-system-Go.patch78
-rw-r--r--nixpkgs/pkgs/servers/http/envoy/0003-nixpkgs-use-system-C-C-toolchains.patch29
-rw-r--r--nixpkgs/pkgs/servers/http/envoy/default.nix201
-rw-r--r--nixpkgs/pkgs/servers/http/envoy/protobuf.patch116
-rw-r--r--nixpkgs/pkgs/servers/http/gatling/default.nix32
-rw-r--r--nixpkgs/pkgs/servers/http/h2o/default.nix29
-rw-r--r--nixpkgs/pkgs/servers/http/hiawatha/default.nix57
-rw-r--r--nixpkgs/pkgs/servers/http/hyp/default.nix20
-rw-r--r--nixpkgs/pkgs/servers/http/jboss/default.nix27
-rw-r--r--nixpkgs/pkgs/servers/http/jboss/jdbc/mysql/default.nix22
-rw-r--r--nixpkgs/pkgs/servers/http/jetty/11.x.nix4
-rw-r--r--nixpkgs/pkgs/servers/http/jetty/12.x.nix4
-rw-r--r--nixpkgs/pkgs/servers/http/jetty/common.nix30
-rw-r--r--nixpkgs/pkgs/servers/http/lighttpd/default.nix82
-rw-r--r--nixpkgs/pkgs/servers/http/lwan/default.nix40
-rw-r--r--nixpkgs/pkgs/servers/http/merecat/default.nix52
-rw-r--r--nixpkgs/pkgs/servers/http/micro-httpd/default.nix27
-rw-r--r--nixpkgs/pkgs/servers/http/mini-httpd/default.nix26
-rw-r--r--nixpkgs/pkgs/servers/http/nginx/generic.nix210
-rw-r--r--nixpkgs/pkgs/servers/http/nginx/mainline.nix6
-rw-r--r--nixpkgs/pkgs/servers/http/nginx/modules.nix1054
-rw-r--r--nixpkgs/pkgs/servers/http/nginx/nix-etag-1.15.4.patch106
-rw-r--r--nixpkgs/pkgs/servers/http/nginx/nix-skip-check-logs-path.patch27
-rw-r--r--nixpkgs/pkgs/servers/http/nginx/quic.nix14
-rw-r--r--nixpkgs/pkgs/servers/http/nginx/stable.nix6
-rw-r--r--nixpkgs/pkgs/servers/http/nix-binary-cache/default.nix60
-rw-r--r--nixpkgs/pkgs/servers/http/nix-binary-cache/nix-binary-cache-start.in117
-rw-r--r--nixpkgs/pkgs/servers/http/nix-binary-cache/nix-binary-cache.cgi.in105
-rw-r--r--nixpkgs/pkgs/servers/http/openresty/default.nix60
-rw-r--r--nixpkgs/pkgs/servers/http/pomerium/default.nix129
-rw-r--r--nixpkgs/pkgs/servers/http/pomerium/external-envoy.diff48
-rw-r--r--nixpkgs/pkgs/servers/http/pomerium/package.json61
-rwxr-xr-xnixpkgs/pkgs/servers/http/pomerium/updater.sh23
-rw-r--r--nixpkgs/pkgs/servers/http/pomerium/yarn-hash1
-rw-r--r--nixpkgs/pkgs/servers/http/pshs/default.nix27
-rw-r--r--nixpkgs/pkgs/servers/http/quark/default.nix27
-rw-r--r--nixpkgs/pkgs/servers/http/ran/default.nix47
-rw-r--r--nixpkgs/pkgs/servers/http/redstore/default.nix32
-rw-r--r--nixpkgs/pkgs/servers/http/router/default.nix49
-rw-r--r--nixpkgs/pkgs/servers/http/router/librusty_v8.nix19
-rw-r--r--nixpkgs/pkgs/servers/http/showoff/Gemfile2
-rw-r--r--nixpkgs/pkgs/servers/http/showoff/Gemfile.lock73
-rw-r--r--nixpkgs/pkgs/servers/http/showoff/default.nix18
-rw-r--r--nixpkgs/pkgs/servers/http/showoff/gemset.nix231
-rw-r--r--nixpkgs/pkgs/servers/http/spawn-fcgi/default.nix26
-rw-r--r--nixpkgs/pkgs/servers/http/tengine/check-resolv-conf.patch12
-rw-r--r--nixpkgs/pkgs/servers/http/tengine/default.nix127
-rw-r--r--nixpkgs/pkgs/servers/http/thttpd/default.nix33
-rw-r--r--nixpkgs/pkgs/servers/http/tomcat/axis2/builder.sh16
-rw-r--r--nixpkgs/pkgs/servers/http/tomcat/axis2/default.nix25
-rw-r--r--nixpkgs/pkgs/servers/http/tomcat/default.nix50
-rw-r--r--nixpkgs/pkgs/servers/http/tomcat/jdbc/mysql/default.nix21
-rw-r--r--nixpkgs/pkgs/servers/http/tomcat/tomcat-native.nix29
-rw-r--r--nixpkgs/pkgs/servers/http/trafficserver/default.nix188
-rw-r--r--nixpkgs/pkgs/servers/http/unit/default.nix85
-rw-r--r--nixpkgs/pkgs/servers/http/webfs/default.nix35
-rw-r--r--nixpkgs/pkgs/servers/http/webfs/ls.c.patch13
-rw-r--r--nixpkgs/pkgs/servers/http/webhook/default.nix33
-rw-r--r--nixpkgs/pkgs/servers/http/yaws/default.nix32
93 files changed, 6287 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/servers/http/angie/console-light.nix b/nixpkgs/pkgs/servers/http/angie/console-light.nix
new file mode 100644
index 000000000000..c4772205a5c7
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/angie/console-light.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, fetchurl
+, gzip
+, brotli
+}:
+
+stdenv.mkDerivation rec {
+  version = "1.2.1";
+  pname = "angie-console-light";
+
+  src = fetchurl {
+    url = "https://download.angie.software/files/${pname}/${pname}-${version}.tar.gz";
+    hash = "sha256-bwnVwhcPyEXGzvpXj2bC1WUGtNbBlHpqZibApKtESq8=";
+  };
+
+  outputs = [ "out" "doc" ];
+
+  nativeBuildInputs = [ brotli ];
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/share/angie-console-light
+    mv ./html $out/share/angie-console-light
+
+    mkdir -p $doc/share/doc/angie-console-light
+    mv ./LICENSE $doc/share/doc/angie-console-light
+
+    # Create static gzip and brotli files
+    find -L $out -type f -regextype posix-extended -iregex '.*\.(html|js|txt)' \
+      -exec gzip --best --keep --force {} ';' \
+      -exec brotli --best --keep --no-copy-stat {} ';'
+
+    runHook postInstall
+   '';
+
+  meta = {
+    description = "Console Light is a lightweight, real-time activity monitoring interface.";
+    homepage    = "https://angie.software/en/console/";
+    license     = lib.licenses.asl20;
+    platforms   = lib.platforms.all;
+    maintainers = with lib.maintainers; [ izorkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/angie/default.nix b/nixpkgs/pkgs/servers/http/angie/default.nix
new file mode 100644
index 000000000000..233298053b2e
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/angie/default.nix
@@ -0,0 +1,47 @@
+{ callPackage
+, runCommand
+, lib
+, fetchurl
+, nixosTests
+, withQuic ? false
+, fetchpatch
+, ...
+}@args:
+
+callPackage ../nginx/generic.nix args rec {
+  version = "1.4.1";
+  pname = if withQuic then "angieQuic" else "angie";
+
+  src = fetchurl {
+    url = "https://download.angie.software/files/angie-${version}.tar.gz";
+    hash = "sha256-g6PyuyulnltnZJWiZ01iYG1k6Lz5nO+gneb8M4q3WHo=";
+  };
+
+  configureFlags = lib.optional withQuic [
+    "--with-http_v3_module"
+  ];
+
+  preInstall = ''
+    if [[ -e man/angie.8 ]]; then
+      installManPage man/angie.8
+    fi
+  '';
+
+  postInstall = ''
+    ln -s $out/bin/nginx $out/bin/angie
+  '';
+
+  passthru.tests = {
+    angie = nixosTests.nginx-variants.angie;
+    angie-api = nixosTests.angie-api;
+    angie-http3 = nixosTests.nginx-http3.angieQuic;
+  };
+
+  meta = {
+    description = "Angie is an efficient, powerful, and scalable web server that was forked from nginx";
+    homepage    = "https://angie.software/en/";
+    license     = lib.licenses.bsd2;
+    platforms   = lib.platforms.all;
+    maintainers = with lib.maintainers; [ izorkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-httpd/2.4.nix b/nixpkgs/pkgs/servers/http/apache-httpd/2.4.nix
new file mode 100644
index 000000000000..27cfd755bcdd
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-httpd/2.4.nix
@@ -0,0 +1,117 @@
+{ lib, stdenv, fetchurl, perl, zlib, apr, aprutil, pcre2, libiconv, lynx, which, libxcrypt
+, fetchpatch
+, nixosTests
+, proxySupport ? true
+, sslSupport ? true, openssl
+, modTlsSupport ? false, rustls-ffi, Foundation
+, http2Support ? true, nghttp2
+, ldapSupport ? true, openldap
+, libxml2Support ? true, libxml2
+, brotliSupport ? true, brotli
+, luaSupport ? false, lua5
+}:
+
+stdenv.mkDerivation rec {
+  pname = "apache-httpd";
+  version = "2.4.58";
+
+  src = fetchurl {
+    url = "mirror://apache/httpd/httpd-${version}.tar.bz2";
+    sha256 = "sha256-+hbXKgeCEKVMR91b7y+Lm4oB2UkJpRRTlWs+xkQupMU=";
+  };
+
+  # FIXME: -dev depends on -doc
+  outputs = [ "out" "dev" "man" "doc" ];
+  setOutputFlags = false; # it would move $out/modules, etc.
+
+  nativeBuildInputs = [ which ];
+
+  buildInputs = [ perl libxcrypt ] ++
+    lib.optional brotliSupport brotli ++
+    lib.optional sslSupport openssl ++
+    lib.optional modTlsSupport rustls-ffi ++
+    lib.optional (modTlsSupport && stdenv.isDarwin) Foundation ++
+    lib.optional ldapSupport openldap ++    # there is no --with-ldap flag
+    lib.optional libxml2Support libxml2 ++
+    lib.optional http2Support nghttp2 ++
+    lib.optional stdenv.isDarwin libiconv;
+
+  patches = lib.optionals modTlsSupport [
+    (fetchpatch {
+      name = "compat-with-rustls-ffi-0.10.0.patch";
+      url = "https://github.com/apache/httpd/commit/918620a183d843fb393ed939423a25d42c1044ec.patch";
+      hash = "sha256-YZi3t++hjM0skisax2xuh9DifZVZjCjVn6XQr6QKGEs=";
+    })
+  ] ++ lib.optionals libxml2Support [
+    (fetchpatch {
+      name = "compat-with-libxml2-2.12.patch";
+      url = "https://github.com/apache/httpd/commit/27a68e54b7c6d2ae80dca396fd2727852897dab1.patch";
+      hash = "sha256-k2EqCaDkckrXLsHnjP4h+b1brTnde4pUyrbOiPFB6qk=";
+    })
+  ];
+
+  postPatch = ''
+    sed -i config.layout -e "s|installbuilddir:.*|installbuilddir: $dev/share/build|"
+    sed -i support/apachectl.in -e 's|@LYNX_PATH@|${lynx}/bin/lynx|'
+  '';
+
+  # Required for ‘pthread_cancel’.
+  NIX_LDFLAGS = lib.optionalString (!stdenv.isDarwin) "-lgcc_s";
+
+  configureFlags = [
+    "--with-apr=${apr.dev}"
+    "--with-apr-util=${aprutil.dev}"
+    "--with-z=${zlib.dev}"
+    "--with-pcre=${pcre2.dev}/bin/pcre2-config"
+    "--disable-maintainer-mode"
+    "--disable-debugger-mode"
+    "--enable-mods-shared=all"
+    "--enable-mpms-shared=all"
+    "--enable-cern-meta"
+    "--enable-imagemap"
+    "--enable-cgi"
+    "--includedir=${placeholder "dev"}/include"
+    (lib.enableFeature proxySupport "proxy")
+    (lib.enableFeature sslSupport "ssl")
+    (lib.enableFeature modTlsSupport "tls")
+    (lib.withFeatureAs libxml2Support "libxml2" "${libxml2.dev}/include/libxml2")
+    "--docdir=$(doc)/share/doc"
+
+    (lib.enableFeature brotliSupport "brotli")
+    (lib.withFeatureAs brotliSupport "brotli" brotli)
+
+    (lib.enableFeature http2Support "http2")
+    (lib.withFeature http2Support "nghttp2")
+
+    (lib.enableFeature luaSupport "lua")
+    (lib.withFeatureAs luaSupport "lua" lua5)
+  ];
+
+  enableParallelBuilding = true;
+
+  stripDebugList = [ "lib" "modules" "bin" ];
+
+  postInstall = ''
+    mkdir -p $doc/share/doc/httpd
+    mv $out/manual $doc/share/doc/httpd
+    mkdir -p $dev/bin
+    mv $out/bin/apxs $dev/bin/apxs
+  '';
+
+  passthru = {
+    inherit apr aprutil sslSupport proxySupport ldapSupport luaSupport lua5;
+    tests = {
+      acme-integration = nixosTests.acme;
+      proxy = nixosTests.proxy;
+      php = nixosTests.php.httpd;
+    };
+  };
+
+  meta = with lib; {
+    description = "Apache HTTPD, the world's most popular web server";
+    homepage    = "https://httpd.apache.org/";
+    license     = licenses.asl20;
+    platforms   = platforms.linux ++ platforms.darwin;
+    maintainers = with maintainers; [ lovek323 ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_auth_mellon/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_auth_mellon/default.nix
new file mode 100644
index 000000000000..5dd2fee040e9
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_auth_mellon/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, apacheHttpd, autoconf, automake, autoreconfHook, curl, fetchFromGitHub, glib, lasso, libtool, libxml2, libxslt, openssl, pkg-config, xmlsec }:
+
+stdenv.mkDerivation rec {
+
+  pname = "mod_auth_mellon";
+  version = "0.19.0";
+
+  src = fetchFromGitHub {
+    owner = "latchset";
+    repo = "mod_auth_mellon";
+    rev = "v${version}";
+    sha256 = "sha256-frSfhddLfEZ2xSI7/HPZkr5AiTJ9nnYmnJZY8aC3zwI=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook pkg-config autoconf automake ];
+  buildInputs = [ apacheHttpd curl glib lasso libtool libxml2 libxslt openssl xmlsec ];
+
+  configureFlags = ["--with-apxs2=${apacheHttpd.dev}/bin/apxs" "--exec-prefix=$out"];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp ./mellon_create_metadata.sh $out/bin
+    mkdir -p $out/modules
+    cp ./.libs/mod_auth_mellon.so $out/modules
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/latchset/mod_auth_mellon";
+    description = "An Apache module with a simple SAML 2.0 service provider";
+    mainProgram = "mellon_create_metadata.sh";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ womfoo ];
+  };
+
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_ca/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_ca/default.nix
new file mode 100644
index 000000000000..4eb67f02c9a0
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_ca/default.nix
@@ -0,0 +1,55 @@
+{
+  apacheHttpd,
+  apr,
+  aprutil,
+  directoryListingUpdater,
+  fetchurl,
+  lib,
+  openldap,
+  openssl,
+  pkg-config,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_ca";
+  version = "0.2.3";
+
+  src = fetchurl {
+    url = "https://redwax.eu/dist/rs/${pname}-${version}.tar.gz";
+    hash = "sha256-HGnhypOO0WOgRw9i9oqO4da131zAwBXOdrc9dypFjyk=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    apacheHttpd
+    apr
+    aprutil
+    openldap
+    openssl
+  ];
+
+  # Note that configureFlags and installFlags are inherited by
+  # the various submodules.
+  #
+  configureFlags = [ "--with-apxs=${apacheHttpd.dev}/bin/apxs" ];
+
+  installFlags = [
+    "INCLUDEDIR=${placeholder "out"}/include"
+    "LIBEXECDIR=${placeholder "out"}/modules"
+  ];
+
+  passthru.updateScript = directoryListingUpdater {
+    url = "https://redwax.eu/dist/rs/";
+  };
+
+  meta = with lib; {
+    description = "RedWax CA service module";
+    homepage = "https://redwax.eu";
+    changelog = "https://source.redwax.eu/projects/RS/repos/mod_ca/browse/ChangeLog";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dirkx ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_crl/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_crl/default.nix
new file mode 100644
index 000000000000..340bc3a962ed
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_crl/default.nix
@@ -0,0 +1,43 @@
+{
+  apr,
+  aprutil,
+  directoryListingUpdater,
+  fetchurl,
+  lib,
+  mod_ca,
+  pkg-config,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_crl";
+  version = "0.2.4";
+
+  src = fetchurl {
+    url = "https://redwax.eu/dist/rs/${pname}-${version}.tar.gz";
+    hash = "sha256-w8YIhed9J1uo5uwhfOVe5LhNLUvFZCgUO4FrHm344Rg=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    apr
+    aprutil
+    mod_ca
+  ];
+
+  inherit (mod_ca) configureFlags installFlags;
+
+  passthru.updateScript = directoryListingUpdater {
+    url = "https://redwax.eu/dist/rs/";
+  };
+
+  meta = with lib; {
+    description = "RedWax module for Certificate Revocation Lists";
+    homepage = "https://redwax.eu";
+    changelog = "https://source.redwax.eu/projects/RS/repos/mod_crl/browse/ChangeLog";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dirkx ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_cspnonce/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_cspnonce/default.nix
new file mode 100644
index 000000000000..f6de7f017537
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_cspnonce/default.nix
@@ -0,0 +1,34 @@
+{ stdenv, lib, fetchFromGitHub, apacheHttpd }:
+
+stdenv.mkDerivation rec {
+  pname = "mod_cspnonce";
+  version = "1.4";
+
+  src = fetchFromGitHub {
+    owner = "wyattoday";
+    repo = "mod_cspnonce";
+    rev = version;
+    hash = "sha256-uUWRKUjS2LvHgT5xrK+LZLQRHc6wMaxGca2OsVxVlRs=";
+  };
+
+  buildInputs = [ apacheHttpd ];
+
+  buildPhase = ''
+    apxs -ca mod_cspnonce.c
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/modules
+    cp .libs/mod_cspnonce.so $out/modules
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "An Apache2 module that makes it dead simple to add nonce values to the CSP";
+    homepage = "https://github.com/wyattoday/mod_cspnonce";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dasj19 ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_csr/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_csr/default.nix
new file mode 100644
index 000000000000..0fb6d8d0a0ac
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_csr/default.nix
@@ -0,0 +1,43 @@
+{
+  apr,
+  aprutil,
+  directoryListingUpdater,
+  fetchurl,
+  lib,
+  mod_ca,
+  pkg-config,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_csr";
+  version = "0.2.4";
+
+  src = fetchurl {
+    url = "https://redwax.eu/dist/rs/${pname}-${version}.tar.gz";
+    hash = "sha256-JVd5N5UnAxDwq6AavEHA0HsY2TRa+9RmLLJeRZbj+4Q=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    apr
+    aprutil
+    mod_ca
+  ];
+
+  inherit (mod_ca) configureFlags installFlags;
+
+  passthru.updateScript = directoryListingUpdater {
+    url = "https://redwax.eu/dist/rs/";
+  };
+
+  meta = with lib; {
+    description = "RedWax CA service module to handle Certificate Signing Requests";
+    homepage = "https://redwax.eu";
+    changelog = "https://source.redwax.eu/projects/RS/repos/mod_csr/browse/ChangeLog";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dirkx ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_dnssd/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_dnssd/default.nix
new file mode 100644
index 000000000000..7f574f9fd962
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_dnssd/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchurl, fetchpatch, pkg-config, apacheHttpd, apr, avahi }:
+
+stdenv.mkDerivation rec {
+  pname = "mod_dnssd";
+  version = "0.6";
+
+  src = fetchurl {
+    url = "http://0pointer.de/lennart/projects/mod_dnssd/${pname}-${version}.tar.gz";
+    sha256 = "2cd171d76eba398f03c1d5bcc468a1756f4801cd8ed5bd065086e4374997c5aa";
+  };
+
+  configureFlags = [ "--disable-lynx" ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ apacheHttpd avahi apr ];
+
+  patches = [ (fetchpatch {
+    url = "http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/vivid/mod-dnssd/vivid/download/package-import%40ubuntu.com-20130530193334-kqebiy78q534or5k/portforapache2.4.pat-20130530222510-7tlw5btqchd04edb-3/port-for-apache2.4.patch";
+    sha256 = "1hgcxwy1q8fsxfqyg95w8m45zbvxzskf1jxd87ljj57l7x1wwp4r";
+  }) ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/modules
+    cp src/.libs/mod_dnssd.so $out/modules
+
+    runHook postInstall
+  '';
+
+  preFixup = ''
+    # TODO: Packages in non-standard directories not stripped.
+    # https://github.com/NixOS/nixpkgs/issues/141554
+    stripDebugList=modules
+  '';
+
+  meta = with lib; {
+    homepage = "https://0pointer.de/lennart/projects/mod_dnssd";
+    description = "Provide Zeroconf support via DNS-SD using Avahi";
+    license = licenses.asl20;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_fastcgi/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_fastcgi/default.nix
new file mode 100644
index 000000000000..a67ea3cc03e7
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_fastcgi/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchFromGitHub, fetchurl, apacheHttpd }:
+
+stdenv.mkDerivation rec {
+  pname = "mod_fastcgi";
+  version = "2.4.7.1";
+
+  src = fetchFromGitHub {
+    owner = "FastCGI-Archives";
+    repo = "mod_fastcgi";
+    rev = version;
+    hash = "sha256-ovir59kCjKkgbraX23nsmzlMzGdeNTyj3MQd8cgvLsg=";
+  };
+
+  buildInputs = [ apacheHttpd ];
+
+  preBuild = ''
+    cp Makefile.AP2 Makefile
+    makeFlags="top_dir=${apacheHttpd.dev}/share prefix=$out"
+  '';
+
+  meta = {
+    homepage = "https://github.com/FastCGI-Archives/mod_fastcgi";
+    description = "Provide support for the FastCGI protocol";
+
+    longDescription = ''
+      mod_fastcgi is a module for the Apache web server that enables
+      FastCGI - a standards based protocol for communicating with
+      applications that generate dynamic content for web pages. FastCGI
+      provides a superset of CGI functionality, but a subset of the
+      functionality of programming for a particular web server API.
+      Nonetheless, the feature set is rich enough for programming
+      virtually any type of web application, but the result is generally
+      more scalable.
+    '';
+
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_itk/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_itk/default.nix
new file mode 100644
index 000000000000..a36a030899a5
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_itk/default.nix
@@ -0,0 +1,39 @@
+{ lib
+, stdenv
+, fetchurl
+, pkg-config
+, mod_ca
+, apr
+, aprutil
+, apacheHttpd
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_itk";
+  version = "2.4.7-04";
+
+  src = fetchurl {
+    url = "http://mpm-itk.sesse.net/mpm-itk-${version}.tar.gz";
+    sha256 = "sha256:1kzgd1332pgpxf489kr0vdwsaik0y8wp3q282d4wa5jlk7l877v0";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ mod_ca apr aprutil apacheHttpd ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/modules
+    ${apacheHttpd.dev}/bin/apxs -S LIBEXECDIR=$out/modules -i mpm_itk.la
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "an MPM (Multi-Processing Module) for the Apache web server.";
+    maintainers = [ maintainers.zupo ];
+    homepage = "http://mpm-itk.sesse.net/";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_mbtiles/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_mbtiles/default.nix
new file mode 100644
index 000000000000..c2bf88cbac1a
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_mbtiles/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, apacheHttpd, sqlite }:
+
+stdenv.mkDerivation rec {
+  pname = "mod_mbtiles";
+  version = "unstable-2022-05-25";
+
+  src = fetchFromGitHub {
+    owner = "systemed";
+    repo = pname;
+    rev = "f9d12a9581820630dd923c3c90aa8dcdcf65cb87";
+    sha256 = "sha256-wOoLSNLgh0YXHUFn7WfUkQXpyWsgCrVZlMg55rvi9q4=";
+  };
+
+  buildInputs = [ apacheHttpd sqlite ];
+
+  buildPhase = ''
+    apxs -lsqlite3 -ca mod_mbtiles.c
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    install -D .libs/mod_mbtiles.so -t $out/modules
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/systemed/mod_mbtiles";
+    description = "Serve tiles with Apache directly from an .mbtiles file";
+    license = licenses.free;
+    maintainers = with maintainers; [ sikmir ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_ocsp/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_ocsp/default.nix
new file mode 100644
index 000000000000..2f4b754cfc6b
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_ocsp/default.nix
@@ -0,0 +1,43 @@
+{
+  apr,
+  aprutil,
+  directoryListingUpdater,
+  fetchurl,
+  lib,
+  mod_ca,
+  pkg-config,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_ocsp";
+  version = "0.2.3";
+
+  src = fetchurl {
+    url = "https://redwax.eu/dist/rs/${pname}-${version}.tar.gz";
+    hash = "sha256-G+m/KdJCCTlSMeJzUnCRJkBEQ8cOQ+rJhA3NPrwh1Us=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    apr
+    aprutil
+    mod_ca
+  ];
+
+  inherit (mod_ca) configureFlags installFlags;
+
+  passthru.updateScript = directoryListingUpdater {
+    url = "https://redwax.eu/dist/rs/";
+  };
+
+  meta = with lib; {
+    description = "RedWax CA service modules of OCSP Online Certificate Validation";
+    homepage = "https://redwax.eu";
+    changelog = "https://source.redwax.eu/projects/RS/repos/mod_csr/browse/ChangeLog";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dirkx ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_perl/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_perl/default.nix
new file mode 100644
index 000000000000..c0a9e11a6ce5
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_perl/default.nix
@@ -0,0 +1,58 @@
+{
+  apacheHttpd,
+  directoryListingUpdater,
+  fetchurl,
+  lib,
+  nixosTests,
+  perl,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_perl";
+  version = "2.0.13";
+
+  src = fetchurl {
+    url = "mirror://apache/perl/${pname}-${version}.tar.gz";
+    sha256 = "sha256-reO+McRHuESIaf7N/KziWNbVh7jGx3PF8ic19w2C1to=";
+  };
+
+  buildInputs = [
+    apacheHttpd
+    perl
+  ];
+
+  buildPhase = ''
+    perl Makefile.PL \
+      MP_APXS=${apacheHttpd.dev}/bin/apxs
+    make
+  '';
+
+  installPhase = ''
+    mkdir -p $out
+    make install DESTDIR=$out
+    mv $out${apacheHttpd}/* $out
+    mv $out${apacheHttpd.dev}/* $out
+    mv $out${perl}/* $out
+    rm $out/nix -rf
+  '';
+
+  passthru = {
+    updateScript = directoryListingUpdater {
+      url = "https://archive.apache.org/dist/perl/";
+    };
+    tests = nixosTests.mod_perl;
+  };
+
+  __darwinAllowLocalNetworking = true;
+
+  meta = with lib; {
+    description = "Integration of perl with the Apache2 web server";
+    homepage = "https://perl.apache.org/download/index.html";
+    changelog = "https://github.com/apache/mod_perl/blob/trunk/Changes";
+    license = licenses.asl20;
+    mainProgram = "mp2bug";
+    maintainers = with maintainers; [ ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_pkcs12/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_pkcs12/default.nix
new file mode 100644
index 000000000000..0f8962b275c0
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_pkcs12/default.nix
@@ -0,0 +1,43 @@
+{
+  apr,
+  aprutil,
+  directoryListingUpdater,
+  fetchurl,
+  lib,
+  mod_ca,
+  pkg-config,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_pkcs12";
+  version = "0.2.3";
+
+  src = fetchurl {
+    url = "https://redwax.eu/dist/rs/${pname}-${version}.tar.gz";
+    hash = "sha256-k7BZ5d0WigyTmoUyFds7UCJ/tFBiUxd5pS4cVxmAI1g=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    apr
+    aprutil
+    mod_ca
+  ];
+
+  inherit (mod_ca) configureFlags installFlags;
+
+  passthru.updateScript = directoryListingUpdater {
+    url = "https://redwax.eu/dist/rs/";
+  };
+
+  meta = with lib; {
+    description = "RedWax CA service modules for PKCS#12 format files";
+    homepage = "https://redwax.eu";
+    changelog = "https://source.redwax.eu/projects/RS/repos/mod_pkcs12/browse/ChangeLog";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dirkx ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_python/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_python/default.nix
new file mode 100644
index 000000000000..8b4fcd5d94be
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_python/default.nix
@@ -0,0 +1,49 @@
+{
+  apacheHttpd,
+  fetchFromGitHub,
+  lib,
+  libintl,
+  nix-update-script,
+  python3,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_python";
+  version = "3.5.0.2";
+
+  src = fetchFromGitHub {
+    owner = "grisha";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    hash = "sha256-EH8wrXqUAOFWyPKfysGeiIezgrVc789RYO4AHeSA6t4=";
+  };
+
+  patches = [ ./install.patch ];
+
+  installFlags = [
+    "LIBEXECDIR=$(out)/modules"
+    "BINDIR=$(out)/bin"
+  ];
+
+  buildInputs = [
+    apacheHttpd
+    python3
+  ] ++ lib.optionals stdenv.isDarwin [
+    libintl
+  ];
+
+  passthru = {
+    inherit apacheHttpd;
+    updateScript = nix-update-script { };
+  };
+
+  meta = with lib; {
+    homepage = "https://modpython.org/";
+    changelog = "https://github.com/grisha/mod_python/blob/${version}/NEWS";
+    description = "An Apache module that embeds the Python interpreter within the server";
+    mainProgram = "mod_python";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_python/install.patch b/nixpkgs/pkgs/servers/http/apache-modules/mod_python/install.patch
new file mode 100644
index 000000000000..29667e11ed8e
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_python/install.patch
@@ -0,0 +1,12 @@
+diff -ru -x '*~' mod_python-3.5.0-orig/dist/Makefile.in mod_python-3.5.0/dist/Makefile.in
+--- mod_python-3.5.0-orig/dist/Makefile.in	2013-11-12 04:21:34.000000000 +0100
++++ mod_python-3.5.0/dist/Makefile.in	2014-11-07 11:28:24.466377733 +0100
+@@ -34,7 +34,7 @@
+ install_py_lib: mod_python src
+ 	@cd src; $(MAKE) psp_parser.c
+ 	if test -z "$(DESTDIR)" ; then \
+-		$(PYTHON_BIN) setup.py install --optimize 2 --force ; \
++		$(PYTHON_BIN) setup.py install --optimize 2 --force --prefix $(out) ; \
+ 	else \
+ 		$(PYTHON_BIN) setup.py install --optimize 2 --force --root $(DESTDIR) ; \
+ 	fi
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_scep/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_scep/default.nix
new file mode 100644
index 000000000000..40561e41ba88
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_scep/default.nix
@@ -0,0 +1,43 @@
+{
+  apr,
+  aprutil,
+  directoryListingUpdater,
+  fetchurl,
+  lib,
+  mod_ca,
+  pkg-config,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_scep";
+  version = "0.2.4";
+
+  src = fetchurl {
+    url = "https://redwax.eu/dist/rs/${pname}-${version}.tar.gz";
+    hash = "sha256-HFPQ1A3ULtT2MduIQZS1drdQvCdZqJqKpOsJLEw67sI=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    apr
+    aprutil
+    mod_ca
+  ];
+
+  inherit (mod_ca) configureFlags installFlags;
+
+  passthru.updateScript = directoryListingUpdater {
+    url = "https://redwax.eu/dist/rs/";
+  };
+
+  meta = with lib; {
+    description = "RedWax CA service modules for SCEP (Automatic ceritifcate issue/renewal)";
+    homepage = "https://redwax.eu";
+    changelog = "https://source.redwax.eu/projects/RS/repos/mod_scep/browse/ChangeLog";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dirkx ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_spkac/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_spkac/default.nix
new file mode 100644
index 000000000000..639045d18aff
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_spkac/default.nix
@@ -0,0 +1,43 @@
+{
+  apr,
+  aprutil,
+  directoryListingUpdater,
+  fetchurl,
+  lib,
+  mod_ca,
+  pkg-config,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_spkac";
+  version = "0.2.3";
+
+  src = fetchurl {
+    url = "https://redwax.eu/dist/rs/${pname}-${version}.tar.gz";
+    hash = "sha256-J1pGz+/AD0IPwRPBA+wt9PgV9qnZEHX66VCBGqhf0b8=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    apr
+    aprutil
+    mod_ca
+  ];
+
+  inherit (mod_ca) configureFlags installFlags;
+
+  passthru.updateScript = directoryListingUpdater {
+    url = "https://redwax.eu/dist/rs/";
+  };
+
+  meta = with lib; {
+    description = "RedWax CA service module for handling the Netscape keygen requests. ";
+    homepage = "https://redwax.eu";
+    changelog = "https://source.redwax.eu/projects/RS/repos/mod_spkac/browse/ChangeLog";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dirkx ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_tile/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_tile/default.nix
new file mode 100644
index 000000000000..f97ae6269011
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_tile/default.nix
@@ -0,0 +1,77 @@
+{ fetchFromGitHub
+, lib
+, stdenv
+, cmake
+, pkg-config
+, apacheHttpd
+, apr
+, aprutil
+, boost
+, cairo
+, curl
+, glib
+, harfbuzz
+, icu
+, iniparser
+, libmemcached
+, mapnik
+, nix-update-script
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_tile";
+  version = "0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "openstreetmap";
+    repo = "mod_tile";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-zXUwTG8cqAkY5MC1jAc2TtMgNMQPLc5nc22okVYP4ME=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    apacheHttpd
+    apr
+    aprutil
+    boost
+    cairo
+    curl
+    glib
+    harfbuzz
+    icu
+    iniparser
+    libmemcached
+    mapnik
+  ];
+
+  enableParallelBuilding = true;
+
+  # Explicitly specify directory paths
+  cmakeFlags = [
+    (lib.cmakeFeature "CMAKE_INSTALL_BINDIR" "bin")
+    (lib.cmakeFeature "CMAKE_INSTALL_MANDIR" "share/man")
+    (lib.cmakeFeature "CMAKE_INSTALL_MODULESDIR" "modules")
+    (lib.cmakeFeature "CMAKE_INSTALL_PREFIX" "")
+    (lib.cmakeBool "ENABLE_TESTS" doCheck)
+  ];
+
+  # And use DESTDIR to define the install destination
+  installFlags = [ "DESTDIR=$(out)" ];
+
+  doCheck = true;
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    homepage = "https://github.com/openstreetmap/mod_tile";
+    description = "Efficiently render and serve OpenStreetMap tiles using Apache and Mapnik";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ jglukasik ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_timestamp/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_timestamp/default.nix
new file mode 100644
index 000000000000..1dbe4101dfe6
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_timestamp/default.nix
@@ -0,0 +1,48 @@
+{
+  apr,
+  aprutil,
+  directoryListingUpdater,
+  fetchurl,
+  lib,
+  mod_ca,
+  pkg-config,
+  stdenv,
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mod_timestamp";
+  version = "0.2.3";
+
+  src = fetchurl {
+    url = "https://redwax.eu/dist/rs/${pname}-${version}.tar.gz";
+    hash = "sha256-X49gJ1wQtwQT3GOZkluxdMIY2ZRpM9Y7DZln6Ag9DvM=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    apr
+    aprutil
+    mod_ca
+  ];
+
+  env.NIX_CFLAGS_COMPILE = toString (lib.optionals stdenv.cc.isClang [
+    "-Wno-error=int-conversion"
+    "-Wno-error=implicit-function-declaration"
+  ]);
+
+  inherit (mod_ca) configureFlags installFlags;
+
+  passthru.updateScript = directoryListingUpdater {
+    url = "https://redwax.eu/dist/rs/";
+  };
+
+  meta = with lib; {
+    description = "RedWax CA service module for issuing signed timestamps";
+    homepage = "https://redwax.eu";
+    changelog = "https://source.redwax.eu/projects/RS/repos/mod_timestamp/browse/ChangeLog";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ dirkx ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/mod_wsgi/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/mod_wsgi/default.nix
new file mode 100644
index 000000000000..01f953f7c80c
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/mod_wsgi/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromGitHub, apacheHttpd, python3, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "mod_wsgi";
+  version = "5.0.0";
+
+  src = fetchFromGitHub {
+    owner = "GrahamDumpleton";
+    repo = "mod_wsgi";
+    rev = version;
+    hash = "sha256-/4swm4AYCN3xyz2+OH7XqH/dFC53wqGPZgEAdxZQvbs=";
+  };
+
+  buildInputs = [ apacheHttpd python3 ncurses ];
+
+  postPatch = ''
+    substituteInPlace configure --replace '/usr/bin/lipo' 'lipo'
+  '';
+
+  makeFlags = [
+    "LIBEXECDIR=$(out)/modules"
+  ];
+
+  meta = {
+    homepage = "https://github.com/GrahamDumpleton/mod_wsgi";
+    description = "Host Python applications in Apache through the WSGI interface";
+    license = lib.licenses.asl20;
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apache-modules/tomcat-connectors/default.nix b/nixpkgs/pkgs/servers/http/apache-modules/tomcat-connectors/default.nix
new file mode 100644
index 000000000000..20879d4aaf21
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apache-modules/tomcat-connectors/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchurl, apacheHttpd, jdk }:
+
+stdenv.mkDerivation rec {
+  pname = "tomcat-connectors";
+  version = "1.2.48";
+
+  src = fetchurl {
+    url = "mirror://apache/tomcat/tomcat-connectors/jk/${pname}-${version}-src.tar.gz";
+    sha256 = "15wfj1mvad15j1fqw67qbpbpwrcz3rb0zdhrq6z2sax1l05kc6yb";
+  };
+
+  configureFlags = [
+    "--with-apxs=${apacheHttpd.dev}/bin/apxs"
+    "--with-java-home=${jdk}"
+  ];
+
+  setSourceRoot = ''
+    sourceRoot=$(echo */native)
+  '';
+
+  installPhase = ''
+    mkdir -p $out/modules
+    cp apache-2.0/mod_jk.so $out/modules
+  '';
+
+  buildInputs = [ apacheHttpd jdk ];
+
+  meta = with lib; {
+    description = "Provides web server plugins to connect web servers with Tomcat";
+    homepage = "https://tomcat.apache.org/download-connectors.cgi";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/apt-cacher-ng/default.nix b/nixpkgs/pkgs/servers/http/apt-cacher-ng/default.nix
new file mode 100644
index 000000000000..72a456ab17f9
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/apt-cacher-ng/default.nix
@@ -0,0 +1,48 @@
+{ lib
+, stdenv
+, bzip2
+, cmake
+, doxygen
+, fetchurl
+, fetchpatch
+, fuse
+, libevent
+, xz
+, openssl
+, pkg-config
+, systemd
+, tcp_wrappers
+, zlib
+, c-ares
+}:
+
+stdenv.mkDerivation rec {
+  pname = "apt-cacher-ng";
+  version = "3.7.4";
+
+  src = fetchurl {
+    url = "https://ftp.debian.org/debian/pool/main/a/apt-cacher-ng/apt-cacher-ng_${version}.orig.tar.xz";
+    sha256 = "0pwsj9rf6a6q7cnfbpcrfq2gjcy7sylqzqqr49g2zi39lrrh8533";
+  };
+
+  patches = [
+    # this patch fixes the build for glibc >= 2.38
+    (fetchpatch {
+      name = "strlcpy-glibc238.patch";
+      url = "https://bugs.debian.org/cgi-bin/bugreport.cgi?att=0;bug=1052360;msg=10";
+      hash = "sha256-uhQj+ZcHCV36Tm0pF/+JG59bSaRdTZCrMcKL3YhZTk8=";
+    })
+  ];
+
+  nativeBuildInputs = [ cmake doxygen pkg-config ];
+  buildInputs = [ bzip2 fuse libevent xz openssl systemd tcp_wrappers zlib c-ares ];
+
+  meta = with lib; {
+    description = "A caching proxy specialized for Linux distribution files";
+    mainProgram = "apt-cacher-ng";
+    homepage = "https://www.unix-ag.uni-kl.de/~bloch/acng/";
+    license = licenses.bsdOriginal;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/bozohttpd/default.nix b/nixpkgs/pkgs/servers/http/bozohttpd/default.nix
new file mode 100644
index 000000000000..0aad8168ffa8
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/bozohttpd/default.nix
@@ -0,0 +1,84 @@
+{ lib
+, stdenv
+, fetchurl
+, bmake
+, groff
+, inetutils
+, wget
+, openssl
+, libxcrypt
+, minimal ? false
+, userSupport ? !minimal
+, cgiSupport ? !minimal
+, dirIndexSupport ? !minimal
+, dynamicContentSupport ? !minimal
+, sslSupport ? !minimal
+, luaSupport ? !minimal
+, lua
+, htpasswdSupport ? !minimal
+}:
+
+let inherit (lib) optional optionals;
+in
+stdenv.mkDerivation rec {
+  pname = "bozohttpd";
+  version = "20240126";
+
+  # bozohttpd is developed in-tree in pkgsrc, canonical hashes can be found at:
+  # http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/www/bozohttpd/distinfo
+  src = fetchurl {
+    url = "http://eterna23.net/${pname}/${pname}-${version}.tar.bz2";
+    hash = "sha512-fr1PnyYAS3wkpmj/npRC3A87UL9LIXw4thlM4GfrtlJbuX5EkWGVJnHJW/EmYp7z+N91dcdRJgdO79l6WJsKpg==";
+  };
+
+  buildInputs = [ openssl libxcrypt ] ++ optional (luaSupport) lua;
+  nativeBuildInputs = [ bmake groff ];
+
+  COPTS = [
+    "-D_DEFAULT_SOURCE"
+    "-D_GNU_SOURCE"
+
+    # ensure that we can serve >2GB files even on 32-bit systems.
+    "-D_LARGEFILE_SOURCE"
+    "-D_FILE_OFFSET_BITS=64"
+
+    # unpackaged dependency: https://man.netbsd.org/blocklist.3
+    "-DNO_BLOCKLIST_SUPPORT"
+  ]
+  ++ optional (!userSupport) "-DNO_USER_SUPPORT"
+  ++ optional (!dirIndexSupport) "-DNO_DIRINDEX_SUPPORT"
+  ++ optional (!dynamicContentSupport) "-DNO_DYNAMIC_CONTENT"
+  ++ optional (!luaSupport) "-DNO_LUA_SUPPORT"
+  ++ optional (!sslSupport) "-DNO_SSL_SUPPORT"
+  ++ optional (!cgiSupport) "-DNO_CGIBIN_SUPPORT"
+  ++ optional (htpasswdSupport) "-DDO_HTPASSWD";
+
+  _LDADD = [ "-lm" ]
+    ++ optional (stdenv.hostPlatform.libc != "libSystem") "-lcrypt"
+    ++ optional (luaSupport) "-llua"
+    ++ optionals (sslSupport) [ "-lssl" "-lcrypto" ];
+  makeFlags = [ "LDADD=$(_LDADD)" ];
+
+  doCheck = true;
+  nativeCheckInputs = [ inetutils wget ];
+  checkFlags = optional (!cgiSupport) "CGITESTS=";
+
+  meta = with lib; {
+    description = "Bozotic HTTP server; small and secure";
+    longDescription = ''
+      bozohttpd is a small and secure HTTP version 1.1 server. Its main
+      feature is the lack of features, reducing the code size and improving
+      verifiability.
+
+      It supports CGI/1.1, HTTP/1.1, HTTP/1.0, HTTP/0.9, ~user translations,
+      virtual hosting support, as well as multiple IP-based servers on a
+      single machine. It is capable of servicing pages via the IPv6 protocol.
+      It has SSL support. It has no configuration file by design.
+    '';
+    homepage = "http://www.eterna.com.au/bozohttpd/";
+    changelog = "http://www.eterna.com.au/bozohttpd/CHANGES";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.embr ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/cgiserver/0001-Add-r-flag-to-set-CGI-SCRIPT_NAME.patch b/nixpkgs/pkgs/servers/http/cgiserver/0001-Add-r-flag-to-set-CGI-SCRIPT_NAME.patch
new file mode 100644
index 000000000000..0d9f947e615f
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/cgiserver/0001-Add-r-flag-to-set-CGI-SCRIPT_NAME.patch
@@ -0,0 +1,37 @@
+From e71226e93702268295d989c5ac7a103a1553a13a Mon Sep 17 00:00:00 2001
+From: Alyssa Ross <hi@alyssa.is>
+Date: Wed, 11 May 2022 14:26:14 +0000
+Subject: [PATCH 1/2] Add -r flag to set CGI SCRIPT_NAME
+
+---
+ main.go | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/main.go b/main.go
+index 2019888..6366db0 100644
+--- a/main.go
++++ b/main.go
+@@ -24,9 +24,11 @@ func main() {
+ 
+ 	// The default usage message isn't very helpful, so we provide our own.
+ 	flag.Usage = func() {
+-		fmt.Fprintln(flag.CommandLine.Output(), "Usage: cgiserver /path/to/application.cgi")
++		fmt.Fprintln(flag.CommandLine.Output(), "Usage: cgiserver [-r ROOT] /path/to/application.cgi")
+ 	}
+ 
++	root := flag.String("r", "/", "CGI SCRIPT_NAME");
++
+ 	// We didn't configure any flags, so this just serves to display an error
+ 	// if someone tries to pass one. It also automatically handles -h/--help.
+ 	flag.Parse()
+@@ -53,6 +55,7 @@ func main() {
+ 	// ...and Go's standard library does literally all of the hard work.
+ 	handler = &cgi.Handler{
+ 		Path: path,
++		Root: *root,
+ 		Env:  os.Environ(), // Environment variables aren't inherited by default.
+ 	}
+ 
+-- 
+2.35.1
+
diff --git a/nixpkgs/pkgs/servers/http/cgiserver/0002-Don-t-include-PII-in-logs.patch b/nixpkgs/pkgs/servers/http/cgiserver/0002-Don-t-include-PII-in-logs.patch
new file mode 100644
index 000000000000..294cf83c72aa
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/cgiserver/0002-Don-t-include-PII-in-logs.patch
@@ -0,0 +1,46 @@
+From c865876ea7df93401349ed788422ea475dcdda9b Mon Sep 17 00:00:00 2001
+From: Alyssa Ross <hi@alyssa.is>
+Date: Wed, 11 May 2022 14:41:36 +0000
+Subject: [PATCH 2/2] Don't include PII in logs
+
+---
+ main.go | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/main.go b/main.go
+index 6366db0..14ef64e 100644
+--- a/main.go
++++ b/main.go
+@@ -7,6 +7,7 @@ import (
+ 	"context"
+ 	"flag"
+ 	"fmt"
++	"io"
+ 	"log"
+ 	"net/http"
+ 	"net/http/cgi"
+@@ -27,7 +28,7 @@ func main() {
+ 		fmt.Fprintln(flag.CommandLine.Output(), "Usage: cgiserver [-r ROOT] /path/to/application.cgi")
+ 	}
+ 
+-	root := flag.String("r", "/", "CGI SCRIPT_NAME");
++	root := flag.String("r", "/", "CGI SCRIPT_NAME")
+ 
+ 	// We didn't configure any flags, so this just serves to display an error
+ 	// if someone tries to pass one. It also automatically handles -h/--help.
+@@ -63,7 +64,11 @@ func main() {
+ 	handler = handlers.ProxyHeaders(handler)
+ 
+ 	// Additionally, we want to log requests.
+-	handler = handlers.CombinedLoggingHandler(os.Stdout, handler)
++	handler = handlers.CustomLoggingHandler(os.Stdout, handler,
++		func(w io.Writer, params handlers.LogFormatterParams) {
++			fmt.Fprintf(w, "%s %s %d %d\n", params.Request.Method,
++				params.URL.String(), params.StatusCode, params.Size)
++		})
+ 
+ 	// Catch SIGTERM so we can shutdown gracefully.
+ 	sig := make(chan os.Signal, 1)
+-- 
+2.35.1
+
diff --git a/nixpkgs/pkgs/servers/http/cgiserver/default.nix b/nixpkgs/pkgs/servers/http/cgiserver/default.nix
new file mode 100644
index 000000000000..d30a3bbea1f3
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/cgiserver/default.nix
@@ -0,0 +1,27 @@
+{ lib, buildGoModule, fetchzip, zstd }:
+
+buildGoModule rec {
+  pname = "cgiserver";
+  version = "1.0.0";
+
+  src = fetchzip {
+    url = "https://src.anomalous.eu/cgiserver/snapshot/cgiserver-${version}.tar.zst";
+    nativeBuildInputs = [ zstd ];
+    hash = "sha256-uIrOZbHzxAdUJF12MBOzRUA6mSPvOKJ/K9ZwwLVId5E=";
+  };
+
+  vendorHash = "sha256-mygMtVbNWwtIkxTGxMnuAMUU0mp49NZ50B9d436nWgI=";
+
+  patches = [
+    ./0001-Add-r-flag-to-set-CGI-SCRIPT_NAME.patch
+    ./0002-Don-t-include-PII-in-logs.patch
+  ];
+
+  meta = with lib; {
+    homepage = "https://src.anomalous.eu/cgiserver/about/";
+    description = "Lightweight web server for sandboxing CGI applications";
+    mainProgram = "cgiserver";
+    maintainers = with maintainers; [ qyliss ];
+    license = licenses.osl3;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/couchdb/3.nix b/nixpkgs/pkgs/servers/http/couchdb/3.nix
new file mode 100644
index 000000000000..6e625dbdb720
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/couchdb/3.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, fetchurl
+, erlang
+, icu
+, openssl
+, spidermonkey_91
+, python3
+, nixosTests
+}:
+
+stdenv.mkDerivation rec {
+  pname = "couchdb";
+  version = "3.3.3";
+
+  src = fetchurl {
+    url = "mirror://apache/couchdb/source/${version}/apache-${pname}-${version}.tar.gz";
+    hash = "sha256-eiAHtfZz1L4iolyaER2QZpGdhy3bkTWn3OwBIimb054=";
+  };
+
+  postPatch = ''
+    substituteInPlace src/couch/rebar.config.script --replace '/usr/include/mozjs-91' "${spidermonkey_91.dev}/include/mozjs-91"
+    substituteInPlace configure --replace '/usr/include/''${SM_HEADERS}' "${spidermonkey_91.dev}/include/mozjs-91"
+    patchShebangs bin/rebar
+  '' + lib.optionalString stdenv.isDarwin ''
+    # LTO with Clang produces LLVM bitcode, which causes linking to fail quietly.
+    # (There are warnings, but no hard errors, and it produces an empty dylib.)
+    substituteInPlace src/jiffy/rebar.config.script --replace '"-flto"' '""'
+  '';
+
+  nativeBuildInputs = [
+    erlang
+  ];
+
+  buildInputs = [
+    icu
+    openssl
+    spidermonkey_91
+    (python3.withPackages(ps: with ps; [ requests ]))
+  ];
+
+  dontAddPrefix= "True";
+
+  configureFlags = [
+    "--spidermonkey-version=91"
+  ];
+
+  buildFlags = [
+    "release"
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out
+    cp -r rel/couchdb/* $out
+    runHook postInstall
+  '';
+
+  passthru.tests = {
+    inherit (nixosTests) couchdb;
+  };
+
+  meta = with lib; {
+    description = "A database that uses JSON for documents, JavaScript for MapReduce queries, and regular HTTP for an API";
+    homepage = "https://couchdb.apache.org";
+    license = licenses.asl20;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ lostnet ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/darkhttpd/default.nix b/nixpkgs/pkgs/servers/http/darkhttpd/default.nix
new file mode 100644
index 000000000000..0d55b3b6b588
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/darkhttpd/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+}:
+
+stdenv.mkDerivation rec {
+  pname = "darkhttpd";
+  version = "1.16";
+
+  src = fetchFromGitHub {
+    owner = "emikulic";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-dcNoGU08tu950PlwSghoZwGSaSbP8NJ5qhWUi3bAtZY=";
+  };
+
+  enableParallelBuilding = true;
+
+  installPhase = ''
+    runHook preInstall
+    install -Dm555 -t $out/bin darkhttpd
+    install -Dm444 -t $out/share/doc/${pname} README.md
+    head -n 18 darkhttpd.c > $out/share/doc/${pname}/LICENSE
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Small and secure static webserver";
+    mainProgram = "darkhttpd";
+    homepage = "https://unix4lyfe.org/darkhttpd/";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ bobvanderlinden ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/dave/default.nix b/nixpkgs/pkgs/servers/http/dave/default.nix
new file mode 100644
index 000000000000..492e4989d753
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/dave/default.nix
@@ -0,0 +1,34 @@
+{ lib, buildGoModule, fetchFromGitHub, mage }:
+
+buildGoModule rec {
+  pname = "dave";
+  version = "0.4.0";
+
+  src = fetchFromGitHub {
+    owner = "micromata";
+    repo = "dave";
+    rev = "v${version}";
+    hash = "sha256-wvsW4EwMWAgEV+LPeMhHL4AsuyS5TDMmpD9D4F1nVM4=";
+  };
+
+  deleteVendor = true;
+  vendorHash = "sha256-iyq2DGdbdfJIRNkGAIKTk1LLDydpVX3juQFaG6H5vJQ=";
+
+  patches = [
+    # Add Go Modules support:
+    # - Based on https://github.com/micromata/dave/commit/46ae146dd2e95d57be35fa01885ea2c55fd8c279.
+    # - Bump golang.org/x/sys for Darwin.
+    ./go-modules.patch
+  ];
+
+  subPackages = [ "cmd/dave" "cmd/davecli" ];
+
+  ldflags = [ "-s" "-w" "-X main.version=${version}" "-X main.builtBy=nixpkgs" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/micromata/dave";
+    description = "A totally simple and very easy to configure stand alone webdav server";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lunik1 ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/dave/go-modules.patch b/nixpkgs/pkgs/servers/http/dave/go-modules.patch
new file mode 100644
index 000000000000..1090adb6f628
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/dave/go-modules.patch
@@ -0,0 +1,562 @@
+From 95b36ebc39e931ab033b199f8c243c2da489f25c Mon Sep 17 00:00:00 2001
+From: Christian Claus <c.claus@micromata.de>
+Date: Tue, 27 Apr 2021 22:20:50 +0200
+Subject: [PATCH 1/2] add go modules file
+
+---
+ go.mod |  30 +++++
+ go.sum | 338 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 368 insertions(+)
+ create mode 100644 go.mod
+ create mode 100644 go.sum
+
+diff --git a/go.mod b/go.mod
+new file mode 100644
+index 0000000..3a17483
+--- /dev/null
++++ b/go.mod
+@@ -0,0 +1,30 @@
++module github.com/micromata/dave
++
++go 1.12
++
++require (
++	github.com/fsnotify/fsnotify v1.4.9
++	github.com/hashicorp/hcl v1.0.0
++	github.com/inconshreveable/mousetrap v1.0.0
++	github.com/konsorten/go-windows-terminal-sequences v1.0.3
++	github.com/magefile/mage v1.10.0
++	github.com/magiconair/properties v1.8.2
++	github.com/mitchellh/mapstructure v1.3.3
++	github.com/pelletier/go-toml v1.8.0
++	github.com/pkg/errors v0.9.1
++	github.com/sirupsen/logrus v1.6.0
++	github.com/spf13/afero v1.3.4
++	github.com/spf13/cast v1.3.1
++	github.com/spf13/cobra v1.0.0
++	github.com/spf13/jwalterweatherman v1.1.0
++	github.com/spf13/pflag v1.0.5
++	github.com/spf13/viper v1.7.1
++	github.com/stretchr/objx v0.1.1 // indirect
++	github.com/subosito/gotenv v1.2.0
++	golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
++	golang.org/x/net v0.0.0-20200822124328-c89045814202
++	golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8
++	golang.org/x/text v0.3.3
++	gopkg.in/ini.v1 v1.60.1
++	gopkg.in/yaml.v2 v2.3.0
++)
+diff --git a/go.sum b/go.sum
+new file mode 100644
+index 0000000..0164408
+--- /dev/null
++++ b/go.sum
+@@ -0,0 +1,338 @@
++cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
++cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
++cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
++cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
++cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
++cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
++cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
++cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
++cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
++cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
++cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
++cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
++dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
++github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
++github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
++github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
++github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
++github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
++github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
++github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
++github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
++github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
++github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
++github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
++github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
++github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
++github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
++github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
++github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
++github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
++github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
++github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
++github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
++github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
++github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
++github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
++github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
++github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
++github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
++github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
++github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
++github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
++github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
++github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
++github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
++github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
++github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
++github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
++github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
++github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
++github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
++github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
++github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
++github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
++github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
++github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
++github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
++github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
++github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
++github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
++github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
++github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
++github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
++github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
++github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
++github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
++github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
++github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
++github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
++github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
++github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
++github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
++github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
++github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
++github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
++github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
++github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
++github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
++github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
++github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
++github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
++github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
++github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
++github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
++github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
++github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
++github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
++github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
++github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
++github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
++github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
++github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
++github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
++github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
++github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
++github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
++github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
++github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
++github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
++github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
++github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
++github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
++github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
++github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
++github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
++github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
++github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
++github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
++github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
++github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
++github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
++github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
++github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
++github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
++github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
++github.com/magiconair/properties v1.8.2 h1:znVR8Q4g7/WlcvsxLBRWvo+vtFJUAbDn3w+Yak2xVMI=
++github.com/magiconair/properties v1.8.2/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
++github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
++github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
++github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
++github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
++github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
++github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
++github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
++github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
++github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
++github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
++github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
++github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
++github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8=
++github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
++github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
++github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
++github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
++github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
++github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
++github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
++github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw=
++github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs=
++github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
++github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
++github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
++github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
++github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
++github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
++github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
++github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
++github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
++github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
++github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
++github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
++github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
++github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
++github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
++github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
++github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
++github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
++github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
++github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
++github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
++github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
++github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
++github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
++github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
++github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
++github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
++github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
++github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
++github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
++github.com/spf13/afero v1.3.4 h1:8q6vk3hthlpb2SouZcnBVKboxWQWMDNF38bwholZrJc=
++github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
++github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
++github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
++github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
++github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
++github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
++github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
++github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
++github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
++github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
++github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
++github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
++github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
++github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
++github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
++github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
++github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
++github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
++github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
++github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
++github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
++github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
++github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
++github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
++github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
++github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
++go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
++go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
++go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
++go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
++go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
++go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
++golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
++golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
++golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
++golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
++golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
++golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
++golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
++golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
++golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
++golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
++golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
++golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
++golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
++golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
++golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
++golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
++golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
++golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
++golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
++golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
++golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
++golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
++golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
++golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
++golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
++golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
++golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
++golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
++golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
++golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
++golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
++golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
++golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
++golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
++golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
++golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
++golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
++golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
++golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
++golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
++golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
++golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
++golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA=
++golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
++golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
++golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
++golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
++golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
++golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
++golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
++golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
++golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
++golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
++golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
++golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
++golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
++golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
++golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
++golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
++golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8 h1:AvbQYmiaaaza3cW3QXRyPo5kYgpFIzOAfeAAN7m3qQ4=
++golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
++golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
++golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
++golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
++golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
++golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
++golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
++golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
++golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
++golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
++golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
++golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
++golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
++golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
++golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
++golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
++golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
++golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
++golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
++golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
++golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
++golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
++golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
++golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
++golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
++google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
++google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
++google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
++google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
++google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
++google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
++google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
++google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
++google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
++google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
++google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
++google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
++google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
++google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
++google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
++google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
++google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
++google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
++google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
++google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
++google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
++google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
++gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
++gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
++gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
++gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
++gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
++gopkg.in/ini.v1 v1.60.1 h1:P5y5shSkb0CFe44qEeMBgn8JLow09MP17jlJHanke5g=
++gopkg.in/ini.v1 v1.60.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
++gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
++gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
++gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
++gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
++gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
++gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
++gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
++honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
++honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
++honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
++honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
++rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+-- 
+2.39.0
+
+
+From cb3ef7b52fcd3e78b218b67420cb93e97a8e03ce Mon Sep 17 00:00:00 2001
+From: Aaron Jheng <wentworth@outlook.com>
+Date: Fri, 27 Jan 2023 01:42:53 +0000
+Subject: [PATCH 2/2] Bump golang.org/x/sys
+
+---
+ go.mod | 36 +++++++++++++++++++-----------------
+ go.sum | 16 ++++++++++++++++
+ 2 files changed, 35 insertions(+), 17 deletions(-)
+
+diff --git a/go.mod b/go.mod
+index 3a17483..c957ff4 100644
+--- a/go.mod
++++ b/go.mod
+@@ -1,30 +1,32 @@
+ module github.com/micromata/dave
+ 
+-go 1.12
++go 1.18
+ 
+ require (
+ 	github.com/fsnotify/fsnotify v1.4.9
+-	github.com/hashicorp/hcl v1.0.0
+-	github.com/inconshreveable/mousetrap v1.0.0
+-	github.com/konsorten/go-windows-terminal-sequences v1.0.3
+ 	github.com/magefile/mage v1.10.0
+-	github.com/magiconair/properties v1.8.2
+-	github.com/mitchellh/mapstructure v1.3.3
+-	github.com/pelletier/go-toml v1.8.0
+ 	github.com/pkg/errors v0.9.1
+ 	github.com/sirupsen/logrus v1.6.0
+-	github.com/spf13/afero v1.3.4
+-	github.com/spf13/cast v1.3.1
+ 	github.com/spf13/cobra v1.0.0
+-	github.com/spf13/jwalterweatherman v1.1.0
+-	github.com/spf13/pflag v1.0.5
+ 	github.com/spf13/viper v1.7.1
+-	github.com/stretchr/objx v0.1.1 // indirect
+-	github.com/subosito/gotenv v1.2.0
+ 	golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
+ 	golang.org/x/net v0.0.0-20200822124328-c89045814202
+-	golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8
+-	golang.org/x/text v0.3.3
+-	gopkg.in/ini.v1 v1.60.1
+-	gopkg.in/yaml.v2 v2.3.0
++)
++
++require (
++	github.com/hashicorp/hcl v1.0.0 // indirect
++	github.com/inconshreveable/mousetrap v1.0.0 // indirect
++	github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect
++	github.com/magiconair/properties v1.8.2 // indirect
++	github.com/mitchellh/mapstructure v1.3.3 // indirect
++	github.com/pelletier/go-toml v1.8.0 // indirect
++	github.com/spf13/afero v1.3.4 // indirect
++	github.com/spf13/cast v1.3.1 // indirect
++	github.com/spf13/jwalterweatherman v1.1.0 // indirect
++	github.com/spf13/pflag v1.0.5 // indirect
++	github.com/subosito/gotenv v1.2.0 // indirect
++	golang.org/x/sys v0.4.0 // indirect
++	golang.org/x/text v0.3.3 // indirect
++	gopkg.in/ini.v1 v1.60.1 // indirect
++	gopkg.in/yaml.v2 v2.3.0 // indirect
+ )
+diff --git a/go.sum b/go.sum
+index 0164408..0f997b9 100644
+--- a/go.sum
++++ b/go.sum
+@@ -11,6 +11,7 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl
+ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
++github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
+ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+@@ -35,6 +36,7 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7
+ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
++github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+@@ -68,6 +70,7 @@ github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OI
+ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
++github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
+ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+@@ -95,21 +98,27 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
+ github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
++github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
+ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
++github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
++github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
+ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
+ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
++github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
++github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
++github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g=
+ github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
+ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+ github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+@@ -142,6 +151,7 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
+ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
++github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+@@ -162,7 +172,9 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV
+ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+ github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
+ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
++github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
+ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
++github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+@@ -187,6 +199,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
++github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
+ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
+ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+@@ -270,6 +283,8 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w
+ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+ golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8 h1:AvbQYmiaaaza3cW3QXRyPo5kYgpFIzOAfeAAN7m3qQ4=
+ golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
++golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
++golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+@@ -319,6 +334,7 @@ google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij
+ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
++gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+ gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+-- 
+2.39.0
+
diff --git a/nixpkgs/pkgs/servers/http/dufs/default.nix b/nixpkgs/pkgs/servers/http/dufs/default.nix
new file mode 100644
index 000000000000..433a68d1a54a
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/dufs/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, installShellFiles
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "dufs";
+  version = "0.40.0";
+
+  src = fetchFromGitHub {
+    owner = "sigoden";
+    repo = "dufs";
+    rev = "v${version}";
+    hash = "sha256-BoFoF7V6bTQiJ+afGnivviU/s2ikOxAX06s+AwRxo8Q=";
+  };
+
+  cargoHash = "sha256-B0K/lco7suYM0/02LaDbeqyt4zyiwoeBxhmUPsVTvkw=";
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  buildInputs = lib.optionals stdenv.isDarwin [
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  # FIXME: checkPhase on darwin will leave some zombie spawn processes
+  # see https://github.com/NixOS/nixpkgs/issues/205620
+  doCheck = !stdenv.isDarwin;
+  checkFlags = [
+    # tests depend on network interface, may fail with virtual IPs.
+    "--skip=validate_printed_urls"
+  ];
+
+  postInstall = ''
+    installShellCompletion --cmd dufs \
+      --bash <($out/bin/dufs --completions bash) \
+      --fish <($out/bin/dufs --completions fish) \
+      --zsh <($out/bin/dufs --completions zsh)
+  '';
+
+  meta = with lib; {
+    description = "A file server that supports static serving, uploading, searching, accessing control, webdav";
+    mainProgram = "dufs";
+    homepage = "https://github.com/sigoden/dufs";
+    changelog = "https://github.com/sigoden/dufs/blob/${src.rev}/CHANGELOG.md";
+    license = with licenses; [ asl20 /* or */ mit ];
+    maintainers = with maintainers; [ figsoda holymonson ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/envoy/0001-nixpkgs-use-system-Python.patch b/nixpkgs/pkgs/servers/http/envoy/0001-nixpkgs-use-system-Python.patch
new file mode 100644
index 000000000000..fc10f5999233
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/envoy/0001-nixpkgs-use-system-Python.patch
@@ -0,0 +1,83 @@
+From 4a9739da420b9584d5b9582c19cf3f86a6a90609 Mon Sep 17 00:00:00 2001
+From: Luke Granger-Brown <git@lukegb.com>
+Date: Fri, 12 May 2023 08:12:04 +0100
+Subject: [PATCH 1/3] nixpkgs: use system Python
+
+---
+ bazel/python_dependencies.bzl | 11 ++++-------
+ bazel/repositories_extra.bzl  | 16 ----------------
+ 2 files changed, 4 insertions(+), 23 deletions(-)
+
+diff --git a/bazel/python_dependencies.bzl b/bazel/python_dependencies.bzl
+index ea50bf30ba..b82f374720 100644
+--- a/bazel/python_dependencies.bzl
++++ b/bazel/python_dependencies.bzl
+@@ -1,27 +1,24 @@
+ load("@rules_python//python:pip.bzl", "pip_parse")
+-load("@python3_11//:defs.bzl", "interpreter")
+-load("@envoy_toolshed//:packages.bzl", "load_packages")
+ 
+ def envoy_python_dependencies():
+-    # TODO(phlax): rename base_pip3 -> pip3 and remove this
+-    load_packages()
++    pip_parse(
++        name = "pip3",
++        requirements_lock = "@envoy_toolshed//:requirements.txt",
++    )
+     pip_parse(
+         name = "base_pip3",
+-        python_interpreter_target = interpreter,
+         requirements_lock = "@envoy//tools/base:requirements.txt",
+         extra_pip_args = ["--require-hashes"],
+     )
+ 
+     pip_parse(
+         name = "dev_pip3",
+-        python_interpreter_target = interpreter,
+         requirements_lock = "@envoy//tools/dev:requirements.txt",
+         extra_pip_args = ["--require-hashes"],
+     )
+ 
+     pip_parse(
+         name = "fuzzing_pip3",
+-        python_interpreter_target = interpreter,
+         requirements_lock = "@rules_fuzzing//fuzzing:requirements.txt",
+         extra_pip_args = ["--require-hashes"],
+     )
+diff --git a/bazel/repositories_extra.bzl b/bazel/repositories_extra.bzl
+index 40d348073f..17b98b1ea1 100644
+--- a/bazel/repositories_extra.bzl
++++ b/bazel/repositories_extra.bzl
+@@ -1,29 +1,13 @@
+ load("@emsdk//:deps.bzl", emsdk_deps = "deps")
+-load("@rules_python//python:repositories.bzl", "python_register_toolchains")
+ load("@proxy_wasm_cpp_host//bazel/cargo/wasmtime:crates.bzl", "wasmtime_fetch_remote_crates")
+ load("//bazel/external/cargo:crates.bzl", "raze_fetch_remote_crates")
+ load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies")
+ 
+-def _python_minor_version(python_version):
+-    return "_".join(python_version.split(".")[:-1])
+-
+-# Python version for `rules_python`
+-PYTHON_VERSION = "3.11.3"
+-PYTHON_MINOR_VERSION = _python_minor_version(PYTHON_VERSION)
+-
+ # Envoy deps that rely on a first stage of dependency loading in envoy_dependencies().
+ def envoy_dependencies_extra(
+-        python_version = PYTHON_VERSION,
+         ignore_root_user_error = False):
+     emsdk_deps()
+     raze_fetch_remote_crates()
+     wasmtime_fetch_remote_crates()
+ 
+-    # Registers underscored Python minor version - eg `python3_10`
+-    python_register_toolchains(
+-        name = "python%s" % _python_minor_version(python_version),
+-        python_version = python_version,
+-        ignore_root_user_error = ignore_root_user_error,
+-    )
+-
+     aspect_bazel_lib_dependencies()
+-- 
+2.42.0
+
diff --git a/nixpkgs/pkgs/servers/http/envoy/0002-nixpkgs-use-system-Go.patch b/nixpkgs/pkgs/servers/http/envoy/0002-nixpkgs-use-system-Go.patch
new file mode 100644
index 000000000000..494b1e4e7262
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/envoy/0002-nixpkgs-use-system-Go.patch
@@ -0,0 +1,78 @@
+From 10e577a3c300f76ead5a5512f2fe970f12e46592 Mon Sep 17 00:00:00 2001
+From: Luke Granger-Brown <git@lukegb.com>
+Date: Fri, 12 May 2023 08:13:21 +0100
+Subject: [PATCH 2/3] nixpkgs: use system Go
+
+---
+ bazel/dependency_imports.bzl | 29 +----------------------------
+ bazel/repositories.bzl       |  3 ---
+ 2 files changed, 1 insertion(+), 31 deletions(-)
+
+diff --git a/bazel/dependency_imports.bzl b/bazel/dependency_imports.bzl
+index b743a1936d..afa04ef5c0 100644
+--- a/bazel/dependency_imports.bzl
++++ b/bazel/dependency_imports.bzl
+@@ -18,7 +18,7 @@ load("@com_google_cel_cpp//bazel:deps.bzl", "parser_deps")
+ load("@com_github_chrusty_protoc_gen_jsonschema//:deps.bzl", protoc_gen_jsonschema_go_dependencies = "go_dependencies")
+ 
+ # go version for rules_go
+-GO_VERSION = "1.18"
++GO_VERSION = "host"
+ 
+ JQ_VERSION = "1.6"
+ YQ_VERSION = "4.24.4"
+@@ -27,7 +27,6 @@ def envoy_dependency_imports(go_version = GO_VERSION, jq_version = JQ_VERSION, y
+     rules_foreign_cc_dependencies()
+     go_rules_dependencies()
+     go_register_toolchains(go_version)
+-    envoy_download_go_sdks(go_version)
+     gazelle_dependencies(go_sdk = "go_sdk")
+     apple_rules_dependencies()
+     pip_dependencies()
+@@ -148,29 +147,3 @@ def envoy_dependency_imports(go_version = GO_VERSION, jq_version = JQ_VERSION, y
+     )
+ 
+     protoc_gen_jsonschema_go_dependencies()
+-
+-def envoy_download_go_sdks(go_version):
+-    go_download_sdk(
+-        name = "go_linux_amd64",
+-        goos = "linux",
+-        goarch = "amd64",
+-        version = go_version,
+-    )
+-    go_download_sdk(
+-        name = "go_linux_arm64",
+-        goos = "linux",
+-        goarch = "arm64",
+-        version = go_version,
+-    )
+-    go_download_sdk(
+-        name = "go_darwin_amd64",
+-        goos = "darwin",
+-        goarch = "amd64",
+-        version = go_version,
+-    )
+-    go_download_sdk(
+-        name = "go_darwin_arm64",
+-        goos = "darwin",
+-        goarch = "arm64",
+-        version = go_version,
+-    )
+diff --git a/bazel/repositories.bzl b/bazel/repositories.bzl
+index 71667227f7..b10a47d344 100644
+--- a/bazel/repositories.bzl
++++ b/bazel/repositories.bzl
+@@ -215,9 +215,6 @@ def _go_deps(skip_targets):
+     if "io_bazel_rules_go" not in skip_targets:
+         external_http_archive(
+             name = "io_bazel_rules_go",
+-            # TODO(wrowe, sunjayBhatia): remove when Windows RBE supports batch file invocation
+-            patch_args = ["-p1"],
+-            patches = ["@envoy//bazel:rules_go.patch"],
+         )
+         external_http_archive("bazel_gazelle")
+ 
+-- 
+2.42.0
+
diff --git a/nixpkgs/pkgs/servers/http/envoy/0003-nixpkgs-use-system-C-C-toolchains.patch b/nixpkgs/pkgs/servers/http/envoy/0003-nixpkgs-use-system-C-C-toolchains.patch
new file mode 100644
index 000000000000..5a24e7e4a90d
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/envoy/0003-nixpkgs-use-system-C-C-toolchains.patch
@@ -0,0 +1,29 @@
+From 6175deb13a2df8bd25a56021ba8754e4be445219 Mon Sep 17 00:00:00 2001
+From: Luke Granger-Brown <git@lukegb.com>
+Date: Fri, 13 Oct 2023 21:42:51 +0000
+Subject: [PATCH 3/3] nixpkgs: use system C/C++ toolchains
+
+---
+ bazel/dependency_imports.bzl | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/bazel/dependency_imports.bzl b/bazel/dependency_imports.bzl
+index afa04ef5c0..a5ffaf4ff3 100644
+--- a/bazel/dependency_imports.bzl
++++ b/bazel/dependency_imports.bzl
+@@ -24,7 +24,11 @@ JQ_VERSION = "1.6"
+ YQ_VERSION = "4.24.4"
+ 
+ def envoy_dependency_imports(go_version = GO_VERSION, jq_version = JQ_VERSION, yq_version = YQ_VERSION):
+-    rules_foreign_cc_dependencies()
++    rules_foreign_cc_dependencies(
++        register_default_tools=False,  # no prebuilt toolchains
++	register_built_tools=False,  # nor from source
++	register_preinstalled_tools=True,  # use host tools (default)
++    )
+     go_rules_dependencies()
+     go_register_toolchains(go_version)
+     gazelle_dependencies(go_sdk = "go_sdk")
+-- 
+2.42.0
+
diff --git a/nixpkgs/pkgs/servers/http/envoy/default.nix b/nixpkgs/pkgs/servers/http/envoy/default.nix
new file mode 100644
index 000000000000..bb8a5e6a575c
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/envoy/default.nix
@@ -0,0 +1,201 @@
+{ lib
+, bazel_6
+, bazel-gazelle
+, buildBazelPackage
+, fetchFromGitHub
+, fetchpatch
+, stdenv
+, cmake
+, gn
+, go
+, jdk
+, ninja
+, patchelf
+, python3
+, linuxHeaders
+, nixosTests
+
+  # v8 (upstream default), wavm, wamr, wasmtime, disabled
+, wasmRuntime ? "wamr"
+}:
+
+let
+  srcVer = {
+    # We need the commit hash, since Bazel stamps the build with it.
+    # However, the version string is more useful for end-users.
+    # These are contained in a attrset of their own to make it obvious that
+    # people should update both.
+    version = "1.27.3";
+    rev = "0fd81ee7ffcd7cfc864094b24dc9b5c3ade89ff2";
+    hash = "sha256-WNyyUw3517oKqMd1sJMk9CiLa/V7UrhwlRS+AWNNOOo=";
+  };
+
+  # these need to be updated for any changes to fetchAttrs
+  depsHash = {
+    x86_64-linux = "sha256-wTGHfeFkCuijPdX//lT5GPspaxZsxzBHJffH1tpVM2w=";
+    aarch64-linux = "sha256-9/Wem+Gk/7bFeMNFC4J3mdTm3mrNmyMxiu5oadQcovU=";
+  }.${stdenv.system} or (throw "unsupported system ${stdenv.system}");
+in
+buildBazelPackage {
+  pname = "envoy";
+  inherit (srcVer) version;
+  bazel = bazel_6;
+  src = fetchFromGitHub {
+    owner = "envoyproxy";
+    repo = "envoy";
+    inherit (srcVer) hash rev;
+
+    postFetch = ''
+      chmod -R +w $out
+      rm $out/.bazelversion
+      echo ${srcVer.rev} > $out/SOURCE_VERSION
+    '';
+  };
+
+  postPatch = ''
+    sed -i 's,#!/usr/bin/env python3,#!${python3}/bin/python,' bazel/foreign_cc/luajit.patch
+    sed -i '/javabase=/d' .bazelrc
+    sed -i '/"-Werror"/d' bazel/envoy_internal.bzl
+
+    cp ${./protobuf.patch} bazel/protobuf.patch
+  '';
+
+  patches = [
+    # use system Python, not bazel-fetched binary Python
+    ./0001-nixpkgs-use-system-Python.patch
+
+    # use system Go, not bazel-fetched binary Go
+    ./0002-nixpkgs-use-system-Go.patch
+
+    # use system C/C++ tools
+    ./0003-nixpkgs-use-system-C-C-toolchains.patch
+
+    # bump proxy-wasm-cpp-host until > 1.27.3/1.28.0
+    (fetchpatch {
+      url = "https://github.com/envoyproxy/envoy/pull/31451.patch";
+      hash = "sha256-n8k7bho3B8Gm0dJbgf43kU7ymvo15aGJ2Twi2xR450g=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    python3
+    gn
+    go
+    jdk
+    ninja
+    patchelf
+  ];
+
+  buildInputs = [
+    linuxHeaders
+  ];
+
+  # external/com_github_grpc_grpc/src/core/ext/transport/binder/transport/binder_transport.cc:756:29: error: format not a string literal and no format arguments [-Werror=format-security]
+  hardeningDisable = [ "format" ];
+
+  fetchAttrs = {
+    sha256 = depsHash;
+    dontUseCmakeConfigure = true;
+    dontUseGnConfigure = true;
+    preInstall = ''
+      # Strip out the path to the build location (by deleting the comment line).
+      find $bazelOut/external -name requirements.bzl | while read requirements; do
+        sed -i '/# Generated from /d' "$requirements"
+      done
+
+      # Remove references to paths in the Nix store.
+      sed -i \
+        -e 's,${python3},__NIXPYTHON__,' \
+        -e 's,${stdenv.shellPackage},__NIXSHELL__,' \
+        $bazelOut/external/com_github_luajit_luajit/build.py \
+        $bazelOut/external/local_config_sh/BUILD \
+        $bazelOut/external/*_pip3/BUILD.bazel
+
+      rm -r $bazelOut/external/go_sdk
+      rm -r $bazelOut/external/local_jdk
+      rm -r $bazelOut/external/bazel_gazelle_go_repository_tools/bin
+
+      # Remove compiled python
+      find $bazelOut -name '*.pyc' -delete
+
+      # Remove Unix timestamps from go cache.
+      rm -rf $bazelOut/external/bazel_gazelle_go_repository_cache/{gocache,pkg/mod/cache,pkg/sumdb}
+
+      # fix tcmalloc failure https://github.com/envoyproxy/envoy/issues/30838
+      sed -i '/TCMALLOC_GCC_FLAGS = \[/a"-Wno-changes-meaning",' $bazelOut/external/com_github_google_tcmalloc/tcmalloc/copts.bzl
+    '';
+  };
+  buildAttrs = {
+    dontUseCmakeConfigure = true;
+    dontUseGnConfigure = true;
+    dontUseNinjaInstall = true;
+    preConfigure = ''
+      # Make executables work, for the most part.
+      find $bazelOut/external -type f -executable | while read execbin; do
+        file "$execbin" | grep -q ': ELF .*, dynamically linked,' || continue
+        patchelf \
+          --set-interpreter $(cat ${stdenv.cc}/nix-support/dynamic-linker) \
+          "$execbin"
+      done
+
+      ln -s ${bazel-gazelle}/bin $bazelOut/external/bazel_gazelle_go_repository_tools/bin
+
+      sed -i 's,#!/usr/bin/env bash,#!${stdenv.shell},' $bazelOut/external/rules_foreign_cc/foreign_cc/private/framework/toolchains/linux_commands.bzl
+
+      # Add paths to Nix store back.
+      sed -i \
+        -e 's,__NIXPYTHON__,${python3},' \
+        -e 's,__NIXSHELL__,${stdenv.shellPackage},' \
+        $bazelOut/external/com_github_luajit_luajit/build.py \
+        $bazelOut/external/local_config_sh/BUILD \
+        $bazelOut/external/*_pip3/BUILD.bazel
+    '';
+    installPhase = ''
+      install -Dm0755 bazel-bin/source/exe/envoy-static $out/bin/envoy
+    '';
+  };
+
+  removeRulesCC = false;
+  removeLocalConfigCc = true;
+  removeLocal = false;
+  bazelTargets = [ "//source/exe:envoy-static" ];
+  bazelBuildFlags = [
+    "-c opt"
+    "--spawn_strategy=standalone"
+    "--noexperimental_strict_action_env"
+    "--cxxopt=-Wno-error"
+    "--linkopt=-Wl,-z,noexecstack"
+
+    # Force use of system Java.
+    "--extra_toolchains=@local_jdk//:all"
+    "--java_runtime_version=local_jdk"
+    "--tool_java_runtime_version=local_jdk"
+
+    "--define=wasm=${wasmRuntime}"
+  ] ++ (lib.optionals stdenv.isAarch64 [
+    # external/com_github_google_tcmalloc/tcmalloc/internal/percpu_tcmalloc.h:611:9: error: expected ':' or '::' before '[' token
+    #   611 |       : [end_ptr] "=&r"(end_ptr), [cpu_id] "=&r"(cpu_id),
+    #       |         ^
+    "--define=tcmalloc=disabled"
+  ]);
+  bazelFetchFlags = [
+    "--define=wasm=${wasmRuntime}"
+  ];
+
+  passthru.tests = {
+    envoy = nixosTests.envoy;
+    # tested as a core component of Pomerium
+    pomerium = nixosTests.pomerium;
+  };
+
+  meta = with lib; {
+    homepage = "https://envoyproxy.io";
+    changelog = "https://github.com/envoyproxy/envoy/releases/tag/v${version}";
+    description = "Cloud-native edge and service proxy";
+    mainProgram = "envoy";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lukegb ];
+    platforms = [ "x86_64-linux" "aarch64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/envoy/protobuf.patch b/nixpkgs/pkgs/servers/http/envoy/protobuf.patch
new file mode 100644
index 000000000000..dc7026350316
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/envoy/protobuf.patch
@@ -0,0 +1,116 @@
+diff --git a/BUILD.bazel b/BUILD.bazel
+index 637882c49..2cb08f1b0 100644
+--- a/BUILD.bazel
++++ b/BUILD.bazel
+@@ -165,6 +165,8 @@ alias(
+     visibility = ["//visibility:public"],
+ )
+ 
++# Envoy: Patch
++
+ cc_binary(
+     name = "protoc",
+     copts = COPTS,
+@@ -173,6 +175,14 @@ cc_binary(
+     deps = ["//src/google/protobuf/compiler:protoc_lib"],
+ )
+ 
++alias(
++    name = "protobuf_python_genproto",
++    actual = "//python:well_known_types_py_pb2_genproto",
++    visibility = ["//visibility:public"],
++)
++
++# /Envoy: Patch
++
+ cc_binary(
+     name = "protoc_static",
+     copts = COPTS,
+diff --git a/python/google/protobuf/__init__.py b/python/google/protobuf/__init__.py
+index 88de4cf8a..b3e046997 100755
+--- a/python/google/protobuf/__init__.py
++++ b/python/google/protobuf/__init__.py
+@@ -31,3 +31,10 @@
+ # Copyright 2007 Google Inc. All Rights Reserved.
+ 
+ __version__ = '4.23.1'
++
++
++if __name__ != '__main__':
++    try:
++        __import__('pkg_resources').declare_namespace(__name__)
++    except ImportError:
++        __path__ = __import__('pkgutil').extend_path(__path__, __name__)
+diff --git a/src/google/protobuf/compiler/BUILD.bazel b/src/google/protobuf/compiler/BUILD.bazel
+index a2171c806..8aec6187f 100644
+--- a/src/google/protobuf/compiler/BUILD.bazel
++++ b/src/google/protobuf/compiler/BUILD.bazel
+@@ -306,7 +306,7 @@ cc_library(
+     srcs = ["retention.cc"],
+     hdrs = ["retention.h"],
+     include_prefix = "google/protobuf/compiler",
+-    visibility = ["//src/google/protobuf:__subpackages__"],
++    visibility = ["//visibility:public"],
+     deps = [
+         "//src/google/protobuf:protobuf_nowkt",
+         "@com_google_absl//absl/types:span",
+diff --git a/src/google/protobuf/io/BUILD.bazel b/src/google/protobuf/io/BUILD.bazel
+index 8f39625c2..2c2c73dcd 100644
+--- a/src/google/protobuf/io/BUILD.bazel
++++ b/src/google/protobuf/io/BUILD.bazel
+@@ -142,7 +142,7 @@ cc_library(
+         "@com_google_absl//absl/log:absl_log",
+     ] + select({
+         "//build_defs:config_msvc": [],
+-        "//conditions:default": ["@zlib//:zlib"],
++        "//conditions:default": ["//external:zlib"],
+     }),
+ )
+ 
+diff --git a/src/google/protobuf/map.h b/src/google/protobuf/map.h
+index 869ebf100..fec92e2b1 100644
+--- a/src/google/protobuf/map.h
++++ b/src/google/protobuf/map.h
+@@ -883,7 +883,7 @@ class KeyMapBase : public UntypedMapBase {
+         TreeConvert(b);
+       }
+       ABSL_DCHECK(TableEntryIsTree(b))
+-          << (void*)table_[b] << " " << (uintptr_t)table_[b];
++          << reinterpret_cast<void*>(table_[b]) << " " << static_cast<uintptr_t>(table_[b]);
+       InsertUniqueInTree(b, node);
+       index_of_first_non_null_ = (std::min)(index_of_first_non_null_, b);
+     }
+diff --git a/src/google/protobuf/map_field.h b/src/google/protobuf/map_field.h
+index 70b12b1e7..b8f46db45 100644
+--- a/src/google/protobuf/map_field.h
++++ b/src/google/protobuf/map_field.h
+@@ -345,7 +345,7 @@ class PROTOBUF_EXPORT MapFieldBase : public MapFieldBaseForParse {
+ 
+  protected:
+   // "protected" stops users from deleting a `MapFieldBase *`
+-  ~MapFieldBase();
++  virtual ~MapFieldBase();
+ 
+  public:
+   // Returns reference to internal repeated field. Data written using
+diff --git a/src/google/protobuf/port_def.inc b/src/google/protobuf/port_def.inc
+index 1c6a24945..6186c2ad1 100644
+--- a/src/google/protobuf/port_def.inc
++++ b/src/google/protobuf/port_def.inc
+@@ -1004,7 +1004,7 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3),
+ #pragma clang diagnostic ignored "-Wshorten-64-to-32"
+ // Turn on -Wdeprecated-enum-enum-conversion. This deprecation comes in C++20
+ // via http://wg21.link/p1120r0.
+-#pragma clang diagnostic error "-Wdeprecated-enum-enum-conversion"
++// #pragma clang diagnostic error "-Wdeprecated-enum-enum-conversion"
+ // This error has been generally flaky, but we need to disable it specifically
+ // to fix https://github.com/protocolbuffers/protobuf/issues/12313
+ #pragma clang diagnostic ignored "-Wunused-parameter"
+@@ -1062,6 +1062,7 @@ static_assert(PROTOBUF_ABSL_MIN(20230125, 3),
+ #pragma warning(disable: 4125)
+ #endif
+ 
++#pragma GCC diagnostic ignored "-Wundef"
+ #if PROTOBUF_ENABLE_DEBUG_LOGGING_MAY_LEAK_PII
+ #define PROTOBUF_DEBUG true
+ #else
diff --git a/nixpkgs/pkgs/servers/http/gatling/default.nix b/nixpkgs/pkgs/servers/http/gatling/default.nix
new file mode 100644
index 000000000000..1474232bd624
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/gatling/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchurl, libowfat, libcap, zlib, openssl, libxcrypt }:
+
+let
+  version = "0.16";
+in
+stdenv.mkDerivation rec {
+  pname = "gatling";
+  inherit version;
+
+  src = fetchurl {
+    url = "https://www.fefe.de/gatling/${pname}-${version}.tar.xz";
+    sha256 = "0nrnws5qrl4frqcsfa9z973vv5mifgr9z170qbvg3mq1wa7475jz";
+  };
+
+  buildInputs = [ libowfat libcap zlib openssl libxcrypt ];
+
+  configurePhase = ''
+    substituteInPlace Makefile --replace "/usr/local" "$out"
+    substituteInPlace GNUmakefile --replace "/opt/diet" "$out"
+  '';
+
+  buildPhase = ''
+    make gatling
+  '';
+
+  meta = with lib; {
+    description = "A high performance web server";
+    homepage = "http://www.fefe.de/gatling/";
+    license = lib.licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/h2o/default.nix b/nixpkgs/pkgs/servers/http/h2o/default.nix
new file mode 100644
index 000000000000..b533a908ef98
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/h2o/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub
+, pkg-config, cmake, ninja
+, openssl, libuv, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname   = "h2o";
+  version = "2.3.0-beta2";
+
+  src = fetchFromGitHub {
+    owner  = "h2o";
+    repo   = "h2o";
+    rev    = "refs/tags/v${version}";
+    sha256 = "0lwg5sfsr7fw7cfy0hrhadgixm35b5cgcvlhwhbk89j72y1bqi6n";
+  };
+
+  outputs = [ "out" "man" "dev" "lib" ];
+
+  nativeBuildInputs = [ pkg-config cmake ninja ];
+  buildInputs = [ openssl libuv zlib ];
+
+  meta = with lib; {
+    description = "Optimized HTTP/1 and HTTP/2 server";
+    homepage    = "https://h2o.examp1e.net";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ thoughtpolice ];
+    platforms   = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/hiawatha/default.nix b/nixpkgs/pkgs/servers/http/hiawatha/default.nix
new file mode 100644
index 000000000000..d92d5d51a4f8
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/hiawatha/default.nix
@@ -0,0 +1,57 @@
+{ lib, stdenv
+, fetchFromGitLab
+
+, cmake
+, ninja
+, mbedtls_2
+, libxcrypt
+
+, enableCache     ? true     # Internal cache support.
+, enableIpV6      ? true
+, enableTls       ? true
+, enableMonitor   ? false    # Support for the Hiawatha Monitor.
+, enableRproxy    ? true     # Reverse proxy support.
+, enableTomahawk  ? false    # Tomahawk, the Hiawatha command shell.
+, enableXslt      ? true, libxml2 ? null, libxslt ? null
+, enableToolkit   ? true     # The URL Toolkit.
+}:
+
+stdenv.mkDerivation rec {
+  pname = "hiawatha";
+  version = "10.11";
+
+  src = fetchFromGitLab {
+    owner = "hsleisink";
+    repo = "hiawatha";
+    rev = "v${version}";
+    sha256 = "10a7dqj37zrbmgnhwsw0mqm5x25kasl8p95g01rzakviwxkdrkid";
+  };
+
+  nativeBuildInputs = [ cmake ninja ];
+  buildInputs = [ mbedtls_2 libxcrypt ] ++ lib.optionals enableXslt [ libxslt libxml2 ];
+
+  prePatch = ''
+    substituteInPlace CMakeLists.txt --replace SETUID ""
+  '';
+
+  cmakeFlags = [
+    "-DUSE_SYSTEM_MBEDTLS=on" # Policy to use Nix deps, and Nix uses up to date deps
+    ( if enableCache     then "-DENABLE_CACHE=on"       else "-DENABLE_CACHE=off"       )
+    ( if enableIpV6      then "-DENABLE_IPV6=on"        else "-DENABLE_IPV6=off"        )
+    ( if enableTls       then "-DENABLE_TLS=on"         else "-DENABLE_TLS=off"         )
+    ( if enableMonitor   then "-DENABLE_MONITOR=on"     else "-DENABLE_MONITOR=off"     )
+    ( if enableRproxy    then "-DENABLE_RPROXY=on"      else "-DENABLE_RPROXY=off"      )
+    ( if enableTomahawk  then "-DENABLE_TOMAHAWK=on"    else "-DENABLE_TOMAHAWK=off"    )
+    ( if enableXslt      then "-DENABLE_XSLT=on"        else "-DENABLE_XSLT=off"        )
+    ( if enableToolkit   then "-DENABLE_TOOLKIT=on"     else "-DENABLE_TOOLKIT=off"     )
+  ];
+
+  meta = with lib; {
+    homepage = "https://www.hiawatha-webserver.org";
+    description = "An advanced and secure webserver";
+    license = licenses.gpl2;
+    platforms = platforms.unix;    # "Hiawatha runs perfectly on Linux, BSD and MacOS X"
+    maintainers = [];
+  };
+
+}
diff --git a/nixpkgs/pkgs/servers/http/hyp/default.nix b/nixpkgs/pkgs/servers/http/hyp/default.nix
new file mode 100644
index 000000000000..76562311ac64
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/hyp/default.nix
@@ -0,0 +1,20 @@
+{ lib, python3Packages, fetchPypi }:
+
+python3Packages.buildPythonPackage rec {
+  pname = "hyp-server";
+  version = "1.2.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1lafjdcn9nnq6xc3hhyizfwh6l69lc7rixn6dx65aq71c913jc15";
+  };
+
+  meta = with lib; {
+    description = "Hyperminimal https server";
+    mainProgram = "hyp";
+    homepage    = "https://github.com/rnhmjoj/hyp";
+    license     = with licenses; [gpl3Plus mit];
+    maintainers = with maintainers; [ rnhmjoj ];
+    platforms   = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/jboss/default.nix b/nixpkgs/pkgs/servers/http/jboss/default.nix
new file mode 100644
index 000000000000..4ad126afa501
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/jboss/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchurl, jdk }:
+
+stdenv.mkDerivation rec {
+  pname = "jboss-as";
+  version = "7.1.1.Final";
+  src = fetchurl {
+    url = "https://download.jboss.org/jbossas/${lib.versions.majorMinor version}/jboss-as-${version}/jboss-as-${version}.tar.gz";
+    sha256 = "1bdjw0ib9qr498vpfbg8klqw6rl11vbz7vwn6gp1r5gpqkd3zzc8";
+  };
+
+  installPhase = ''
+    mv $PWD $out
+    find $out/bin -name \*.sh -print0 | xargs -0 sed -i -e '/#!\/bin\/sh/aJAVA_HOME=${jdk}'
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.jboss.org/";
+    description = "Open Source J2EE application server";
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = licenses.lgpl21;
+    maintainers = [ maintainers.sander ];
+    platforms = platforms.unix;
+    knownVulnerabilities = [
+      "CVE-2015-7501: remote code execution in apache-commons-collections: InvokerTransformer during deserialisation"
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/jboss/jdbc/mysql/default.nix b/nixpkgs/pkgs/servers/http/jboss/jdbc/mysql/default.nix
new file mode 100644
index 000000000000..078ae4d51149
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/jboss/jdbc/mysql/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, mysql_jdbc }:
+
+stdenv.mkDerivation {
+  pname = "jboss-mysql-jdbc";
+  inherit (mysql_jdbc) version;
+
+  dontUnpack = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/server/default/lib
+    ln -s $mysql_jdbc/share/java/mysql-connector-java.jar $out/server/default/lib/mysql-connector-java.jar
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    inherit (mysql_jdbc.meta) description license platforms homepage;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/jetty/11.x.nix b/nixpkgs/pkgs/servers/http/jetty/11.x.nix
new file mode 100644
index 000000000000..0744d76a32d1
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/jetty/11.x.nix
@@ -0,0 +1,4 @@
+import ./common.nix {
+  version = "11.0.20";
+  hash = "sha256-qOpIWht7Q8zjNRiHvpN5SBy+hOhddhgor5S55gWxHlQ=";
+}
diff --git a/nixpkgs/pkgs/servers/http/jetty/12.x.nix b/nixpkgs/pkgs/servers/http/jetty/12.x.nix
new file mode 100644
index 000000000000..c3ad743310da
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/jetty/12.x.nix
@@ -0,0 +1,4 @@
+import ./common.nix {
+  version = "12.0.7";
+  hash = "sha256-n85MgRRWCaa7+KvGH1QyiQ03TFoAw7N2jPCJbmuGZNg=";
+}
diff --git a/nixpkgs/pkgs/servers/http/jetty/common.nix b/nixpkgs/pkgs/servers/http/jetty/common.nix
new file mode 100644
index 000000000000..83adac4ddd0d
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/jetty/common.nix
@@ -0,0 +1,30 @@
+{ version, hash }:
+
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation rec {
+  pname = "jetty";
+
+  inherit version;
+
+  src = fetchurl {
+    url = "mirror://maven/org/eclipse/jetty/jetty-home/${version}/jetty-home-${version}.tar.gz";
+    inherit hash;
+  };
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out
+    mv etc lib modules start.jar $out
+  '';
+
+  meta = with lib; {
+    description = "A Web server and javax.servlet container";
+    homepage = "https://eclipse.dev/jetty/";
+    platforms = platforms.all;
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    license = with licenses; [ asl20 epl10 ];
+    maintainers = with maintainers; [ emmanuelrosa anthonyroussel ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/lighttpd/default.nix b/nixpkgs/pkgs/servers/http/lighttpd/default.nix
new file mode 100644
index 000000000000..051f1c18e64e
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/lighttpd/default.nix
@@ -0,0 +1,82 @@
+{ lib, stdenv, buildPackages, fetchurl, pkg-config, pcre2, libxml2, zlib, bzip2, which, file
+, fetchpatch
+, openssl
+, enableDbi ? false, libdbi
+, enableMagnet ? false, lua5_1
+, enableMysql ? false, libmysqlclient
+, enableLdap ? false, openldap
+, enablePam ? false, linux-pam
+, enableSasl ? false, cyrus_sasl
+, enableWebDAV ? false, sqlite, libuuid
+, enableExtendedAttrs ? false, attr
+, perl
+, nixosTests
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lighttpd";
+  version = "1.4.75";
+
+  src = fetchurl {
+    url = "https://download.lighttpd.net/lighttpd/releases-${lib.versions.majorMinor version}.x/${pname}-${version}.tar.xz";
+    sha256 = "sha256-i3IcqTnTEq+qbvMdy9avtRYe04Wsgo5vzNTFt2vhidY=";
+  };
+
+  postPatch = ''
+    patchShebangs tests
+  '';
+
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ pcre2 pcre2.dev libxml2 zlib bzip2 which file openssl ]
+             ++ lib.optional enableDbi libdbi
+             ++ lib.optional enableMagnet lua5_1
+             ++ lib.optional enableMysql libmysqlclient
+             ++ lib.optional enableLdap openldap
+             ++ lib.optional enablePam linux-pam
+             ++ lib.optional enableSasl cyrus_sasl
+             ++ lib.optional enableWebDAV sqlite
+             ++ lib.optional enableWebDAV libuuid;
+
+  configureFlags = [ "--with-openssl" ]
+                ++ lib.optional enableDbi "--with-dbi"
+                ++ lib.optional enableMagnet "--with-lua"
+                ++ lib.optional enableMysql "--with-mysql"
+                ++ lib.optional enableLdap "--with-ldap"
+                ++ lib.optional enablePam "--with-pam"
+                ++ lib.optional enableSasl "--with-sasl"
+                ++ lib.optional enableWebDAV "--with-webdav-props"
+                ++ lib.optional enableWebDAV "--with-webdav-locks"
+                ++ lib.optional enableExtendedAttrs "--with-attr";
+
+  preConfigure = ''
+    export PATH=$PATH:${pcre2.dev}/bin
+    sed -i "s:/usr/bin/file:${file}/bin/file:g" configure
+  '';
+
+  nativeCheckInputs = [ perl ];
+  doCheck = true;
+
+  postInstall = ''
+    mkdir -p "$out/share/lighttpd/doc/config"
+    cp -vr doc/config "$out/share/lighttpd/doc/"
+    # Remove files that references needless store paths (dependency bloat)
+    rm "$out/share/lighttpd/doc/config/Makefile"*
+    rm "$out/share/lighttpd/doc/config/conf.d/Makefile"*
+    rm "$out/share/lighttpd/doc/config/vhosts.d/Makefile"*
+  '';
+
+  passthru.tests = {
+    inherit (nixosTests) lighttpd;
+  };
+
+  meta = with lib; {
+    description = "Lightweight high-performance web server";
+    homepage = "http://www.lighttpd.net/";
+    license = lib.licenses.bsd3;
+    platforms = platforms.linux ++ platforms.darwin;
+    maintainers = with maintainers; [ bjornfor brecht ];
+    mainProgram = "lighttpd";
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/lwan/default.nix b/nixpkgs/pkgs/servers/http/lwan/default.nix
new file mode 100644
index 000000000000..bc155d353b9f
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/lwan/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, zlib, cmake, enableJemalloc ? !stdenv.hostPlatform.isMusl, jemalloc }:
+
+stdenv.mkDerivation rec {
+  pname = "lwan";
+  version = "0.4";
+
+  src = fetchFromGitHub {
+    owner = "lpereira";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-Z8kiuZHLEupCKFrj8guiu9fTG7s+5KiQ6x0pg9iMy0c=";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config ];
+
+  buildInputs = [ zlib ] ++ lib.optional enableJemalloc jemalloc;
+
+  # Note: tcmalloc and mimalloc are also supported (and normal malloc)
+  cmakeFlags = lib.optional enableJemalloc "-DUSE_ALTERNATIVE_MALLOC=jemalloc";
+
+  hardeningDisable = lib.optional stdenv.hostPlatform.isMusl "pie";
+
+  meta = with lib; {
+    description = "Lightweight high-performance multi-threaded web server";
+    mainProgram = "lwan";
+    longDescription = "A lightweight and speedy web server with a low memory
+      footprint (~500KiB for 10k idle connections), with minimal system calls and
+      memory allocation.  Lwan contains a hand-crafted HTTP request parser. Files are
+      served using the most efficient way according to their size: no copies between
+      kernel and userland for files larger than 16KiB.  Smaller files are sent using
+      vectored I/O of memory-mapped buffers. Header overhead is considered before
+      compressing small files.  Features include: mustache templating engine and IPv6
+      support.
+    ";
+    homepage = "https://lwan.ws/";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ leenaars ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/merecat/default.nix b/nixpkgs/pkgs/servers/http/merecat/default.nix
new file mode 100644
index 000000000000..6231fb9e2ad2
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/merecat/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, autoreconfHook
+, pkg-config
+, libconfuse
+, libxcrypt
+, testers
+, merecat
+, nixosTests
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "merecat";
+  version = "2.31";
+
+  # Or, already reconf'd: ftp://ftp.troglobit.com/merecat/merecat-${finalAttrs.version}.tar.xz
+  src = fetchFromGitHub {
+    owner = "troglobit";
+    repo = "merecat";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-oIzOXUnCFqd3HPyKp58r+enRRpaE7f9hqNITtxCCB7I=";
+  };
+
+  nativeBuildInputs = [
+    autoreconfHook
+    pkg-config
+  ];
+
+  buildInputs = [
+    libconfuse
+    libxcrypt
+  ];
+
+  passthru.tests = {
+    testVersion = testers.testVersion {
+      package = merecat;
+      command = "merecat -V";
+    };
+    inherit (nixosTests) merecat;
+  };
+
+  meta = with lib; {
+    description = "Small and made-easy HTTP/HTTPS server based on Jef Poskanzer's thttpd";
+    homepage = "https://troglobit.com/projects/merecat/";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+    # Strange header and/or linker errors
+    broken = stdenv.isDarwin;
+  };
+})
diff --git a/nixpkgs/pkgs/servers/http/micro-httpd/default.nix b/nixpkgs/pkgs/servers/http/micro-httpd/default.nix
new file mode 100644
index 000000000000..b4a555910545
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/micro-httpd/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchurl }:
+
+stdenv.mkDerivation {
+  pname = "micro-httpd";
+  version = "20140814";
+
+  src = fetchurl {
+    url   = "https://acme.com/software/micro_httpd/micro_httpd_14Aug2014.tar.gz";
+    sha256 = "0mlm24bi31s0s8w55i0sysv2nc1n2x4cfp6dm47slz49h2fz24rk";
+  };
+
+  preBuild = ''
+    makeFlagsArray=(BINDIR="$out/bin" MANDIR="$out/share/man/man8")
+    mkdir -p $out/bin
+    mkdir -p $out/share/man/man8
+  '';
+
+  meta = with lib; {
+    homepage    = "http://acme.com/software/micro_httpd/";
+    description = "A really small HTTP server";
+    license     = licenses.bsd2;
+    platforms   = platforms.unix;
+    maintainers = with maintainers; [ copumpkin ];
+    mainProgram = "micro_httpd";
+  };
+}
+
diff --git a/nixpkgs/pkgs/servers/http/mini-httpd/default.nix b/nixpkgs/pkgs/servers/http/mini-httpd/default.nix
new file mode 100644
index 000000000000..fdf5012514f6
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/mini-httpd/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl, boost }:
+
+stdenv.mkDerivation rec {
+  pname = "mini-httpd";
+  version = "1.7";
+
+  src = fetchurl {
+    url = "https://download-mirror.savannah.gnu.org/releases/mini-httpd/${pname}-${version}.tar.gz";
+    sha256 = "0jggmlaywjfbdljzv5hyiz49plnxh0har2bnc9dq4xmj1pmjgs49";
+  };
+
+  buildInputs = [ boost ];
+
+  enableParallelBuilding = true;
+
+  env.NIX_CFLAGS_COMPILE = toString [ "-std=c++14" ];
+
+  meta = {
+    homepage = "http://mini-httpd.nongnu.org/";
+    description = "minimalistic high-performance web server";
+    mainProgram = "httpd";
+    license = lib.licenses.gpl3;
+    platforms = lib.platforms.linux;
+    maintainers = [ lib.maintainers.peti ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/nginx/generic.nix b/nixpkgs/pkgs/servers/http/nginx/generic.nix
new file mode 100644
index 000000000000..e998675b5766
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nginx/generic.nix
@@ -0,0 +1,210 @@
+outer@{ lib, stdenv, fetchurl, fetchpatch, openssl, zlib, pcre, libxml2, libxslt
+, nginx-doc
+
+, nixosTests
+, installShellFiles, substituteAll, removeReferencesTo, gd, geoip, perl
+, withDebug ? false
+, withKTLS ? true
+, withStream ? true
+, withMail ? false
+, withPerl ? true
+, withSlice ? false
+, modules ? []
+, ...
+}:
+
+{ pname ? "nginx"
+, version
+, nginxVersion ? version
+, src ? null # defaults to upstream nginx ${version}
+, hash ? null # when not specifying src
+, configureFlags ? []
+, nativeBuildInputs ? []
+, buildInputs ? []
+, extraPatches ? []
+, fixPatch ? p: p
+, postPatch ? ""
+, preConfigure ? ""
+, preInstall ? ""
+, postInstall ? ""
+, meta ? null
+, nginx-doc ? outer.nginx-doc
+, passthru ? { tests = {}; }
+}:
+
+let
+
+  moduleNames = map (mod: mod.name or (throw "The nginx module with source ${toString mod.src} does not have a `name` attribute. This prevents duplicate module detection and is no longer supported."))
+    modules;
+
+  mapModules = attrPath: lib.flip lib.concatMap modules
+    (mod:
+      let supports = mod.supports or (_: true);
+      in
+        if supports nginxVersion then mod.${attrPath} or []
+        else throw "Module at ${toString mod.src} does not support nginx version ${nginxVersion}!");
+
+in
+
+assert lib.assertMsg (lib.unique moduleNames == moduleNames)
+  "nginx: duplicate modules: ${lib.concatStringsSep ", " moduleNames}. A common cause for this is that services.nginx.additionalModules adds a module which the nixos module itself already adds.";
+
+stdenv.mkDerivation {
+  inherit pname version nginxVersion;
+
+  outputs = [ "out" "doc" ];
+
+  src = if src != null then src else fetchurl {
+    url = "https://nginx.org/download/nginx-${version}.tar.gz";
+    inherit hash;
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    removeReferencesTo
+  ] ++ nativeBuildInputs;
+
+  buildInputs = [ openssl zlib pcre libxml2 libxslt gd geoip perl ]
+    ++ buildInputs
+    ++ mapModules "inputs";
+
+  configureFlags = [
+    "--sbin-path=bin/nginx"
+    "--with-http_ssl_module"
+    "--with-http_v2_module"
+    "--with-http_realip_module"
+    "--with-http_addition_module"
+    "--with-http_xslt_module"
+    "--with-http_sub_module"
+    "--with-http_dav_module"
+    "--with-http_flv_module"
+    "--with-http_mp4_module"
+    "--with-http_gunzip_module"
+    "--with-http_gzip_static_module"
+    "--with-http_auth_request_module"
+    "--with-http_random_index_module"
+    "--with-http_secure_link_module"
+    "--with-http_degradation_module"
+    "--with-http_stub_status_module"
+    "--with-threads"
+    "--with-pcre-jit"
+    "--http-log-path=/var/log/nginx/access.log"
+    "--error-log-path=/var/log/nginx/error.log"
+    "--pid-path=/var/log/nginx/nginx.pid"
+    "--http-client-body-temp-path=/tmp/nginx_client_body"
+    "--http-proxy-temp-path=/tmp/nginx_proxy"
+    "--http-fastcgi-temp-path=/tmp/nginx_fastcgi"
+    "--http-uwsgi-temp-path=/tmp/nginx_uwsgi"
+    "--http-scgi-temp-path=/tmp/nginx_scgi"
+  ] ++ lib.optionals withDebug [
+    "--with-debug"
+  ] ++ lib.optionals withKTLS [
+    "--with-openssl-opt=enable-ktls"
+  ] ++ lib.optionals withStream [
+    "--with-stream"
+    "--with-stream_realip_module"
+    "--with-stream_ssl_module"
+    "--with-stream_ssl_preread_module"
+  ] ++ lib.optionals withMail [
+    "--with-mail"
+    "--with-mail_ssl_module"
+  ] ++ lib.optionals withPerl [
+    "--with-http_perl_module"
+    "--with-perl=${perl}/bin/perl"
+    "--with-perl_modules_path=lib/perl5"
+  ] ++ lib.optional withSlice "--with-http_slice_module"
+    ++ lib.optional (gd != null) "--with-http_image_filter_module"
+    ++ lib.optional (geoip != null) "--with-http_geoip_module"
+    ++ lib.optional (withStream && geoip != null) "--with-stream_geoip_module"
+    ++ lib.optional (with stdenv.hostPlatform; isLinux || isFreeBSD) "--with-file-aio"
+    ++ configureFlags
+    ++ map (mod: "--add-module=${mod.src}") modules;
+
+  env.NIX_CFLAGS_COMPILE = toString ([
+    "-I${libxml2.dev}/include/libxml2"
+    "-Wno-error=implicit-fallthrough"
+  ] ++ lib.optionals (stdenv.cc.isGNU && lib.versionAtLeast stdenv.cc.version "11") [
+    # fix build vts module on gcc11
+    "-Wno-error=stringop-overread"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "-Wno-error=deprecated-declarations"
+    "-Wno-error=gnu-folding-constant"
+    "-Wno-error=unused-but-set-variable"
+  ]);
+
+  configurePlatforms = [];
+
+  # Disable _multioutConfig hook which adds --bindir=$out/bin into configureFlags,
+  # which breaks build, since nginx does not actually use autoconf.
+  preConfigure = ''
+    setOutputFlags=
+  '' + preConfigure
+     + lib.concatMapStringsSep "\n" (mod: mod.preConfigure or "") modules;
+
+  patches = map fixPatch ([
+    (substituteAll {
+      src = ./nix-etag-1.15.4.patch;
+      preInstall = ''
+        export nixStoreDir="$NIX_STORE" nixStoreDirLen="''${#NIX_STORE}"
+      '';
+    })
+    ./nix-skip-check-logs-path.patch
+  ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+    (fetchpatch {
+      url = "https://raw.githubusercontent.com/openwrt/packages/c057dfb09c7027287c7862afab965a4cd95293a3/net/nginx/patches/102-sizeof_test_fix.patch";
+      sha256 = "0i2k30ac8d7inj9l6bl0684kjglam2f68z8lf3xggcc2i5wzhh8a";
+    })
+    (fetchpatch {
+      url = "https://raw.githubusercontent.com/openwrt/packages/c057dfb09c7027287c7862afab965a4cd95293a3/net/nginx/patches/101-feature_test_fix.patch";
+      sha256 = "0v6890a85aqmw60pgj3mm7g8nkaphgq65dj4v9c6h58wdsrc6f0y";
+    })
+    (fetchpatch {
+      url = "https://raw.githubusercontent.com/openwrt/packages/c057dfb09c7027287c7862afab965a4cd95293a3/net/nginx/patches/103-sys_nerr.patch";
+      sha256 = "0s497x6mkz947aw29wdy073k8dyjq8j99lax1a1mzpikzr4rxlmd";
+    })
+  ] ++ mapModules "patches")
+    ++ extraPatches;
+
+  inherit postPatch;
+
+  hardeningEnable = lib.optional (!stdenv.isDarwin) "pie";
+
+  enableParallelBuilding = true;
+
+  preInstall = ''
+    mkdir -p $doc
+    cp -r ${nginx-doc}/* $doc
+
+    # TODO: make it unconditional when `openresty` and `nginx` are not
+    # sharing this code.
+    if [[ -e man/nginx.8 ]]; then
+      installManPage man/nginx.8
+    fi
+  '' + preInstall;
+
+  disallowedReferences = map (m: m.src) modules;
+
+  postInstall =
+    let
+      noSourceRefs = lib.concatMapStrings (m: "remove-references-to -t ${m.src} $out/bin/nginx\n") modules;
+    in noSourceRefs + postInstall;
+
+  passthru = {
+    inherit modules;
+    tests = {
+      inherit (nixosTests) nginx nginx-auth nginx-etag nginx-etag-compression nginx-globalredirect nginx-http3 nginx-proxyprotocol nginx-pubhtml nginx-sso nginx-status-page nginx-unix-socket;
+      variants = lib.recurseIntoAttrs nixosTests.nginx-variants;
+      acme-integration = nixosTests.acme;
+    } // passthru.tests;
+  };
+
+  meta = if meta != null then meta else with lib; {
+    description = "A reverse proxy and lightweight webserver";
+    mainProgram = "nginx";
+    homepage    = "http://nginx.org";
+    license     = [ licenses.bsd2 ]
+      ++ concatMap (m: m.meta.license) modules;
+    platforms   = platforms.all;
+    maintainers = with maintainers; [ fpletz raitobezarius ] ++ teams.helsinki-systems.members;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/nginx/mainline.nix b/nixpkgs/pkgs/servers/http/nginx/mainline.nix
new file mode 100644
index 000000000000..ddb9c14740bb
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nginx/mainline.nix
@@ -0,0 +1,6 @@
+{ callPackage, ... }@args:
+
+callPackage ./generic.nix args {
+  version = "1.25.4";
+  hash = "sha256-dgcpkBrLqlF5luaB7m6iWQMpheN8J2i+74DfOod97tk=";
+}
diff --git a/nixpkgs/pkgs/servers/http/nginx/modules.nix b/nixpkgs/pkgs/servers/http/nginx/modules.nix
new file mode 100644
index 000000000000..978a1c854b38
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nginx/modules.nix
@@ -0,0 +1,1054 @@
+{ lib
+, config
+, fetchFromGitHub
+, fetchFromGitLab
+, fetchhg
+, fetchpatch
+, runCommand
+
+, arpa2common
+, brotli
+, curl
+, expat
+, fdk_aac
+, ffmpeg-headless
+, geoip
+, libbsd
+, libiconv
+, libjpeg
+, libkrb5
+, libmaxminddb
+, libmodsecurity
+, libuuid
+, libxml2
+, lmdb
+, luajit_openresty
+, msgpuck
+, openssl
+, opentracing-cpp
+, pam
+, psol
+, which
+, yajl
+, zlib
+, zstd
+}:
+
+let
+
+  http_proxy_connect_module_generic = patchName: rec {
+    name = "http_proxy_connect";
+    src = fetchFromGitHub {
+      name = "http_proxy_connect_module_generic";
+      owner = "chobits";
+      repo = "ngx_http_proxy_connect_module";
+      # 2023-06-19
+      rev = "dcb9a2c614d376b820d774db510d4da12dfe1e5b";
+      hash = "sha256-AzMhTSzmk3osSYy2q28/hko1v2AOTnY/dP5IprqGlQo=";
+    };
+
+    patches = [
+      "${src}/patch/${patchName}.patch"
+    ];
+
+    meta = with lib; {
+      description = "Forward proxy module for CONNECT request handling";
+      homepage = "https://github.com/chobits/ngx_http_proxy_connect_module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+in
+
+let self = {
+  akamai-token-validate = {
+    name = "akamai-token-validate";
+    src = fetchFromGitHub {
+      name = "akamai-token-validate";
+      owner = "kaltura";
+      repo = "nginx-akamai-token-validate-module";
+      rev = "34fd0c94d2c43c642f323491c4f4a226cd83b962";
+      sha256 = "0yf34s11vgkcl03wbl6gjngm3p9hs8vvm7hkjkwhjh39vkk2a7cy";
+    };
+
+    inputs = [ openssl ];
+
+    meta = with lib; {
+      description = "Validates Akamai v2 query string tokens";
+      homepage = "https://github.com/kaltura/nginx-akamai-token-validate-module";
+      license = with licenses; [ agpl3Only ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  auth-a2aclr = {
+    name = "auth-a2aclr";
+    src = fetchFromGitLab {
+      name = "auth-a2aclr";
+      owner = "arpa2";
+      repo = "nginx-auth-a2aclr";
+      rev = "bbabf9480bb2b40ac581551883a18dfa6522dd63";
+      sha256 = "sha256-h2LgMhreCgod+H/bNQzY9BvqG9ezkwikwWB3T6gHH04=";
+    };
+
+    inputs = [
+      (arpa2common.overrideAttrs
+        (old: rec {
+          version = "0.7.1";
+
+          src = fetchFromGitLab {
+            owner = "arpa2";
+            repo = "arpa2common";
+            rev = "v${version}";
+            sha256 = "sha256-8zVsAlGtmya9EK4OkGUMu2FKJRn2Q3bg2QWGjqcii64=";
+          };
+        }))
+    ];
+
+    meta = with lib; {
+      description = "Integrate ARPA2 Resource ACLs into nginx";
+      homepage = "https://gitlab.com/arpa2/nginx-auth-a2aclr";
+      license = with licenses; [ isc ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  aws-auth = {
+    name = "aws-auth";
+    src = fetchFromGitHub {
+      name = "aws-auth";
+      owner = "anomalizer";
+      repo = "ngx_aws_auth";
+      rev = "2.1.1";
+      sha256 = "10z67g40w7wpd13fwxyknkbg3p6hn61i4v8xw6lh27br29v1y6h9";
+    };
+
+    meta = with lib; {
+      description = "Proxy to authenticated AWS services";
+      homepage = "https://github.com/anomalizer/ngx_aws_auth";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  brotli = {
+    name = "brotli";
+    src = let src' = fetchFromGitHub {
+      name = "brotli";
+      owner = "google";
+      repo = "ngx_brotli";
+      rev = "6e975bcb015f62e1f303054897783355e2a877dc";
+      sha256 = "sha256-G0IDYlvaQzzJ6cNTSGbfuOuSXFp3RsEwIJLGapTbDgo=";
+    }; in
+      runCommand "brotli" { } ''
+        cp -a ${src'} $out
+        substituteInPlace $out/filter/config \
+          --replace '$ngx_addon_dir/deps/brotli/c' ${lib.getDev brotli}
+      '';
+
+    inputs = [ brotli ];
+
+    meta = with lib; {
+      description = "Brotli compression";
+      homepage = "https://github.com/google/ngx_brotli";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  cache-purge = {
+    name = "cache-purge";
+    src = fetchFromGitHub {
+      name = "cache-purge";
+      owner = "nginx-modules";
+      repo = "ngx_cache_purge";
+      rev = "2.5.1";
+      sha256 = "0va4jz36mxj76nmq05n3fgnpdad30cslg7c10vnlhdmmic9vqncd";
+    };
+
+    meta = with lib; {
+      description = "Adds ability to purge content from FastCGI, proxy, SCGI and uWSGI caches";
+      homepage = "https://github.com/nginx-modules/ngx_cache_purge";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  coolkit = {
+    name = "coolkit";
+    src = fetchFromGitHub {
+      name = "coolkit";
+      owner = "FRiCKLE";
+      repo = "ngx_coolkit";
+      rev = "0.2";
+      sha256 = "1idj0cqmfsdqawjcqpr1fsq670fdki51ksqk2lslfpcs3yrfjpqh";
+    };
+
+    meta = with lib; {
+      description = "Collection of small and useful nginx add-ons";
+      homepage = "https://github.com/FRiCKLE/ngx_coolkit";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  dav = {
+    name = "dav";
+    src = fetchFromGitHub {
+      name = "dav";
+      owner = "arut";
+      repo = "nginx-dav-ext-module";
+      rev = "v3.0.0";
+      sha256 = "000dm5zk0m1hm1iq60aff5r6y8xmqd7djrwhgnz9ig01xyhnjv9w";
+    };
+
+    inputs = [ expat ];
+
+    meta = with lib; {
+      description = "WebDAV PROPFIND,OPTIONS,LOCK,UNLOCK support";
+      homepage = "https://github.com/arut/nginx-dav-ext-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  develkit = {
+    name = "develkit";
+    src = fetchFromGitHub {
+      name = "develkit";
+      owner = "vision5";
+      repo = "ngx_devel_kit";
+      rev = "v0.3.1";
+      sha256 = "1c5zfpvm0hrd9lp8rasmw79dnr2aabh0i6y11wzb783bp8m3p2sq";
+    };
+
+    meta = with lib; {
+      description = "Adds additional generic tools that module developers can use in their own modules";
+      homepage = "https://github.com/vision5/ngx_devel_kit";
+      license = with licenses; [ bsd3 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  echo = rec {
+    name = "echo";
+    version = "0.63";
+
+    src = fetchFromGitHub {
+      name = "echo";
+      owner = "openresty";
+      repo = "echo-nginx-module";
+      rev = "v${version}";
+      hash = "sha256-K7oOE0yxPYLf+3YMVbBsncpHRpGHXjs/8B5QPO3MQC4=";
+    };
+
+    meta = with lib; {
+      description = "Brings echo, sleep, time, exec and more shell-style goodies to Nginx";
+      homepage = "https://github.com/openresty/echo-nginx-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  fancyindex = {
+    name = "fancyindex";
+    src = fetchFromGitHub {
+      name = "fancyindex";
+      owner = "aperezdc";
+      repo = "ngx-fancyindex";
+      rev = "v0.5.2";
+      sha256 = "0nar45lp3jays3p6b01a78a6gwh6v0snpzcncgiphcqmj5kw8ipg";
+    };
+
+    meta = with lib; {
+      description = " Fancy indexes module";
+      homepage = "https://github.com/aperezdc/ngx-fancyindex";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ aneeshusa ];
+    };
+  };
+
+  fluentd = {
+    name = "fluentd";
+    src = fetchFromGitHub {
+      name = "fluentd";
+      owner = "fluent";
+      repo = "nginx-fluentd-module";
+      rev = "8af234043059c857be27879bc547c141eafd5c13";
+      sha256 = "1ycb5zd9sw60ra53jpak1m73zwrjikwhrrh9q6266h1mlyns7zxm";
+    };
+
+    meta = with lib; {
+      description = "Fluentd data collector";
+      homepage = "https://github.com/fluent/nginx-fluentd-module";
+      license = with licenses; [ asl20 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  geoip2 = {
+    name = "geoip2";
+    src = fetchFromGitHub {
+      name = "geoip2";
+      owner = "leev";
+      repo = "ngx_http_geoip2_module";
+      rev = "3.4";
+      sha256 = "CAs1JZsHY7RymSBYbumC2BENsXtZP3p4ljH5QKwz5yg=";
+    };
+
+    inputs = [ libmaxminddb ];
+
+    meta = with lib; {
+      description = "Creates variables with values from the maxmind geoip2 databases";
+      homepage = "https://github.com/leev/ngx_http_geoip2_module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ pinpox ];
+    };
+  };
+
+  http_proxy_connect_module_v24 = http_proxy_connect_module_generic "proxy_connect_rewrite_102101" // {
+    supports = with lib.versions; version: major version == "1" && minor version == "24";
+  };
+
+  http_proxy_connect_module_v25 = http_proxy_connect_module_generic "proxy_connect_rewrite_102101" // {
+    supports = with lib.versions; version: major version == "1" && minor version == "25";
+  };
+
+  ipscrub = {
+    name = "ipscrub";
+    src = fetchFromGitHub {
+      name = "ipscrub";
+      owner = "masonicboom";
+      repo = "ipscrub";
+      rev = "v1.0.1";
+      sha256 = "0qcx15c8wbsmyz2hkmyy5yd7qn1n84kx9amaxnfxkpqi05vzm1zz";
+    } + "/ipscrub";
+
+    inputs = [ libbsd ];
+
+    meta = with lib; {
+      description = " IP address anonymizer";
+      homepage = "https://github.com/masonicboom/ipscrub";
+      license = with licenses; [ bsd3 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  limit-speed = {
+    name = "limit-speed";
+    src = fetchFromGitHub {
+      name = "limit-speed";
+      owner = "yaoweibin";
+      repo = "nginx_limit_speed_module";
+      rev = "f77ad4a56fbb134878e75827b40cf801990ed936";
+      sha256 = "0kkrd08zpcwx938i2is07vq6pgjkvn97xzjab0g4zaz8bivgmjp8";
+    };
+
+    meta = with lib; {
+      description = "Limit the total speed from the specific user";
+      homepage = "https://github.com/yaoweibin/nginx_limit_speed_module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  live = {
+    name = "live";
+    src = fetchFromGitHub {
+      name = "live";
+      owner = "arut";
+      repo = "nginx-live-module";
+      rev = "5e4a1e3a718e65e5206c24eba00d42b0d1c4b7dd";
+      sha256 = "1kpnhl4b50zim84z22ahqxyxfq4jv8ab85kzsy2n5ciqbyg491lz";
+    };
+
+    meta = with lib; {
+      description = "HTTP live module";
+      homepage = "https://github.com/arut/nginx-live-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  lua = rec {
+    name = "lua";
+    version = "0.10.26";
+
+    src = fetchFromGitHub {
+      name = "lua";
+      owner = "openresty";
+      repo = "lua-nginx-module";
+      rev = "v${version}";
+      hash = "sha256-007up/XncaSBimBumHpbwgB1WnkXgBe8e/q/yT6vthI=";
+    };
+
+    inputs = [ luajit_openresty ];
+
+    preConfigure = let
+      # fix compilation against nginx 1.23.0
+      nginx-1-23-patch = fetchpatch {
+        url = "https://github.com/openresty/lua-nginx-module/commit/b6d167cf1a93c0c885c28db5a439f2404874cb26.patch";
+        sha256 = "sha256-l7GHFNZXg+RG2SIBjYJO1JHdGUtthWnzLIqEORJUNr4=";
+      };
+    in ''
+      export LUAJIT_LIB="${luajit_openresty}/lib"
+      export LUAJIT_INC="$(realpath ${luajit_openresty}/include/luajit-*)"
+
+      # make source directory writable to allow generating src/ngx_http_lua_autoconf.h
+      lua_src=$TMPDIR/lua-src
+      cp -r "${src}/" "$lua_src"
+      chmod -R +w "$lua_src"
+      patch -p1 -d $lua_src -i ${nginx-1-23-patch}
+      export configureFlags="''${configureFlags//"${src}"/"$lua_src"}"
+      unset lua_src
+    '';
+
+    allowMemoryWriteExecute = true;
+
+    meta = with lib; {
+      description = "Embed the Power of Lua";
+      homepage = "https://github.com/openresty/lua-nginx-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  lua-upstream = {
+    name = "lua-upstream";
+    src = fetchFromGitHub {
+      name = "lua-upstream";
+      owner = "openresty";
+      repo = "lua-upstream-nginx-module";
+      rev = "v0.07";
+      sha256 = "1gqccg8airli3i9103zv1zfwbjm27h235qjabfbfqk503rjamkpk";
+    };
+
+    inputs = [ luajit_openresty ];
+    allowMemoryWriteExecute = true;
+
+    meta = with lib; {
+      description = "Expose Lua API to ngx_lua for Nginx upstreams";
+      homepage = "https://github.com/openresty/lua-upstream-nginx-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  modsecurity = {
+    name = "modsecurity";
+    src = fetchFromGitHub {
+      name = "modsecurity-nginx";
+      owner = "SpiderLabs";
+      repo = "ModSecurity-nginx";
+      rev = "v1.0.3";
+      sha256 = "sha256-xp0/eqi5PJlzb9NaUbNnzEqNcxDPyjyNwZOwmlv1+ag=";
+    };
+
+    inputs = [ curl geoip libmodsecurity libxml2 lmdb yajl ];
+    disableIPC = true;
+
+    meta = with lib; {
+      description = "Open source, cross platform web application firewall (WAF)";
+      homepage = "https://github.com/SpiderLabs/ModSecurity";
+      license = with licenses; [ asl20 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  moreheaders = {
+    name = "moreheaders";
+    src = fetchFromGitHub {
+      name = "moreheaders";
+      owner = "openresty";
+      repo = "headers-more-nginx-module";
+      rev = "v0.36";
+      sha256 = "sha256-X+ygIesQ9PGm5yM+u1BOLYVpm1172P8jWwXNr3ixFY4=";
+    };
+
+    meta = with lib; {
+      description = "Set, add, and clear arbitrary output headers";
+      homepage = "https://github.com/openresty/headers-more-nginx-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ SuperSandro2000 ];
+    };
+  };
+
+  mpeg-ts = {
+    name = "mpeg-ts";
+    src = fetchFromGitHub {
+      name = "mpeg-ts";
+      owner = "arut";
+      repo = "nginx-ts-module";
+      rev = "v0.1.1";
+      sha256 = "12dxcyy6wna1fccl3a9lnsbymd6p4apnwz6c24w74v97qvpfdxqd";
+    };
+
+    meta = with lib; {
+      description = "MPEG-TS Live Module";
+      homepage = "https://github.com/arut/nginx-ts-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  naxsi = {
+    name = "naxsi";
+    src = fetchFromGitHub {
+      name = "naxsi";
+      owner = "nbs-system";
+      repo = "naxsi";
+      rev = "95ac520eed2ea04098a76305fd0ad7e9158840b7";
+      sha256 = "0b5pnqkgg18kbw5rf2ifiq7lsx5rqmpqsql6hx5ycxjzxj6acfb3";
+    } + "/naxsi_src";
+
+    meta = with lib; {
+      description = "Open-source, high performance, low rules maintenance WAF";
+      homepage = "https://github.com/nbs-system/naxsi";
+      license = with licenses; [ gpl3 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  njs = rec {
+    name = "njs";
+    src = fetchhg {
+      url = "https://hg.nginx.org/njs";
+      rev = "0.8.1";
+      sha256 = "sha256-bFHrcA1ROMwYf+s0EWOXzkru6wvfRLvjvN8BV/r2tMc=";
+      name = "nginx-njs";
+    };
+
+    # njs module sources have to be writable during nginx build, so we copy them
+    # to a temporary directory and change the module path in the configureFlags
+    preConfigure = ''
+      NJS_SOURCE_DIR=$(readlink -m "$TMPDIR/${src}")
+      mkdir -p "$(dirname "$NJS_SOURCE_DIR")"
+      cp --recursive "${src}" "$NJS_SOURCE_DIR"
+      chmod -R u+rwX,go+rX "$NJS_SOURCE_DIR"
+      export configureFlags="''${configureFlags/"${src}"/"$NJS_SOURCE_DIR/nginx"}"
+      unset NJS_SOURCE_DIR
+    '';
+
+    inputs = [ which ];
+
+    meta = with lib; {
+      description = "Subset of the JavaScript language that allows extending nginx functionality";
+      homepage = "https://nginx.org/en/docs/njs/";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  opentracing = {
+    name = "opentracing";
+    src =
+      let src' = fetchFromGitHub {
+        name = "opentracing";
+        owner = "opentracing-contrib";
+        repo = "nginx-opentracing";
+        rev = "v0.10.0";
+        sha256 = "1q234s3p55xv820207dnh4fcxkqikjcq5rs02ai31ylpmfsf0kkb";
+      };
+      in "${src'}/opentracing";
+
+    inputs = [ opentracing-cpp ];
+
+    meta = with lib; {
+      description = "Enable requests served by nginx for distributed tracing via The OpenTracing Project";
+      homepage = "https://github.com/opentracing-contrib/nginx-opentracing";
+      license = with licenses; [ asl20 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  pagespeed = {
+    name = "pagespeed";
+    src = let
+      moduleSrc = fetchFromGitHub {
+        name = "pagespeed";
+        owner = "apache";
+        repo = "incubator-pagespeed-ngx";
+        rev = "v${psol.version}-stable";
+        sha256 = "0ry7vmkb2bx0sspl1kgjlrzzz6lbz07313ks2lr80rrdm2zb16wp";
+      };
+    in runCommand "ngx_pagespeed" {
+      meta = {
+        description = "PageSpeed module for Nginx";
+        homepage = "https://developers.google.com/speed/pagespeed/module/";
+        license = lib.licenses.asl20;
+      };
+    } ''
+      cp -r "${moduleSrc}" "$out"
+      chmod -R +w "$out"
+      ln -s "${psol}" "$out/psol"
+    '';
+
+    inputs = [ zlib libuuid ]; # psol deps
+    allowMemoryWriteExecute = true;
+
+    meta = with lib; {
+      description = "Automatic PageSpeed optimization";
+      homepage = "https://github.com/apache/incubator-pagespeed-ngx";
+      license = with licenses; [ asl20 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  pam = {
+    name = "pam";
+    src = fetchFromGitHub {
+      name = "pam";
+      owner = "sto";
+      repo = "ngx_http_auth_pam_module";
+      rev = "v1.5.3";
+      sha256 = "sha256:09lnljdhjg65643bc4535z378lsn4llbq67zcxlln0pizk9y921a";
+    };
+
+    inputs = [ pam ];
+
+    meta = with lib; {
+      description = "Use PAM for simple http authentication ";
+      homepage = "https://github.com/sto/ngx_http_auth_pam_module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  pinba = {
+    name = "pinba";
+    src = fetchFromGitHub {
+      name = "pinba";
+      owner = "tony2001";
+      repo = "ngx_http_pinba_module";
+      rev = "28131255d4797a7e2f82a6a35cf9fc03c4678fe6";
+      sha256 = "00fii8bjvyipq6q47xhjhm3ylj4rhzmlk3qwxmfpdn37j7bc8p8c";
+    };
+
+    meta = with lib; {
+      description = "Pinba module for nginx";
+      homepage = "https://github.com/tony2001/ngx_http_pinba_module";
+      license = with licenses; [ unfree ]; # no license in repo
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  push-stream = {
+    name = "push-stream";
+    src = fetchFromGitHub {
+      name = "push-stream";
+      owner = "wandenberg";
+      repo = "nginx-push-stream-module";
+      rev = "1cdc01521ed44dc614ebb5c0d19141cf047e1f90";
+      sha256 = "0ijka32b37dl07k2jl48db5a32ix43jaczrpjih84cvq8yph0jjr";
+    };
+
+    meta = with lib; {
+      description = "Pure stream http push technology";
+      homepage = "https://github.com/wandenberg/nginx-push-stream-module";
+      license = with licenses; [ gpl3 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  rtmp = {
+    name = "rtmp";
+    src = fetchFromGitHub {
+      name = "rtmp";
+      owner = "arut";
+      repo = "nginx-rtmp-module";
+      rev = "v1.2.2";
+      sha256 = "0y45bswk213yhkc2v1xca2rnsxrhx8v6azxz9pvi71vvxcggqv6h";
+    };
+
+    meta = with lib; {
+      description = "Media Streaming Server";
+      homepage = "https://github.com/arut/nginx-rtmp-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  secure-token = rec {
+    name = "secure-token";
+    version = "1.5";
+    src = fetchFromGitHub {
+      name = "secure-token";
+      owner = "kaltura";
+      repo = "nginx-secure-token-module";
+      rev = "refs/tags/${version}";
+      hash = "sha256-qYTjGS9pykRqMFmNls52YKxEdXYhHw+18YC2zzdjEpU=";
+    };
+
+    inputs = [ openssl ];
+
+    meta = with lib; {
+      description = "Generates CDN tokens, either as a cookie or as a query string parameter";
+      homepage = "https://github.com/kaltura/nginx-secure-token-module";
+      license = with licenses; [ agpl3Only ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  set-misc = {
+    name = "set-misc";
+    src = fetchFromGitHub {
+      name = "set-misc";
+      owner = "openresty";
+      repo = "set-misc-nginx-module";
+      rev = "v0.33";
+      hash = "sha256-jMMj3Ki1uSfQzagoB/O4NarxPjiaF9YRwjSKo+cgMxo=";
+    };
+
+    meta = with lib; {
+      description = "Various set_xxx directives added to the rewrite module (md5/sha1, sql/json quoting and many more)";
+      homepage = "https://github.com/openresty/set-misc-nginx-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  shibboleth = {
+    name = "shibboleth";
+    src = fetchFromGitHub {
+      name = "shibboleth";
+      owner = "nginx-shib";
+      repo = "nginx-http-shibboleth";
+      rev = "3f5ff4212fa12de23cb1acae8bf3a5a432b3f43b";
+      sha256 = "136zjipaz7iikgcgqwdv1mrh3ya996zyzbkdy6d4k07s2h9g7hy6";
+    };
+
+    meta = with lib; {
+      description = "Shibboleth auth request";
+      homepage = "https://github.com/nginx-shib/nginx-http-shibboleth";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  sla = {
+    name = "sla";
+    src = fetchFromGitHub {
+      name = "sla";
+      owner = "goldenclone";
+      repo = "nginx-sla";
+      rev = "7778f0125974befbc83751d0e1cadb2dcea57601";
+      sha256 = "1x5hm6r0dkm02ffny8kjd7mmq8przyd9amg2qvy5700x6lb63pbs";
+    };
+
+    meta = with lib; {
+      description = "Implements a collection of augmented statistics based on HTTP-codes and upstreams response time";
+      homepage = "https://github.com/goldenclone/nginx-sla";
+      license = with licenses; [ unfree ]; # no license in repo
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  slowfs-cache = {
+    name = "slowfs-cache";
+    src = fetchFromGitHub {
+      name = "slowfs-cache";
+      owner = "FRiCKLE";
+      repo = "ngx_slowfs_cache";
+      rev = "1.10";
+      sha256 = "1gyza02pcws3zqm1phv3ag50db5gnapxyjwy8skjmvawz7p5bmxr";
+    };
+
+    meta = with lib; {
+      description = "Adds ability to cache static files";
+      homepage = "https://github.com/friCKLE/ngx_slowfs_cache";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  sorted-querystring = {
+    name = "sorted-querystring";
+    src = fetchFromGitHub {
+      name = "sorted-querystring";
+      owner = "wandenberg";
+      repo = "nginx-sorted-querystring-module";
+      rev = "0.3";
+      sha256 = "0p6b0hcws39n27fx4xp9k4hb3pcv7b6kah4qqaj0pzjy3nbp4gj7";
+    };
+
+    meta = with lib; {
+      description = "Expose querystring parameters sorted in a variable";
+      homepage = "https://github.com/wandenberg/nginx-sorted-querystring-module";
+      license = with licenses; [ mit ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  spnego-http-auth = {
+    name = "spnego-http-auth";
+    src = fetchFromGitHub {
+      name = "spnego-http-auth";
+      owner = "stnoonan";
+      repo = "spnego-http-auth-nginx-module";
+      rev = "72c8ee04c81f929ec84d5a6d126f789b77781a8c";
+      sha256 = "05rw3a7cv651951li995r5l1yzz6kwkm2xpbd59jsfzd74bw941i";
+    };
+
+    inputs = [ libkrb5 ];
+
+    meta = with lib; {
+      description = "SPNEGO HTTP Authentication Module";
+      homepage = "https://github.com/stnoonan/spnego-http-auth-nginx-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  statsd = {
+    name = "statsd";
+    src = fetchFromGitHub {
+      name = "statsd";
+      owner = "harvesthq";
+      repo = "nginx-statsd";
+      rev = "b970e40467a624ba710c9a5106879a0554413d15";
+      sha256 = "1x8j4i1i2ahrr7qvz03vkldgdjdxi6mx75mzkfizfcc8smr4salr";
+    };
+
+    meta = with lib; {
+      description = "Send statistics to statsd";
+      homepage = "https://github.com/harvesthq/nginx-statsd";
+      license = with licenses; [ bsd3 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  stream-sts = {
+    name = "stream-sts";
+    src = fetchFromGitHub {
+      name = "stream-sts";
+      owner = "vozlt";
+      repo = "nginx-module-stream-sts";
+      rev = "v0.1.1";
+      sha256 = "1jdj1kik6l3rl9nyx61xkqk7hmqbncy0rrqjz3dmjqsz92y8zaya";
+    };
+
+    meta = with lib; {
+      description = "Stream server traffic status core module";
+      homepage = "https://github.com/vozlt/nginx-module-stream-sts";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  sts = {
+    name = "sts";
+    src = fetchFromGitHub {
+      name = "sts";
+      owner = "vozlt";
+      repo = "nginx-module-sts";
+      rev = "v0.1.1";
+      sha256 = "0nvb29641x1i7mdbydcny4qwlvdpws38xscxirajd2x7nnfdflrk";
+    };
+
+    meta = with lib; {
+      description = "Stream server traffic status module";
+      homepage = "https://github.com/vozlt/nginx-module-sts";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  subsFilter = {
+    name = "subsFilter";
+    src = fetchFromGitHub {
+      name = "subsFilter";
+      owner = "yaoweibin";
+      repo = "ngx_http_substitutions_filter_module";
+      rev = "b8a71eacc7f986ba091282ab8b1bbbc6ae1807e0";
+      sha256 = "027jxzx66q9a6ycn47imjh40xmnqr0z423lz0ds3w4rf1c2x130f";
+    };
+
+    meta = with lib; {
+      description = "Filter module which can do both regular expression and fixed string substitutions";
+      homepage = "https://github.com/yaoweibin/ngx_http_substitutions_filter_module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  sysguard = {
+    name = "sysguard";
+    src = fetchFromGitHub {
+      name = "sysguard";
+      owner = "vozlt";
+      repo = "nginx-module-sysguard";
+      rev = "e512897f5aba4f79ccaeeebb51138f1704a58608";
+      sha256 = "19c6w6wscbq9phnx7vzbdf4ay6p2ys0g7kp2rmc9d4fb53phrhfx";
+    };
+
+    meta = with lib; {
+      description = "Nginx sysguard module";
+      homepage = "https://github.com/vozlt/nginx-module-sysguard";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  upload = {
+    name = "upload";
+    src = fetchFromGitHub {
+      name = "upload";
+      owner = "fdintino";
+      repo = "nginx-upload-module";
+      rev = "2.3.0";
+      sha256 = "8veZP516oC7TESO368ZsZreetbDt+1eTcamk7P1kWjU=";
+    };
+
+    meta = with lib; {
+      description = "Handle file uploads using multipart/form-data encoding and resumable uploads";
+      homepage = "https://github.com/fdintino/nginx-upload-module";
+      license = with licenses; [ bsd3 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  upstream-check = {
+    name = "upstream-check";
+    src = fetchFromGitHub {
+      name = "upstream-check";
+      owner = "yaoweibin";
+      repo = "nginx_upstream_check_module";
+      rev = "e538034b6ad7992080d2403d6d3da56e4f7ac01e";
+      sha256 = "06y7k04072xzqyqyb08m0vaaizkp4rfwm0q7i735imbzw2rxb74l";
+    };
+
+    meta = with lib; {
+      description = "Support upstream health check";
+      homepage = "https://github.com/yaoweibin/nginx_upstream_check_module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  upstream-tarantool = {
+    name = "upstream-tarantool";
+    src = fetchFromGitHub {
+      name = "upstream-tarantool";
+      owner = "tarantool";
+      repo = "nginx_upstream_module";
+      rev = "v2.7.1";
+      sha256 = "0ya4330in7zjzqw57djv4icpk0n1j98nvf0f8v296yi9rjy054br";
+    };
+
+    inputs = [ msgpuck.dev yajl ];
+
+    meta = with lib; {
+      description = "Tarantool NginX upstream module (REST, JSON API, websockets, load balancing)";
+      homepage = "https://github.com/tarantool/nginx_upstream_module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  url = {
+    name = "url";
+    src = fetchFromGitHub {
+      name = "url";
+      owner = "vozlt";
+      repo = "nginx-module-url";
+      rev = "9299816ca6bc395625c3683fbd2aa7b916bfe91e";
+      sha256 = "0mk1gjmfnry6hgdsnlavww9bn7223idw50jlkhh5k00q5509w4ip";
+    };
+
+    meta = with lib; {
+      description = "URL encoding converting module";
+      homepage = "https://github.com/vozlt/nginx-module-url";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  video-thumbextractor = rec {
+    name = "video-thumbextractor";
+    version = "1.0.0";
+    src = fetchFromGitHub {
+      name = "video-thumbextractor";
+      owner = "wandenberg";
+      repo = "nginx-video-thumbextractor-module";
+      rev = "refs/tags/${version}";
+      hash = "sha256-F2cuzCbJdGYX0Zmz9MSXTB7x8+FBR6pPpXtLlDRCcj8=";
+    };
+
+    inputs = [ ffmpeg-headless libjpeg ];
+
+    meta = with lib; {
+      description = "Extract thumbs from a video file";
+      homepage = "https://github.com/wandenberg/nginx-video-thumbextractor-module";
+      license = with licenses; [ gpl3 ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  vod = {
+    name = "vod";
+    src = fetchFromGitHub {
+      name = "vod";
+      owner = "kaltura";
+      repo = "nginx-vod-module";
+      rev = "1.32";
+      hash = "sha256-ZpG0oj60D3o7/7uyE8AybCiOtncVe1Jnjaz22sIFypk=";
+      postFetch = ''
+        substituteInPlace $out/vod/media_set.h \
+          --replace "MAX_CLIPS (128)" "MAX_CLIPS (1024)"
+      '';
+    };
+
+    inputs = [ ffmpeg-headless fdk_aac openssl libxml2 libiconv ];
+
+    meta = with lib; {
+      description = "VOD packager";
+      homepage = "https://github.com/kaltura/nginx-vod-module";
+      license = with licenses; [ agpl3Only ];
+      maintainers = with maintainers; [ ];
+    };
+  };
+
+  vts = {
+    name = "vts";
+    src = fetchFromGitHub {
+      name = "vts";
+      owner = "vozlt";
+      repo = "nginx-module-vts";
+      rev = "v0.2.2";
+      sha256 = "sha256-ReTmYGVSOwtnYDMkQDMWwxw09vT4iHYfYZvgd8iBotk=";
+    };
+
+    meta = with lib; {
+      description = "Virtual host traffic status module";
+      homepage = "https://github.com/vozlt/nginx-module-vts";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ SuperSandro2000 ];
+    };
+  };
+
+  zstd = {
+    name = "zstd";
+    src = fetchFromGitHub {
+      name = "zstd";
+      owner = "tokers";
+      repo = "zstd-nginx-module";
+      rev = "0.1.1";
+      hash = "sha256-1gCV7uUsuYnZfb9e8VfjWkUloVINOUH5qzeJ03kIHgs=";
+    };
+
+    inputs = [ zstd ];
+
+    meta = with lib; {
+      description = "Nginx modules for the Zstandard compression";
+      homepage = "https://github.com/tokers/zstd-nginx-module";
+      license = with licenses; [ bsd2 ];
+      maintainers = with maintainers; [ SuperSandro2000 ];
+    };
+  };
+}; in self // lib.optionalAttrs config.allowAliases {
+  # deprecated or renamed packages
+  modsecurity-nginx = self.modsecurity;
+  fastcgi-cache-purge = throw "fastcgi-cache-purge was renamed to cache-purge";
+  ngx_aws_auth = throw "ngx_aws_auth was renamed to aws-auth";
+}
diff --git a/nixpkgs/pkgs/servers/http/nginx/nix-etag-1.15.4.patch b/nixpkgs/pkgs/servers/http/nginx/nix-etag-1.15.4.patch
new file mode 100644
index 000000000000..8c8c8ce74b21
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nginx/nix-etag-1.15.4.patch
@@ -0,0 +1,106 @@
+This patch makes it possible to serve static content from Nix store paths, by
+using the hash of the store path for the ETag header.
+
+diff --git a/src/http/ngx_http_core_module.c b/src/http/ngx_http_core_module.c
+index 97a91aee2..2d07d71e6 100644
+--- a/src/http/ngx_http_core_module.c
++++ b/src/http/ngx_http_core_module.c
+@@ -1676,6 +1676,8 @@ ngx_http_set_etag(ngx_http_request_t *r)
+ {
+     ngx_table_elt_t           *etag;
+     ngx_http_core_loc_conf_t  *clcf;
++    u_char                    *real, *ptr1, *ptr2;
++    ngx_err_t                 err;
+ 
+     clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
+ 
+@@ -1692,16 +1694,82 @@ ngx_http_set_etag(ngx_http_request_t *r)
+     etag->next = NULL;
+     ngx_str_set(&etag->key, "ETag");
+ 
+-    etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);
+-    if (etag->value.data == NULL) {
+-        etag->hash = 0;
+-        return NGX_ERROR;
++    // Upstream nginx uses file mod timestamp and content-length for Etag, but
++    // files in the Nix store have their timestamps reset, so that doesn't work.
++    // Instead, when serving from the Nix store, we use the hash from the store
++    // path and content-length.
++    //
++    // Every file in under the given store path will share the same store path
++    // hash. It is fine to serve different resources with the same Etag, but
++    // different representations of the same resource (eg the same file, but
++    // gzip-compressed) should have different Etags. Thus, we also append
++    // content-length, which should be different when the response is compressed
++
++    err = ngx_errno;
++    real = ngx_realpath(clcf->root.data, NULL);
++    ngx_set_errno(err);
++
++    #define NIX_STORE_DIR "@nixStoreDir@"
++    #define NIX_STORE_LEN @nixStoreDirLen@
++
++    if (r->headers_out.last_modified_time == 1
++        && real != NULL
++        && !ngx_strncmp(real, NIX_STORE_DIR, NIX_STORE_LEN)
++        && real[NIX_STORE_LEN] == '/'
++        && real[NIX_STORE_LEN + 1] != '\0')
++    {
++        // extract the hash from a path formatted like
++        // /nix/store/hashhere1234-pname-1.0.0
++        // +1 to skip the leading /
++        ptr1 = real + NIX_STORE_LEN + 1;
++
++        ptr2 = (u_char *) ngx_strchr(ptr1, '-');
++
++        if (ptr2 == NULL) {
++            ngx_free(real);
++            etag->hash = 0;
++            return NGX_ERROR;
++        }
++
++        *ptr2 = '\0';
++
++        // hash + content-length + quotes and hyphen. Note that the
++        // content-length part of the string can vary in length.
++        etag->value.data = ngx_pnalloc(r->pool, ngx_strlen(ptr1) + NGX_OFF_T_LEN + 3);
++
++        if (etag->value.data == NULL) {
++            ngx_free(real);
++            etag->hash = 0;
++            return NGX_ERROR;
++        }
++
++
++        // set value.data content to "{hash}-{content-length}" (including quote
++        // marks), and set value.len to the length of the resulting string
++        etag->value.len = ngx_sprintf(etag->value.data, "\"\%s-%xO\"",
++                                      ptr1,
++                                      r->headers_out.content_length_n)
++                          - etag->value.data;
++
++        ngx_http_clear_last_modified(r);
++    } else {
++        // outside of Nix store, use the upstream Nginx logic for etags
++
++        etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);
++
++        if (etag->value.data == NULL) {
++            ngx_free(real);
++            etag->hash = 0;
++            return NGX_ERROR;
++        }
++
++        etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",
++                                      r->headers_out.last_modified_time,
++                                      r->headers_out.content_length_n)
++                          - etag->value.data;
+     }
+ 
+-    etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",
+-                                  r->headers_out.last_modified_time,
+-                                  r->headers_out.content_length_n)
+-                      - etag->value.data;
++    ngx_free(real);
+ 
+     r->headers_out.etag = etag;
diff --git a/nixpkgs/pkgs/servers/http/nginx/nix-skip-check-logs-path.patch b/nixpkgs/pkgs/servers/http/nginx/nix-skip-check-logs-path.patch
new file mode 100644
index 000000000000..a823660cc32e
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nginx/nix-skip-check-logs-path.patch
@@ -0,0 +1,27 @@
+diff --git a/auto/install b/auto/install
+index d884487..dccc411 100644
+--- a/auto/install
++++ b/auto/install
+@@ -148,12 +148,6 @@ install:	build $NGX_INSTALL_PERL_MODULES
+ 		|| cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PATH'
+ 	cp conf/nginx.conf '\$(DESTDIR)$NGX_CONF_PREFIX/nginx.conf.default'
+ 
+-	test -d '\$(DESTDIR)`dirname "$NGX_PID_PATH"`' \\
+-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_PID_PATH"`'
+-
+-	test -d '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`' \\
+-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_HTTP_LOG_PATH"`'
+-
+ 	test -d '\$(DESTDIR)$NGX_PREFIX/html' \\
+ 		|| cp -R $NGX_HTML '\$(DESTDIR)$NGX_PREFIX'
+ END
+@@ -161,9 +155,6 @@ END
+ 
+ if test -n "$NGX_ERROR_LOG_PATH"; then
+     cat << END                                                >> $NGX_MAKEFILE
+-
+-	test -d '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`' \\
+-		|| mkdir -p '\$(DESTDIR)`dirname "$NGX_ERROR_LOG_PATH"`'
+ END
+ 
+ fi
diff --git a/nixpkgs/pkgs/servers/http/nginx/quic.nix b/nixpkgs/pkgs/servers/http/nginx/quic.nix
new file mode 100644
index 000000000000..ea5af571f110
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nginx/quic.nix
@@ -0,0 +1,14 @@
+{ callPackage
+, nginxMainline
+, ...
+} @ args:
+
+callPackage ./generic.nix args {
+  pname = "nginxQuic";
+
+  inherit (nginxMainline) src version;
+
+  configureFlags = [
+    "--with-http_v3_module"
+  ];
+}
diff --git a/nixpkgs/pkgs/servers/http/nginx/stable.nix b/nixpkgs/pkgs/servers/http/nginx/stable.nix
new file mode 100644
index 000000000000..e3fab406c8d5
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nginx/stable.nix
@@ -0,0 +1,6 @@
+{ callPackage, ... } @ args:
+
+callPackage ./generic.nix args {
+  version = "1.24.0";
+  hash = "sha256-d6JUFje5KmIePudndsi3tAz21wfmm6U6lAKD4w/y9V0=";
+}
diff --git a/nixpkgs/pkgs/servers/http/nix-binary-cache/default.nix b/nixpkgs/pkgs/servers/http/nix-binary-cache/default.nix
new file mode 100644
index 000000000000..4f26610e10cf
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nix-binary-cache/default.nix
@@ -0,0 +1,60 @@
+{lib, stdenv
+, coreutils, findutils, nix, xz, bzip2, gnused, gnugrep, openssl
+, lighttpd, iproute2 }:
+stdenv.mkDerivation rec {
+  version = "2014-06-29-1";
+  pname = "nix-binary-cache";
+
+  dontUnpack = true;
+
+  installPhase = ''
+    mkdir -p "$out/bin"
+    substitute "${./nix-binary-cache.cgi.in}" "$out"/bin/nix-binary-cache.cgi \
+      --replace @out@ "$out/bin" \
+      --replace @shell@ "${stdenv.shell}" \
+      --replace @coreutils@ "${coreutils}/bin" \
+      --replace @findutils@ "${findutils}/bin" \
+      --replace @nix@ "${nix.out}/bin" \
+      --replace @xz@ "${xz.bin}/bin" \
+      --replace @bzip2@ "${bzip2.bin}/bin" \
+      --replace @gnused@ "${gnused}/bin" \
+      --replace @gnugrep@ "${gnugrep}/bin" \
+      --replace @openssl@ "${openssl.bin}/bin" \
+      --replace @lighttpd@ "${lighttpd}/sbin" \
+      --replace @iproute@ "${iproute2}/sbin" \
+      --replace "xXxXx" "xXxXx"
+
+    chmod a+x "$out/bin/nix-binary-cache.cgi"
+
+    substitute "${./nix-binary-cache-start.in}" "$out"/bin/nix-binary-cache-start \
+      --replace @out@ "$out/bin" \
+      --replace @shell@ "${stdenv.shell}" \
+      --replace @coreutils@ "${coreutils}/bin" \
+      --replace @findutils@ "${findutils}/bin" \
+      --replace @nix@ "${nix.out}/bin" \
+      --replace @xz@ "${xz.bin}/bin" \
+      --replace @bzip2@ "${bzip2.bin}/bin" \
+      --replace @gnused@ "${gnused}/bin" \
+      --replace @gnugrep@ "${gnugrep}/bin" \
+      --replace @openssl@ "${openssl.bin}/bin" \
+      --replace @lighttpd@ "${lighttpd}/sbin" \
+      --replace @iproute@ "${iproute2}/sbin" \
+      --replace "xXxXx" "xXxXx"
+
+    chmod a+x "$out/bin/nix-binary-cache-start"
+  '';
+
+  meta = {
+    description = "A set of scripts to serve the Nix store as a binary cache";
+    longDescription = ''
+      This package installs a CGI script that serves Nix store path in the
+      binary cache format. It also installs a launcher called
+      nix-binary-cache-start that can be run without any setup to launch
+      a binary cache and get the example arguments for its usage.
+    '';
+    maintainers = [lib.maintainers.raskin];
+    license = lib.licenses.gpl2Plus;
+    platforms = lib.platforms.all;
+    hydraPlatforms = [];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/nix-binary-cache/nix-binary-cache-start.in b/nixpkgs/pkgs/servers/http/nix-binary-cache/nix-binary-cache-start.in
new file mode 100644
index 000000000000..13b62a8829da
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nix-binary-cache/nix-binary-cache-start.in
@@ -0,0 +1,117 @@
+#! @shell@
+
+parse_opts () {
+  while @coreutils@/test -n "$1" && @coreutils@/test "x$1" != x-- ; do 
+    case "$1" in
+      --store-dir)
+        shift;
+        echo "STORE_DIR='$1'"
+        shift;
+        ;;
+      --priority)
+        shift;
+        echo "PRIORITY=$1";
+        shift;
+        ;;
+      --compression)
+        shift;
+        echo "COMPRESSION=$1";
+        shift;
+        ;;
+      --key)
+        shift;
+        echo "KEY=${1#*:}"
+        echo "KEYNAME=${1%%:*}"
+        shift;
+        ;;
+      --nix-remote)
+        shift;
+        echo "NIX_REMOTE=$1"
+        shift;
+        ;;
+      --mass-query)
+        shift;
+        echo "MASS_QUERY=$1"
+        shift;
+        ;;
+      --port)
+        shift;
+        echo "PORT=$1"
+        shift;
+        ;;
+      --ipv6)
+        shift;
+	echo "USE_IPV6=enable"
+	;;
+      --help)
+        cat <<EOF >&2
+"$0": start the Nix binary cache serving the Nix store dynamically.
+
+Recognized options:
+
+--port           server port
+--store-dir      served Nix store
+
+--priority       binary cache priority
+--mass-query     0 or 1 - whether binary cache expects queries for nix-env -qas
+
+--compression    compression to use: bzip2 or xz
+--key            name:/path/to/key - key to use for narinfo signing
+
+--nix-remote     'daemon' or empty string '' - whether to use daemon for store
+                   operations
+
+--ipv6           enable ipv6
+
+--help           show help and exit
+EOF
+	exit 1;
+        ;;
+      *) shift ;;
+    esac;
+  done
+}
+
+workingdir="$(@coreutils@/mktemp -d)"
+cd "$workingdir"
+
+PORT=8080
+(echo "STORE_DIR=${NIX_STORE_DIR:-/nix/store}"; parse_opts "$@" 
+  ) > nix-binary-cache.conf || exit
+. "$workingdir/nix-binary-cache.conf"
+
+echo "
+server.port = $PORT
+server.modules = ( \"mod_cgi\", \"mod_setenv\", )
+server.document-root = \"$workingdir\"
+cgi.assign = ( \".cgi\" => \"@shell@\" )
+setenv.add-request-header = ( \"NIX_BINARY_CACHE_CONFIG\" => \"$workingdir/nix-binary-cache.conf\" )
+" > lighttpd.conf
+
+test -n "$USE_IPV6" && echo "
+\$SERVER[\"socket\"] == \"[::]:$PORT\" {
+server.use-ipv6 = \"enable\"
+}
+" >> lighttpd.conf
+
+cp @out@/nix-binary-cache.cgi . 
+cp @out@/nix-binary-cache.cgi ./nix-bc.cgi 
+
+ip="$(@iproute@/ip a | @gnugrep@/grep 'inet .* scope global' | @coreutils@/head -n 1)"
+ip="${ip%%/*}"
+ip="${ip##* }"
+
+url="http://$ip:$PORT/nix-bc.cgi?"
+
+echo "Working directory: $workingdir"
+echo
+echo "Address of the binary cache: $url"
+echo
+echo "Usage example: NIX_REMOTE= nix-store --option binary-caches '$url'"
+echo
+echo
+
+@lighttpd@/lighttpd -D -f "$workingdir/lighttpd.conf"
+
+cd /
+@coreutils@/rm -rf "$workingdir"
diff --git a/nixpkgs/pkgs/servers/http/nix-binary-cache/nix-binary-cache.cgi.in b/nixpkgs/pkgs/servers/http/nix-binary-cache/nix-binary-cache.cgi.in
new file mode 100644
index 000000000000..890e68765b40
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/nix-binary-cache/nix-binary-cache.cgi.in
@@ -0,0 +1,105 @@
+#! @shell@
+
+STORE_DIR="${NIX_STORE_DIR:-/nix/store}"
+MASS_QUERY=0
+PRIORITY=75
+COMPRESSION=bzip2
+KEY=
+KEYNAME=na
+
+export NIX_REMOTE=daemon
+
+config="${NIX_BINARY_CACHE_CONFIG:-${HTTP_NIX_BINARY_CACHE_CONFIG:-/etc/nix/nix-binary-cache.cgi.conf}}"
+config="$(cd "$(@coreutils@/dirname "$config")";
+  @coreutils@/pwd)/$(@coreutils@/basename "$config")"
+@coreutils@/test -e "$config" && . "$config"
+
+header(){
+	echo "Content-Type: text/plain; charset=utf-8"
+	echo
+}
+
+header404(){
+	echo "Status: 404 Not Found"
+	echo
+}
+
+clean_path() {
+	@gnused@/sed -re "s@^$STORE_DIR/?@@" | @findutils@/xargs
+}
+
+storeq(){
+	@nix@/nix-store -q "$@"
+}
+
+sign(){
+	test -n "$1" &&
+	  @coreutils@/sha256sum | @gnused@/sed -e 's/ .*//' |
+	  @openssl@/openssl rsautl -sign -inkey "$@" | @coreutils@/base64 -w 0
+}
+
+case "$QUERY_STRING" in
+	"")
+		header
+		echo "Hello, this is a dynamically-generated Nix binary cache"
+		;;
+	/debug)
+		header
+		set
+		;;
+	/nix-cache-info)
+		header
+		echo "StoreDir: $STORE_DIR"
+		echo "WantMassQuery: $MASS_QUERY"
+		echo "Priority: $PRIORITY"
+		;;
+	*.narinfo)
+		hash=${QUERY_STRING%.narinfo}
+		hash=${hash#/}
+		path="$(echo "$STORE_DIR/$hash-"* | @coreutils@/sort | @coreutils@/head -n 1)"
+		if [ -n "$path" ] && [ -e "$path" ]; then
+			header
+			info="$(
+			echo "StorePath: $path"
+			echo "URL: $(@coreutils@/basename "$path"
+			  ).nar.$COMPRESSION"
+			echo "Compression: $COMPRESSION"
+			echo "NarHash: $(storeq --hash "$path")"
+			echo "NarSize: $(storeq --size "$path")"
+			echo "References: $(storeq --references "$path" |
+			  @coreutils@/tac | clean_path )"
+			echo "Deriver: $(storeq --deriver "$path" |
+			  clean_path )"
+			)"
+			signature="$(echo "$info" | sign "$KEY")"
+
+			echo "$info"
+			echo "Signature: 1;$KEYNAME;$signature"
+
+		else
+			header404
+			exit 1
+		fi
+		;;
+	*.nar.xz)
+		path="$STORE_DIR${QUERY_STRING%.nar.xz}"
+		if [ -n "$path" ] && [ -e "$path" ]; then
+			header
+			@nix@/nix-store --dump "$path" | @xz@/xz
+		else
+			header404
+			exit 1
+		fi
+		;;
+	*.nar.bzip2)
+		path="$STORE_DIR${QUERY_STRING%.nar.bzip2}"
+		echo "$path" >&2;
+		if [ -n "$path" ] && [ -e "$path" ]; then
+			header
+			@nix@/nix-store --dump "$path" | @bzip2@/bzip2
+		else
+			header404
+			exit 1
+		fi
+		;;
+esac
diff --git a/nixpkgs/pkgs/servers/http/openresty/default.nix b/nixpkgs/pkgs/servers/http/openresty/default.nix
new file mode 100644
index 000000000000..87cd8e4c53e3
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/openresty/default.nix
@@ -0,0 +1,60 @@
+{ callPackage
+, runCommand
+, lib
+, fetchurl
+, perl
+, postgresql
+, nixosTests
+, ...
+}@args:
+
+callPackage ../nginx/generic.nix args rec {
+  pname = "openresty";
+  nginxVersion = "1.21.4";
+  version = "${nginxVersion}.3";
+
+  src = fetchurl {
+    url = "https://openresty.org/download/openresty-${version}.tar.gz";
+    sha256 = "sha256-M6hMY8/Z5GsOXGLrLdx7gGi9ouFoYxQ0O4n8P/0kzdM=";
+  };
+
+  # generic.nix applies fixPatch on top of every patch defined there.
+  # This allows updating the patch destination, as openresty has
+  # nginx source code in a different folder.
+  fixPatch = patch:
+    let name = patch.name or (builtins.baseNameOf patch); in
+    runCommand "openresty-${name}" { src = patch; } ''
+      substitute $src $out \
+        --replace "a/" "a/bundle/nginx-${nginxVersion}/" \
+        --replace "b/" "b/bundle/nginx-${nginxVersion}/"
+    '';
+
+  nativeBuildInputs = [ perl ];
+
+  buildInputs = [ postgresql ];
+
+  postPatch = ''
+    patchShebangs configure bundle/
+  '';
+
+  configureFlags = [ "--with-http_postgres_module" ];
+
+  postInstall = ''
+    ln -s $out/luajit/bin/luajit-2.1.0-beta3 $out/bin/luajit-openresty
+    ln -s $out/nginx/bin/nginx $out/bin/nginx
+    ln -s $out/nginx/conf $out/conf
+    ln -s $out/nginx/html $out/html
+  '';
+
+  passthru.tests = {
+    inherit (nixosTests) openresty-lua;
+  };
+
+  meta = {
+    description = "A fast web application server built on Nginx";
+    homepage = "https://openresty.org";
+    license = lib.licenses.bsd2;
+    platforms = lib.platforms.all;
+    maintainers = with lib.maintainers; [ thoughtpolice lblasc emily ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/pomerium/default.nix b/nixpkgs/pkgs/servers/http/pomerium/default.nix
new file mode 100644
index 000000000000..248b7ae1f3e7
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/pomerium/default.nix
@@ -0,0 +1,129 @@
+{ buildGoModule
+, fetchFromGitHub
+, callPackage
+, lib
+, envoy
+, mkYarnPackage
+, fetchYarnDeps
+, nixosTests
+, pomerium-cli
+}:
+
+let
+  inherit (lib) concatStringsSep concatMap id mapAttrsToList;
+in
+buildGoModule rec {
+  pname = "pomerium";
+  version = "0.25.1";
+  src = fetchFromGitHub {
+    owner = "pomerium";
+    repo = "pomerium";
+    rev = "v${version}";
+    hash = "sha256-xVPyiwKtSBchXC0FhNegeJlUej877zwNvrlAhSy6dJE=";
+  };
+
+  vendorHash = "sha256-GdeZkKkENacc11FmEAFUfX9efInfhpv2Lz0/3CtixFQ=";
+
+  ui = mkYarnPackage {
+    inherit version;
+    src = "${src}/ui";
+
+    packageJSON = ./package.json;
+    offlineCache = fetchYarnDeps {
+      yarnLock = "${src}/ui/yarn.lock";
+      sha256 = lib.fileContents ./yarn-hash;
+    };
+
+    buildPhase = ''
+      runHook preBuild
+      yarn --offline build
+      runHook postBuild
+    '';
+
+    installPhase = ''
+      runHook preInstall
+      cp -R deps/pomerium/dist $out
+      runHook postInstall
+    '';
+
+    doDist = false;
+  };
+
+  subPackages = [
+    "cmd/pomerium"
+  ];
+
+  # patch pomerium to allow use of external envoy
+  patches = [ ./external-envoy.diff ];
+
+  ldflags = let
+    # Set a variety of useful meta variables for stamping the build with.
+    setVars = {
+      "github.com/pomerium/pomerium/internal/version" = {
+        Version = "v${version}";
+        BuildMeta = "nixpkgs";
+        ProjectName = "pomerium";
+        ProjectURL = "github.com/pomerium/pomerium";
+      };
+      "github.com/pomerium/pomerium/pkg/envoy" = {
+        OverrideEnvoyPath = "${envoy}/bin/envoy";
+      };
+    };
+    concatStringsSpace = list: concatStringsSep " " list;
+    mapAttrsToFlatList = fn: list: concatMap id (mapAttrsToList fn list);
+    varFlags = concatStringsSpace (
+      mapAttrsToFlatList (package: packageVars:
+        mapAttrsToList (variable: value:
+          "-X ${package}.${variable}=${value}"
+        ) packageVars
+      ) setVars);
+  in [
+    "${varFlags}"
+  ];
+
+  preBuild = ''
+    # Replace embedded envoy with nothing.
+    # We set OverrideEnvoyPath above, so rawBinary should never get looked at
+    # but we still need to set a checksum/version.
+    rm pkg/envoy/files/files_{darwin,linux}*.go
+    cat <<EOF >pkg/envoy/files/files_external.go
+    package files
+
+    import _ "embed" // embed
+
+    var rawBinary []byte
+
+    //go:embed envoy.sha256
+    var rawChecksum string
+
+    //go:embed envoy.version
+    var rawVersion string
+    EOF
+    sha256sum '${envoy}/bin/envoy' > pkg/envoy/files/envoy.sha256
+    echo '${envoy.version}' > pkg/envoy/files/envoy.version
+
+    # put the built UI files where they will be picked up as part of binary build
+    cp -r ${ui}/* ui/dist
+  '';
+
+  installPhase = ''
+    install -Dm0755 $GOPATH/bin/pomerium $out/bin/pomerium
+  '';
+
+  passthru = {
+    tests = {
+      inherit (nixosTests) pomerium;
+      inherit pomerium-cli;
+    };
+    updateScript = ./updater.sh;
+  };
+
+  meta = with lib; {
+    homepage = "https://pomerium.io";
+    description = "Authenticating reverse proxy";
+    mainProgram = "pomerium";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lukegb devusb ];
+    platforms = [ "x86_64-linux" "aarch64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/pomerium/external-envoy.diff b/nixpkgs/pkgs/servers/http/pomerium/external-envoy.diff
new file mode 100644
index 000000000000..49f4985ad77c
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/pomerium/external-envoy.diff
@@ -0,0 +1,48 @@
+diff --git a/pkg/envoy/envoy.go b/pkg/envoy/envoy.go
+index e32cfc29..9d32c057 100644
+--- a/pkg/envoy/envoy.go
++++ b/pkg/envoy/envoy.go
+@@ -8,9 +8,9 @@ import (
+ 	"errors"
+ 	"fmt"
+ 	"io"
++	"io/fs"
+ 	"os"
+ 	"os/exec"
+-	"path"
+ 	"path/filepath"
+ 	"regexp"
+ 	"strconv"
+@@ -36,8 +36,12 @@ import (
+ 
+ const (
+ 	configFileName = "envoy-config.yaml"
++	workingDirectoryName = ".pomerium-envoy"
++	embeddedEnvoyPermissions     fs.FileMode = 0o700
+ )
+ 
++var OverrideEnvoyPath = ""
++
+ type serverOptions struct {
+ 	services string
+ 	logLevel string
+@@ -60,13 +64,16 @@ type Server struct {
+ 
+ // NewServer creates a new server with traffic routed by envoy.
+ func NewServer(ctx context.Context, src config.Source, builder *envoyconfig.Builder) (*Server, error) {
+-	envoyPath, err := Extract()
++	envoyPath := OverrideEnvoyPath
++	wd := filepath.Join(os.TempDir(), workingDirectoryName)
++
++	err := os.MkdirAll(wd, embeddedEnvoyPermissions)
+ 	if err != nil {
+-		return nil, fmt.Errorf("extracting envoy: %w", err)
++		return nil, fmt.Errorf("error creating temporary working directory for envoy: %w", err)
+ 	}
+ 
+ 	srv := &Server{
+-		wd:        path.Dir(envoyPath),
++		wd:        wd,
+ 		builder:   builder,
+ 		grpcPort:  src.GetConfig().GRPCPort,
+ 		httpPort:  src.GetConfig().HTTPPort,
diff --git a/nixpkgs/pkgs/servers/http/pomerium/package.json b/nixpkgs/pkgs/servers/http/pomerium/package.json
new file mode 100644
index 000000000000..4f81e118d85a
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/pomerium/package.json
@@ -0,0 +1,61 @@
+{
+  "name": "pomerium",
+  "version": "1.0.0",
+  "main": "src/index.tsx",
+  "license": "Apache-2.0",
+  "scripts": {
+    "build": "ts-node ./scripts/esbuild.ts",
+    "format": "prettier --write .",
+    "lint": "eslint .",
+    "watch": "ts-node ./scripts/esbuild.ts --watch"
+  },
+  "browserslist": {
+    "production": [
+      ">0.2%",
+      "not dead",
+      "not op_mini all"
+    ],
+    "development": [
+      "last 1 chrome version",
+      "last 1 firefox version",
+      "last 1 safari version"
+    ]
+  },
+  "dependencies": {
+    "@babel/core": "^7.0.0",
+    "@emotion/react": "^11.7.1",
+    "@emotion/styled": "^11.11.0",
+    "@fontsource/dm-mono": "^5.0.14",
+    "@fontsource/dm-sans": "^5.0.13",
+    "@mui/icons-material": "^5.14.9",
+    "@mui/material": "^5.4.0",
+    "luxon": "^2.5.2",
+    "markdown-to-jsx": "^7.2.1",
+    "react": "^17.0.2",
+    "react-dom": "^17.0.2",
+    "react-feather": "^2.0.10"
+  },
+  "devDependencies": {
+    "@trivago/prettier-plugin-sort-imports": "2.0.4",
+    "@types/luxon": "^2.0.9",
+    "@types/node": "^17.0.14",
+    "@types/react": "^17.0.34",
+    "@types/react-dom": "^17.0.11",
+    "@typescript-eslint/eslint-plugin": "^5.10.2",
+    "@typescript-eslint/parser": "^5.59.11",
+    "esbuild": "^0.13.12",
+    "eslint": "7.32.0",
+    "eslint-config-prettier": "^8.3.0",
+    "eslint-plugin-react": "^7.28.0",
+    "prettier": "^2.4.1",
+    "ts-node": "^10.9.1",
+    "typescript": "^5.1.3"
+  },
+  "prettier": {
+    "importOrder": [
+      "^[./]"
+    ],
+    "importOrderSeparation": true,
+    "importOrderSortSpecifiers": true
+  }
+}
diff --git a/nixpkgs/pkgs/servers/http/pomerium/updater.sh b/nixpkgs/pkgs/servers/http/pomerium/updater.sh
new file mode 100755
index 000000000000..0df47268ca96
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/pomerium/updater.sh
@@ -0,0 +1,23 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -i bash -p gnugrep coreutils curl wget jq nix-update prefetch-yarn-deps
+
+set -euo pipefail
+pushd "$(dirname "${BASH_SOURCE[0]}")"
+
+owner="pomerium"
+repo="pomerium"
+version=`curl -s "https://api.github.com/repos/$owner/$repo/tags" | jq -r .[0].name | grep -oP "^v\K.*"`
+url="https://raw.githubusercontent.com/$owner/$repo/v$version/"
+
+if [[ "$UPDATE_NIX_OLD_VERSION" == "$version" ]]; then
+    echo "Already up to date!"
+    exit 0
+fi
+
+rm -f package.json yarn.lock
+wget "$url/ui/yarn.lock" "$url/ui/package.json"
+echo $(prefetch-yarn-deps) > yarn-hash
+rm -f yarn.lock
+
+popd
+nix-update pomerium --version $version
diff --git a/nixpkgs/pkgs/servers/http/pomerium/yarn-hash b/nixpkgs/pkgs/servers/http/pomerium/yarn-hash
new file mode 100644
index 000000000000..71760c6384c7
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/pomerium/yarn-hash
@@ -0,0 +1 @@
+1cjwkdvg9rfp55674gns44xwi32ws8z57sa4ffb0zzgdgy2yx2zm
diff --git a/nixpkgs/pkgs/servers/http/pshs/default.nix b/nixpkgs/pkgs/servers/http/pshs/default.nix
new file mode 100644
index 000000000000..e7715881541a
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/pshs/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, libevent, file, qrencode, miniupnpc }:
+
+stdenv.mkDerivation rec {
+  pname = "pshs";
+  version = "0.3.4";
+
+  src = fetchFromGitHub {
+    owner = "mgorny";
+    repo = "pshs";
+    rev = "v${version}";
+    sha256 = "1j8j4r0vsmp6226q6jdgf9bzhx3qk7vdliwaw7f8kcsrkndkg6p4";
+  };
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+  buildInputs = [ libevent file qrencode miniupnpc ];
+
+  # SSL requires libevent at 2.1 with ssl support
+  configureFlags = [ "--disable-ssl" ];
+
+  meta = {
+    description = "Pretty small HTTP server - a command-line tool to share files";
+    mainProgram = "pshs";
+    homepage = "https://github.com/mgorny/pshs";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/quark/default.nix b/nixpkgs/pkgs/servers/http/quark/default.nix
new file mode 100644
index 000000000000..e178fe91a34a
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/quark/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchgit, patches ? null }:
+
+stdenv.mkDerivation {
+  pname = "quark";
+  version = "unstable-2021-02-22";
+
+  src = fetchgit {
+    url = "git://git.suckless.org/quark";
+    rev = "68b4f733b2755762e43df90f73db5a6ec8d14104";
+    sha256 = "sha256-Jtu5zJfHd+6Oq572nVem5msMDCOjdqDNH4SQck8/O5A=";
+  };
+
+  inherit patches;
+
+  makeFlags = [ "CC:=$(CC)" ];
+
+  installFlags = [ "PREFIX=$(out)" ];
+
+  meta = with lib; {
+    description = "Extremely small and simple HTTP GET/HEAD-only web server for static content";
+    mainProgram = "quark";
+    homepage = "http://tools.suckless.org/quark";
+    license = licenses.isc;
+    maintainers = with maintainers; [ sikmir ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/ran/default.nix b/nixpkgs/pkgs/servers/http/ran/default.nix
new file mode 100644
index 000000000000..d22750fce3a0
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/ran/default.nix
@@ -0,0 +1,47 @@
+{ buildGoModule
+, fetchFromGitHub
+, lib
+, runCommand
+, ran
+, curl
+}:
+
+buildGoModule rec {
+  pname = "ran";
+  version = "0.1.6";
+  src = fetchFromGitHub {
+    owner = "m3ng9i";
+    repo = "ran";
+    rev = "v${version}";
+    hash = "sha256-iMvUvzr/jaTNdgHQFuoJNJnnkx2XHIUUlrPWyTlreEw=";
+  };
+
+  vendorHash = "sha256-ObroruWWNilHIclqNvbEaa7vwk+1zMzDKbjlVs7Fito=";
+
+  CGO_ENABLED = 0;
+
+  ldflags = [
+    "-X" "main._version_=v${version}"
+    "-X" "main._branch_=master"
+  ];
+
+  passthru.tests = {
+    simple = runCommand "ran-test" { } ''
+      echo hello world > index.html
+      ${ran}/bin/ran &
+      # Allow ran to fully initialize
+      sleep 1
+      [ "$(${curl}/bin/curl 127.0.0.1:8080)" == "hello world" ]
+      kill %1
+      ${ran}/bin/ran --version > $out
+    '';
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/m3ng9i/ran";
+    description = "Ran is a simple web server for serving static files";
+    mainProgram = "ran";
+    license = licenses.mit;
+    maintainers = with maintainers; [ tomberek ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/redstore/default.nix b/nixpkgs/pkgs/servers/http/redstore/default.nix
new file mode 100644
index 000000000000..869f2c1f3b04
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/redstore/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchurl, redland, pkg-config, gmp, zlib, librdf_raptor2
+  , librdf_rasqal }:
+
+stdenv.mkDerivation rec {
+  pname = "redstore";
+  version = "0.5.4";
+
+  src = fetchurl {
+    url = "https://www.aelius.com/njh/redstore/redstore-${version}.tar.gz";
+    sha256 = "0hc1fjfbfvggl72zqx27v4wy84f5m7bp4dnwd8g41aw8lgynbgaq";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ gmp redland zlib librdf_raptor2 librdf_rasqal ];
+
+  preConfigure = ''
+    # Define _XOPEN_SOURCE to enable, e.g., getaddrinfo.
+    configureFlagsArray+=(
+      "CFLAGS=-D_XOPEN_SOURCE=600 -I${librdf_raptor2}/include/raptor2 -I${librdf_rasqal}/include/rasqal"
+    )
+  '';
+
+  meta = {
+    description = "An HTTP interface to Redland RDF store";
+    mainProgram = "redstore";
+    homepage = "https://www.aelius.com/njh/redstore/";
+    maintainers = [ lib.maintainers.raskin ];
+    platforms = with lib.platforms;
+      linux ++ freebsd ++ gnu;
+    license = lib.licenses.gpl3Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/router/default.nix b/nixpkgs/pkgs/servers/http/router/default.nix
new file mode 100644
index 000000000000..f4903b2f31f7
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/router/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, callPackage
+, fetchFromGitHub
+, rustPlatform
+, cmake
+, pkg-config
+, protobuf
+, elfutils
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "router";
+  version = "1.30.1";
+
+  src = fetchFromGitHub {
+    owner = "apollographql";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-mQtIjfXDcEy5HfZbWauL0NQLPneGq9EJt/yB8zMuhSU=";
+  };
+
+  cargoHash = "sha256-XCDU6cXw+Wf5MR6m+HCI8/VFRRylMywktZbd5k7Lcwo=";
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    protobuf
+  ];
+
+  buildInputs = [
+    elfutils
+  ];
+
+  # The v8 package will try to download a `librusty_v8.a` release at build time to our read-only filesystem
+  # To avoid this we pre-download the file and export it via RUSTY_V8_ARCHIVE
+  RUSTY_V8_ARCHIVE = callPackage ./librusty_v8.nix { };
+
+  cargoTestFlags = [
+    "-- --skip=uplink::test::stream_from_uplink_error_no_retry"
+  ];
+
+  meta = with lib; {
+    description = "A configurable, high-performance routing runtime for Apollo Federation";
+    homepage = "https://www.apollographql.com/docs/router/";
+    license = licenses.elastic20;
+    maintainers = [ maintainers.bbigras ];
+    knownVulnerabilities = [ "CVE-2023-45812" ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/router/librusty_v8.nix b/nixpkgs/pkgs/servers/http/router/librusty_v8.nix
new file mode 100644
index 000000000000..1d5e334f2d07
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/router/librusty_v8.nix
@@ -0,0 +1,19 @@
+{ stdenv, fetchurl }:
+
+let
+  fetch_librusty_v8 = args: fetchurl {
+    name = "librusty_v8-${args.version}";
+    url = "https://github.com/denoland/rusty_v8/releases/download/v${args.version}/librusty_v8_release_${stdenv.hostPlatform.rust.rustcTarget}.a";
+    sha256 = args.shas.${stdenv.hostPlatform.system};
+    meta = { inherit (args) version; };
+  };
+in
+fetch_librusty_v8 {
+  version = "0.74.3";
+  shas = {
+    x86_64-linux = "sha256-8pa8nqA6rbOSBVnp2Q8/IQqh/rfYQU57hMgwU9+iz4A=";
+    aarch64-linux = "sha256-3kXOV8rlCNbNBdXgOtd3S94qO+JIKyOByA4WGX+XVP0=";
+    x86_64-darwin = "sha256-iBBVKZiSoo08YEQ8J/Rt1/5b7a+2xjtuS6QL/Wod5nQ=";
+    aarch64-darwin = "sha256-Djnuc3l/jQKvBf1aej8LG5Ot2wPT0m5Zo1B24l1UHsM=";
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/showoff/Gemfile b/nixpkgs/pkgs/servers/http/showoff/Gemfile
new file mode 100644
index 000000000000..cfd295096bc1
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/showoff/Gemfile
@@ -0,0 +1,2 @@
+source 'https://rubygems.org'
+gem 'showoff'
diff --git a/nixpkgs/pkgs/servers/http/showoff/Gemfile.lock b/nixpkgs/pkgs/servers/http/showoff/Gemfile.lock
new file mode 100644
index 000000000000..34b90b3fd2f7
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/showoff/Gemfile.lock
@@ -0,0 +1,73 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    addressable (2.6.0)
+      public_suffix (>= 2.0.2, < 4.0)
+    commonmarker (0.18.2)
+      ruby-enum (~> 0.5)
+    concurrent-ruby (1.1.5)
+    daemons (1.3.1)
+    em-websocket (0.3.8)
+      addressable (>= 2.1.1)
+      eventmachine (>= 0.12.9)
+    eventmachine (1.2.7)
+    fidget (0.0.6)
+      ruby-dbus (< 0.15.0)
+    gli (2.18.0)
+    htmlentities (4.3.4)
+    i18n (1.6.0)
+      concurrent-ruby (~> 1.0)
+    iso-639 (0.2.8)
+    json (2.2.0)
+    mini_portile2 (2.4.0)
+    nokogiri (1.10.1)
+      mini_portile2 (~> 2.4.0)
+    parslet (1.8.2)
+    public_suffix (3.0.3)
+    rack (1.6.11)
+    rack-contrib (1.8.0)
+      rack (~> 1.4)
+    rack-protection (1.5.5)
+      rack
+    redcarpet (3.4.0)
+    ruby-dbus (0.14.1)
+    ruby-enum (0.7.2)
+      i18n
+    showoff (0.20.1)
+      commonmarker
+      fidget (>= 0.0.3)
+      gli (>= 2.0)
+      htmlentities
+      i18n
+      iso-639
+      json
+      nokogiri
+      parslet
+      rack-contrib
+      redcarpet
+      sinatra (~> 1.3)
+      sinatra-websocket
+      thin (~> 1.3)
+      tilt (>= 2.0.3)
+    sinatra (1.4.8)
+      rack (~> 1.5)
+      rack-protection (~> 1.4)
+      tilt (>= 1.3, < 3)
+    sinatra-websocket (0.3.1)
+      em-websocket (~> 0.3.6)
+      eventmachine
+      thin (>= 1.3.1, < 2.0.0)
+    thin (1.7.2)
+      daemons (~> 1.0, >= 1.0.9)
+      eventmachine (~> 1.0, >= 1.0.4)
+      rack (>= 1, < 3)
+    tilt (2.0.9)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  showoff
+
+BUNDLED WITH
+   2.1.4
diff --git a/nixpkgs/pkgs/servers/http/showoff/default.nix b/nixpkgs/pkgs/servers/http/showoff/default.nix
new file mode 100644
index 000000000000..ecfd034e05b3
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/showoff/default.nix
@@ -0,0 +1,18 @@
+{ lib, bundlerApp, bundlerUpdateScript }:
+
+bundlerApp {
+  pname = "showoff";
+  gemdir = ./.;
+  exes = [ "showoff" ];
+
+  passthru.updateScript = bundlerUpdateScript "showoff";
+
+  meta = with lib; {
+    description = "A slideshow presentation tool with a twist";
+    longDescription = "It runs as a web application, with audience interactivity features. This means that your audience can follow along in their own browsers, can download supplemental materials, can participate in quizzes or polls, post questions for the presenter, etc. By default, their slideshows will synchronize with the presenter, but they can switch to self-navigation mode";
+    homepage = "https://puppetlabs.github.io/showoff/";
+    license = with licenses; mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ maxwilson nicknovitski ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/showoff/gemset.nix b/nixpkgs/pkgs/servers/http/showoff/gemset.nix
new file mode 100644
index 000000000000..d493a0a79751
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/showoff/gemset.nix
@@ -0,0 +1,231 @@
+{
+  addressable = {
+    dependencies = ["public_suffix"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0bcm2hchn897xjhqj9zzsxf3n9xhddymj4lsclz508f4vw3av46l";
+      type = "gem";
+    };
+    version = "2.6.0";
+  };
+  commonmarker = {
+    dependencies = ["ruby-enum"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "122dy5mzx4p86flpzyg3raf742zp5ab9bjr7zk29p3ixpncf0rdk";
+      type = "gem";
+    };
+    version = "0.18.2";
+  };
+  concurrent-ruby = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1x07r23s7836cpp5z9yrlbpljcxpax14yw4fy4bnp6crhr6x24an";
+      type = "gem";
+    };
+    version = "1.1.5";
+  };
+  daemons = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0l5gai3vd4g7aqff0k1mp41j9zcsvm2rbwmqn115a325k9r7pf4w";
+      type = "gem";
+    };
+    version = "1.3.1";
+  };
+  em-websocket = {
+    dependencies = ["addressable" "eventmachine"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0xkb1rc6dd3y5s7qsp4wqrri3n9gwsbvnwwv6xwgp241jxdpp4iq";
+      type = "gem";
+    };
+    version = "0.3.8";
+  };
+  eventmachine = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0wh9aqb0skz80fhfn66lbpr4f86ya2z5rx6gm5xlfhd05bj1ch4r";
+      type = "gem";
+    };
+    version = "1.2.7";
+  };
+  fidget = {
+    dependencies = ["ruby-dbus"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "04g2846wjlb8ms5041lv37aqs4jzsziwv58bxg7yzc61pdvi4ksb";
+      type = "gem";
+    };
+    version = "0.0.6";
+  };
+  gli = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "133glfzsq67ykmdsgp251s9kddg9x4qki2jpbjv25h3hawlql4hs";
+      type = "gem";
+    };
+    version = "2.18.0";
+  };
+  htmlentities = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1nkklqsn8ir8wizzlakncfv42i32wc0w9hxp00hvdlgjr7376nhj";
+      type = "gem";
+    };
+    version = "4.3.4";
+  };
+  i18n = {
+    dependencies = ["concurrent-ruby"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1hfxnlyr618s25xpafw9mypa82qppjccbh292c4l3bj36az7f6wl";
+      type = "gem";
+    };
+    version = "1.6.0";
+  };
+  iso-639 = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "10k1gpkkbxbasgjzh4hd32ygxzjb5312rphipm46ryxkpx556zzz";
+      type = "gem";
+    };
+    version = "0.2.8";
+  };
+  json = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0sx97bm9by389rbzv8r1f43h06xcz8vwi3h5jv074gvparql7lcx";
+      type = "gem";
+    };
+    version = "2.2.0";
+  };
+  mini_portile2 = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "15zplpfw3knqifj9bpf604rb3wc1vhq6363pd6lvhayng8wql5vy";
+      type = "gem";
+    };
+    version = "2.4.0";
+  };
+  nokogiri = {
+    dependencies = ["mini_portile2"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "09zll7c6j7xr6wyvh5mm5ncj6pkryp70ybcsxdbw1nyphx5dh184";
+      type = "gem";
+    };
+    version = "1.10.1";
+  };
+  parslet = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "12nrzfwjphjlakb9pmpj70hgjwgzvnr8i1zfzddifgyd44vspl88";
+      type = "gem";
+    };
+    version = "1.8.2";
+  };
+  public_suffix = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "08q64b5br692dd3v0a9wq9q5dvycc6kmiqmjbdxkxbfizggsvx6l";
+      type = "gem";
+    };
+    version = "3.0.3";
+  };
+  rack = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1g9926ln2lw12lfxm4ylq1h6nl0rafl10za3xvjzc87qvnqic87f";
+      type = "gem";
+    };
+    version = "1.6.11";
+  };
+  rack-contrib = {
+    dependencies = ["rack"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "1l7m0av4pjl5p64l8j7pkip1jwhkp80a8kc2j7b9lrwh04fgx5wx";
+      type = "gem";
+    };
+    version = "1.8.0";
+  };
+  rack-protection = {
+    dependencies = ["rack"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0my0wlw4a5l3hs79jkx2xzv7djhajgf8d28k8ai1ddlnxxb0v7ss";
+      type = "gem";
+    };
+    version = "1.5.5";
+  };
+  redcarpet = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0h9qz2hik4s9knpmbwrzb3jcp3vc5vygp9ya8lcpl7f1l9khmcd7";
+      type = "gem";
+    };
+    version = "3.4.0";
+  };
+  ruby-dbus = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "16lsqdwas6ngyyvq51l7lynj5ayis17zm5hpsg5x3m3n6r5k2gv4";
+      type = "gem";
+    };
+    version = "0.14.1";
+  };
+  ruby-enum = {
+    dependencies = ["i18n"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0h62avini866kxpjzqxlqnajma3yvj0y25l6hn9h2mv5pp6fcrhx";
+      type = "gem";
+    };
+    version = "0.7.2";
+  };
+  showoff = {
+    dependencies = ["commonmarker" "fidget" "gli" "htmlentities" "i18n" "iso-639" "json" "nokogiri" "parslet" "rack-contrib" "redcarpet" "sinatra" "sinatra-websocket" "thin" "tilt"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "14884kh7vrp5b72dpn7q26h49y7igxqza72girkv1h28qx4kqw4r";
+      type = "gem";
+    };
+    version = "0.20.1";
+  };
+  sinatra = {
+    dependencies = ["rack" "rack-protection" "tilt"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0byxzl7rx3ki0xd7aiv1x8mbah7hzd8f81l65nq8857kmgzj1jqq";
+      type = "gem";
+    };
+    version = "1.4.8";
+  };
+  sinatra-websocket = {
+    dependencies = ["em-websocket" "eventmachine" "thin"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0as52mfw34z3ba6qjab009h2rdn0za0iwrc42kw948hbb8qzcm5m";
+      type = "gem";
+    };
+    version = "0.3.1";
+  };
+  thin = {
+    dependencies = ["daemons" "eventmachine" "rack"];
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0nagbf9pwy1vg09k6j4xqhbjjzrg5dwzvkn4ffvlj76fsn6vv61f";
+      type = "gem";
+    };
+    version = "1.7.2";
+  };
+  tilt = {
+    source = {
+      remotes = ["https://rubygems.org"];
+      sha256 = "0ca4k0clwf0rkvy7726x4nxpjxkpv67w043i39saxgldxd97zmwz";
+      type = "gem";
+    };
+    version = "2.0.9";
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/spawn-fcgi/default.nix b/nixpkgs/pkgs/servers/http/spawn-fcgi/default.nix
new file mode 100644
index 000000000000..3a4d9c8597c5
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/spawn-fcgi/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchsvn, autoconf, automake }:
+
+stdenv.mkDerivation rec {
+  pname = "spawn-fcgi";
+  version = "1.6.4";
+
+  src = fetchsvn {
+    url = "svn://svn.lighttpd.net/spawn-fcgi/tags/spawn-fcgi-${version}";
+    sha256 = "07r6nwbg4881mdgp0hqh80c4x9wb7jg6cgc84ghwhfbd2abc2iq5";
+  };
+
+  nativeBuildInputs = [ automake autoconf ];
+
+  preConfigure = ''
+    ./autogen.sh
+  '';
+
+  meta = with lib; {
+    homepage    = "https://redmine.lighttpd.net/projects/spawn-fcgi";
+    description = "Provides an interface to external programs that support the FastCGI interface";
+    mainProgram = "spawn-fcgi";
+    license     = licenses.bsd3;
+    maintainers = with maintainers; [ ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/tengine/check-resolv-conf.patch b/nixpkgs/pkgs/servers/http/tengine/check-resolv-conf.patch
new file mode 100644
index 000000000000..83b4e1cf8eb2
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/tengine/check-resolv-conf.patch
@@ -0,0 +1,12 @@
+diff --git a/auto/unix b/auto/unix
+index a38c12dc..025a4899 100644
+--- a/auto/unix
++++ b/auto/unix
+@@ -1072,7 +1072,5 @@ ngx_feature_test='int fd;
+ 
+ 
+ # Tengine: auto read nameserver from /etc/resolv.conf.
+- if [ -f "/etc/resolv.conf" ]; then
+     have=NGX_RESOLVER_FILE value="\"/etc/resolv.conf\"" . auto/define
+-fi
+ 
diff --git a/nixpkgs/pkgs/servers/http/tengine/default.nix b/nixpkgs/pkgs/servers/http/tengine/default.nix
new file mode 100644
index 000000000000..591f180893b3
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/tengine/default.nix
@@ -0,0 +1,127 @@
+{ lib, stdenv, fetchFromGitHub, openssl, zlib, pcre, libxcrypt, libxml2, libxslt
+, substituteAll, gd, geoip, gperftools, jemalloc, nixosTests
+, withDebug ? false
+, withMail ? false
+, withStream ? false
+, modules ? []
+, ...
+}:
+
+with lib;
+
+stdenv.mkDerivation rec {
+  version = "3.1.0";
+  pname = "tengine";
+
+  src = fetchFromGitHub {
+    owner = "alibaba";
+    repo = pname;
+    rev = version;
+    hash = "sha256-cClSNBlresMHqJrqSFWvUo589TlwJ2tL5FWJG9QBuis=";
+  };
+
+  buildInputs =
+    [ openssl zlib pcre libxcrypt libxml2 libxslt gd geoip gperftools jemalloc ]
+    ++ concatMap (mod: mod.inputs or []) modules;
+
+  patches = singleton (substituteAll {
+    src = ../nginx/nix-etag-1.15.4.patch;
+    preInstall = ''
+      export nixStoreDir="$NIX_STORE" nixStoreDirLen="''${#NIX_STORE}"
+    '';
+  }) ++ [
+    ./check-resolv-conf.patch
+    ../nginx/nix-skip-check-logs-path.patch
+  ];
+
+  configureFlags = [
+    "--with-http_ssl_module"
+    "--with-http_v2_module"
+    "--with-http_realip_module"
+    "--with-http_addition_module"
+    "--with-http_xslt_module"
+    "--with-http_geoip_module"
+    "--with-http_sub_module"
+    "--with-http_dav_module"
+    "--with-http_flv_module"
+    "--with-http_mp4_module"
+    "--with-http_gunzip_module"
+    "--with-http_gzip_static_module"
+    "--with-http_auth_request_module"
+    "--with-http_random_index_module"
+    "--with-http_secure_link_module"
+    "--with-http_degradation_module"
+    "--with-http_stub_status_module"
+    "--with-threads"
+    "--with-pcre-jit"
+    "--with-http_slice_module"
+    "--with-select_module"
+    "--with-poll_module"
+    "--with-google_perftools_module"
+    "--with-jemalloc"
+    "--http-log-path=/var/log/nginx/access.log"
+    "--error-log-path=/var/log/nginx/error.log"
+    "--pid-path=/var/log/nginx/nginx.pid"
+    "--http-client-body-temp-path=/var/cache/nginx/client_body"
+    "--http-proxy-temp-path=/var/cache/nginx/proxy"
+    "--http-fastcgi-temp-path=/var/cache/nginx/fastcgi"
+    "--http-uwsgi-temp-path=/var/cache/nginx/uwsgi"
+    "--http-scgi-temp-path=/var/cache/nginx/scgi"
+  ] ++ optionals withDebug [
+    "--with-debug"
+  ] ++ optionals withMail [
+    "--with-mail"
+    "--with-mail_ssl_module"
+  ] ++ optionals (!withMail) [
+    "--without-mail_pop3_module"
+    "--without-mail_imap_module"
+    "--without-mail_smtp_module"
+  ] ++ optionals withStream [
+    "--with-stream"
+    "--with-stream_ssl_module"
+    "--with-stream_realip_module"
+    "--with-stream_geoip_module"
+    "--with-stream_ssl_preread_module"
+    "--with-stream_sni"
+  ] ++ optionals (!withStream) [
+    "--without-stream_limit_conn_module"
+    "--without-stream_access_module"
+    "--without-stream_geo_module"
+    "--without-stream_map_module"
+    "--without-stream_split_clients_module"
+    "--without-stream_return_module"
+    "--without-stream_upstream_hash_module"
+    "--without-stream_upstream_least_conn_module"
+    "--without-stream_upstream_random_module"
+    "--without-stream_upstream_zone_module"
+  ] ++ optional (gd != null) "--with-http_image_filter_module"
+    ++ optional (with stdenv.hostPlatform; isLinux || isFreeBSD) "--with-file-aio"
+    ++ map (mod: "--add-module=${mod.src}") modules;
+
+  env.NIX_CFLAGS_COMPILE = "-I${libxml2.dev}/include/libxml2 -Wno-error=implicit-fallthrough"
+    + optionalString stdenv.isDarwin " -Wno-error=deprecated-declarations";
+
+  preConfigure = (concatMapStringsSep "\n" (mod: mod.preConfigure or "") modules);
+
+  hardeningEnable = optional (!stdenv.isDarwin) "pie";
+
+  enableParallelBuilding = true;
+
+  postInstall = ''
+    mv $out/sbin $out/bin
+  '';
+
+  passthru = {
+    inherit modules;
+    tests = nixosTests.nginx-variants.tengine;
+  };
+
+  meta = {
+    description = "A web server based on Nginx and has many advanced features, originated by Taobao";
+    mainProgram = "nginx";
+    homepage    = "https://tengine.taobao.org";
+    license     = licenses.bsd2;
+    platforms   = platforms.all;
+    maintainers = with maintainers; [ izorkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/thttpd/default.nix b/nixpkgs/pkgs/servers/http/thttpd/default.nix
new file mode 100644
index 000000000000..c7a92bbf5f1c
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/thttpd/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchurl, libxcrypt }:
+
+stdenv.mkDerivation rec {
+  pname = "thttpd";
+  version = "2.29";
+
+  src = fetchurl {
+    url = "https://acme.com/software/thttpd/${pname}-${version}.tar.gz";
+    sha256 = "15x3h4b49wgfywn82i3wwbf38mdns94mbi4ma9xiwsrjv93rzh4r";
+  };
+
+  prePatch = ''
+    sed -i -e 's/getline/getlineX/' extras/htpasswd.c
+    sed -i -e 's/chmod 2755/chmod 755/' extras/Makefile.in
+  '';
+
+  buildInputs = [
+    libxcrypt
+  ];
+
+  preInstall = ''
+    mkdir -p "$out/man/man1"
+    sed -i -e 's/-o bin -g bin *//' Makefile
+    sed -i -e '/chgrp/d' extras/Makefile
+  '';
+
+  meta = {
+    description = "Tiny/turbo/throttling HTTP server";
+    homepage = "http://www.acme.com/software/thttpd/";
+    license = lib.licenses.bsd2;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/tomcat/axis2/builder.sh b/nixpkgs/pkgs/servers/http/tomcat/axis2/builder.sh
new file mode 100644
index 000000000000..de8e225456b4
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/tomcat/axis2/builder.sh
@@ -0,0 +1,16 @@
+if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi
+source $stdenv/setup
+
+unzip $src
+cd axis2-*
+mkdir -p $out
+cp -av * $out
+cd webapp
+ant
+cd ..
+mkdir -p $out/webapps
+cp dist/axis2.war $out/webapps
+cd $out/webapps
+mkdir axis2
+cd axis2
+unzip ../axis2.war
diff --git a/nixpkgs/pkgs/servers/http/tomcat/axis2/default.nix b/nixpkgs/pkgs/servers/http/tomcat/axis2/default.nix
new file mode 100644
index 000000000000..5cee9020b8aa
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/tomcat/axis2/default.nix
@@ -0,0 +1,25 @@
+{ lib, stdenv, fetchurl, apacheAnt, jdk, unzip }:
+
+stdenv.mkDerivation rec {
+  pname = "axis2";
+  version = "1.8.2";
+
+  src = fetchurl {
+    url = "mirror://apache/axis/axis2/java/core/${version}/${pname}-${version}-bin.zip";
+    hash = "sha256-oilPVFFpl3F61nVDxcYx/bc81FopS5fzoIdXzeP8brk=";
+  };
+
+  nativeBuildInputs = [ unzip ];
+  buildInputs = [ apacheAnt jdk ];
+  builder = ./builder.sh;
+
+  meta = {
+    description = "Web Services / SOAP / WSDL engine, the successor to the widely used Apache Axis SOAP stack";
+    homepage = "https://axis.apache.org/axis2/java/core/";
+    changelog = "https://axis.apache.org/axis2/java/core/release-notes/${version}.html";
+    maintainers = [ lib.maintainers.anthonyroussel ];
+    platforms = lib.platforms.unix;
+    sourceProvenance = with lib.sourceTypes; [ binaryBytecode ];
+    license = lib.licenses.asl20;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/tomcat/default.nix b/nixpkgs/pkgs/servers/http/tomcat/default.nix
new file mode 100644
index 000000000000..710caedc094e
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/tomcat/default.nix
@@ -0,0 +1,50 @@
+{ stdenv, lib, fetchurl, nixosTests, testers, jre }:
+
+let
+  common = { version, hash }: stdenv.mkDerivation (finalAttrs: {
+    pname = "apache-tomcat";
+    inherit version;
+
+    src = fetchurl {
+      url = "mirror://apache/tomcat/tomcat-${lib.versions.major version}/v${version}/bin/apache-tomcat-${version}.tar.gz";
+      inherit hash;
+    };
+
+    outputs = [ "out" "webapps" ];
+    installPhase =
+      ''
+        mkdir $out
+        mv * $out
+        mkdir -p $webapps/webapps
+        mv $out/webapps $webapps/
+      '';
+
+    passthru.tests = {
+      inherit (nixosTests) tomcat;
+      version = testers.testVersion {
+        package = finalAttrs.finalPackage;
+        command = "JAVA_HOME=${jre} ${finalAttrs.finalPackage}/bin/version.sh";
+      };
+    };
+
+    meta = with lib; {
+      homepage = "https://tomcat.apache.org/";
+      description = "An implementation of the Java Servlet and JavaServer Pages technologies";
+      platforms = jre.meta.platforms;
+      maintainers = with maintainers; [ anthonyroussel ];
+      license = [ licenses.asl20 ];
+      sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    };
+  });
+
+in {
+  tomcat9 = common {
+    version = "9.0.87";
+    hash = "sha256-2kgvuSIAhtvzceGAqgnGQCr48EhYZzTN7dSgjEjUzgI=";
+  };
+
+  tomcat10 = common {
+    version = "10.1.19";
+    hash = "sha256-w+pp2SvPw+15Ko2AeUrNuFbxwF2KBF4XpxoliKDHULc=";
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/tomcat/jdbc/mysql/default.nix b/nixpkgs/pkgs/servers/http/tomcat/jdbc/mysql/default.nix
new file mode 100644
index 000000000000..9e6f346a0ec4
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/tomcat/jdbc/mysql/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, mysql_jdbc }:
+
+stdenv.mkDerivation {
+  pname = "tomcat-mysql-jdbc";
+  version = mysql_jdbc.version;
+
+  dontUnpack = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/lib
+    ln -s $mysql_jdbc/share/java/mysql-connector-java.jar $out/lib/mysql-connector-java.jar
+
+    runHook postInstall
+  '';
+
+  meta = {
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/tomcat/tomcat-native.nix b/nixpkgs/pkgs/servers/http/tomcat/tomcat-native.nix
new file mode 100644
index 000000000000..84e5cecf1e5e
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/tomcat/tomcat-native.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchurl, apr, jdk, openssl }:
+
+stdenv.mkDerivation rec {
+  pname = "tomcat-native";
+  version = "2.0.7";
+
+  src = fetchurl {
+    url = "mirror://apache/tomcat/tomcat-connectors/native/${version}/source/${pname}-${version}-src.tar.gz";
+    hash = "sha256-LFr8ftw4PkdmBkfppwca2B9Y5Rx/dlwS9+evySA7LU0=";
+  };
+
+  sourceRoot = "${pname}-${version}-src/native";
+
+  buildInputs = [ apr jdk openssl ];
+
+  configureFlags = [
+    "--with-apr=${apr.dev}"
+    "--with-java-home=${jdk}"
+    "--with-ssl=${openssl.dev}"
+  ];
+
+  meta = with lib; {
+    description = "An optional component for use with Apache Tomcat that allows Tomcat to use certain native resources for performance, compatibility, etc";
+    homepage = "https://tomcat.apache.org/native-doc/";
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ aanderse ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/trafficserver/default.nix b/nixpkgs/pkgs/servers/http/trafficserver/default.nix
new file mode 100644
index 000000000000..a49acfe9fce8
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/trafficserver/default.nix
@@ -0,0 +1,188 @@
+{ lib
+, stdenv
+, fetchzip
+, makeWrapper
+, nixosTests
+, pkg-config
+, file
+, linuxHeaders
+, openssl
+, pcre
+, perlPackages
+, python3
+, xz
+, zlib
+, catch2
+# recommended dependencies
+, withHwloc ? true
+, hwloc
+, withCurl ? true
+, curl
+, withCurses ? true
+, ncurses
+, withCap ? stdenv.isLinux
+, libcap
+, withUnwind ? stdenv.isLinux
+, libunwind
+# optional dependencies
+, withBrotli ? false
+, brotli
+, withCjose ? false
+, cjose
+, withGeoIP ? false
+, geoip
+, withHiredis ? false
+, hiredis
+, withImageMagick ? false
+, imagemagick
+, withJansson ? false
+, jansson
+, withKyotoCabinet ? false
+, kyotocabinet
+, withLuaJIT ? false
+, luajit
+, withMaxmindDB ? false
+, libmaxminddb
+# optional features
+, enableWCCP ? false
+}:
+
+stdenv.mkDerivation rec {
+  pname = "trafficserver";
+  version = "9.2.3";
+
+  src = fetchzip {
+    url = "mirror://apache/trafficserver/trafficserver-${version}.tar.bz2";
+    hash = "sha256-WqRqf10QKYepCoaNzG26O2jv54Do3qFawDupSkrAPKk=";
+  };
+
+  # NOTE: The upstream README indicates that flex is needed for some features,
+  # but it actually seems to be unnecessary as of this commit[1]. The detection
+  # logic for bison and flex is still present in the build script[2], but no
+  # other code seems to depend on it. This situation is susceptible to change
+  # though, so it's a good idea to inspect the build scripts periodically.
+  #
+  # [1]: https://github.com/apache/trafficserver/pull/5617
+  # [2]: https://github.com/apache/trafficserver/blob/3fd2c60/configure.ac#L742-L788
+  nativeBuildInputs = [ makeWrapper pkg-config file python3 ]
+    ++ (with perlPackages; [ perl ExtUtilsMakeMaker ])
+    ++ lib.optionals stdenv.isLinux [ linuxHeaders ];
+
+  buildInputs = [
+    openssl
+    pcre
+    perlPackages.perl
+  ] ++ lib.optional withBrotli brotli
+  ++ lib.optional withCap libcap
+  ++ lib.optional withCjose cjose
+  ++ lib.optional withCurl curl
+  ++ lib.optional withGeoIP geoip
+  ++ lib.optional withHiredis hiredis
+  ++ lib.optional withHwloc hwloc
+  ++ lib.optional withImageMagick imagemagick
+  ++ lib.optional withJansson jansson
+  ++ lib.optional withKyotoCabinet kyotocabinet
+  ++ lib.optional withCurses ncurses
+  ++ lib.optional withLuaJIT luajit
+  ++ lib.optional withUnwind libunwind
+  ++ lib.optional withMaxmindDB libmaxminddb;
+
+  outputs = [ "out" "man" ];
+
+  postPatch = ''
+    patchShebangs \
+      iocore/aio/test_AIO.sample \
+      src/traffic_via/test_traffic_via \
+      src/traffic_logstats/tests \
+      tools/check-unused-dependencies
+
+    substituteInPlace configure --replace '/usr/bin/file' '${file}/bin/file'
+  '' + lib.optionalString stdenv.isLinux ''
+    substituteInPlace configure \
+      --replace '/usr/include/linux' '${linuxHeaders}/include/linux'
+  '' + lib.optionalString stdenv.isDarwin ''
+    # 'xcrun leaks' probably requires non-free XCode
+    substituteInPlace iocore/net/test_certlookup.cc \
+      --replace 'xcrun leaks' 'true'
+  '';
+
+  configureFlags = [
+    "--enable-layout=NixOS"
+    "--enable-experimental-plugins"
+    (lib.enableFeature enableWCCP "wccp")
+
+    (lib.withFeatureAs withHiredis "hiredis" hiredis)
+  ];
+
+  installFlags = [
+    "pkgsysconfdir=${placeholder "out"}/etc/trafficserver"
+
+    # replace runtime directories with an install-time placeholder directory
+    "pkgcachedir=${placeholder "out"}/.install-trafficserver"
+    "pkglocalstatedir=${placeholder "out"}/.install-trafficserver"
+    "pkglogdir=${placeholder "out"}/.install-trafficserver"
+    "pkgruntimedir=${placeholder "out"}/.install-trafficserver"
+  ];
+
+  postInstall = ''
+    substituteInPlace rc/trafficserver.service --replace "syslog.target" ""
+    install -Dm644 rc/trafficserver.service $out/lib/systemd/system/trafficserver.service
+
+    wrapProgram $out/bin/tspush \
+      --set PERL5LIB '${with perlPackages; makePerlPath [ URI ]}' \
+      --prefix PATH : "${lib.makeBinPath [ file ]}"
+
+    find "$out" -name '*.la' -delete
+
+    # ensure no files actually exist in this directory
+    rmdir $out/.install-trafficserver
+  '';
+
+  installCheckPhase = let
+    expected = ''
+      Via header is [uScMsEf p eC:t cCMp sF], Length is 22
+      Via Header Details:
+      Request headers received from client                   :simple request (not conditional)
+      Result of Traffic Server cache lookup for URL          :miss (a cache "MISS")
+      Response information received from origin server       :error in response
+      Result of document write-to-cache:                     :no cache write performed
+      Proxy operation result                                 :unknown
+      Error codes (if any)                                   :connection to server failed
+      Tunnel info                                            :no tunneling
+      Cache Type                                             :cache
+      Cache Lookup Result                                    :cache miss (url not in cache)
+      Parent proxy connection status                         :no parent proxy or unknown
+      Origin server connection status                        :connection open failed
+    '';
+  in ''
+    runHook preInstallCheck
+    diff -Naur <($out/bin/traffic_via '[uScMsEf p eC:t cCMp sF]') - <<EOF
+    ${lib.removeSuffix "\n" expected}
+    EOF
+    runHook postInstallCheck
+  '';
+
+  doCheck = true;
+  doInstallCheck = true;
+  enableParallelBuilding = true;
+
+  passthru.tests = { inherit (nixosTests) trafficserver; };
+
+  meta = with lib; {
+    homepage = "https://trafficserver.apache.org";
+    changelog = "https://raw.githubusercontent.com/apache/trafficserver/${version}/CHANGELOG-${version}";
+    description = "Fast, scalable, and extensible HTTP caching proxy server";
+    longDescription = ''
+      Apache Traffic Server is a high-performance web proxy cache that improves
+      network efficiency and performance by caching frequently-accessed
+      information at the edge of the network. This brings content physically
+      closer to end users, while enabling faster delivery and reduced bandwidth
+      use. Traffic Server is designed to improve content delivery for
+      enterprises, Internet service providers (ISPs), backbone providers, and
+      large intranets by maximizing existing and available bandwidth.
+    '';
+    license = licenses.asl20;
+    maintainers = with maintainers; [ midchildan ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/unit/default.nix b/nixpkgs/pkgs/servers/http/unit/default.nix
new file mode 100644
index 000000000000..c77428688da5
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/unit/default.nix
@@ -0,0 +1,85 @@
+{ lib, stdenv, fetchFromGitHub, nixosTests, which
+, pcre2
+, withPython3 ? true, python3, ncurses
+, withPHP81 ? true, php81
+, withPHP82 ? false, php82
+, withPerl536 ? false, perl536
+, withPerl538 ? true, perl538
+, withRuby_3_1 ? true, ruby_3_1
+, withRuby_3_2 ? false, ruby_3_2
+, withSSL ? true, openssl ? null
+, withIPv6 ? true
+, withDebug ? false
+}:
+
+with lib;
+
+let
+  phpConfig = {
+    embedSupport = true;
+    apxs2Support = false;
+    systemdSupport = false;
+    phpdbgSupport = false;
+    cgiSupport = false;
+    fpmSupport = false;
+  };
+
+  php81-unit = php81.override phpConfig;
+  php82-unit = php82.override phpConfig;
+
+in stdenv.mkDerivation rec {
+  version = "1.32.0";
+  pname = "unit";
+
+  src = fetchFromGitHub {
+    owner = "nginx";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-u693Q6Gp8lFm3DX1q5i6W021bxD962NGBGDRxUtvGrk=";
+  };
+
+  nativeBuildInputs = [ which ];
+
+  buildInputs = [ pcre2.dev ]
+    ++ optionals withPython3 [ python3 ncurses ]
+    ++ optional withPHP81 php81-unit
+    ++ optional withPHP82 php82-unit
+    ++ optional withPerl536 perl536
+    ++ optional withPerl538 perl538
+    ++ optional withRuby_3_1 ruby_3_1
+    ++ optional withRuby_3_2 ruby_3_2
+    ++ optional withSSL openssl;
+
+  configureFlags = [
+    "--control=unix:/run/unit/control.unit.sock"
+    "--pid=/run/unit/unit.pid"
+    "--user=unit"
+    "--group=unit"
+  ] ++ optional withSSL     "--openssl"
+    ++ optional (!withIPv6) "--no-ipv6"
+    ++ optional withDebug   "--debug";
+
+  # Optionally add the PHP derivations used so they can be addressed in the configs
+  usedPhp81 = optionals withPHP81 php81-unit;
+
+  postConfigure = ''
+    ${optionalString withPython3    "./configure python --module=python3  --config=python3-config  --lib-path=${python3}/lib"}
+    ${optionalString withPHP81      "./configure php    --module=php81    --config=${php81-unit.unwrapped.dev}/bin/php-config --lib-path=${php81-unit}/lib"}
+    ${optionalString withPHP82      "./configure php    --module=php81    --config=${php82-unit.unwrapped.dev}/bin/php-config --lib-path=${php82-unit}/lib"}
+    ${optionalString withPerl536    "./configure perl   --module=perl536  --perl=${perl536}/bin/perl"}
+    ${optionalString withPerl538    "./configure perl   --module=perl538  --perl=${perl538}/bin/perl"}
+    ${optionalString withRuby_3_1   "./configure ruby   --module=ruby31   --ruby=${ruby_3_1}/bin/ruby"}
+    ${optionalString withRuby_3_2   "./configure ruby   --module=ruby32   --ruby=${ruby_3_2}/bin/ruby"}
+  '';
+
+  passthru.tests.unit-php = nixosTests.unit-php;
+
+  meta = {
+    description = "Dynamic web and application server, designed to run applications in multiple languages";
+    mainProgram = "unitd";
+    homepage    = "https://unit.nginx.org/";
+    license     = licenses.asl20;
+    platforms   = platforms.linux;
+    maintainers = with maintainers; [ izorkin ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/webfs/default.nix b/nixpkgs/pkgs/servers/http/webfs/default.nix
new file mode 100644
index 000000000000..812f5a0d00f5
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/webfs/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchurl, openssl }:
+let
+  # Let's not pull the whole apache httpd package
+  mime_file = fetchurl {
+    url = "https://raw.githubusercontent.com/apache/httpd/906e419c1f703360e2e8ec077b393347f993884f/docs/conf/mime.types";
+    sha256 = "ef972fc545cbff4c0daa2b2e6b440859693b3c10435ee90f10fa6fffad800c16";
+  };
+in
+stdenv.mkDerivation rec {
+  pname = "webfs";
+  version = "1.21";
+
+  src = fetchurl {
+    url = "https://www.kraxel.org/releases/webfs/${pname}-${version}.tar.gz";
+    sha256 = "98c1cb93473df08e166e848e549f86402e94a2f727366925b1c54ab31064a62a";
+  };
+
+  patches = [ ./ls.c.patch ];
+
+  buildInputs = [ openssl ];
+
+  makeFlags = [
+    "mimefile=${mime_file}"
+    "prefix=$(out)"
+  ];
+
+  meta = with lib; {
+    description = "HTTP server for purely static content";
+    homepage    = "http://linux.bytesex.org/misc/webfs.html";
+    license     = licenses.gpl2;
+    platforms   = platforms.all;
+    maintainers = with maintainers; [ zimbatm ];
+    mainProgram = "webfsd";
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/webfs/ls.c.patch b/nixpkgs/pkgs/servers/http/webfs/ls.c.patch
new file mode 100644
index 000000000000..78b83b725887
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/webfs/ls.c.patch
@@ -0,0 +1,13 @@
+# Source: homebrew
+# https://raw.githubusercontent.com/Homebrew/patches/0518a6d1/webfs/patch-ls.c
+--- ./ls.c.orig	Fri Oct 15 14:20:50 2004
++++ ./ls.c	Fri Oct 15 14:21:13 2004
+@@ -160,7 +160,7 @@
+     return buf;
+ }
+ 
+-#if !defined(__FreeBSD__) && !defined(__OpenBSD__)
++#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__APPLE__)
+ static void strmode(mode_t mode, char *dest)
+ {
+     static const char *rwx[] = {
diff --git a/nixpkgs/pkgs/servers/http/webhook/default.nix b/nixpkgs/pkgs/servers/http/webhook/default.nix
new file mode 100644
index 000000000000..d4ee36713e4c
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/webhook/default.nix
@@ -0,0 +1,33 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, nixosTests
+}:
+
+buildGoModule rec {
+  pname = "webhook";
+  version = "2.8.1";
+
+  src = fetchFromGitHub {
+    owner = "adnanh";
+    repo = "webhook";
+    rev = version;
+    sha256 = "sha256-8OpVpm9nEroUlr41VgnyM6sxd/FlSvoQK5COOWvo4Y4=";
+  };
+
+  vendorHash = null;
+
+  subPackages = [ "." ];
+
+  doCheck = false;
+
+  passthru.tests = { inherit (nixosTests) webhook; };
+
+  meta = with lib; {
+    description = "Incoming webhook server that executes shell commands";
+    mainProgram = "webhook";
+    homepage = "https://github.com/adnanh/webhook";
+    license = licenses.mit;
+    maintainers = with maintainers; [ azahi ];
+  };
+}
diff --git a/nixpkgs/pkgs/servers/http/yaws/default.nix b/nixpkgs/pkgs/servers/http/yaws/default.nix
new file mode 100644
index 000000000000..5e5a401d35d2
--- /dev/null
+++ b/nixpkgs/pkgs/servers/http/yaws/default.nix
@@ -0,0 +1,32 @@
+{lib, stdenv, fetchFromGitHub, erlang, pam, perl, autoreconfHook }:
+
+stdenv.mkDerivation rec {
+  pname = "yaws";
+  version = "2.1.1";
+
+  src = fetchFromGitHub {
+    owner = "erlyaws";
+    repo = pname;
+    rev = "${pname}-${version}";
+    hash = "sha256-F1qhq0SEChWw/EBodXKWTqMNmGoTwP2JgkmfANUFD9I=";
+  };
+
+  configureFlags = [ "--with-extrainclude=${pam}/include/security" ];
+
+  nativeBuildInputs = [ autoreconfHook ];
+  buildInputs = [ erlang pam perl ];
+
+  postInstall = ''
+    sed -i "s#which #type -P #" $out/bin/yaws
+  '';
+
+  meta = with lib; {
+    description = "A webserver for dynamic content written in Erlang.";
+    mainProgram = "yaws";
+    homepage = "https://github.com/erlyaws/yaws";
+    license = licenses.bsd2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+
+}