Теоретический минимум *nix-based-систем

Предлагаю рассмотреть три юниорских степени познания дзена управлением шайтан-машиной ака *nix-сервак на примере всеми любимой ubuntu.

1-й юниорский

Начнем с самых азов — забудьте про GUI, только консоль, только хардкор ^_^!


Несколько красивых консолей в xmonad для повышения мотивации.

Наше приключение начинаем с того, что надо добраться до консоли (в случае SSH-подключения мы там будем сразу). Кстати, если вы windows user, вам поможет волшебная программка putty.

Если же вы уже в линуксе и вы его поставили, верю, что сможете найти там консоль и как в нее попасть. Если же нет, вот мануал на примере ubuntu с самыми популярными DWM. Там же найдете описание базовых команд консоли. Рассмотрим сей список поподробнее и немного сгруппируем.

Давайте посмотрим на структуру файловой системы.

Да, не пугайтесь, привычных C: и D: тут нету, всё идет от корня (/).

/ Корневая директория, содержащая всю файловую иерархию.
/bin/ Основные системные утилиты, необходимые и в однопользовательском режиме, и при обычной работе всем пользователям (cat, ls, cp).
/boot/ Загрузочные файлы (в том числе, файлы загрузчика, ядро и т. д.). Часто выносится в отдельный раздел.
/dev/ Основные файлы устройств системы (например, физические устройства: sata-винчестеры /dev/sda, видеокамеры или TV-тюнеры /dev/video или псевдоустройства, например, «черные дыры» /dev/null, /dev/zero).
/etc/ Общесистемные конфигурационные файлы и файлы конфигурации установленных программ (имя происходит от et cetera).
/home/ Содержит домашние директории пользователей, которые, в свою очередь, содержат персональные настройки и данные пользователя. Часто размещается на отдельном разделе.
/lib/ Основные библиотеки, необходимые для работы программ из /bin/ и /sbin/.
/media/ Точки монтирования для сменных носителей (CD-ROM, DVD-ROM, flash-диски).
/opt/ Дополнительное ПО.
/proc/ Виртуальная файловая система, представляющая состояние ядра операционной системы и запущенных процессов в виде каталогов файлов.
/root/ Домашняя директория пользователя root.
/sbin/ Основные системные программы для администрирования и настройки системы, например, init, iptables, ifconfig.
/tmp/ Временные файлы (см. также /var/tmp).
/usr/ Вторичная иерархия для данных пользователя; содержит большинство пользовательских приложений и утилит, используемых в многопользовательском режиме. Может быть смонтирована по сети только для чтения и быть общей для нескольких машин.
/var/ Изменяемые файлы: файлы регистрации (log-файлы), временные почтовые файлы, файлы спулеров.
/var/cache/ Данные кэша приложений. Сюда скачиваются пакеты перед установкой в систему, здесь же они какое-то время хранятся.
/var/lib/ Информация о состоянии. Постоянные данные, изменяемые программами в процессе работы (базы данных, метаданные пакетного менеджера и т. п.).
/var/log/ Различные файлы регистрации (log-файлы).
/var/www/ Директория веб-сервера Apache, всё, что находится внутри, транслируется им в интернет (конфигурация по умолчанию)

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

Потом рекомендую узнать, как перемещаться в пространстве (cdwww.linfo.org/cd.html), создавать файлы (touchwww.linfo.org/touch.html) редактировать и удалять тоже (понять шутку про sudo rm -rf / — настойчиво рекомендую загуглить тем, кто не в курсе), познакомиться, как работает консольный текстовый редактор (например, Nano) — да-да, не надо пугать новичков Vim и Emacs. Еще есть симпатичный вариант mcedit.


Nano


MCEdit

Чип и Дейл спешат на помощь! В любой непонятной ситуации вводите man %commandName%, и восхитительная утилита man в *nix-системах вам расскажет как работает та или иная команда (программа) в bash.
Если вы потерялись в файловой системе, поможет команда pwd.

Теперь давайте обозначим еще некоторые особенности этого семейства OS.

*nix-системы отличаются регистрозависимостью т. е. file.txt и File.txt — разные файлы. И директории /uploads и /Uploads — тоже разные директории.

Еще несколько важных отличий:

  • Разные слеши Win — Backslash “\”; *nix — Slash “/”

  • Символы переноса строки Win — “\r\n — CRLF”; *nix — “\n — CR”; mac — “\r — LF” статья по теме: en.wikipedia.org/wiki/Newline

В PHP-разработке для ликвидации этих проблем кроссплатформености рекомендуется использовать PHP_EOL для новой строки в консоли и DIRECTORY_SEPARATOR для правильных слешей.

В контексте обсуждения файловой системы и фич linux давайте рассмотрим интересную фичу — симлинки (symlinks). Если объяснить по-простому — это ярлыки, как в всем известной windows, только тут ярлык может быть и на другой сервер, и на директорию, и на файл. Отличие от ярлыков в windows в том, что тут ярлыки используют не только на рабочем столе, а во всей файловой системе. По поводу этого есть хорошая статья на вики en.wikipedia.org/wiki/Symbolic_link и немного синтаксиса с вики debian вдогонку: wiki.debian.org/SymLink.

Почему многие developer-ы любят *nix-системы? Да потому что они стандартизированы системой стандарта POSIX, что их все роднит и помогает спокойно мигрировать из одной стандартизированной OS в другую (и разработчику, и юзеру. Тема раскрыта тут: en.wikipedia.org/wiki/POSIX.

Продолжаем знакомство.

Основное отличие *nix-систем — их многопользовательский подход. Из этого следует логический вывод: если есть много пользователей, надо разграничивать их сферы влияния. Один из основных инструментов для этого — права к файлам и директориям.

Обозначения прав идут в буквенном или цифровом формате.

Увидеть права мы можем через команды lsl или lsla, а поменять — через chmod.


Нашел потрясающую картинку, которая объясняет всю суть происходящего.

Добавлю, что в жизни веб-разработчика всегда нужно помнить о правах в linux, поскольку имеет место обыденная ситуация: разрабатывали под windows, задеплоили и внезапно (!) ничего не работает. В целом ничего страшного в них нету, но keep in mind.

P. S. Советую хорошо разобраться в этом моменте, поскольку ставить 777 на весь проект тоже не очень секьюрно.

Для пользователей системы существует режим стандартных правил для создаваемых ими файлов — umask. От него зависит, с какими правами будут создаваться файлы этого пользователя по умолчанию.
Почитать здесь: ru.wikipedia.org/wiki/Umask.

Я вскользь упомянул о наличии пользователей и групп в *nix-системах, но еще есть административный пользователь — root.
Root-юзер помогает вам делать многое: инсталлить софт, маунтить (https://help.ubuntu.com/community/Mount) разделы, разруливать права на файлы и папки где вашего обычного юзера не хватает, и т. п.

Для этого есть волшебная команда sudo. Более подробно предлагаю ознакомиться здесь: help.ubuntu.ru/wiki/.

Под рутом надо быть очень аккуратными. Особенно на лайв-серверах. Особенно удаляя что-то через консоль.

Раз уж мы вспомнили о лайв-серверах, у них бывает такое свойство — заканчивается память.

Сначала проверяем, что у нас с ОЗУ, для этого подойдет top/htop.

Давайте также вспомним замечательную тулзу — ps. Она выводит отчет о работающих процессах. Удобна еще и несколькими триками:

  • Удобно пользоваться конвейером и утилитой less для пролистывания выводимой информации с помощью кнопок «вверх» и «вниз», например, ps aux | less.
  • С помощью утилиты grep удобно искать и выводить только нужные процессы, например, ps aux | grep node.

Для проверки, сколько свободного места у нас на харде, есть команды: df -h и df –k.

Если проблема в ОЗУ, смотрим, что у нас потребляет больше, чем надо, и делаем kill, или же, если это нужные процессы, — думаем дальше :).

Если же заканчиваются ресурсы харда и нечего удалить, на помощь приходят архиваторы. Основной архиватор в мире linux — tar. Вот небольшой гайд по сабжу, которого в повседневной жизни вам должно хватить с головой: help.ubuntu.ru/wiki/tar.

Стоит добавить, что в консоли есть варианты работы с несколькими программами одновременно — утилита GNU Screen: help.ubuntu.ru/wiki/screen.

В целом на этом можно и закончить первую степень посвящения, но обрадую немного тех, кто очень боится консоли: есть консольный 2-панельный классический файловый менеджер — Midnight commander.

Продолжим рубрикой «Что делать не надо» :).

  1. Не знаешь, зачем оно и как работает — не удаляй!
  2. Увидел файл или папку, которые начинаются с точечки — тем более не удаляй ^_^!

Это dotfiles — спрятанные файлы, просто по ls их не видно, можно увидеть через ls –la. Зачастую это системные файлы или файлы программ (иногда — настройки). И тут тоже вики хорошо раскрывает тему: en.wikipedia.org/wiki/Hidden_file_and_hidden_directory.

2-й юниорский

Первый юниорский нам поможет сделать что-то, но для повседневных задач web-developer’а этого мало, так что давайте пойдем дальше осваивать уровень, которого нам хватит для резолва ежедневных задач.

Первое, о чём надо упомянуть на этом уровне — пакетный менеджер aptitude (разбираем на примере ubuntu, да и в целом debian-based systems).
С его помощью можем устанавливать и удалять программы в й системе, подробнее рекомендую почитать, как говорится, на сайте производителя: help.ubuntu.ru/wiki/apt.

Следующая повседневная задача — установка lamp (linux apache php mysql)-сервера.

Вы не поверите, но после установки сервера на Windows в Ubuntu это делать просто и приятно, буквально в несколько команд: help.ubuntu.com/community/ApacheMySQLPHP

Конечно же, нам пригодятся Virtual Hosts. Файл хостов находится по адресу /etc/hosts, а хосты надо редактировать под рутом.

Пришло время упомянуть базовые команды Apache.

Включаем модули в apache, в том числе, модуль PHP (если ставим руками) — a2enmod %moduleName%.
Рестарт сервера — sudo service apache2 restart.

Вернемся к хостам. В apache, да и в nginx система хостов не очень сложная, но, как показывает практика, лучше рассказать, чтобы не видеть потом огромные и ужасные httpd.conf/nginx.conf.

Хосты, которые настроены и существуют (но не факт, что включены!) лежат отдельными файликами в папке /etc/apache2/sites-available. А хосты, которые используются и активны в данный момент, лежат симлинками в папке /etc/apache2/sites-enabled.

In real life выглядит все так: мы создаем файл конфига для нового хоста в sites-available, потом командой a2ensite %hostName% apache создает симлинк в папке sites-enabled, тем самым активируя хост. Обратная процедура — a2dissite.

