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...

InformationsquelleAutor The Surrican | 2011-04-18
Schreibe einen Kommentar