Предыдущая статья про связку rtorrent+rutorrent+nginx+php-fpm была написана сразу после успешной установки и начальной настройки этой связки. В процессе эксплуатации выявились некоторые подводные камни, о которых я и хочу рассказать.
Как оказалось, чтобы связка nginx с rutorrent+rtorrent работала нормально, достаточно в файле conf/config.php в дереве каталогов установки rutorrent прописать такие строчки:
При этом в файле настроек rtorrent ~/.rtorrent.rc достаточно прописать сетевой сокет:
В nginx больше не нужно писать backend для /RPC2, а из скриптов запуска rtorrent нужно убрать работу с локальным UNIX-сокетом для управления rtorrent.
Естественно, для того, чтобы rutorrent успешно работал, нужно пользователю, от имени которого работают демоны nginx и php-fpm, дать права на все файлы и каталоги установки rutorrent. В моём случае это делает команда:
При локальном использовании php-fpm лучше посадить на UNIX-сокет. Для этого в файле /etc/php/php-fpm.conf необходимо закомментировать строчку с сетевым сокетом:
И вписать ниже строчку с UNIX-сокетом:
После этого необходимо перенастроить nginx. В файле /etc/nginx/conf/nginx.conf приводим блок backend'а к такому виду:
Использование UNIX-сокетов уменьшает нагрузку на систему, так как не вычисляются контрольные суммы, а поток данных направляется непосредственно в принимающий буфер. Критично только для встраиваемых решений.
При локальном использовании nginx лучше всего посадить на 127.0.0.1. Для этого в файле /etc/nginx/conf/sites-enabled/rutorrent.eternity строчку listen следует привести к такому виду:
Если этого не сделать, веб-интерфейсом сможет воспользоваться тот, кто знает IP-адрес компьютера. Чтобы иметь возможность удалённо управлять rtorrent'ом, следует позаботиться об аутентификации (хотя бы через базовую аутентификацию nginx).
Для того, чтобы заработал модуль rutorrent под названием geoip, необходимо установить соответствующее расширение для PHP. В моём случае (Arch Linux) это действие выглядит так:
Потом в файле /etc/php/conf.d/geoip.ini необходимо снять комментарий с единственной строчки, чтобы она выглядела так:
Также необходимо активировать плагин JSON. Делается это созданием в каталоге /etc/php/conf.d файла json.ini с таким содержимым:
Без плагина json ничего работать не будет.
Для того, чтобы rutorrent нашёл дополнительные программы (curl, stat, mediainfo), во-первых, их нужно установить:
Во-вторых, необходимо разрешить их выполнение. Для этого в файле /etc/php/php.ini нужно закомментировать строчку open_basedir:
И, в-третьих, требуется дополнительные программы прописать в конфигурации rutorrent. CURL и stat прописываются в файле conf/config.php дерева каталогов установки rutorrent таким образом:
Путь к программе mediainfo указывается в файле plugins/mediainfo/conf.php дерева каталогов установки rutorrent таким образом:
Эти пути можно и не указывать, если для пользователя, от имени которого работают демоны веб-части связки, установлена переменная окружения PATH.
Лично для себя я сделал скрипт с таким содержимым:
Этому скрипту даются права на выполнение:
А сам скрипт перемещается в /usr/bin:
Потом где-то на панельке своего DE (я всё делал в xfce) вешается кнопка на запуск этого скрипта. Если rtorrent не запущен, то скрипт его запустит, а если запущен, то выключит, при этом выводя всплывающее оповещение на экран через libnotify. Конечно же, для этого нужно установить libnotify:
После выполнения всех перечисленных действий необходимо перезапустить php-fpm и nginx:
В итоге шансы, что rutorrent полноценно заработает, существенно увеличиваются.
UPDATE 1: добавил некоторые объяснения.
UPDATE 2: обновил раздел с RPC. Спасибо svin0.
RPC
Как оказалось, чтобы связка nginx с rutorrent+rtorrent работала нормально, достаточно в файле conf/config.php в дереве каталогов установки rutorrent прописать такие строчки:
$scgi_port = 33333;
$scgi_host = "127.0.0.1";
При этом в файле настроек rtorrent ~/.rtorrent.rc достаточно прописать сетевой сокет:
scgi_port = 127.0.0.1:33333
В nginx больше не нужно писать backend для /RPC2, а из скриптов запуска rtorrent нужно убрать работу с локальным UNIX-сокетом для управления rtorrent.
Права доступа
Естественно, для того, чтобы rutorrent успешно работал, нужно пользователю, от имени которого работают демоны nginx и php-fpm, дать права на все файлы и каталоги установки rutorrent. В моём случае это делает команда:
sudo chown -R http:http /srv/http/nginx/rutorrent.eternity/htdocs
Сокет php-fpm
При локальном использовании php-fpm лучше посадить на UNIX-сокет. Для этого в файле /etc/php/php-fpm.conf необходимо закомментировать строчку с сетевым сокетом:
;listen = 127.0.0.1:9000
И вписать ниже строчку с UNIX-сокетом:
listen = /var/run/php-fpm/php-fpm.sock
После этого необходимо перенастроить nginx. В файле /etc/nginx/conf/nginx.conf приводим блок backend'а к такому виду:
upstream backend {
server unix:/var/run/php-fpm/php-fpm.sock;
}
Использование UNIX-сокетов уменьшает нагрузку на систему, так как не вычисляются контрольные суммы, а поток данных направляется непосредственно в принимающий буфер. Критично только для встраиваемых решений.
Безопасность
При локальном использовании nginx лучше всего посадить на 127.0.0.1. Для этого в файле /etc/nginx/conf/sites-enabled/rutorrent.eternity строчку listen следует привести к такому виду:
listen 127.0.0.1:80;
Если этого не сделать, веб-интерфейсом сможет воспользоваться тот, кто знает IP-адрес компьютера. Чтобы иметь возможность удалённо управлять rtorrent'ом, следует позаботиться об аутентификации (хотя бы через базовую аутентификацию nginx).
geoip
Для того, чтобы заработал модуль rutorrent под названием geoip, необходимо установить соответствующее расширение для PHP. В моём случае (Arch Linux) это действие выглядит так:
sudo pacman -S php-geoip
Потом в файле /etc/php/conf.d/geoip.ini необходимо снять комментарий с единственной строчки, чтобы она выглядела так:
extension=geoip.so
Также необходимо активировать плагин JSON. Делается это созданием в каталоге /etc/php/conf.d файла json.ini с таким содержимым:
extension=json.so
Без плагина json ничего работать не будет.
Вспомогательные программы
Для того, чтобы rutorrent нашёл дополнительные программы (curl, stat, mediainfo), во-первых, их нужно установить:
sudo pacman -S curl mediainfo
Во-вторых, необходимо разрешить их выполнение. Для этого в файле /etc/php/php.ini нужно закомментировать строчку open_basedir:
;open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/
И, в-третьих, требуется дополнительные программы прописать в конфигурации rutorrent. CURL и stat прописываются в файле conf/config.php дерева каталогов установки rutorrent таким образом:
$pathToExternals = array(
"php" => '',
"curl" => '/usr/bin/curl',
"gzip" => '',
"id" => '',
"stat" => '/usr/bin/stat',
);
Путь к программе mediainfo указывается в файле plugins/mediainfo/conf.php дерева каталогов установки rutorrent таким образом:
$pathToExternals['mediainfo'] = '/usr/bin/mediainfo';
Эти пути можно и не указывать, если для пользователя, от имени которого работают демоны веб-части связки, установлена переменная окружения PATH.
Вкусняшки
Лично для себя я сделал скрипт с таким содержимым:
#!/usr/bin/env bash
delay="1000"
pid1=`pidof rtorrent`
if [[ $pid1 != "" ]]
then
notify-send -t $delay "Останавливаю rtorrentd…"
sudo rc.d stop rtorrentd
notify-send -t $delay "rtorrentd остановлен"
else
notify-send -t $delay "Запускаю rtorrentd…"
sudo rc.d start rtorrentd
notify-send -t $delay "rtorrentd запущен"
fi
Этому скрипту даются права на выполнение:
sudo chown root:root x-rtorrentd-wrapper.sh
sudo chmod 755 x-rtorrentd-wrapper.sh
А сам скрипт перемещается в /usr/bin:
sudo mv x-rtorrentd-wrapper.sh /usr/bin
Потом где-то на панельке своего DE (я всё делал в xfce) вешается кнопка на запуск этого скрипта. Если rtorrent не запущен, то скрипт его запустит, а если запущен, то выключит, при этом выводя всплывающее оповещение на экран через libnotify. Конечно же, для этого нужно установить libnotify:
sudo pacman -S libnotify
Перезапуск демонов
После выполнения всех перечисленных действий необходимо перезапустить php-fpm и nginx:
sudo rc.d restart php-fpm nginx
В итоге шансы, что rutorrent полноценно заработает, существенно увеличиваются.
UPDATE 1: добавил некоторые объяснения.
UPDATE 2: обновил раздел с RPC. Спасибо svin0.