Когда вы делаете это руками или просто пишете в файл основнового конфига, где-то плачет один котик, ну, или собачка — кому кого больше жаль :).

Ещё распространенная задача — поднять https. Хороший мануал здесь:
help.ubuntu.ru/wiki/apache_%D0%B8_https.


Картинка, обьясняющая суть того, зачем нам https.

Если вас всё ещё терзает вопрос зачем эта вся секьюрность, советую почитать на тему секьюрности для разработчиков хороший мануал: www.owasp.org/index.php/PHP_Security_Cheat_Sheet — тут на примере PHP, но многое актуально для всех Web разработчиков.

Также при работе с lamp старайтесь закрывать использование exec (выполнение команд в консоли OS через php) www.php.net/manual/ru/function.exec.php.

На уровне php это потенциальный пробел в вашей защите.

Добавлю часто встречающуюся задачу — закрытие сервера для незалогиненных пользователей методами веб-сервера, как на этом скрине.

Сделать так очень просто через htpasswd, вот пример: doc.norang.ca/apache-basic-auth.html.

Пришло время упомянуть о базах данных. В нашем юниорском забеге будем рассматривать MySql. В целом по вопросам Database Administration написано очень много книг и очень многое появляется с опытом, но некоторые базовые вещи просто необходимы.

how to mysql server restart?

Первое — конфиг живет по адресу /etc/mysql/my.cnf, заходить в гости, как обычно, под рутом.

Перезапустить «моську» можно командой sudo service mysql restart.

Если вы что-то не то сделали с правами своего рута или просто потеряли пароль рута от mysql, сбросить его и задать новый можно командой sudo dpkg-reconfigure mysql-server-5.5 (или 5.6), в общем, подставите нужную версию :).

Перейдем к следующему животрепещущему вопросу в жизни веб-девелопера:

Хоббит SQL-дампы — туда и обратно на dedicated servers
Для бекапа базы в sql-файл используется прекрасная команда mysqldump со следующим синтаксисом:

mysqldump —opt -u [uname] -p[pass] [dbname] > [backupfile.sql]
[uname] Имя юзера
[pass] Пароль (Будьте внимательны между параметром p и паролем нет пробела)
[dbname] Название нашей базы
[backupfile.sql] Как мы называем файл дампа (можно так же указать путь к нему если вы не в той папке где хотите создать его)
[—opt] Дополнительные опции
Пример: mysqldump -u root -p Tutorials > tut_backup.sql

  • add-drop-table — добавляет в дамп DROP TABLE перед CREATE TABLE.
  • no-data — дампит только таблицы без контента.
  • add-locks — добавляет LOCK TABLES и UNLOCK TABLES в дамп.

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

mysqldump -u [uname] -p[pass] [dbname] | gzip -9 > [backupfile.sql.gz]

Теперь давайте разберем накатку базы (условие: базы не существует, накатка с нуля).
Основной синтаксис будет такой:

mysql -u [uname] -p[pass] [db_to_restore] < [backupfile.sql]

Следуя нашему примеру, получаем что-то в духе:
mysql -u root -p Tutorials < tut_backup.sql

А если мы таки запаковались в архив, будет так:

gunzip < [backupfile.sql.gz] | mysql -u [uname] -p[pass] [dbname]

Если накатываем базу не с нуля, а она уже создана, есть другая команда:

mysqlimport -u [uname] -p[pass] [dbname] [backupfile.sql]

С архивом по аналогии.

Эту прекрасную шпаргалку по дампам взял отсюда: webcheatsheet.com/sql/mysql_backup_restore.php на good data centre

Следующий важный момент в MySQL — права Grants. «Моська» у нас многопользовательская, если есть много пользователей, значит, права свои у них будут — life is cruel :). Советую о них почитать. Самая распространенная задача — открыть юзеру вход не с локалхоста Она решается следующим образом:

Удаляем строку bind-address 127.0.0.1 из главного конфига.
Потом выполняем следующие команды:

~# mysql -u root mysql -p
mysql> GRANT ALL PRIVILEGES ON database.* TO username@»%» IDENTIFIED BY ‘password’ WITH GRANT OPTION;
mysql> exit;
~# mysqladmin -u root -p flush-privileges

Здесь database — база данных, к которой назначаем права пользователю username с паролем password, а % указывает на то, что пользователь может прийти не только с локалхоста, а откуда угодно.

Эти команды на респекте собрал отсюда: saradmin.ru/?p=792.

Node JS мы также можем установить в две команды “sudo apt-get install nodejs” “sudo apt-get install npm”.
Node-проекты заводить обычно легко, что-то в духе node server.js
Хочу поделиться интересной тулзой nodemon — она дает нам намного больше возможностей в области девелопмента на nodeJS, т. к. следит за изменениями в файлах проекта и перезапускает сервер автоматически:
nodemon.io/

Далее рекомендую ознакомиться с работой в консоли самых популярных в мире web development VCS — git и svn. Мануалов по ним очень много разных и хороших, думаю, подберете на свой вкус ;).

По теме VCS может понадобится мануал по генерации SSH-ключей для Git: help.github.com/articles/generating-ssh-keys.
Поделюсь интересным триком: если вам нужен live-вывод изменяющихся файлов в консоль (зачастую логи) — используйте команду tail –f, например, (tail -f /var/log/apache2/error.log).

3-й юниорский

Вот мы и подобрались к 3-му юниорскому! Довольно неплохой уровень, после которого уже идет хардкор, но тут еще ничего страшного тоже нет, всё достаточно интересно и весело.

Начинается опыт реального подъема серверов с фулстеком (lamp + ftp(s) + ssh) по ситуации, с прикруткой CI-систем, также интересен опыт подъёма хостинг-систем типа Virtualmin / WebMin.
В реальной эксплуатации не рекомендуется оставлять чистый ftp-сервер, лучше использовать SFTP (ftp over ssh) для секьюрности.


help.ubuntu.ru/wiki/webmin

Интересен опыт с nginx вместо apache — отличный мануал можно найти тут: help.ubuntu.ru/wiki/nginx-phpfpm.
Также дополню хорошей онлайн-тулзой которая трансформирует rewrite-правила из apache в формат nginx: winginx.com/ru/htaccess.

Еще на этом уровне не нужно бояться BASH-скриптинга и знать, что такое sed и grep. Основы рекомендую почитать тут:
help.ubuntu.com/community/Beginners/BashScripting

Хороший левел — знание vim или emacs. Очень холиварная тема, но не упомянуть нельзя.

Если временами вы очень скучаете по некоторым программам из windows, или у вас есть специфичный софт, который все-таки нужен и аналог никак не можете найти (что же такое страшное вам нужно?!), есть wine — wine is not an emulator.


IE В Ubuntu («работает» еще веселее, чем в нативной среде обитания).

Это действительно не эмулятор windows, а набор библиотек, чтобы заводить виндовые програмы под никсами. Есть база данных, какие программы и даже игры поддерживает wine — appdb.winehq.org/.

Давайте затронем сетевую тему, первым в гостем нашей студии станет netstat (network statistics), встречайте! Тулза поможет нам посмотреть статистику сетевой активности, открытые порты, наши сетевые интерфейсы и т. д.

Базовая информация:
en.wikipedia.org/wiki/Netstat

Примеры использования: putty.org.ru/articles/netstat-linux-examples.html.
Спасибо, netstat.
Следующий наш гость — Iptables, встречайте!
IPtables — стандартный интерфейс управления работой брандмауэра.
Базовая информация: en.wikipedia.org/wiki/Iptables
Спасибо, Iptables!

И в заключение сетевой темы давайте позовем нашего хедлайнера — nmap. Поприветсвуем гостя nmap!

Очень известная утилита в области сетевой безопасности, видеть ее мы могли в десятках фильмов ;).


nmap.org/movies/

Базовая информация: en.wikipedia.org/wiki/Nmap#Bibliography.
Примеры использования: habrahabr.ru/post/88064/.

Спасибо nmap за столь увлекательную историю и счастливое детство.

Предлагаю перейти на немного advanced level MySQL-тюнинга — PIMP MY DB.

В живых проектах очень важно держать MySQL в боевом состоянии, настроенным на максимальную стабильность и производительность, в противном случае получаем очень неприятный bottleneck.

DB Tuning можно условно разделить на две части:

Оптимизация структуры базы данных (нормализация/денормализация, foreign keys, indexes и т. д.).
Оптимизация настроек сервера DB.
Про оптимизацию структуры базы данных написано немало гайдов и мануалов, и серебряной пули тут не существует. Всегда смотрим на конкретный проект и индивидуальные проблемы. Explain в помощь :).

Советую почитать:

ruhighload.com/post/ ruhighload.com/index.php/2009/07/28/ habrahabr.ru/post/108418/
В вопросе тюнинга и оптимизации настроек DB очень преуспела компания Percona — MySQL-форк. Рекомендую познакомиться с ними поближе.
Из базового набора для тюнинга у них есть тулкит и визард настройки вашего сервера.

www.percona.com/software/percona-toolkit
tools.percona.com/wizard

