для исключения частых memory allocation error
гик-памятка по автоматическому копированию файлов (например аплоадов) юзеров на сторонний сервер,
средствами unixlike систем: rsync и ssh авторизацией по паре ключей
проверяем работоспособность rsync или простейший бэкап
rsync -azvv --progress --size-only /temp/source/ /backup/test
первый этап
---------------------------------
первый сервер, откуда происходит копирование linuxexmpl.ru
и второй freebsdexmpl.ru, куда происходит копирование
1 юзеры на обеих серверах должны совпадать (например rsync_user)
2 на всякий случай генерацию ключей делаю на старой freebsd
ssh-keygen -t rsa -b 2000 -f rsync-key
( rsa считается безопасной при длинне ключа более 1000 )
появилось два файла
публичный ключ rsync-key.pub (владальца rsync_user с правами 644 и содержания ssh-rsa бла-бла-бла)
и частный ключ rsync-key (владельца rsync_user с правами 600 и содержания -----BEGIN RSA PRIVATE KEY----- бла-бла-бла)
3 публичный ключ rsync-key.pub переименовываем в authorized_keys (права 600)
и копируем (тут был основной мой косяк) в дирректорию /home/rsync_user/data/.ssh
созданную юзером rsync_user с правами (!!!) 700
( а не в дирректорию /home/rsync_user/.ssh как везде написано )
4 частный ключ нужно скопировать на 1й сервер,
с которого происходит копирование ( если по фтипи то в ascii режиме )
или например так
scp rsync-key rsync_user@linuxexmpl.ru:/home/rsync_user/data/.ssh
проверяем скрипт
rsync -aczvv --progress -e "ssh -i /var/www/rsync_user/.ssh/rsync-key" /temp/source rsync_user@freebsdexmpl.ru:/home/rsync_user/data/temp --log-file=/temp/rsync.log
после удачной работы можно verbose (две vv) убрать также как и --progress
не работает шайтан труба? ашипки?
------------------------------------------------------------------
1 к команде rsynс добавляем ключи --verbose --stats --perms --progress
2 добавление к команде ssh -vvv вывод ещё кучку дебаг сообщений уже со стороны ssh
3 включаем на обоих серверах в sshd_config
LogLevel DEBUG
перегружаем sshd, смотрим лог /var/log/auth.log
курим гуглы-маны
2 этап
-----------------------------------
настройка drupal директории куда будет скидываться аплоад контент
filefield что-то не захотел у меня работать вместе с comment_upload
пришлось использовать uploadpath, а comment_upload обрабатывать напильником ( http://drupal.org/node/785596 )
теперь все аплоады падают в директорию linuxexmpl.ru/sites/default/files/upload
3 этап
-----------------------------
запуск rsync через друпал, точнее через вызов друпалом урла с cgi скриптом
www.linuxserv/cgi-bin/rsync.cgi с правами 500 и примерно такого содержания:
#!/usr/bin/perl
print "\n\n"; # убираем ошибку
system "/usr/bin/rsync -aczvv -e \"ssh -p22 -2 -vvv -i /var/www/rsync_user/data/.ssh/rsync-key\"
/var/www/rsync_user/data/www/linxuexmp.ru/sites/default/files/upload rsync_user\linuxexmpl.ru:
/home/rsync_user/data/www/img.freebsdexmpl.ru --log-file=/temp/rsync.log --verbose --stats --perms --progress >>/temp/sync2.log 2>&1";
в моём случае
пришлось вручную копировать (на строне отправляющего linux сервера, ранее созданный)
файл known_hosts в директорию .ssh пользователя
из под которого происходит запуск cgi-perl скрипта
4 этап
------------------------------
теперь, когда происходит автоматический слив документов на файловый сервер
необходимо изменение урла вывода файлов
наверное корректней сделать изменение урла-src выводимого документа с помощью дубляжа контента на поддомен посредстовм Domain Access или Virtual Sites
но мне проще-быстрее найти концы в исходниках
стоят модули imagecache, imageapi, lightbox2 и itweak upload
в модуле itweak_upload.module
находим $html = l($thumbnail, $href, $options);
и меняем например на
$href2=str_ireplace ('www.linuxexmpl.ru/sites/default/files/', 'img.freebsdexmpl.ru/', $href);
$html = l($thumbnail, $href2, $options);
5 этап
---------------------------
запуск rsync скрипта друпалом
пилим скрипты drupal'a для запуска синхронизации файлами по событию
( или используем варианты запуска по крону или по встроенным триггерам или сторонним модулем типа рулес )
в моём случае это синхронизация по добавлению новости (а также коментария или записи в блоге) с аттачментом
код находится тут: drupal/includes/form.inc
было
$goto = NULL;
if (isset($redirect)) {
$goto = $redirect;
}
стало:
$goto = NULL;
if (isset($redirect)) {
$url = 'http://linuxexmpl.ru/cgi-bin/rsync.cgi';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FAILONERROR, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$result = curl_exec($ch);
curl_close($ch);
$goto = $redirect;
}
6 этап
-------------------------
настройка сервера отдающего файлы
настройка apache-nginx-lighhtpd
...
безопасность
-------------------------------
работу по ssh можно засунуть в chroot окружение
более простой (и менее кошерный вариант) использование ограничений через слоупок шел - lshell
pkg_add -r lshell (или как там у вас ... юмюм_аптгет_рпм_мэйк)
chsh -s /usr/local/bin/lshell rsync_user
в файле /usr/local/etc/lshell.conf пишем что-то типа
[rsync_user]
sftp : 1
allowed : ['cd','exit','ls']
path : [/home/rsync_user/data','/home/rsync_user/.ssh']
ну и не забывать конечно по крону антивирусом прогонять
clamscan /img.freebsdexmpl.ru/ -r -i --move=/temp/infected
защита по кол-ву сессий ssh (fail2ban, DenyHosts, ipt_recent)
вход в ssh с определённых айпи (ipfw, hosts.allow)
ошибки
--------------------------
ssh: Could not resolve hostname rsync_userfreebsdexmpl.ru: Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]
[sender] _exit_cleanup(code=12, file=io.c, line=601): about to call exit(255)
***
Host key verification failed.^M
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]
[sender] _exit_cleanup(code=12, file=io.c, line=601): about to call exit(255)
ошибка возникала при запуске из под оболочки cgi-perl
из-за отсутствия обратной косой перед /@именем пользователя
debug3: check_host_in_hostfile: host 60.*00.1.1 filename /etc/ssh/ssh_known_hosts
debug3: check_host_in_hostfile: host linuxexmpl.ru filename /var/www/rsync_user/data/.ssh/known_hosts
debug2: no key of type 0 for host linuxexmpl.ru
debug2: no key of type 1 for host linuxexmpl.ru
debug1: read_passphrase: can't open /dev/tty: No such device or address
Host key verification failed.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]
[sender] _exit_cleanup(code=12, file=io.c, line=601): about to call exit(255)
ошибка возникала из-за отсутствия файла known_hosts (/var/www/rsync_www_user/data/.ssh/known_hosts) от запускающего cgi-perl пользователя
вопросы
---------------------------
где кто какие видит косяки?
Комментарии
Какое отношение копирование файлов имеет к memory allocation error?
Зачем они должны совпадать?
-b 2048, но нет смысла, это значение по умолчанию.
Если мы имеем возможность использовать ssh, то sftp или scp, какой ftp - мы же за безопасность?
Вообще тема не раскрыта
-зачем всё это понадобилось.
-что будет, если кто-нить начнёт долбиться в http://www.linuxserv/cgi-bin/rsync.cgi?
-зачем вообще rsync использовать и каждый раз по загрузке файла, вместо того, чтобы его отправить на удалённый сервер, синхрить всё дерево?
По мне, проще было бы запускать rsync редко по крону, например чтобы зачистить от удалённых файлов, и отправлять файлы например по sftp или scp, прямо внутри друпала, модулем, средствами php. И наружу ничего торчать не будет. Или, если файлы могут быть большими, по крону, создавая очередь закачки из друпала, что в общем-то правильнее.
Что это было?
>Какое отношение копирование файлов имеет к memory allocation error
это шутка юмора, про собственную забывчивость
>Зачем они должны совпадать?
да, действительно работают и разные
> ssh-keygen -t rsa -b 2000 -f rsync-key
> -b 2048, но нет смысла, это значение по умолчанию
памятка она для памяти, что бы проще было вспомнить где какие ключи
а так конечно стоит размер ключа побольше чем стандартный
>мы же за безопасность
а то
>зачем всё это понадобилось
т.к. хостеры нашенские, то приходится извращаться
у одного хостера быстрый процессор, но жёсткие ограничения по объёму трафика
у другого хостера нет ограничений по трафику, на него и скидывается файло
> зачем вообще rsync использовать и каждый раз по загрузке файла,
> вместо того, чтобы его отправить на удалённый сервер, синхрить всё дерево
как вариант вполне, но это надо хорошо вглубь друпала лезть
> что будет, если кто-нить начнёт долбиться в http://www.linuxserv/cgi-bin/rsync.cgi
да, надо поставить ограничение на кол-во сессий
Ну не глубже чем сейчас, в общем-то. Но намного ведь эффективнее.
Просто не надо, чтобы такие вещи торчали наружу, особенно тогда, когда это реально не нужно.
По поводу же хостеров, надо просто найти пару хороших вариантов, и не париться так. Или ещё лучше, взять себе сервачёк, или хотя бы vps у хетзнера например, раз уж есть знания в области администрирования, и захостить там свои проекты.