Установка и настройка 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 и наслаждайтесь.
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 50

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

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

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

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

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

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

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

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

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

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

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

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

                                    В-третьих, не нравится — не используйте, я троллингу не подвержен, а насильно вбивать конфетки в зубы молотком не намерен.
                                      +1
                                      Вы просто не в курсе, что rtorrent — достаточно легкое решение, которое можно запустить даже на среднепаршивом роутере с USB-винтом, и оно при этом будет работать. Достаточно много народа выбирают роутеры исходя из такой возможности. Гуй при такой архитектуре, естественно, показан только внешний.
                                      –1
                                      Не троллинга ради, но простите это же издевательство выкладывать простыню с росписями как заставить работать элементарную вещь в блог с названием «линукс для всех» да был бы я новичком увидев это «для всех» я бы охренел и ассоциацией первого уровня при слове линукс у меня было бы торрент клиент который надо настраивать путем написания конфигов, скриптов и ещё линус знает чего. Признаюсь я пользуюсь utorrent под виндой и я потратил около 2 минут на его настройку…
                                        0
                                        Это скорее осмысленная конкретика, чем подробное руководство к действию. Я и не планировал ориентировать статью совсем уж на новичков.
                                          0
                                          /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
                                            Ну и как оно в сравнении с сабжем?
                                              0
                                              Стабильно. Некоторые альфы зажираются, но ща стабильная у них
                                          0
                                          Некоторое время назад потратил хренову тонну времени на аналогичную связку в генте. Уже отчаявшись гуглить, наткнулся на какой-то мелкий коммент на форуме по поводу того, что в девелопмент-ветке rtorrent'а отломали xmlrpc. Возможно, с тех пор все уже починилось, я пока не обновлялся. Если у кого-то будут сложности, имейте в виду такую проблему :) Работоспособные версии пока назвать не могу, нет доступа к машине, если кто столкнется, напишите, подсмотрю.
                                            0
                                            чтобы не было «мусора типа .svn» надо пользоваться svn export вместо checkout

                                            Only users with full accounts can post comments. Log in, please.