Также известная тулза — mysqltuner (http://mysqltuner.com/).
Для тестирования нагрузки на MySQL есть интересная тулза sysbench. Почитать про нее можно тут: ruhighload.com/index.php/2010/03/05/sysbench-testiruem-proizvoditelnost-mysql/.

Добавим в наше приключение немного стильных, модных и молодежных технологий — CI.

Wiki: Непрерывная интеграция (англ. Continuous Integration) — практика разработки ПО, которая заключается в выполнении частых автоматизированных сборок проекта для скорейшего выявления и решения интеграционных проблем.

На практике это очень удобный софт, позволяющий собирать билды, прогонять все виды тестов, делать минификацию js/css, следить за качеством кода, деплоить, итп.

Самые популярные — Jenkins, Travis, TeamCity.

en.wikipedia.org/wiki/Jenkins_(software)
en.wikipedia.org/wiki/Travis_CI
ru.wikipedia.org/wiki/TeamCity

P. S. Клевая тулза Guake —выезжающая консолько в стиле quake.

Цельнотянуто с Хабра

Linux Mint 17 и DLNA

Linux Mint — отличная домашняя ОС. Богатый выбор графических сред на любой вкус, простая и понятная даже новичку установка, сразу после установки имеем основной набор необходимого софта, удобный менеджер приложений, основные мультимедийные кодеки. В общем, отличная система для перехода и ознакомления с Linux.

image

Но возникает проблема для тех, у кого нет дома NAS или чего-то подобного, а смотреть контент с ПК на других устройствах, поддерживающих DLNA хочется. Под Linux существует множество различных DLNA-серверов, но оптимальным, все же, является MiniDLNA. И тому есть несколько причин. Во-первых, это типичный Unix-way: этот сервер является именно DLNA-сервером, а не комбайном с кучей свистелок, при этом контент без проблем воспринимается на любом устройстве. Даже телевизоры Samsung со своим AllShare прекрасно подключаются к нему. Также можно отметить и замечательную скорость работы и нетребовательность к ресурсам этого сервера.

И все бы было хорошо, но вот в с помощью команды

sudo apt-get install minidlna

установить его не получится — нет его в репозитарии.

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

Подготовка

Если будете выполнять команды в консоли, запущенной с правами root, команду sudo писать не нужно.

Для начала нужно установить необходимые библиотеки:

Обновляемся:

sudo apt-get update

И устанавливаем сами библиотеки:

sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libflac-dev libvorbis-dev libogg-dev libid3tag0-dev libexif-dev libjpeg-dev libsqlite3-dev

Самая свежая версия MiniDLNA на данный момент — 1.1.3, ее можно скачать здесь, либо загрузить из консоли:

wget --trust-server-names http://sourceforge.net/projects/minidlna/files/latest/download

ключ перед адресом нужен, чтобы сохранилось оригинальное имя, с выхдом новой версии имя файла будет отличатся. После этого архив нужно распаковать:

tar -xf minidlna-1.1.3.tar.gz

Теперь перейдем в распакованную папку с исходниками

cd minidlna-1.1.3

Если вы хотите, чтобы на устройстве отображались сразу папки с файлами, нужно немного подправить код:

Для отключения запроса способа отображения файлов нужно в папке с исходниками (minidlna-1.1.3, мы в нее уже должны были перейти) подправить файл upnpsoap.c, но сначала сделаем его резервную копию:

sudo cp upnpsoap.c upnpsoap.c.old

и откроем в редакторе

sudo nano upnpsoap.c

поиском (F6), ищем процедуру:

"BrowseContentDirectory"static void
BrowseContentDirectory(struct upnphttp * h, const char * action)
{

В начале процедуры выполняется разбор SOAP/XML-запроса, затем его обработка и возврат результата. Разбор запроса завершается формированием отладочного сообщения:

DPRINTF(E_DEBUG, L_HTTP, "Browsing ContentDirectory:\n"
             " * ObjectID: %s\n"
             " * Count: %d\n"
             " * StartingIndex: %d\n"
             " * BrowseFlag: %s\n"
             " * Filter: %s\n"
             " * SortCriteria: %s\n",
            ObjectID, RequestedCount, StartingIndex,
            BrowseFlag, Filter, SortCriteria);

Далее реализован выбор корневого контейнера в зависимости от конфигурационного параметра root_container:

    // Если запрошен корневой контейнер
    if( strcmp(ObjectID, "0") == 0 )
    {
        // Выставляем флаг корневого контейнера
        args.flags |= FLAG_ROOT_CONTAINER;
        // Если в конфиге задан корневой контейнер
        if( runtime_vars.root_container )
        {
            // Если клиентом является аудио плейер и в конфиге задан обзор папок
            // Отправляем его в папку с музыкой
            if( (args.flags & FLAG_AUDIO_ONLY) && (strcmp(runtime_vars.root_container, BROWSEDIR_ID) == 0) )
                ObjectID = MUSIC_DIR_ID;
            else // Иначе выставляем контейнер, заданный в конфиге
                ObjectID = runtime_vars.root_container;
        }
        else // Если контейнер в конфиге не задан
        {
            // Если клиентом является аудио плейер
            // Отправляем его в папку с музыкой
            if( args.flags & FLAG_AUDIO_ONLY )
                ObjectID = MUSIC_ID;
        }
    }

Сразу после этого блока и перед блоком с запросами к БД добавляем код перенаправления папок для видео, музыки и изображений:

    //Redirect video to folder
    if( strcmp(ObjectID, VIDEO_ID) == 0 )
    {
        ObjectID = VIDEO_DIR_ID;
    }

    //Redirect music to folder
    if( strcmp(ObjectID, MUSIC_ID) == 0 )
    {
        ObjectID = MUSIC_DIR_ID;
    }

    //Redirect images to folder
    if( strcmp(ObjectID, IMAGE_ID) == 0 )
    {
        ObjectID = IMAGE_DIR_ID;
    }

В итоге правленный фрагмент должен выглядеть следующим образом:

        if( strcmp(ObjectID, "0") == 0 )
        {
                args.flags |= FLAG_ROOT_CONTAINER;
                if( runtime_vars.root_container )
                {
                        if( (args.flags & FLAG_AUDIO_ONLY) && (strcmp(runtime_vars.root_containe$
                                ObjectID = MUSIC_DIR_ID;
                        else
                                ObjectID = runtime_vars.root_container;
                }
                else
                {
                        if( args.flags & FLAG_AUDIO_ONLY )
                                ObjectID = MUSIC_ID;
                }
        }

        //Redirect video to folder
        if( strcmp(ObjectID, VIDEO_ID) == 0 )
        {
                ObjectID = VIDEO_DIR_ID;
        }

        //Redirect music to folder
        if( strcmp(ObjectID, MUSIC_ID) == 0 )
        {
                ObjectID = MUSIC_DIR_ID;
        }

        //Redirect images to folder
        if( strcmp(ObjectID, IMAGE_ID) == 0 )
        {
                ObjectID = IMAGE_DIR_ID;
        }

        if( strcmp(BrowseFlag+6, "Metadata") == 0 )
        {
                args.requested = 1;
                sql = sqlite3_mprintf("SELECT %s, " COLUMNS
                                      "from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID$
                                      " where OBJECT_ID = '%q';",
                                      (args.flags & FLAG_ROOT_CONTAINER) ? "0, -1" : "o.OBJECT_I$
                                      ObjectID);
                ret = sqlite3_exec(db, sql, callback, (void *) &args, &zErrMsg);
                totalMatches = args.returned;
        }

Чтобы упростить процедуру последующего обновления, сохраним патч с внесенными изменениями:

diff -u upnpsoap.c.old upnpsoap.c > ../minidlna-folders.patch

Теперь вместо редактирования файла, достаточно применить патч:

cd ~/src/minidlna/minidlna-НоваяВерсия
patch < ../minidlna-folders.patch

Теперь можно переходить к конфигурированию.

Если вам это не нужно, переходите сразу к конфигурированию:

./configure

И компилируем:

make
Установка

1) Для тех, кто в дальнейшем захочет обновить версию, предыдущую можно удалить (конфигурационные файлы при этом сохраняются), если этого не сделать, то в случае, если в новой версии состав установочных файлов изменится, в /usr/local могут остаться старые файлы, при первой установке — переходим сразу к пункту 2.

Для удаления заходим в папку с предыдущей установкой и выполняем команду:

sudo apt-get remove minidlna

2) Запускаем установку (в комментариях предложили более правильный путь, чем make install):

sudo checkinstall -D

Ключ -D указывает, что должен быть создан Debian-пакет

3)Если мы производим первоначальную установку, нужно создать init-скрипт:

sudo nano /etc/init.d/minidlna

, если мы обновляем версию, больше ничего делать не нужно, при первоначальной установке у нас откроется пустой файл, в который нужно внести следующий код:

Листинг

#!/bin/sh
#
# MiniDLNA initscript
#
# Based on the mediatomb debian package.
# Original authors: Tor Krill <tor@excito.com>
#                   Leonhard Wimmer <leo@mediatomb.cc>
#                   Andres Mejia <mcitadel@gmail.com>
#
# Modified by: Benoit Knecht <benoit.knecht@fsfe.org>
#
### BEGIN INIT INFO
# Provides:          minidlna
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop::    $network $local_fs $remote_fs
# Should-Start:      $all
# Should-Stop:       $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start minidlna at boot time
# Description:       Manage the minidlna daemon, a DLNA/UPnP-AV media server.
### END INIT INFO

unset USER

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="DLNA/UPnP-AV media server"
NAME=minidlnad
DAEMON=/usr/local/sbin/minidlnad
PIDDIR=/run/$NAME
PIDFILE=$PIDDIR/$NAME.pid
SCRIPTNAME=/etc/init.d/minidlna
DEFAULT=/etc/default/minidlna

# Exit if the package is not installed
[ -x $DAEMON ] || exit 0

# Read configuration variable file if it is present
[ -r $DEFAULT ] && . $DEFAULT

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# Do not start the daemon if NO_START is enabled in DEFAULT
if [ "$START_DAEMON" != "yes" ] && [ "$1" != "stop" ]; then
        log_warning_msg "$NAME: Not starting $DESC."
        log_warning_msg "$NAME: Disabled in $DEFAULT."
        exit 0
fi

# Set the default configuration file
if [ -z $CONFIGFILE ]; then
        CONFIGFILE=/etc/minidlna.conf
fi

# Set the default log file
if [ -z $LOGFILE ]; then
        LOGFILE=/var/log/minidlna.log
fi

# Run as `minidlna' if USER is not specified or is `root'
if [ -z $USER ]; then
        USER=minidlna
fi

# If no group is specified, use USER
if [ -z $GROUP ]; then
        GROUP=$USER
fi

DAEMON_ARGS="-f $CONFIGFILE -P $PIDFILE $DAEMON_OPTS"

#
# Function that starts the daemon/service
#
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        touch $LOGFILE && chown $USER:$GROUP $LOGFILE || return 2
        if [ ! -d $PIDDIR ]; then
            mkdir $PIDDIR || return 2
        fi
        chown $USER:$GROUP $PIDDIR || return 2

        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --chuid $USER:$GROUP --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE \
                --chuid $USER:$GROUP --exec $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -rf $PIDDIR
        return "$RETVAL"
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
    do_start
    case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
  ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  status)
       status_of_proc -p "$PIDFILE" "$DAEMON" "$NAME" && exit 0 || exit $?
       ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                if [ "$1" = "force-reload" ]; then
                        # Rescan the collection
                        DAEMON_ARGS="$DAEMON_ARGS -R"
                fi
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
        exit 3
        ;;
esac

:

, сохранить комбинацией клавиш Ctrl+O и выйти из редактора — Ctrl+X.

4) После этого даем права на запуск скрипта:

sudo chmod 755 /etc/init.d/minidlna

5) И активируем запуск init-скрипта:

sudo update-rc.d minidlna defaults

6) Так как по умолчанию служба запускается под пользователем minidlna, нам нужно создать соответствующую учетную запись:

sudo adduser --system --home /var/lib/minidlna --group --gecos "MiniDLNA server" minidlna

7) Правим файл конфигурации сервера:

sudo nano /etc/minidlna.conf

