dynamisch festlegen upload_tmp_dir in apache2
Arbeite ich auf dieser für Stunden und seine mich verrückt!
also ich denke es ist eine wirklich schwierige Frage daher die detaillierte Frage stellen.
Das problem ist:
-
Ich habe einen server, der akzeptiert die Datei post-uploads per php-Skript.
-
Werden die Daten verteilt auf mehrere discs.
-
Ich die Datei speichern möchten, um die richtige Scheibe beim hochladen (tmp-Datei).
Weil:
-
Die Datei muss auf später verschoben werden, und ich will es nicht zu lange dauern (Kopie aus den Systemen tmp-Verzeichnis in target disk)
-
Dem system-Laufwerk eine ssd, die werden nicht sehr glücklich sein, wenn so viele Daten geschrieben und gelöscht es.
Diesem server config änderungen der init-Wert. beim hochladen einer können finden Sie in der temp-Datei und sehen, wie sich seine filesize erhöht:
Alias /thundercloud /home/thundercloud
<Directory /home/thundercloud>
php_admin_value upload_tmp_dir /home/thundercloud/locations/42/tmp
</Directory>
Meine sripts sind in /home/Gewitterwolke und es gibt mehrere symlinks in /home/Gewitterwolke/Standorte (benannt numerisch 1-n), die alle Punkt, um das entsprechende mountpoints.
Nun, was ich brauche, ist, um die Zahl 42 (die disk nicht. 42 - Nein, es gibt nur 14 Festplatten im server, dis seine nur für test) Dynamik.
Habe ich eine Menge Kontrolle über die Anfrage, so dass ich im Grunde nicht egal, ob seine bestimmt durch hostname, get variable, Unterverzeichnis etc.
Also mein Erster Versuch war dieser:
RewriteLock /var/lock/apache2/rewrite.lock
Alias /thundercloud /home/thundercloud
RewriteMap getuplaodlocation prg:/home/thundercloud/uploadloc.php
RewriteEngine On
<Directory /home/thundercloud>
AllowOverride All
php_admin_value upload_tmp_dir ${getuplaodlocation:%{THE_REQUEST}}
</Directory>
den entsprechenden rewrite-map war:
#!/usr/bin/php
<?
set_time_limit(0); # forever program!
$keyboard = fopen("php://stdin","r");
while (1) {
$line = trim(fgets($keyboard)); //dont care for now
echo '/home/thundercloud/locations/42/tmp'.PHP_EOL;
}
Ich jut hardcoded 42. wenn es funktionierte hätte ich Analysierte die richtige falue von THE_REQUEST
. Es hat nicht funktioniert. war das script chmod 777 und alles.
Mein Nächster Versuch war:
Alias /thundercloud /home/thundercloud
<Directory /home/thundercloud>
SetEnvIfNoCase Host lionel\.2x\.to upload=/home/thundercloud/locations/42/tmp
php_admin_value upload_tmp_dir upload
</Directory>
kein Glück.
also mein letzter Versuch war:
Alias /thundercloud /home/thundercloud
<Directory /home/thundercloud>
php_admin_value upload_tmp_dir /home/thundercloud/locations/%{REMOTE_HOST}/tmp
</Directory>
kein Glück entweder. ich druckte ini_get_all() und bekam folgende Ausgabe:
["upload_tmp_dir"]=>
array(3) {
["global_value"]=>
string(47) "/home/thundercloud/locations/%{REMOTE_HOST}/tmp"
so offensichtlich diese "Konstante" nicht zur Verfügung stehen, wie dies in diesem Umfang
nun ich lief aus Ideen
muss ich admin meine apporaches sind wirklich trial und error.
anyony kann mir in die richtige Richtung oder sagen Sie mir, ist nicht möglich und rechtfertigen?
ps: das hat offensichtlich nicht funktioniert, auf die php-runtime 😉
edit:
Ok, nach einigen Stunden mehr und ein nützliches Kommentar von Marc B ich kam mit dieser "Lösung":
<VirtualHost *:80>
ServerName 42.thundercloud.lionel.2x.to
DocumentRoot /home/thundercloud
php_admin_value upload_tmp_dir /home/thundercloud/locations/42/tmp
</VirtualHost>
<VirtualHost *:80>
ServerName 43.thundercloud.lionel.2x.to
DocumentRoot /home/thundercloud
php_admin_value upload_tmp_dir /home/thundercloud/locations/43/tmp
</VirtualHost>
Nur brute-force eine eigene VirtualHost container für jeden Datenträger... es ist hässlich und ich hoffte, zu vermeiden, dass Schritt und haben eine generische webserver config, aber wie es scheint der einzige Weg zu gehen - wenigstens funktioniert es.
Ich Frage mich immer noch, ob es ein schöner Weg, und ich denke, dass seine sehr interessant, gehen so tief in die webserver-Konfigurationen. Apache ist unglaublich flexibel und es wird wirklich interessant, wenn man an die Grenzen (das ist zumindest was ich denke).
Thats, warum ich lasse diese Frage offen und setzen ein Kopfgeld auf ihn.
edit:
Nach einigen weitere Forschung ich denke, es könnte eine Lösung sein, die Anwendung der Techniken hier:
http://httpd.apache.org/docs/2.0/vhosts/mass.html
etwas wie:
<VirtualHost *>
Use CanonicalName off
VirtualDocumentRoot /home/thundercloud/locations/%0/tmp/
php_admin_value open_basedir VIRTUAL_DOCUMENT_ROOT
<VirtualHost>
Dies ist nur eine Idee, noch nicht getestet. immer noch versuchen, es herauszufinden. Die Pfade sind nicht korrekt, in diesem Fall aber gibt es vielleicht einen workaround mit symlinks. Wäre schön, wenn some1 könnte mich in die richtige Richtung.
- Irgendeinem Grund möchten Sie eine andere upload-dirs? PHP bereits jetzt einen zufälligen Namen im temp-Datei, so dass zwei oder mehr uploads sind unwahrscheinlich zu stampfen auf einander. Wie für den Apache-Variablen, diese gelten nur für bestimmte Bereiche, die speziell suchen/erwarten Sie. php_value/php_admin_value ist nicht einer von Ihnen.
- in diesem Fall unterschiedliche Verzeichnisse unterschiedliche physikalische Festplatten. ich erklärte die Gründe in der Frage (keine redundante kopieren von Dateien). in der Tat uploads sind nicht unwahrscheinlich, aber unmöglich zu collied durch Ihren Namen (vorausgesetzt, Sie haben eine gemeinsame Netzwerk-mount als temp-Verzeichnis für mehrere Server oder sowas).
- Gotcha. Nur Ding ich denken kann, ist die Einstellung ein vhost für jede Festplatte, und verwenden Sie eine rewrite-Regel, um eine neue route die uploads, wie Sie kommen in. Dann können Sie hartcodieren den tmp-Pfad in jedem vhost ohne Rückgriff auf Variablen. Es sei denn, Sie sind das hinzufügen von Datenträgern zu einem furios oder Ihre Namen ändern sich Häufig, es könnte nur sein, genug, um zu arbeiten.
- ja, ich denke darüber auch nach. problem ist, von meinem aktuellen design, die locations sind nicht 1-n auf, auf jedem server, sondern die einzelnen Datenträger in der ganzen cloud hat seine eigene id, so können Sie wachsen ziemlich groß und ich würde die Konfiguration des vhosts für jeden server und es müsste eine Menge Pflege. ich hoffte, eine generische Konfiguration für alle Server, aber das Programm Sinn macht, muss denken, dass durch ein bisschen mehr. maby ändern kann ich meine Datenbank-layout zu dientify Festplatten anders.
- warum wurde diese gewählt zu löschen? sehe ich apache/php questinos die ganze Zeit hier Rum und ich denke, dass Sie hierher gehören. ich definately denken, dass dies nicht migriert werden sollen, Webmaster. wenn einige dann serverfault, aber ich denke, es gehört hier mehr als auf server Schuld, weil das ist auf jeden Fall aproblem auf Anwendungsebene.
- Die Stimme (nicht meine) ist für ein einfaches "off-topic" - Verschluss, keine migration.
- wenn Sie klicken Sie auf die "Abstimmung off-topic-link" sehen Sie, es wurde gegossen, "gehört auf webmasters.stackexchange.com Q&A für die pro-Webmaster"
- Für die Masse virtualHosting, haben Sie einen Blick auf mod_macro Sie werden in der Lage sein zu schreiben Sie alle Ihre VH mit einfachen Kommandos wie "Benutze MyVHOSt 42.somwhere.com dir42"
- danke, muss prüfen, ob die +1 @regilero
- Ich habe einige tests, die Kombination mod_macro und LocationMatch oder bestimmten Quelle Richtlinien, aber kein Glück für jetzt, es gibt eine Menge von Lösungen für Variablen in der Konfiguration, aber nicht zu viel, für unterschiedliche Konfigurationen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Möglichkeit zur Nutzung eines Variablen-substitution in
php_admin_value
Einstellungen. Dies ist nur, weil apache-Module können nur analysieren Ihre eigenen config-Richtlinien. mod_rewrite unterstützt die Verwendung von environment-Variablen, da dies in mod_rewrite selbst.Da kann man keine Variablen verwenden, die Sie einrichten müssen, alle möglichen Werte mit so etwas wie
<Location>
's. Zum Beispiel:Dann haben Sie gerade den post zu
/upload{$id}
. Dies ist natürlich nicht so schön dynamisch, wie es wäre, wenn eine substitution möglich wäre. Es gibt 2 offensichtliche alternativen, um es übersichtlicher:1) Haben einen separaten build-Skript erzeugt eine Datei zu setzen, in
/etc/httpd/conf.d
mit den entsprechenden Zeilen für jeden server2) Erstellen Sie eine Universelle config-Datei, die Sie einfach hat z.B. die 100 Ort Regeln. Auf jedem server, man würde dann nur zum einrichten des symlinks Sie wollten und haben das PHP generiert die form entscheiden, welche Lautstärke, um die upload - Sie würde am Ende mit einem Bündel von
/uploadX
urls, die nicht funktionieren würde, auf jeden server, aber nichts posten würde es sowieso.Die alternative ist die Verwendung mod_macro, die im Grunde können Sie tun das gleiche wie oben, aber mit eine kleinere config-Datei die Erzeugung der erweiterten config automatisch, aber immer noch im wesentlichen nur die Generierung einer großen config-Datei mit vielen vhost/Ort Blöcke. Tun Sie es so schön als Sie original haben gefragt, Sie haben müssen ändern mod_php.
Wenn ich die Frage richtig verstanden, Sie können immer mit ini_set