Отдельный файловый сервер для веб-сайта на php


У меня есть два сервера для веб-сайта. На одном сервере будет php-код и база данных, а на другом - менее скоростной сервер для хранения только файлов. Мне нужно реализовать их таким образом, чтобы файл, загруженный через веб-сайт, должен храниться на другом сервере, а затем также может быть загружен оттуда.

Может ли кто-нибудь предложить мне лучший способ добиться этого. Я знаю, что файлы могут быть переданы на другой сервер с помощью FTP-функций php сразу после загрузки через веб-сайт, но это не кажется правильным путь.

Или два сервера могут использоваться только для статического медиаконтента, такого как изображения.

Спасибо

Author: hakre, 2011-08-19

7 answers

Лучшая идея - просто хранить ВСЕ файлы, включая файлы веб-сайтов, на "сервере хранения". В основном, что вы делаете, это монтируете "общую папку", это означает, что файлы веб-сайтов и другие файлы, которые вам понадобятся. (В большинстве случаев у вас просто есть папка /var/www-local/на сервере хранения, которую вы монтируете в /var/www/на веб-сервере).

Убедитесь, что вы смонтировали его с помощью NFS, добавив его в файл /etc/fstab на веб-сервере. ( Дополнительная информация о НФС)

Преимущество этой идеи в том, что когда вы хотите расшириться, это легко возможно, установив программный балансировщик нагрузки (например, HAProxy), добавив столько веб-серверов, сколько вам нравится, и ваши данные будут синхронизированы.

 13
Author: Kenny, 2011-08-25 07:43:08

Я использовал нечто под названием Gluster, которое позволяет делать подобные вещи. Ситуация, для которой я его использую, больше подходит для балансировки нагрузки, чем для альтернативного распространения контента.

Кроме того, такие сайты, как Stack Overflow, используют Услуги сети распространения контента для определенных частей информации на своем сайте. Подобное решение на самом деле может быть более экономичным, чем покупка/настройка/обслуживание совершенно нового сервера.

 5
Author: afuzzyllama, 2011-08-27 20:08:11

Возможно, вы можете подключить каталог загрузки к своему веб-серверу. Проверьте Linux NFS

 4
Author: xdazz, 2011-08-25 05:11:45

Не знаю, лучший ли это способ, но почему бы просто не выделить файловый сервер в отдельный поддомен? Таким образом, он может обрабатывать все детали загрузки файлов, и вы можете подключиться к нему через FTP или SFTP с главного сервера.

В принципе, вот процесс, который вы могли бы использовать:

  1. Укажите свой поддомен на дополнительный сервер. Я нашел некоторую информацию об этом здесь.
  2. На вашем главном сервере есть форма загрузки, которая обрабатывает и проверяет файл.
  3. Когда файл будет признан приемлемым, отправьте его на другой сервер по FTP или SFTP. Если вы не можете заставить инструменты PHP работать для этого, phpseclib может помочь. Возможно, вы захотите сделать этот шаг многопоточным.
 3
Author: cwallenpoole, 2011-08-25 05:18:29

Используя оболочку URL, вы можете использовать свой стандартный move_uploaded_file(), если ваш ftp-сервер принимает этот тип подключения. В качестве альтернативы вы можете использовать функции PHPftp, особенно ftp_put(), для загрузки файла на сервер.

Для доставки контента вам необходимо иметь базу данных или другие средства, чтобы получить исходный URL-адрес на сервере распространения контента и указать URL-адрес в аргументах html:

<img src="http://cdn1.example.com/images/68263483.png" />
<a href="http://cdn2.example.com/files/9872345.pdf">Download PDF</a>

Пример кода для обработки загруженные файлы будут

<?php
// ...
$uploads_dir = 'images';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, 
            "ftp://user:[email protected]/$uploads_dir/$name");

        // save url in your database for later retrieval ...
    }
}

Или с помощью ftp_put():

<?php
// ...
$ftpCon = ftp_connect('cdn1.example.com') 
    or die('Could not connect to ftp server');
$uploads_dir = 'images';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        ftp_put($ftpCon, "$uploads_dir/$name", $tmp_name)
            or die("could not upload $name to ftp server");
        // save url in your database for later retrieval ...
    }
}
 1
Author: Lars, 2011-08-29 15:31:56

Если вашему приложению требуется интенсивное чтение/запись на файловый сервер, то я бы подумал, что разделять его - плохая идея. возможно, вы можете зеркально отобразить NFS на свой основной веб-сервер, чтобы уменьшить задержку!

Используйте nginx для обработки всех запросов к статическим файлам (например: css, изображения, javascript)

 0
Author: gumpi, 2011-08-26 14:39:32
  1. Создайте общий ресурс на файловом сервере в каталог tbe, в который вы хотите загружать и загружать файлы. Два общих ресурса, если вы планируете хранить их в отдельных папках.

  2. Сопоставьте папки на веб-сервере с базой кода PHP. Убедитесь, что вы используете логин для подключения к общим ресурсам, которые будут иметь доступ на чтение и запись.

  3. После того, как вы сопоставили общий ресурс (-ы), создайте виртуальный каталог на веб-сайте с общей папкой (все зависит от вашего веб-сайта сервер).

  4. Проверьте, как PHP обрабатывает доступ к файлам на общем диске на веб-сайте, в зависимости от вашего веб-сервера это может отличаться от того, как вы обычно обрабатываете файлы.

Мне нравится этот подход, потому что серверная ОС обрабатывает передачу файлов на файловый сервер и с него. PHP просто обрабатывает информацию о том, какие файлы ему нужны.

 0
Author: b01, 2011-08-30 17:53:41