В нем нам нужно следующее содержимое (здесь подправлен интервал, с которым сервер себя анонсирует, так как не все телевизоры опрашивают сервер, также вам надо прописать путь к папке с медиа, к примеру так: «media_dir=V,/mnt/sdb6/Video/Alex/» в соответствующем разделе файла):

Листинг minidlna.conf

# Порт сервера
port=8200

# Привязка к сетевому интерфейсу
# Можно задать несколько интерфейсов
# в формате network_interface=eth0,eth1
#network_interface=eth0

# Имя пользователя или UID, под которым будет работать служба
# Добавлен в версии 1.1.0
# В Debian задается в параметрах init-скрипта
#user=jmaggard

# Путь к папке с медиа-файлами
# Для сканирования нескольких папок, укажите несколько параметров media_dir
# Чтобы сканировать файлы определенного типа, укажите соответствующий префикс:
#   A - аудио: media_dir=A,/home/jmaggard/Music
#   V - видео: media_dir=V,/home/jmaggard/Videos
#   P - изображения: media_dir=P,/home/jmaggard/Pictures
# Начиная с версии 1.1.0, можно задать несколько типов:
#   PV - изображения и видео: media_dir=AV,/var/lib/minidlna/digital_camera
#
# При изменении параметра, потребуется повторное сканирование файлов.
# Необходимо выполнить команду "service minidlna force-reload" от имени root.
# Начиная с версии 1.1.0, при изменении параметра, сканирование выполняется автоматически.
media_dir=/var/lib/minidlna

# Имя DLNA-сервера, отображаемое клиентом
# По умолчанию: "$HOSTNAME:$USER"
#friendly_name=

# Путь к папке для хранения базы данных и кэша обложек альбомов
db_dir=/var/lib/minidlna

# Путь к папке с лог-файлами
log_dir=/var/log

# Уровень детальности лога
# В формате log_level=источник1,источник2=значение1,источник3,источник4=значение2 ...
# Доступные источники: "general", "artwork", "database", "inotify", "scanner", "metadata", "http", "ssdp", "tivo"
# Возможные значения: "off", "fatal", "error", "warn", "info" or "debug"
#log_level=general,artwork,database,inotify,scanner,metadata,info,ssdp,tivo=warn

# Перечень имен файлов-обложек альбомов, разделитель: "/"
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg

# Автообнаружение новых файлов
# Включено по умолчанию
inotify=yes

# Поддержка устройств TiVo
#enable_tivo=no

# Строго следовать DLNA-стандарту
# Использовать серверное масштабирование для очень больших JPEG-изображений
# Что может снизить скорость их обработки.
#strict_dlna=no

# Адрес веб-страницы устройства
# По умолчанию IP-адрес и заданный порт сервера
#presentation_url=http://www.mylan/index.php

# Интервал отправки SSDP-уведомлений, в секундах
notify_interval=30

# Серийный номер и номер модели DLNA-сервера, сообщаемый клиенту
serial=12345678
model_number=1

# Путь к сокету MiniSSDPd, если установлен
# Требуется для обеспечения работы нескольких DLNA/UPnP служб на одном сервере
#minissdpdsocket=/run/minissdpd.sock

# Контейнер, используемый в качестве корневой папки для клиентов
#   * "." - стандартный контейнер
#   * "B" - "Обзор папки"
#   * "M" - "Музыка"
#   * "V" - "Видео"
#   * "P" - "Изображения"
# Если задано "B" и клиент представится как аудиоплеер, в качестве корня будет использована папка "Music/Folders"
#root_container=.

# Всегда использовать заданный критерий сортировки, вместо значения, запрошенного клиентом
#force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title

# Максимальное число одновременных подключений
# Учтите: многие клиенты открывают несколько подключений одновременно
#max_connections=50

8)Затем проверяем параметры init-скрипта /etc/default/minidlna:

sudo nano /etc/default/minidlna

Обычно корректировка не требуется. Если файл отсутствует, при первичной установке из исходников, копируем листинг:

# Запускать демон, если задано "yes"
START_DAEMON="yes"

# Путь к файлу конфигурации
#CONFIGFILE="/etc/minidlna.conf"

# Путь к лог-файлу
#LOGFILE="/var/log/minidlna.log"

# Запуск от имени заданного пользователя и группы
# По умолчанию: minidlna
#USER="minidlna"
#GROUP="minidlna"

# Дополнительные ключи запуска
DAEMON_OPTS=""

Обычно после этого не требуется дополнительных настроек, но если есть проблемы с доступом к медиа (или хотите перестраховаться), можно настроить права доступа:

Настройка прав доступа:

Поскольку служба работает под пользователем с ограниченными правами, публикуемые папки и файлы должны быть доступны на чтение для всех пользователей, следовательно, иметь разрешения 644: «rw- r— r—», для файлов и 755: «rwx r-x r-x», для папок.Проверяем доступность для каждой папки, заданной в minidlna.conf, командой:

sudo -u minidlna ls -l папка

Если папка недоступна, задаем права доступа:

sudo chmod -R 755 папка

Вышестоящие папки также должны быть доступны на чтение всем пользователям. Проверяем доступность на чтение каждой папки, указанной в пути. Для вышестоящих папок используем chmod без ключа -R, если не требуется сброс разрешений для всех дочерних файлов и папок.
В качестве альтернативы смене разрешений, можно запустить MiniDLNA от имени пользователя или группы-владельца файлов. Для этого необходимо задать параметры USER и GROUP в /etc/default/minidlna, и сменить владельца папки /var/lib/minidlna командой:

sudo chown -R пользователь:группа /var/lib/minidlna
Запуск сервера

Запускаем:

sudo service minidlna force-reload

Проверяем, работает ли служба, также смотрим параметры запуска:

ps ax | grep minidlna

Проверяем, слушается ли порт:

sudo ss -4lnp | grep minidlna

Проверяем лог:

cat /var/log/minidlna.log

В случае успешного старта, лог должен быть примерно следующим:

Gothician gothician # cat /var/log/minidlna.log
[2014/07/27 10:05:31] minidlna.c:1014: warn: Starting MiniDLNA version 1.1.3.
[2014/07/27 10:05:31] minidlna.c:355: warn: Creating new database at /var/lib/minidlna/files.db
[2014/07/27 10:05:31] minidlna.c:1053: warn: HTTP listening on port 8200
[2014/07/27 10:05:31] scanner.c:706: warn: Scanning /var/lib/minidlna
[2014/07/27 10:05:31] scanner.c:793: warn: Scanning /var/lib/minidlna finished (0 files)!
[2014/07/27 10:05:31] playlist.c:125: warn: Parsing playlists...
[2014/07/27 10:05:31] playlist.c:259: warn: Finished parsing playlists.
[2014/08/03 09:25:35] minidlna.c:1053: warn: HTTP listening on port 8200

Если видим: «WARNING: Inotify max_user_watches [8192] is low.», необходимо увеличить число дескрипторов слежения inotify до 100 000. Для этого в файл /etc/sysctl.conf добавим строки:

#MiniDLNA warning fix
fs.inotify.max_user_watches = 100000

Вручную редактором:

sudo nano /etc/sysctl.conf

Или копипастом команды:

sudo sh -c 'printf "\n\n#MiniDLNA warning fix\nfs.inotify.max_user_watches = 100000\n" >> /etc/sysctl.conf && cat /etc/sysctl.conf'

Изменение параметра вступит в силу после перезагрузки системы.
Открываем в браузере адрес.сервера:8200, видим количество файлов в библиотеке, начиная с версии 1.1.2, также отображается список подключенных клиентов.

Настройка DLNA/UPnP-AV сервера завершена.

При появлении ошибок в каталоге, необходимо выполнить повторное сканирование файлов.
При использовании приведенного выше init-скрипта, для запуска сканирования медиа-библиотеки используем команду:

sudo service minidlna force-reload

Служба при этом будет перезапущена, подключенные клиенты будут отключены.

Для сканирования медиа-библиотеки при каждом старте системы можно задать ключ запуска: «-R» в параметре DAEMON_OPTS в файле /etc/default/minidlna. Сканирование большой медиа-библиотеки существенно нагружает диск, что может замедлить загрузку системы.

Полное формирование каталога может занять несколько минут. Сканирование папок выполняется в порядке их объявления в конфиге. Файлы из небольших папок, объявленных в конфиге выше, появятся в каталоге в самом начале процесса сканирования. Крупные папки с редко воспроизводимым контентом имеет смысл размещать в конфиге последними.

По материалам http://itadept.ru/, wiki.archlinux.org.

Проекты на WordPress: советы по оптимизации

Сегодня WordPress является одной из самых популярных CMS. Задуманная изначально как движок для блогов, сегодня она используется для самых разных типов сайтов, в частности, для новостных порталов и интернет-СМИ. На Wordpress работают корпоративные веб-сайты, образовательные и развлекательные порталы.
Во всех примерах используется Ubuntu 12.04.

Настраиваем СУБД

Выбор СУБД

Как известно, для работы WordPress необходима СУБД MySQL. В последнее время широкое распространение получили альтернативные реализации (форки) этой СУБД, наиболее популярными из которых являются Percona Server и MariaDB. Во многих инструкциях по установке, опубликованных в Интернете, рекомендуется использовать MariaDB.

Мы же рекомендуем использовать Percona Server, так как этот форк по сравнению со стандартным MySQL является более производительным и стабильным. Кроме того, Percona обладает более широкими возможностями для сбора системной статистики.

Чтобы установить Percona на сервер, нужно сначала импортировать ключи:

$ apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A

Затем нужно добавить в файл /etc/apt/sources.list следующие репозитории:

deb http://repo.percona.com/apt precise main
deb-src http://repo.percona.com/apt precise main

И выполнить команду:

$ sudo apt-get update

После этого можно устанавливать percona-server при помощи стандартного менеджера пакетов:

$ sudo apt-get install percona-server-server percona-server-client

 

Выбираем движок: MyISAM или InnoDB?

Самыми популярными движками в MySQL-базах являются MyISAM и InnoDB. Если движок выбран неправильно, то возникают проблемы с производительностью и консистентностью.

Рассмотрим особенности этих движков более подробно.

MyISAM показывает хорошие результаты на выборках SELECT, что во многом обусловлено отсутствием поддержки транзакций и внешних ключей. Однако при модификации и добавлении записей вся таблица на время блокируется, что при большой загрузке может стать причиной серьезных задержек.

Несомненными преимуществами этого движка являются также полнотекстовый поиск и компрессия. Формат данных в MyISAM — кроссплатформенный, что позволяет без проблем переносить данные с одного сервера на другой путем простого копирования бинарных файлов (таблиц) баз данных.

