X-accel für die Auslieferung statischer (benutzergenerierter) Dateien
Beschreibung
Motivator für diesen TIC ist grüne IT durch Einsparung von Netzwerktraffic und CPU-Zyklen. Die Auslieferung statischer Dateien ist bei den wenigsten ein Flaschenhals, macht jedoch bei uns einen signifikanten Anteil an Netzwerktraffic von Stud.IP (z.B. bei Fehlen einer Cloud-Lösung für die Benutzer und 20'000 Studierenden) und einen geringen aber nicht übersehbaren Teil der CPU-Last unserer PHP-FPMs aus.
So werden statische (benutzergenerierte) Dateien bei uns aktuell ausgeliefert:
stellt Anfrage
\o/ ───────────►
| Reverse-Proxy
/ \ ◄─────────── │ ▲
Nut- antwortet ▼ │ Liefert Antwort mit Datei
zer PHP-FPM
│ ▲
▼ │ Liefert Datei
NFS-Dateiserver
Klickt ein Benutzer auf eine Datei zum Download, so geht die Anfrage an den Reverse-Proxy, dieser leitet die Anfrage an einen PHP-FPM weiter, dieser holt die Datei von einem Dateiserver und liefert die Antwort zurück an den Reverse-Proxy und dieser zum Benutzer.
Mit X-accel lässt sich das abkürzen: Der Proxy kann die Datei nach Berechtigungsprüfung durch die PHP-FPMs direkt ausliefern:
stellt Anfrage
\o/ ───────────►
| Reverse-Proxy
/ \ ◄─────────── │ ▲ ▲
Nut- antwortet │ │X-Accel- │
zer │ │Header │Liefert
▼ │ │Datei
PHP-FPM │
│
NFS-Dateiserver
Geplant sind folgende Änderungen:
- Einführung von 3 Konfigurationsoptionen:
// static file delivery: you may configure your reverse proxy to deliver static files instead of PHP
// this can save network traffic and php run time in some szenarios
// confer to the X-accel module in your proxy documentation for how to use this feature
// we have created some examples here ...
$FILE_DELIVERY_X_ACCEL_PREFIX = '/protected_files'; // path prefix that should be sent in the x-accel-redirect header to allow for location matching
$FILE_DELIVERY_USE_X_ACCEL = TRUE; // if true, all except temporary files should be delivered by your reverse proxy
$FILE_DELIVERY_USE_X_ACCEL_FOR_ALL_FILES = TRUE; // if true, all files should be delivered by your reverse proxy
- Dokumentation für die Anpassung von nginx:
# serve static files through X-Accel-Redirect
location /protected_files {
internal;
alias /protected_files;
}
- Anpassung der Datei
/public/sendfile.php
, so dass Dateien nicht durch PHP ausgeliefert werden, wenn eine der OptionenFILE_DELIVERY_USE_X_ACCEL
oderFILE_DELIVERY_USE_X_ACCEL_FOR_ALL_FILES
gesetzt ist und stattdessen der HeaderX-Accel-Redirect
gesetzt wird.
Für Apache2 gibt es einen ähnlichen Mechanismus, XSendfile
, der jedoch nicht für URLs funktioniert, ggf. nicht gut gewartet wird und von Server Admins extra installiert werden muss. Falls der Wunsch besteht, könnte die Umsetzung auch so generisch gestaltet werden, dass auch XSendfile
verwendet werden kann.
Die Umsetzung erfolgt so, dass das Feature standardmäßig ausgeschaltet ist; es also für solche Institutionen, die es nicht einsetzen möchten, keine Änderungen und kein Zusatzaufwand gibt. Die Umsetzung ändert (bei ignorierten Whitespace und Verschiebungen) maximal 20 Zeilen Code.