Установка и настройка rtorrent+rutorrent+nginx+php-fpm в Arch Linux

Предыстория


Для работы с торрентами я достаточно долго использовал ktorrent. Сей клиент мои потребности в удобном управлении закачками удовлетворял полностью, пока я не заметил, что на популярных торрентах загрузка процессора доходила до 50% (а с uTP — ещё больше), а потребление памяти в и без того жирном KDE стало неприятно бросаться в глаза.

Было решено сменить KDE на xfce (это отдельная история), а программу для торрентов подобрать с хорошим функционалом и удобным управлением. Перепробовав transmission, deluge и rtorrent, я остановлися на последнем.

О том, как настроить rtorrent+rutorrent+nginx+php-fpm, и будет под катом.

Почему так?


Сразу хочу ответить, почему выбраны именно означенные инструменты.

Arch Linux. Об этом дистрибутиве можно говорить достаточно долго, мне нравится его организация и философия в целом, и я могу его использовать для себя с максимальной эффективностью. Кому интересно более детально прочитать о нём, смотрите сюда и сюда.

nginx. Я впечатлён тем, как эта маленькая штука выполняет свою работу, экономя память, гибко настраиваясь и предоставляя весь необходимый мне функционал.

php-fpm. Можно настроить количество рабочих потоков, в связке с nginx даёт замечательную производительность.

rtorrent. Малое потребление ресурсов, хорошо настраивается.

rutorrent. Активно развивается, имеет приятный интерфейс.

Установка необходимого программного обеспечения



Будем исходить из того, что Arch Linux на компьютере уже стоит, а пользователь знаком с его пакетной системой.

Чтобы установить веб-часть связки, выполняем команду:

sudo pacman -S nginx php-fpm

rtorrent и librtorrent я рекомендую устанавливать с AUR'а, там есть замечательный PKGBUILD под названием rtorrent-color, делающий скучный консольный интерфейс более приятным (если будете им пользоваться), и libtorrent-extended, имеющий дополнительные патчи. Поэтому выполняем команду:

yaourt rtorrent-color

и

yaourt libtorrent-extended

Чтобы получить rutorrent, нужно склонировать его из svn'а командой:

svn checkout rutorrent.googlecode.com/svn/trunk/ rutorrent-read-only


Файлы появятся в каталоге «rutorrent-read-only», потом мы их оттуда заберём.

Настройка



В файле /etc/php/php-fpm.conf нужно установить такие параметры:

  • listen = 127.0.0.1:9000, чтобы php-fpm слушал на указанном сетевом сокете;
  • pm = static, чтобы количество рабочих потоков было постоянным;
  • pm.max_children = 2, чтобы установить количество рабочих потоков, равным количеству физических потоков (у меня двухъядерный процессор, поэтому здесь установлено 2).


Файл /etc/nginx/conf/nginx.conf приведём к такому виду:

worker_processes 2;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;


events {
	worker_connections  1024;
	use epoll;
}