InnoDB используется в современных версиях MySQL как движок по умолчанию.
В отличии от MyISAM InnoDB поддерживает транзакции и внешние ключи. В Percona Server используется собственный движок — XtraDB, полностью совместимый с InnoDB. Данные в InnoDB/XtraDB кэшируются. Когда большая часть данных считывается из кэша, производительность InnoDB/XtraDB в разы выше, чем у MyISAM.

Статей, посвященных сравнению MyISAM с InnoDB/XtraDB, а также MySQL c его форками, опубликовано немало (см., в частности, тест производительности здесь). Мы не будем вдаваться в теоретические подробности и ограничимся практическим советом: MyISAM нужно выбирать только в случаях, когда нужен полнотекстовый поиск. Со всеми остальными задачами прекрасно справятся InnoDB/XtraDB. Кстати, в MySQL/Percona Server 5.6+ полнотекстовый поиск для InnoDB уже поддерживается.

Оптимизация конфигурации СУБД

По мере развития сайта количество данных в БД будет расти, и возникнет необходимость изменений настроек базы данных. Чтобы обеспечить оптимальную работу сайта, желательно регулярно проверять, насколько оптимально настроена действующая конфигурация MySQL. Такую проверку проще всего осуществлять с помощью специальных скриптов, самым известным и популярным из которых является mysqltuner.pl. Его можно скачать при помощи следующих команд:

$ wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
$ chmod +x ./mysqltuner.pl
$ ./mysqltuner.pl

Этот скрипт собирает статистику MySQL и выдает рекомендации по улучшению существующих настроек.

Настраиваем веб-сервер

 

Параметры Apache

Настройки apache хранятся в файле /etc/apache2/apache2.conf

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

Допустим, один процесс Apache может потребить 20 Мб оперативной памяти. Если для параметра max_clients выставлено значение 200, то при пиковой нагрузке под все процессы потребуется 200×20 Мб = 4Гб памяти — и это только под Apache! В результате нехватки памяти даже самые простые запросы будут выполняться крайне медленно. И программное обеспечение на сервере может перестать работать.

Поэтому слишком большое значение параметра max_clients выставлять не желательно. Если количество запросов превысит установленное значение, то все эти запросы будут поставлены в очередь и обработаны, как только освободятся занятые процессы.

В целях повышения производительности рекомендуется также отключить keepalive-соединения, исправив соответствующую строку в конфигурационном файле:

KeepAlive off 

 

Backend+Frontend = Apache +Nginx

Любой более или менее высоконагруженный веб-проект должен иметь многоуровневую архитектуру (об этом мы уже писали). Для большинства проектов на базе WordPress вполне подойдет двухуровневая архитектура Backend — Frontend. Мы рекомендуем использовать следующую связку: в качестве бэкенда Apache, в качестве фронтенда — Nginx.

Впрочем, возможен и другой вариант — php-fpm в качестве бэкенда, а в качестве фронтенда — все тот же Nginx (см. инструкции по настройке, например, здесь и здесь). Во многих публикациях утверждается, что связка php-fpm+Nginx работает быстрее или потребляет намного меньше памяти. С этими утверждением, однако, вряд ли можно однозначно согласиться.

К тестам, опубликованным в Интернете, нужно относиться со здоровой долей скептицизма: нередко php-fpm+Nginx показывает лучшие результаты лишь потому, что Apache не был настроен должным образом (см., например, отчет о тестировании и его критический разбор; см. также любопытную дискуссию здесь). На основании собственного опыта можем сказать, что для большинства проектов на Wordpress комбинация Apache+Nginx вполне подойдет. Выбор решения должен основываться не только и столько на приросте производительности, сколько на специфке решаемых задач и соображениях технологического удобства. А Apache, на наш взгляд, отличается большей гибкостью конфигурирования. Он может использоваться и как отдельный веб-сервер, и как бэкенд для Nginx, и как фронтенд для php-fpm.

Общая схема работы выглядит так: Nginx принимает запросы от пользователей, которые затем либо передает Apache, либо обрабатывает самостоятельно. Apache будут передаваться запросы, связанные с обработкой динамического контента — например, php-скриптов. Nginx самостоятельно обрабатывает запросы на отдачу статики — например, графики, JS, CSS, текстовых файлов, XML-файлов.

Apache обработав запрос и передав содержимое Nginx, отключается и переходе к обработке других запросов. Благодаря этому работа существенно ускоряется (что немаловажно, например, при медленном интернет-подключении).

Кроме того, раздачу динамических запросов можно ускорить с помощью сервера Memcached (см., например, инструкцию по установке и настройке здесь).

Обеспечиваем безопасность

Для расширения функциональности WordPress используются многочисленные плагины. В этих плагинах постоянно обнаруживаются различные уязвимости, и из-за этого некоторые системные администраторы относятся к ней несколько предвзято. Сайты на базе WordPress действительно часто становятся мишенью для атак, но со временем разработчики совершенствуют плагины, устраняя существующие бреши безопасности. Ниже мы дадим еще несколько советов по настройке WordPress, с помощью которых можно сделать сайт менее уязвимым.

Защититесь от вредоносных программ и уязвимостей в скриптах на сервере, на котором установлен WordPress. Мы рекомендуем использовать сканер ClamAV+Maldet. С инструкцией по установке и настройке AV можно ознакомиться здесь. Для поиска уязвимостей можно также воспользоваться программой WPScan.

Измените префикс таблиц в базе данных. По умолчанию в базе данных WordPress установлен префикс «wp_». Это упрощает использование уязвимостей с MySQL-инъекцией: если известно имя таблицы, в нее гораздо проще вставить вредоносный код, изменить в ней информацию или вообще удалить. В новых версиях WordPress появилась возможность выбора префикса при установке.

Если вы используете раннюю версию WordPress, то изменить префикс можно с помощью специализированных плагинов. Наиболее известным и популярным является Prefix Changer. Следует, однако, учесть, что многие из этих плагинов не всегда работают корректно, поэтому перед их использованием рекомендуется сохранить резервную копию базы данных.

Переместите файл wp-config.php. В файле wp-config.php хранятся важные параметры настройки WordPress, которую желательно защитить от несанкционированного доступа. По умолчанию этот файл сохраняется в корневом каталоге, но его можно переместить на каталог выше. Не обнаружив файла wp-config.php в корневом каталоге, WordPress будет искать его автоматически.

Получите SSL-сертификат и включите SSL-шифрование. Для этого в файл wp-config нужно добавить следующие строки:

/* Enable SSL Encryption */
define(‘FORCE_SSL_LOGIN’, true);
define(‘FORCE_SSL_ADMIN’, true);

Удалите информацию о версии WordPress. Если злоумышленник узнает, что вы используете устаревшую версию WordPress, то он может воспользоваться имеющимися уязвимостями и взломать ваш сайт. Поэтому информацию о версии лучше удалить.

Во-первых, нужно удалить файл: ваш_сайт/readme.html, из которого можно без труда узнать, какую версию WordPress вы используете.

Об используемой версии можно также узнать из файла header.php, который находится в папке с темой. Он содержит следующую строку:

<meta name="generator" content="WordPress " />

Можно удалить всю эту строку целиком. Если в файле header.php вашей темы оформления нет такой строки, то, скорее всего она вставляется автоматически WordPress’ом при вызове функции wp_head(). В таком случае удалить информацию о версии из секцииможно, добавив в файл functions.php следующий код:

remove_action(’wp_head’, ’wp_generator’);
function selectel_remove_version() {
return ’’;
}
add_filter(’the_generator’, ’selectel_remove_version’);

Измените ключи безопасности. В упомянутом выше файле wp-config.php есть раздел с ключами безопасности. Выглядит он так:

define(’AUTH_KEY’, ’’);
define(’SECURE_AUTH_KEY’, ’’);
define(’LOGGED_IN_KEY’, ’’);
define(’NONCE_KEY’, ’’);

Ключи используются для хэширования паролей. Очень часто на этот раздел не обращают внимания даже опытные пользователи. Между тем изменить ключи безопасности довольно просто: достаточно зайти на страницу https://api.wordpress.org/secret-key/1.1 и скопировать сгенерированные ключи в файл wp-config.php. Эту процедуру достаточно осуществить всего один раз во время первичной настройки сайта.

Ограничьте доступ к папкам wp-content и wp-includes. Из соображений безопасности рекомендуется закрыть доступ к содержимому папок wp-content и wp-includes. Нужно закрыть доступ к любым файлам, кроме графики, JS и СSS. Для этого нужно в каждой папке создать файл .htaccess и поместить в него такой код:

Order Allow,Deny
Deny from all
Allow from all

Создайте пустой файл wp-content/plugins/index.html. Благодаря этому станет недоступной информация о том, какие плагины вы используете. В плагинах WordPress могут содержаться уязвимости, и этим могут воспользоваться злоумышленники.

Чтобы сделать листинг недоступным, можно также добавить в файл .htaccess, хранящийся в папке с плагинами, следующую строку:

Options -Indexes

 

Ограничьте доступ к папке wp-admin.

Чтобы ограничить доступ, нужно в этой папке создать файл .htaccess и поместить в него следующий код:

AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName «Access Control»
AuthType Basic
order deny,allow
deny from all
# указываем, например. IP-адрес домашнего компьютера
allow from 
# здесь указываем адрес один или несколько IP-адресов, с которых мы будем писать в блог на работе
allow from 
allow from 

Ограничивать доступ определенным набором IP-адресов не всегда удобно. Можно настроить доступ к папке wp-admin только по паролю. Для этого нужно создать файл .htauth:

$ htpasswd -c /home/yourdirectory/.htauth

И поместить его на один уровень выше директории /public_html/
Затем нужно создать в папке wp-admin файл .htaccess и поместить в него следующий код:

AuthName «Admins Only»
AuthUserFile /home/yourdirectory/.htauth
AuthGroupFile /dev/null
AuthType basic
require user <имя пользователя>

 

Заключение

Настройка даже такой простой и интуитивно понятной CMS, как WordPress — дело довольно непростое и содержащее большое количество нюансов, на которые не всегда обращают внимание даже опытные пользователи.
Тянуто с Хабра

SoftEther VPN — продвинутый мультипротокольный VPN-сервер и клиент

В этой статье речь пойдет о VPN-сервере, который может поднимать L2TP/IPsec, OpenVPN, MS-SSTP, L2TPv3, EtherIP-серверы, а также имеет свой собственный протокол «SSL-VPN», который неотличим от обычного HTTPS-трафика (чего не скажешь про OpenVPN handshake, например), может работать не только через TCP/UDP, но и через ICMP (подобно pingtunnel, hanstunnel) и DNS (подобно iodine), работает быстрее (по заверению разработчиков) текущих имплементаций, строит L2 и L3 туннели, имеет встроенный DHCP-сервер, поддерживает как kernel-mode, так и user-mode NAT, IPv6, шейпинг, QoS, кластеризацию, load balancing и fault tolerance, может быть запущен под Windows, Linux, Mac OS, FreeBSD и Solaris и является Open-Source проектом под GPLv2?

