4.6. Provoz za reverzní proxy

V produkčním provozu běží Elza za webovým serverem v roli reverzní proxy (Apache HTTPD nebo NGINX). Webový server zajišťuje HTTPS a předává požadavky na HTTP port aplikace Elza (ve výchozím nastavení 8080, viz server.port v kapitole Konfigurace aplikace).

Proxy musí předávat i spojení WebSocket: klient přijímá oznámení přes cestu /stomp. Bez toho se aplikace sice načte, ale uživatelé nevidí změny provedené ostatními ani průběh úloh na pozadí.

4.6.1. Elza na vlastním doménovém jménu

Příklad pro https://elza.archiv.example.

Apache HTTPD

Vyžaduje moduly mod_proxy, mod_proxy_http a mod_proxy_wstunnel.

<VirtualHost *:443>
  ServerName elza.archiv.example
  # SSLEngine, certifikáty ...

  ProxyPreserveHost On
  ProxyRequests Off
  ProxyTimeout 60

  ProxyPass        "/stomp" "ws://aplikacni-server.interni:8080/stomp"
  ProxyPassReverse "/stomp" "ws://aplikacni-server.interni:8080/stomp"

  ProxyPass        "/" "http://aplikacni-server.interni:8080/"
  ProxyPassReverse "/" "http://aplikacni-server.interni:8080/"
</VirtualHost>

NGINX

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name elza.archiv.example;

  ssl_certificate     /etc/cert/server-chain.pem;
  ssl_certificate_key /etc/cert/server-key.pem;

  client_max_body_size 100m;

  location / {
    proxy_pass http://localhost:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # WebSocket
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

client_max_body_size musí povolit největší nahrávání povolené Elzou (elza.upload.max_request_size, ve výchozím nastavení 100 MB).

4.6.2. Elza pod cestou

Elzu lze provozovat i pod cestou stávajícího webu, například https://www.archiv.example/elza. Proxy pak předává původní host, protokol a prefix cesty v hlavičkách X-Forwarded-* a Elza je musí mít povoleno přijímat:

elza:
  security:
    acceptForwardedHeaders: true

Varování

acceptForwardedHeaders zapínejte, jen pokud je Elza dostupná výhradně přes proxy. Jinak by klient mohl poslat podvržené hlavičky X-Forwarded-* přímo.

Příklad pro Apache HTTPD s přesměrováním na vnitřní server 10.0.0.27:

<VirtualHost *:443>
  ServerName www.archiv.example

  <Location "/elza">
    RequestHeader set X-Forwarded-Prefix "/elza"
    RequestHeader set X-Forwarded-Host "www.archiv.example"
    RequestHeader set X-Forwarded-Proto "https"
  </Location>

  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} websocket [NC]
  RewriteRule "^/elza/(.*)$" "ws://10.0.0.27:8080/$1" [P,UnsafeAllow3F]
  RewriteRule "^/elza/(.*)$" "http://10.0.0.27:8080/$1" [P,UnsafeAllow3F]
</VirtualHost>

Příznak UnsafeAllow3F je od Apache HTTPD 2.4.61 nutný pro URL se zakódovaným otazníkem; ve starších verzích jej vynechte.