http {
	include		/etc/nginx/conf/mime.types;
	default_type	application/octet-stream;

	upstream backend {
		server 127.0.0.1:9000;
	}

	upstream backendrtorrent {
		server unix:/home/pf/.rtorrent.sock;
	}

	sendfile		on;
	keepalive_timeout	65;

	include /etc/nginx/conf/sites-enabled/*;
	include /etc/nginx/conf/conf.d/*;
}


Обратите внимание, что подсекция backend указывает на php-fpm, а backendrtorrent — на socket-файл rtorrent (об этом далее).

Создадим каталоги /etc/nginx/conf/sites-enabled и /etc/nginx/conf/sites-available. Во втором создадим конфигурационный файл rutorrent.eternity следующего содержания и сделаем на него символическую ссылку в первом каталоге:

server {
	listen 80;
	server_name localhost;

	access_log	/srv/http/nginx/rutorrent.eternity/logs/access.log;
	error_log	/srv/http/nginx/rutorrent.eternity/logs/errors.log;

	location / {
		root /srv/http/nginx/rutorrent.eternity/htdocs;
		index index.php index.html index.htm;
	}

	location /RPC2 {
		include /etc/nginx/conf/scgi_params;
		scgi_pass backendrtorrent;
	}

	location ~ /\.ht {
		deny all;
        }

	location ~* \.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
		root /srv/http/nginx/rutorrent.eternity/htdocs;
		access_log off;
		expires 30d;
	}

	location ~ .php$ {
		fastcgi_split_path_info ^(.+\.php)(.*)$;
		fastcgi_pass	backend;
		fastcgi_index	index.php;
		fastcgi_param	SCRIPT_FILENAME	/srv/http/nginx/rutorrent.eternity/htdocs$fastcgi_script_name;
		include fastcgi_params;
		fastcgi_param	QUERY_STRING	$query_string;
		fastcgi_param	REQUEST_METHOD	$request_method;
		fastcgi_param	CONTENT_TYPE	$content_type;
		fastcgi_param	CONTENT_LENGTH	$content_length;
		fastcgi_intercept_errors	on;
		fastcgi_ignore_client_abort	off;
		fastcgi_connect_timeout		60;
		fastcgi_send_timeout		180;
		fastcgi_read_timeout		180;
		fastcgi_buffer_size		128k;
		fastcgi_buffers			4	256k;
		fastcgi_busy_buffers_size	256k;
		fastcgi_temp_file_write_size	256k;
	}
}


Обратите внимание на местоположение журналов ошибок и доступа (/srv/http/nginx/rutorrent.eternity/logs), а также на корневой каталог веб-документов (/srv/http/nginx/rutorrent.eternity/htdocs). Эти каталоги должны существовать. Также обратите внимание на блок location /RPC2, он обязателен для rutorrent. Описание остальных параметров здесь я не привожу, подробной документации в Интернете достаточно.

В файл /etc/hosts внесите такую строчку:

127.0.0.1 localhost.localdomain localhost eternity rutorrent.eternity

eternity — название моей системы, у вас оно может быть другим. В таком случае его нужно поменять везде в конфигурационных файлах.

Можно запускать nginx и php-fpm:

sudo /etc/rc.d/nginx start
sudo /etc/rc.d/php-fpm start


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

Теперь нужно установить rutorrent. Перенесите из вышеупомянутого каталога rutorrent-read-only/rtorrent его содержимое в корневой каталог веб-документов (напомню, это каталог /srv/http/nginx/rutorrent.eternity/htdocs). То же сделайте с каталогом rutorrent-read-only/plugins, его скопируйте поверх существующего каталога plugins в дереве файлов rutorrent. Мусор вида .svn можно удалить.

Откройте файл /srv/http/nginx/rutorrent.eternity/htdocs/conf/config.php и замените там всего две строчки:

$scgi_port = 0;
$scgi_host = "unix:///home/pf/.rtorrent.sock";


Сокет-файл должен совпадать с упомянутым выше.

Веб-интерфейс готов, теперь нужно настроить сам rtorrent.

Создайте в домашнем каталоге файл .rtorrent.rc с таким содержимым:

scgi_local = /home/pf/.rtorrent.sock
max_memory_usage = 268435456
system.file_allocate.set = yes
done_fg_color = 2
done_bg_color = 0
active_fg_color = 4
active_bg_color = 0
download_rate = 250
upload_rate = 250
directory = /home/pf/work/downloads/torrents
session = /home/pf/work/downloads/torrents/.session
port_range = 29292-29292
check_hash = no
use_udp_trackers = yes
encryption = allow_incoming,try_outgoing,enable_retry,prefer_plaintext
dht = auto
dht_port = 6881
peer_exchange = yes


Строчка system.file_allocate.set = yes имеет смысл, если libtorrent скомпилирован с опцией --with-posix-fallocate, что на современных ФС даёт возможность моментально выделить нужное пространство под торрент. Опции вида *g_color относятся только к rtorrent-color. Каталоги, порты и скорость настройте на своё усмотрение.

Последний штрих — скрипт для запуска rtorrent. Следующее содержимое поместите в файл /etc/rc.d/rtorrentd:

#!/usr/bin/env bash

. /etc/rc.conf
. /etc/rc.d/functions

rtorrent_user="pf"
rtorrent_socket="/home/pf/.rtorrent.sock"

case "$1" in
	start)
		stat_busy "Starting rtorrent"
		if [ -S $rtorrent_socket ]; then
			rm $rtorrent_socket
		fi
		su $rtorrent_user -c 'LANG=uk_UA.UTF-8 screen -d -m -S rtorrent rtorrent' &> /dev/null
		if [ $? -gt 0 ]; then
			stat_fail
		else
			while [ ! -S $rtorrent_socket ]
			do
				printf "%10s \r" waiting
			done
			chmod 666 $rtorrent_socket
			add_daemon rtorrent
			stat_done
		fi
	;;
	stop)
		stat_busy "Stopping rtorrent"
		killall -w -s 2 /usr/bin/rtorrent &> /dev/null
		if [ -S $rtorrent_socket ]; then
			rm $rtorrent_socket
		fi
		if [ $? -gt 0 ]; then
			stat_fail
		else
			rm_daemon rtorrent
			stat_done
		fi
	;;
	restart)
		$0 stop
		sleep 1
		$0 start
	;;
	*)
		echo "usage: $0 {start|stop|restart}"
esac
exit 0


Естественно, должен быть установлен screen. Переменные rtorrent_user и rtorrent_socket поправьте под своё окружение. Если нужна автозагрузка rtorrent, поместите его в файл /etc/rc.conf в массив DAEMONS.

Всё. Запускайте rtorrent командой

sudo /etc/rc.d/rtorrentd start

заходите в браузере на сайт rutorrent.eternity и наслаждайтесь.
+38
29 мая 2011, 00:47
91
pfactum 32,1

комментарии (50)

0
mrded #
1. При загрузке torrent файла, можно выбирать куда он будет закачиваться?
2. После завершения загрузки можно переместить загруженые файлы?
+4
PTPtupit #
+2
mrded #
Вот это действительно круто!
Спасибо :)
0
boOn #
Спрошу и я заодно — можно ли «скачивать последовательно». Это для того, чтобы поставить на закачку и через пару минут начинать смотреть. Как раз вчера хотел настраивать на HTPC качалку, выбирал что поставить и для меня эта функция является критичной.
0
PTPtupit #
Я это делаю так: у некритичных торрентов руками уменьшаю скорость закачки. Вообще есть такая вещь как приоритеты. Если нужно просто качать торренты один за другим последовательно то можно ограничить число одновременных загрузок до 1.
0
boOn #
Вы немного не так меня поняли. Я хотел бы, чтобы файлы качались с начала последовательно к концу. Т.е. не раздачи по очереди, а данные в этих раздачах, чтобы при старте закачки скачивалось начало фильма и можно было начинать смотреть. А в процессе просмотра он докачивался бы постепенно до конца.
0
PTPtupit #
если мне не изменяет память, то такое умеет только Vuze.
0
boOn #
Так умеет минимум ещё qBitTorrent
0
madgnu #
Хотелось бы увидеть сравнение по загруженности системы, раз уж на ktorrent в начале поста полетели шишки.

btw, вместо /etc/rc.d/somedaemon start можно использовать rc.d start somedaemon
0
pfactum #
Согласен, но это хорошая тема для отдельной статьи.
0
PTPtupit #
Правильно ли я понял, что archlinux тут по-большому счету приписан только из-за pacman и yaourt? :)
+5
pfactum #
Нет, ещё из-за скрипта для запуска rtorrent. Он арчеспецифический.
+1
Livid #
По большому счету дистрибутивы в основном пакетными менеджерами и отличаются, разве нет? Ну патчами еще время от времени. Исключения разве что source-based дистрибутивы, да и то в том только, что пользовательские патчи накладывать удобнее да конфигурация помудреней.
+1
akshakirov #
К сожалению rtorrent собран без xmlrpc-c, а без него не работает управление скоростью закачки/отдачи.

Год назад я писал статью в которой описывал тоже самое под Debian. Чуть пожже выложил «правильно» собранные пакеты под Debian и Ubuntu здесь.
0
pfactum #
В AUR'е PKGBUILD для rtorrent-color идёт с xmlrpc-c.
0
akshakirov #
А с какой версией xmlrpc-c собран? Дело в том что нужен достаточно свежий 1.24
0
pfactum #
Арч выдаёт такую версию: 1858-1. Я думаю, это номер ревизии с svn.
0
akshakirov #
1.21.1 получается, а посмотрите пожалуйста, работает управление скоростью закачки/отдачи?
0
pfactum #
Да, работает.
+1
hedgehog #
По этому дженту = няшка :)
Собираем сами, а не кушаем что нам дали.
0
akshakirov #
это несколько побочная польза от генты, в debian тоже можно собрать как надо apt-get source
+1
Livid #
На самом деле USE-флаги одна из главных «фишек» portage по сравнению с, так что польза-то совсем не побочная.
Но вообще собрать из исходников всегда можно, в любой системе. Только пакеты собирать не всегда удобно (знаю, знаю про checkinstall). А если без пакетов, то один непринужденный make install превращает любую систему в слакварь :)
0
hedgehog #
это несколько побочная польза от генты

Позвольте не согласиться. Это всё же одна из основных концепций дженту.

Не спорю, что где-то ещё что-то можно. В дженту это истинный путь. В бинарных же дистрибутивах самособранные пакеты выглядят чужеродно. Да и порой что бы собрать что-нибудь, надо поставить 100500 различных devel-пакетов. Что, на лично мой взгляд, не совсем правильно и удобно.
0
Livid #
Вы таки это так говорите, как будто дженту — единственный source-based дистрибутив, что неправда.
0
hedgehog #
Нет, такого я вовсе не хотел утверждать. Вам показалось.
0
Livid #
«В дженту это истинный путь. В бинарных же дистрибутивах… „
Я таки не говорил, что Вы это утверждаете. Но построение фразы наводит на такие мысли. Извините, если задел.
0
hedgehog #
Это всего лишь противопоставление дженту бинарным дистрибутивам и только. Но не как единственного source-based дистрибутива.
0
Livid #
Хорошо, будем считать, что мне показалось :)
0
Enot #
К слову о Вашей статье годичной давности — в ней Вы анонсировали вторую часть, которая так и не вышла. Она есть в планах?
0
akshakirov #
Всё никак из shell скрипта в статью не конвертирую… но видимо по случаю юбилея первой части надо к концу недели опубликовать вторую часть и скрипт для автоинсталла.
+1
Valery4 #
Спасибо, очень тёплые воспоминания, о времени, когда ползовался Arch. Сразу вспомнилось, насколько там всё просто и удобно.
НЛО прилетело и опубликовало эту надпись здесь
0
pfactum #
ktorrent ест намного больше.
НЛО прилетело и опубликовало эту надпись здесь
0
pfactum #
conky иногда показывал до 30% от 2 Гб.
–2
sylvio #
Это безумие.
Вдумайтесь, для комфортного использования нужно поставить как минимум 4 разных пакета, разобраться в их конфигурировании, а на выходе получить конфиг, мало отличимый от любого другого.

Почему нельзя включить скрипты в пакет? Почему нельзя сделать стандартные настройки пригодными для повседневного использования? Почему нельзя, блин, установить его одним махом? Загадка.
0
pfactum #
Было бы не интересно.
0
FilimoniC #
utserver вам в помощь. Правда он жутко агрессивный по траффику и еще alpha
+1
Dganic #
А оно точно работает? не смог заставить работать mod_scgi как не крути, пришлось использовать плагин RPC да и в вике rutorrent написано:
«Мне неизвестны нормально работающие реализации модуля mod_scgi для nginx. Используйте плагин RPC или плагин HTTPRPC. „

и да почему php-fpm тоже не пересадить на unix сокет?
0
pfactum #
Могу скриншот дать для подтверждения.

php-fpm тоже можно на юникс-сокет, согласен.
–2
egorinsk #
Это уже по моему на грани бреда, автор не смог осилить ГУИшный клиент, и нагородил кучу из веб-сервера, какого-то консольного клиента, браузера и веб-интерфейса. Десктопный клиент закрыл — он закрылся, а тут чтобы отключить, надо полчаса сервисы останавливать. Щелкнул по торренту — клиент запускается назад, а тут ен понятно что делать.

По-моему, плохое решение.

Это видимо и есть тот Linux Way, вместо одной нормально работающей программы, поставить кучу разных, для этого не предназначенных, скрепленных кривыми bash-скриптами.
0
pfactum #
Вы ошибаетесь.

Во-первых, nginx+php-fpm используются мною ещё и для веб-разработки, поэтому они работают всегда.

Во-вторых, такая связка удобна для использовании на домашнем сервере, качающем торренты. А на сервере gui не нужен.

В-третьих, не нравится — не используйте, я троллингу не подвержен, а насильно вбивать конфетки в зубы молотком не намерен.
+1
Bambr #
Вы просто не в курсе, что rtorrent — достаточно легкое решение, которое можно запустить даже на среднепаршивом роутере с USB-винтом, и оно при этом будет работать. Достаточно много народа выбирают роутеры исходя из такой возможности. Гуй при такой архитектуре, естественно, показан только внешний.
–1
nonname #
Не троллинга ради, но простите это же издевательство выкладывать простыню с росписями как заставить работать элементарную вещь в блог с названием «линукс для всех» да был бы я новичком увидев это «для всех» я бы охуел и ассоциацией первого уровня при слове линукс у меня было бы торрент клиент который надо настраивать путем написания конфигов, скриптов и ещё линус знает чего. Признаюсь я пользуюсь utorrent под виндой и я потратил около 2 минут на его настройку…
0
pfactum #
Это скорее осмысленная конкретика, чем подробное руководство к действию. Я и не планировал ориентировать статью совсем уж на новичков.
0
FilimoniC #
/usr/bin/sudo -u p2p LC_ALL=ru_RU.UTF-8 /usr/sbin/utserver -settingspath /storage/service/utorrent/settings/ -logfile /storage/service/utorrent/utserver.log -configfile /storage/service/utorrent/utserver.config -daemon

uTorrent Server 3.0 Alpha
0
rhangelxs #
Ну и как оно в сравнении с сабжем?
0
FilimoniC #
Стабильно. Некоторые альфы зажираются, но ща стабильная у них
0
Bambr #
Некоторое время назад потратил хренову тонну времени на аналогичную связку в генте. Уже отчаявшись гуглить, наткнулся на какой-то мелкий коммент на форуме по поводу того, что в девелопмент-ветке rtorrent'а отломали xmlrpc. Возможно, с тех пор все уже починилось, я пока не обновлялся. Если у кого-то будут сложности, имейте в виду такую проблему :) Работоспособные версии пока назвать не могу, нет доступа к машине, если кто столкнется, напишите, подсмотрю.
0
4twilight #
чтобы не было «мусора типа .svn» надо пользоваться svn export вместо checkout

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.