То-то и оно. Такое пропустить нельзя.

Uh-oh, что же это за штука?

Скорее всего, вы раньше не слышали об этом проекте. Дело в том, что Daiyu Nobori (登 大遊) начал его разрабатывать, как только пошел в Тсукубский университет, и PPTP не заработал из сети кампуса. В 2003, когда ему было 18 лет, он выпустил первую версию SoftEther, и на него наехало правительство Японии, которое считало, что этот проект можно расценивать чуть ли ни как вредоносное ПО, т.к. оно позволяет обходить файрволлы (OpenVPN в то время еще только появлялся), а также может «навредить имиджу других VPN-продуктов» и запретило распространять программу. Он попытался объясниться, но т.к. из-за этого его могли, возможно, отчислить из университета, сильно он не настаивал и убрал программу из свободного доступа. Проходит некоторое время, и Mitsubishi Materials Corporation предлагает купить у него SoftEther 1.0 и подписать контракт на 10 лет (апрель 2004-апрель 2014), который дает корпорации право на продажу SoftEther и запрещает Daiyu Nobori продавать программу и/или основанные на ней, но в марте 2013 он начинает распространять SoftEther бесплатно, и вот только совсем недавно (4 января 2014) ее удалось открыть под GPLv2. К большому сожалению, сейчас еще пока остаются некоторые проблемы с копирайтом, поэтому в SoftEther до апреля 2014, вероятно, нельзя будет увидеть некоторые важные функции: аутентификация Radius / Active Directory, аутентификация по RSA-ключам, защита от DoS, Source IP ACL, Syslog transfer и Deep-inspect packet logging.

Описание

Чуть более подробно про возможности сервера:

  • Множество виртуальных хабов. Т.е. не каждый экземпляр сервера обслуживает только своих клиентов, а все в пределе одного сервера.
  • Remote-Access (клиент-к-LAN) и Site-to-Site (объединение двух и более LAN в одну) туннелей.
  • Поддержка L2TP/IPsec, OpenVPN, MS-SSTP, L2TPv3, EtherIP и своего протокола
  • VPN через ICMP и через DNS (только через свой протокол)
  • Dynamic DNS и NAT Traversal через бесплатный релей (да-да, можно поднять VPN сервер с серым IP!)
  • Логгирование
  • Встроенный firewall
  • Поддержка IPv6 в L3-режиме (ну и в L2, конечно, тоже)
  • Шейпинг трафика по группам пользователей либо по конкретным пользователям
  • SecureNAT (user-space NAT и DHCP-сервер). Удобно на не-серверных Windows
  • Поддержка VLAN
  • Поддержка QoS с автоматической приоритезацией

По заявлению автора, SoftEther работает быстрее эталонных реализаций.

ПО состоит из сервера, бридж-сервера, клиента, GUI (только Windows) и CUI утилит администрирования. Клиент нужен для подключения одного компьютера к LAN (Remote Access VPN), а бридж-сервер для соединения двух или более сетей (Site-to-Site VPN). К сожалению, CUI пока не очень хорошо задокументирован и запустить сервер только из CUI мне не удалось, пришлось воспользоваться Windows-версией сервера и GUI-утилитой. Нужно заметить, что GUI-утилита умеет работать не только с локальным сервером, т.е. можно запустить сам сервер на Linux, а администрировать его через GUI-утилиту под Windows. В GUI есть только основные настройки, для изменения продвинутых настроек придется лезть в конфиг или использовать CUI.

Вот вам несколько скриншотов GUI, чтобы было представление, что умеет сервер и как все легко настраивается.

Окно управления сервером
image

Окно управления хабом
image

Редактирование пользователя
image

ACL c возможностью симулировать packet loss и jitter
image

Security Policy для пользователя
image

Настройка SecureNAT
image

Настройка L2TP/IPSec
image

Настройка OpenVPN и SSTP
image

VPNGate

Проект VPNGate был создан для обхода блокировок со стороны администратора, провайдера или правительства. Вы можете запустить у себя SoftEther-сервер, поставить галочку «использовать vpngate», и пользователи, которым нужен бесплатный VPN, смогут найти ваш сервер в каталоге VPNGate и подключиться к нему, причем они не смогут получить доступ к диапазону приватных адресов вроде 192.168.0.0/16, а только до интернета. Также, SoftEther пишет логи пользователей, которые используют ваш сервер через VPNGate.

Заключение

Вот, наверное, и все. Буду с нетерпением ждать апреля, который, надеюсь, привнесет поддержку, как минимум, Radius и сертификатов.
На сайте хоть и мало документации по тонкой настройке SoftEther, но очень понятно, подробно и интересно расписано про сети и VPN в общем. Если у вас хорошо с английским и вы хотите узнать побольше про VPN, не поленитесь, почитайте документацию на сайте проекта. Ну, или хотя бы на картинки посмотрите.

SoftEther VPN
Репозиторий на github

Цельнотянуто с Хабра

Обзор VPN технологий

Недавно я искал информацию об отличиях существующих VPN-технологий и наткнулся на эту статью. Здесь вкратце описаны преимущества и недостатки основных VPN, очень легко и доступно.

VPN-провайдеры обычно предлагают на выбор несколько типов подключения, иногда как часть различных тарифных планов, а иногда в составе единого тарифного плана. Цель этой статьи – провести обзор доступных вариантов VPN и помочь понять основы используемых технологий.

Заметка про длину ключа шифрования

Грубо говоря, длина ключа, используемого при создании шифра, определяет, сколько времени потребуется для взлома с помощью прямого перебора. Шифры с более длинными ключами требуют значительно больше времени для перебора, чем более короткие («брутфорс» означает перебор всех возможных комбинаций, пока не будет найдена верная).

Сейчас почти невозможно найти VPN-шифрование с использованием ключа длиной менее 128 бит и все сложнее найти 256-битное шифрование в предлагаемых OpenVPN-решениях, ключи которых бывают даже 2048 бит. Но что означают эти цифры на практике, 256-битное шифрование действительно более безопасное, чем 128-битное?

Краткий ответ таков: при практическом применении – нет. Это правда, что взлом 256-битного ключа потребует в 2128 больше вычислительной мощности, чем взлом 128-битного ключа. Это означает, что потребуется 3.4х10^38 операций (количество комбинаций в 128-битном ключе) – подвиг для существующих компьютеров и даже в ближайшем будущем. Если бы мы применили самый быстрый суперкомпьютер (по данным 2011 года его скорость вычислений 10.51 петафлопс), нам потребовалось бы 1.02х10^18 (около 1 миллиарда) лет, чтобы взломать 128-битный AES-ключ путем перебора.

Так как на практике 128-битный шифр не может быть взломан путем перебора, было бы правильно говорить, что ключа такой длины более чем достаточно для большинства применений. Только настоящие параноики (например, чиновники в правительстве, имеющие дело со сверхсекретными документами, которые должны оставаться в тайне в течение следующих 100 или более лет) могут использовать 256-битное шифрование (правительство США, например, использует сертифицированный NIST 256-битный AES-шифр).

Так почему же все более часто встречаются VPN-провайдеры, предлагающие 256-битное шифрование (не говоря уже о 2048-битном)? Особенно если учесть, что использование шифрования с 256-битным или более длинным ключом требует больше вычислительных ресурсов. Ответ прост – маркетинг. Проще продать VPN-услуги с более длинным ключом шифрования.

Крупные корпорации и правительства могут испытывать потребность в дополнительной безопасности, обеспечиваемой длинными ключами, но для среднего домашнего пользователя VPN с ключом 128 бит более чем достаточно.

Различные шифры имеют уязвимости, которые могут быть использованы для быстрого взлома. Также могут быть использованы специальные программы, такие как клавиатурные шпионы. Подводя итоги, можно сказать, что использование шифрования с ключом более 128 бит на самом деле вряд ли имеет значение для большинства пользователей.

PPTP

Протокол туннелирования точка-точка (Point-to-Point Tunneling Protocol) – это протокол, изобретенный Microsoft для организации VPN через сети коммутируемого доступа. PPTP является стандартным протоколом для построения VPN уже на протяжении многих лет. Это только VPN-протокол и он опирается на различные методы аутентификации для обеспечения безопасности (наиболее часто используется MS-CHAP v.2). Доступен как стандартный протокол почти во всех операционных системах и устройствах, поддерживающих VPN, что позволяет использовать его без необходимости установки дополнительного программного обеспечения. PPTP остается популярным выбором как предприятий, так и VPN-провайдеров. Его преимущество также в том, что он использует меньше вычислительных ресурсов, следовательно обладает высокой скоростью работы.

Хотя PPTP обычно и используется со 128-битным шифрованием, в следующие несколько лет после включения этого протокола в состав Windows 95 OSR2 в 1999 году были найдены ряд уязвимостей. Наиболее серьезной из которых явилась уязвимость протокола аутентификации MS-CHAP v.2. Используя эту уязвимость, PPTP был взломан в течение 2 дней. И хотя компанией Microsoft была исправлена эта ошибка (за счет использования протокола аутентификации PEAP, а не MS-CHAP v.2), она сама рекомендовала к использованию в качестве VPN проколов L2TP или SSTP.

Плюсы:

  • клиент PPTP встроен почти во все операционные системы
  • очень прост в настройке
  • работает быстро

Минусы:

  • небезопасен (уязвимый протокол аутентификации MS-CHAP v.2 все еще много где используется)

L2TP и L2TP/IPsec

Протокол туннелирования 2 уровня (Layer 2 Tunnel Protocol) – это протокол VPN, который сам по себе не обеспечивает шифрование и конфиденциальность трафика, проходящего через него. По этой причине, как правило, используется протокол шифрования IPsec для обеспечения безопасности и конфиденциальности.

L2TP/IPsec встроен во все современные операционные системы и VPN-совместимые устройства, и так же легко может быть настроен как и PPTP (обычно используется тот же клиент). Проблемы могут возникнуть в том, что L2TP использует UDP-порт 500, который может быть заблокирован файрволлом, если вы находитесь за NAT. Поэтому может потребоваться дополнительная настройка роутера (переадресация портов). Кстати, протокол SSL, например, использует TCP-порт 443, чтобы быть неотличимым от обычного HTTPS-трафика.

Протокол IPsec на данный момент не имеет никаких серьезных уязвимостей и считается очень безопасным при использовании таких алгоритмов шифрования, как AES. Однако, поскольку он инкапсулирует данные дважды, это не так эффективно, как SSL-решения (например, OpenVPN или SSTP), и поэтому работает немного медленнее.

