Symlink auf externe URL verweisen

Symlink auf externe URL verweisen

Ich bin nicht sicher, ob das überhaupt möglich ist, aber vielleicht gibt es eine andere Möglichkeit, mit der man zum selben Ergebnis kommt.

Die alte Situation

Ich betreibe einen LAMP-Server mit CentOS 6. Dieser Server hostet eine MENGE Websites, die uns gehören. Im Dateisystem haben wir einen Ordner mit allen Assets, die für diese Websites üblich sind (Bilder, Audiodateien usw.). Wir sprechen von etwa 400.000 Dateien und 60 GB Daten.

Der Zugriff der Websites auf diesen Ordner erfolgt über eineSymlinkangerufenVermögenswerteim Stammverzeichnis des jeweiligen Dokumentstamms abgelegt (also gibt es im Grunde Dutzende dieserVermögenswerteSymlinks, die über das gesamte Dateisystem verteilt sind), sodass der Code all dieser Websites voller Verweise auf diese Symlinks ist, um diese Dateien auf ihren Seiten zu laden.

Nehmen wir an,VermögenswerteDer symbolische Link verweist auf /server/path/to/assets. Websites laden eine Datei, indem sie beispielsweise aufrufen http://mywebsite.com/assets/audio_file.mp3. Intern lädt der symbolische Link „assets“ die Datei unter /server/path/to/assets/audio_file.mp3.

Die neue Situation

Wir haben uns entschieden, das zu verschiebenVermögenswerteOrdner vom Server an einen anderen Ort im Internet (AWS S3, falls es jemanden interessiert), um Speicherplatz auf dem Server zu sparen und die Belastung zu verringern.

Das Thema

Da wir den Speicherort dieser Assets verschieben, müssten wir alle Verweise auf diese Assets im Code aller Websites manuell ändern. Das ist natürlich eine MENGE Arbeit, wir sprechen hier von Tausenden davon.

Es besteht die Möglichkeit, im Code aller Webseiten Suchen und Ersetzen zu verwenden, was ich auch tun werde, wenn es nicht anders geht, aus verschiedenen Gründen möchte ich das aber möglichst vermeiden.

Die ideale Lösung

Was mir im Idealfall vorschwebte, wäre etwas so Einfaches wie die Erstellung eines Symlinks, auf den alle aktuellen Symlinks verweisen, und diesen auf die URL unseres AWS S3-Buckets verweisen zu lassen. Etwas wie:

  1. Entfernen Sie den /server/path/to/assetsOrdner (natürlich nachdem Sie alle Dateien von dort verschoben haben).
  2. Ein ... kreierenneuSymlink (oder welche andere Lösung auch immer hier funktionieren würde) genanntVermögenswerteanstelle des Ordners, der aufhttps://my-amazon-s3.com/assets

Und dann, wie durch Zauberhand, wenn eine Website geladen werden soll http://mywebsite.com/assets/audio_file.mp3, sucht sie nach der Datei im AWS S3-Bucket und nicht auf unserem Server.

Ich weiß, dass das vielleicht ein bisschen zu viel verlangt ist, daher hoffe ich, dass mir jemand vielleicht eine andere Möglichkeit zur Lösung dieses Problems vorschlagen kann.

Antwort1

Es gibt keine Möglichkeit, einen symbolischen Link zu einem nicht gemounteten Dateisystem zu erstellen.

Ein S3-Bucket kann als lokales Dateisystem gemountet werden s3fs, siehehttps://github.com/s3fs-fuse/s3fs-fuse. Sobald Sie dies tun, wird es als lokales Dateisystem angezeigt und Sie können auf die normale Weise einen symbolischen Link erstellen.

Beachten Sie, dass im Hintergrund die S3-API verwendet wird, um Inhalte auf Ihren lokalen Server abzurufen und von dort bereitzustellen. Relativ gesehen ist dies langsam. Dies kann dazu führen, dass es für Ihre Website ungeeignet ist, aber das liegt bei Ihnen.

Eine alternative Methode, die Sie in Betracht ziehen könnten, ist die Umleitung der Anfragen mithilfe der Apache- RewriteRuleFunktionalität. Mit einem regulären Ausdruck ist dies ziemlich trivial.

RewriteRule ^/assets/(.*)$ https://my-amazon-s3.com/assets/$1 [R=302,L]

Wenn Sie HAProxy verwenden, können Sie damit ein ähnliches Ergebnis erzielen.

verwandte Informationen