Не уверен, возможно ли это вообще, но, возможно, есть другой способ, который даст тот же результат.
Старая ситуация
Я использую сервер LAMP с CentOS 6. На этом сервере размещено МНОГО веб-сайтов, которыми мы владеем. В файловой системе у нас есть папка со всеми активами, которые являются общими для этих веб-сайтов (изображения, аудиофайлы и т. д.). Речь идет о 400 тыс. файлов и 60 ГБ данных.
Веб-сайты получают доступ к этой папке черезсимволическая ссылканазываетсяресурсыразмещены в корне соответствующего им корневого каталога документов (по сути, таких файлов десятки)ресурсысимволические ссылки распределены по всей файловой системе), поэтому код всех этих веб-сайтов полон ссылок на эти символические ссылки для загрузки этих файлов на свои страницы.
Скажем такресурсыsymlink указывает на /server/path/to/assets
. Веб-сайты загружают файл, вызывая, например, http://mywebsite.com/assets/audio_file.mp3
. Внутри себя символическая ссылка assets загружает файл, расположенный в /server/path/to/assets/audio_file.mp3
.
Новая ситуация
Мы решили перенести эторесурсыпапку с сервера в другое место в Интернете (AWS S3, если кому-то интересно), чтобы сэкономить место на сервере и снизить нагрузку.
Проблема
Поскольку мы перемещаем местоположение этих активов, нам нужно будет вручную изменить все ссылки на эти активы в коде всех веб-сайтов. Это, конечно, МНОГО работы, мы говорим о тысячах из них.
В коде всех веб-сайтов есть возможность использовать поиск и замену, что я и сделаю, если не будет другого способа, но по разным причинам я бы предпочел этого избежать, если это возможно.
Идеальное решение
В идеале я имел в виду что-то простое, например, создание символической ссылки, на которую указывают все текущие символические ссылки, и указание этой ссылки на URL-адрес нашего контейнера AWS S3. Что-то вроде:
- Удалите
/server/path/to/assets
папку (конечно, предварительно переместив оттуда все файлы) - Создатьновыйсимволическая ссылка (или любое другое решение, которое здесь сработает) называетсяресурсывместо папки, которая указывает на
https://my-amazon-s3.com/assets
И затем, как по волшебству, когда веб-сайт хочет загрузиться http://mywebsite.com/assets/audio_file.mp3
, он ищет файл в корзине AWS S3, а не на нашем сервере.
Я понимаю, что, возможно, прошу слишком многого, поэтому я надеялся, что, возможно, кто-то предложит мне другой способ решения этой проблемы.
решение1
Невозможно создать символическую ссылку на несмонтированную файловую систему.
S3-корзину можно смонтировать как локальную файловую систему, используя s3fs
, см.https://github.com/s3fs-fuse/s3fs-fuse. После этого он отобразится как локальная файловая система, и вы сможете создавать символические ссылки обычным способом.
Обратите внимание, что за кулисами это использует API S3 для загрузки контента на ваш локальный сервер и доставки его оттуда. Относительно говоря, это медленно. Это может сделать его неподходящим для вашего веб-сайта, но это решение остается за вами.
Альтернативный метод, который вы можете рассмотреть, — это перенаправление запросов с использованием RewriteRule
функциональности Apache. Использование регулярного выражения — это довольно тривиально,
RewriteRule ^/assets/(.*)$ https://my-amazon-s3.com/assets/$1 [R=302,L]
Если вы используете HAProxy, то вы можете добиться аналогичного результата.