Плюсы:

  • очень безопасен
  • легко настраивается
  • доступен в современных операционных системах

Минусы:

  • работает медленнее, чем OpenVPN
  • может потребоваться дополнительная настройка роутера

OpenVPN

OpenVPN является достаточно новой технологией с открытым кодом, которая использует библиотеку OpenSSL и протоколы SSLv3/TLSv1, наряду с множеством других технологий для обеспечения надежного VPN-решения. Одним из его главных преимуществ является то, что OpenVPN очень гибок в настройках. Этот протокол может быть настроен на работу на любом порту, в том числе на 443 TCP-порту, что позволяет маскировать трафик внутри OpenVPN под обычный HTTPS (который использует, например, Gmail) и поэтому его трудно заблокировать.

Еще одним преимуществом OpenVPN является то, что используемые для шифрования библиотеки OpenSSL поддерживают множество криптографических алгоритмов (например, AES, Blowfish, 3DES, CAST-128, Camelia и другие). Наиболее распространенные алгоритмы, которые используют VPN-провайдеры – AES и Blowfish. AES является новой технологией, и хотя оба считаются безопасными, тот факт, что он имеет 128-битный размер блока, а не 64-битный как у Blowfish, означает, что он может работать с большими (более 1Гб) файлами лучше. Различия, однако, довольно незначительные. То, как быстро работает OpenVPN, зависит от выбранного алгоритма шифрования, но, как правило, работает быстрее, чем IPsec.

OpenVPN стал технологией №1 при использовании VPN, и хотя он изначально не поддерживается операционными системами, этот протокол широко поддерживается через стороннее программное обеспечение. Совсем недавно невозможно было использовать OpenVPN на iOS и Android без джейлбрейка и рута, а сейчас появились сторонние приложения, которые частично решили эту проблему.

С этим связана другая проблема OpenVPN – гибкость может сделать его неудобным в настройке. В частности, при использовании типовой программной реализации OpenVPN (например, стандартный открытый клиент OpenVPN под Windows) необходимо не только скачать и установить клиент, но и загрузить и установить дополнительные конфигурационные файлы. Многие VPN-провайдеры решают эту проблему путем использования преднастроенных VPN-клиентов.

Плюсы:

  • гибко настраивается
  • очень безопасен (зависит от выбранного алгоритма шифрования, но все они безопасны)
  • может работать сквозь файрволлы
  • может использовать широкий спектр алгоритмов шифрования

Минусы:

  • необходимо стороннее программное обеспечение
  • может быть неудобен в настройке
  • ограниченная поддержка портативными устройствами

SSTP

Протокол безопасного туннелирования сокетов (Secure Socket Tunneling Protocol) – был представлен Microsoft в Windows Vista SP1, и хотя он теперь доступен на Linux, RouterOS и SEIL, он по-прежнему используется в значительной степени только Windows-системами (есть очень маленький шанс, что он появится на Apple устройствах). SSTP использует SSL v.3 и, следовательно, предлагает аналогичные преимущества, что и OpenVPN (например, возможность использовать TCP-порт 443 для обхода NAT), а так как он интегрирован в Windows, он проще в использовании и более стабилен, чем OpenVPN.

Плюсы:

  • очень безопасен (зависит от алгоритма шифрования, обычно используется очень стойкий AES)
  • полностью интегрирован в Windows (начиная с Windows Vista SP1)
  • имеет поддержку Microsoft
  • может работать сквозь файрволлы

Минусы:

  • работает только в Windows-среде

Заключение

PPTP небезопасен (даже его создатели в Microsoft отказались от него), поэтому его использования следует избегать. В то время, как простота установки и кроссплатформенная совместимость являются привлекательными, L2TP/IPsec имеет те же преимущества и является более безопасным.

L2TP/IPsec является хорошим решением VPN, но не таким хорошим, как OpenVPN. Однако, для быстрой настройки VPN без необходимости установки дополнительного программного обеспечения остается лучшим решением, особенно для мобильных устройств, где поддержка OpenVPN по-прежнему на низком уровне.

OpenVPN является лучшим решением VPN несмотря на необходимость стороннего программного обеспечения во всех операционных системах. Это надежный, быстрый и безопасный протокол, хотя и требует немного больше усилий, чем другие протоколы.

SSTP предлагает большинство преимуществ OpenVPN, но только в среде Windows. Это означает, что он лучше интегрирован в ОС, но благодаря этому он слабо поддерживается VPN-провайдерами.

Большинство пользователей могут использовать OpenVPN на своих настольных компьютерах, возможно, дополнив его L2TP/IPsec на своих мобильных устройствах.

Цельнотянуто с Хабра

Список Full-Mesh VPN решений

Введение

Многие интересуются Full-Mesh (или P2P) VPN, хотят использовать их для игр с друзьями, для связи удаленных офисов, серверов, да для чего угодно. Обычные VPN, вроде OpenVPN или PPTP, пропускают весь трафик через центральный сервер, а Full-Mesh соединяются непосредственно с нодами, зачастую пробивая NAT.

Со своими серверами (преимущественно для игр):

Tunngle
Basic и Premium. Только Windows.

VPN для игр, аналог Hamachi. Zero-config через сервер программы. Чат с возможностью передачи файлов, голосовой чат на основе Ventrillo и Mumble. Имеется мини-файрволл.
В бесплатной версии можно создавать комнату до 32 человек, которая удаляется
после 3 дней неактивности. Нельзя настравать мини-файрволл, он блокирует порты
1-1024 и все протоколы, кроме tcp, udp и icmp. Пробивает NAT.
Premium дает возможность создавать комнаты до 255 человек, скрывать комнаты из
каталога, изменять ник, использовать QoS, настраивать мини-файрволл,
использовать ник вместо ip (dns).

Social VPN
Open Source. Windows и Linux. C#.

Zero-config с XMPP в качестве бекенда, интеграция с Gtalk. Пробивает NAT, соединяется напрямую, или использует свои сервера, если это невозможно. Есть DNS.

Remobo
Free. Windows, Linux и MacOS.

Аналог Hamachi, zero-config через сервер программы. Имеется встроенный чат. Возможно использовать другие компьютеры в качестве прокси. Пробивает NAT.
Есть PRO-версия, которая отличается наличием демона с CLI.

Без своих серверов:

NeoRouter
Free. Windows, Linux, MacOS, FreeBSD, Android.

Есть portable-версия и веб-клиент. Поддержка IPv6, пробивает NAT.

GBridge
Бесплатно. Только Windows.

Zero-config через Gtalk и Gmail. VPN, VNC, Шаринг, синхронизация и бекап файлов.
Генерация превью к картинкам, создание каталогов, стриминг аудио и видео (используется web-интерфейс).
Пробивает NAT, сервер-нода отсутствует.

P2PVPN
Open Source. Windows и Linux. Java.

VPN и чат между пирами. Используется BitTorrent (а конкретно трекер OpenBitTorrent) для поиска пиров вашей сети. NAT не пробивает, требует открытого порта хотя бы у одного участника сети, сервер-нода отсутствует.
Проект немного заглох, последяя версия вышла в 2010.

Wippien
Open Source. Windows и Linux.

Использует XMPP в качестве бекенда, интеграция с Gtalk. Пробивает NAT.

Для серверного использования:

tinc
Open Source. Windows, Linux, *BSD, MacOS, Solaris, iPhone.

Старый проект, легкое конфигурирование, сервер-ноды нет. Поддержка IPv6, пробивает NAT.

PeerVPN
Open Source, Linux и FreeBSD. Неофициальные порты для MacOS и Windows.

Поддержка IPv6, пробивает NAT.

 

Автор статьи ValdikSS

Кратко о настройке Samba

Для расшаривания файлов с сервера под linux в сеть Windows используем Samba сервер.

Установка Samba:

sudo apt-get install samba

Настройка.
Самба хранит все свои настройки в файле /etc/samba/smb.conf. Откроем его для редактирования

sudo nano /etc/samba/smb.conf

Каждый раздел файла начинается с заголовка раздела: [global], [homes], [printers], и т.п.

В [global] определяются глобальные настройки для всего сервера.
Раздел [homes] позволяет удаленным пользователям иметь доступ к своим (и только своим) домашним директориям на сервере. Т. е., если к серверу подключиться пользователь user1, то он будет подключены к своему домашнему каталогу. Для этого он должен быть зарегистрированы на сервере.
В [printers] прописаны настройки для принтеров.

Глобальные настройки:

[global]
; куда записывать логи
log file = /var/log/samba/log.%m
; максимальный размер файла журнала
max log size = 1000

# имя самба сервера в сетевом окружении
netbios name = HomeServer
; коментарий самба сервера
server string = Home Server Ubuntu
; Рабочая группа
workgroup = WORKGROUP
; выступать как контролер домена
domain master = no

; привязка к интерфейсам, на каких слушать, если не указано
;слушает на все интерфейсах, можно указать ай-пи адреса
interfaces = lo, eth2

; подчиняться директивам учетных записей PAM и управлению сессиями
obey pam restrictions = yes
; шифрование паролей между сервером и клиентом
encrypt passwords = true
; параметр сообщают демону smbd что делать с запросами,
; которые не удалось аутентифицировать в UNIX
; bad user – запросы с неправильным паролем будут отклонены, если
; такое имя пользователя существует. Если не существует, то такие запросы
; будут считаться как попытки зайти гостем (guest account).
map to guest = bad user

; определяет будет ли демон nmbd делать запрос к DNS, если WINS
; не смог разрешить NetBIOS имя
dns proxy = no

; параметр заставляет синхронизировать пароль UNIX с паролем SMB при
; изменении зашифрованного пароля SMB в файле smbpasswd. При включении
; этого параметра (yes) от пользователя ROOT вызывается программа,
; определенная в параметре passwd program, что позволяет установить
; новый пароль UNIX без доступа к старому паролю UNIX
unix password sync = yes
; имя программы, которую можно использовать для смены паролей UNIX,
; любые вхождения %u будут заменены именем пользователя
passwd program = /usr/bin/passwd %u
; механизм для хранения информации о пользователях
passdb backend = tdbsam

; уровень отладки журналов событий, которые будут записываться
; в системный syslog, 0 - события LOG_ERR, 1 - LOG_WARNING,
; 2 — LOG_NOTICE, 3 - LOG_INFO.
syslog = 0

; режим работы Samba:
; share - уровень ресурсов,
; user - уровень пользователей, доступ по логин-паролю,
; domain - домен,
; server - сервер паролей,
; ads - Active directory
security = user

; не аутентифицированные пользователи получают доступ к общим
; ресурсам пользователей
usershare allow guests = yes

panic action = /usr/share/samba/panic-action %d
os level = 20

; если включено, для смены паролей будет использован PAM, вместо
; программы указанной в параметре passwd program
pam password change = yes

; разрешаем доступ для всех со своей подсетки и локалхоста
hosts allow = 192.168.10. 127.

; пользователь с root-правами
admin users = user1

; выступать сервером времени
time server = yes

Основные настройки сделаны. Теперь расшарим нужные папки.

Расшариваем домашние папки пользователей

[HOMES]
; комментарий
comment = Home directories
; путь к папке, %U = имя пользователя
path = /home/samba/homes/%U
; только для чтения?
read only = no
; вход с паролем?
public = no
; запись разрешена?
writable = yes
; права создаваемых файлов и папок
create mask = 0600
directory mask = 0700
; отображать в списке ресурсов в сетевом окружении?
browseable = no

Далее расшариваем нужные папки. Для каждой папки можно определить свои параметры доступа. Для этого дописываем в конец конфиг-файла smb.conf разделы как представлено в примере ниже.

Пример:

; создадим расшаренную папку files
[files]
; комментарий к создаваемой папке
comment = Media files
; путь к папке
path = /home/user1/files
; будем разрешать доступ только по паролю
public = yes
; не видно в сетевом окружении всем кроме владельцев
printable = no
; запрещаем запись всем
writable = no
; и разрешаем запись для user1 и пользователям из группы adm
write list = user1 @adm

По аналогии создаются все остальные шары.

Для добавления пользователей в Samba делаем следующее:
smbpasswd -a username

Вам будет предложено ввести пароль, пользователь будет добавлен в базу, теперь необходимо включить этого пользователя.
smbpasswd -e username

Для проверки правильности сделанных настроек выполните команду
testparm

если testparm сообщает об отсутствии проблем, то smbd правильно загрузит файл настроек.

Не забудьте перезапустить Samba после изменения конфиг-файла.
sudo /etc/init.d/samba restart

Если будете расшаривать внешние устройства, нтфс диски и т. д., не забудьте добавить пользователя в группу plugdev.

После того как вы настроите самбу как вам нужно, выполните в терминале команду
testparm
Результатом будет вывод состояния smb-сервера и список расшаренных ресурсов. Если настройки сделаны не правильно, вы увидите сообщение об ошибке, из которой легко поймете, где ошиблись.
Будем считать, что у вас есть сервер с ip-адресом 192.168.1.1 и ваш рабочий компьютер с адресом 192.168.1.2
Пропингуйте сервер с рабочего компьютера:
ping 192.168.1.1
Также пропингуйте рабочий компьютер с сервера:
ping 192.168.1.2
Если пинги идут, значит с сетью все в порядке. Если пинги не проходят, проверьте ваш файл /etc/hosts. Также проблема может быть в DNS-сервере (если он у вас установлен), в роутере, хабе, кабелях.

Если пинги идут, но вы все еще не видите расшаренные папки, выполните команду
smbclient -L 192.168.1.1
Вы должны увидить список доступных расшаренных ресурсов. Если вы получите сообщение «Bad password»,
проверьте, параметры hosts allow, hosts deny и valid users в файле smb.conf. Попробуйте временно закоментировать их.

Выполнение этих простых тестов, позволяет устранить большинство проблем, связанных с настройкой и использование Samba.

Автор статьи — Ильдар Галиуллин

Сервер видеонаблюдения на базе Ubuntu

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

Подключим вебкамеру (можно использовать практически любую недорогую камеру), проверим, доступна ли она:

ls /dev/video*

В выводе команды видим строку /dev/video0. Если подключено несколько камер, соответственно каждая следующая будет идти по порядку video1, video2 и т. д. Если вместо этого видим строку:

ls: невозможно получить доступ к /dev/video*: Нет такого файла или каталога

значит ваша камера не подключена или не найден нужный драйвер. Необходимо поставить его отдельно.

Определившись с камерами, установим пакет motion:

sudo apt-get install motion

Приступим к настройке программы. Настраиваем захват видео с камеры при обнаружении движения в кадре. Т.е. запись в файл начинается, если motion фиксирует движение, экономим свободное пространство на винте.
Конфигурационный файл находится в /etc/motion/motion.conf
Открываем его текстовым редактором nano.

sudo nano /etc/motion/motion.conf

Конфиг подробно прокомментирован:

# Start in daemon (background) mode and release terminal (default: off)
#Старт как демон,по умолчанию он в off
daemon on# Videodevice to be used for capturing (default /dev/video0)
# for FreeBSD default is /dev/bktr0
#устройство для захвата должно быть по умолчанию /dev/video0 если несколько то соответственно /dev/video1 /dev/video2 и т.д.
videodevice /dev/video0

# Image width (pixels). Valid range: Camera dependent, default: 352
#Разрешение камеры  320х240, 640х480 …
width 640

# Image height (pixels). Valid range: Camera dependent, default: 288
height 480

# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
# Определим количество fps;
framerate 30 (30 подойдет, но можете менять в зависимости от нагрузки на компьютер)

# Gap is the seconds of no motion detection that triggers the end of an event
# An event is defined as a series of motion images taken within a short timeframe.
# Recommended value is 60 seconds (Default). The value 0 is allowed and disables
# events causing all Motion to be written to one single mpeg file and no pre_capture.
gap 60

# Maximum length in seconds of an mpeg movie
# When value is exceeded a new mpeg file is created. (Default: 0 = infinite)
#ОЧЕНЬ ВАЖНЫЙ ПАРАМЕТР!
Продолжительность файла можно ограничить параметром max_mpeg_time, указав в качестве значения время в секундах.
max_mpeg_time 180

# Output ‘normal’ pictures when motion is detected (default: on)
# Valid values: on, off, first, best, center
# When set to ‘first’, only the first picture of an event is saved.
# Picture with most motion of an event is saved when set to ‘best’.
# Picture with motion nearest center of picture is saved when set to ‘center’.
# Can be used as preview shot for the corresponding movie.
#Тип скриншота с движением,по умолчанию on - сохранять все подряд - кушает много места
 ставим или best, или first
output_normal off

# Output pictures with only the pixels moving object (ghost images) (default: off)
#Оставим как есть
output_motion off

# Use ffmpeg to encode mpeg movies in realtime (default: off)
#ВАЖНЫЙ ПАРАМЕТР! Указывает motion что сохраняем видео,
#нам видео, по умолчанию стоит off переключаем на on
ffmpeg_cap_new on

# Codec to used by ffmpeg for the video compression.
# Timelapse mpegs are always made in mpeg1 format independent from this option.
# Supported formats are: mpeg1 (ffmpeg-0.4.8 only), mpeg4 (default), and msmpeg4.
# mpeg1 – gives you files with extension .mpg
# mpeg4 or msmpeg4 – gives you files with extension .avi
# msmpeg4 is recommended for use with Windows Media Player because
# it requires no installation of codec on the Windows client.
# swf – gives you a flash film with extension .swf
# flv – gives you a flash video with extension .flv
# ffv1 – FF video codec 1 for Lossless Encoding ( experimental )
# mov – QuickTime ( testing )
#тип используемого кодека.
ffmpeg_video_codec mpeg4

# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
#путь для сохранения видео и скринов.
target_dir /home/user/new

# The mini-http server listens to this port for requests (default: 0 = disabled)
#Это порт  доступа на localhost.
webcam_port 7777

# Quality of the jpeg images produced (default: 50)
#
webcam_quality 50

# Output frames at 1 fps when no motion is detected and increase to the
# rate given by webcam_maxrate when motion is detected (default: off)
#Поставим 20
webcam_motion 20

# Maximum framerate for webcam streams (default: 1)
#Поставим 20
webcam_maxrate 20

# Restrict webcam connections to localhost only (default: on)
#
webcam_localhost off

Настройка конфига закончена, запускаем motion (с правами суперпользователя обязательно):

sudo motion -n

Если не стартует, то заведем так:

LD_PRELOAD=/usr/lib/libv4l/v4l2convert.so motion -n

если библиотека v4l2convert.so не установлена, то установим ее:

sudo apt-get install libv4l-0

Смотрим на вывод, видим лог запуска мини http-server.
Теперь откроем браузер и введем в адресной строке

http://localhost:7777

Теперь  камера наблюдает за происходящим, если в поле зрения попадает движущийся объект то сразу стартует запись, после того как объект выходит из поля зрения камеры, запись продолжается 180 секунд, далее ролик не пишется. Таким образом, motion ведет запись только в случае обнаружения движения.
Так же для более четкого отображения записей задаем параметры:

snapshot_filename %Y-%m-%d/snapshot/%H-%M-%S
jpeg_filename %Y-%m-%d/jpeg/%H-%M-%S-%q
movie_filename %Y-%m-%d/movie/%H-%M-%S-%v

Теперь каждые сутки пишутся в отдельные папки, что очень удобно для просмотра.

Настройка захвата
Секция “Motion Detection Settings”, находящаяся в самом конце конфигурационного файла, отвечает за настройку обнаружения движущихся объектов. Если камера стоит в комнате, и объект перекрывает объектив, проблем с обнаружением нет. Настройка нужна в том случае, когда камера контролирует значительную территорию, где объект имеет небольшой размер, и срабатывание может быть вызвано движением веток деревьев, проходящими машинами и другими помехами.

Параметры:

Threshold позволяет указать количество пикселей, меняющихся для срабатывания детектора, а minimum_motion_frames – количество кадров, в котором они зафиксированы. Подобрав эти значения, можно сделать так, что Motion не будет замечать пролетающую птицу, но без проблем реагировать на человека. Фильтры для сглаживания шума включаются при помощи despeckle. По умолчанию используется оптимальное значение EedDl. При появлении проблем следует поэкспериментировать, убирая буквы в сочетании EedDl и пробуя их в разных комбинациях (подробнее о despeckle смотри на WiKi Motion и на emit.demon.co.uk/motion).

Параметры noise_level, noise_tune, night_compensate и lightswitch отвечают за уровень порога шума и компенсацию темных и светлых участков.

Комбинация параметров pre_capture, post_capture и gap позволяет записать сцену, где будет зафиксирован объкт до и после того, как было обнаружено движение. Значение gap по умолчанию установлено в оптимальные 60 (секунд), если движение не будет обнаружено, то создается новый видеофайл, а старый удаляется. Чтобы захваченный файл не был большим, его продолжительность можно ограничить параметром max_mpeg_time, указав в качестве значения время в секундах.

Параметров в motion.conf очень много, лучший способ  — это вдумчивое курение man’а и тематических форумов, ну а в базовом варианте — простейшая система видеонаблюдения готова к эксплуатации.