add-apt-repository: command not found

Дата: 22.06.2017Метки:

Часто при заказе VPS на сервер устанавливается система с минимальным набором пакетов. Вот недавно на новом VPS при выполнении команды add-apt-repository получил вот такую ошибку:

add-apt-repository: command not found

Для решения проблемы необходимо установить следующие пакеты:

apt-get install software-properties-common python-software-properties

Установка PHP 5.6 в Ubuntu 16.04

Дата: 22.06.2017Метки: ,

В Ubuntu 16.04 Xenial уже давно из репозитория убрали PHP 5.6 и вместо него по умолчанию устанавливается новая версия PHP 7.0. Но как быть тем, кто по той или иной причине не может перейти на новую версию? В этом случае, если вы хотите использовать PHP 5.6 вам необходимо предварительно добавить репозиторий для старой версии.

Добавим ppa-репозиторий в систему:

sudo add-apt-repository ppa:ondrej/php
upt-get update

Далее запускаем установку PHP 5.6 и дополнительно указываем необходимые модули:

sudo apt-get install php5.6-mbstring php5.6-mysql php5.6-gd php5.6-xml

SMART мониторинг SSD в Linux

Дата: 21.06.2017Метки:

У каждого производителя SSD есть специализированная утилита для мониторинга состояния диска в Windows. Что касается Linux, то ситуация состоит сложнее. По моему опыту я сталкивался с наличием такой утилиты под Linux только для PRO и энтерпрайз серии SSD дисков. Но если говорить по сути, то особой нужды в них нет. В качестве альтернативы мы будем использовать утилиту smartmontools доступную для большинства дистрибутивов Linux.

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

yum install smartmontools

Для Debian и Ubuntu аналогично:

apt-get install smartmontools

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

find /dev -name 'sd*'

Теперь, когда известно название диска, можем вывести информацию SMART. У меня результат выполнения команды выглядит следующим образом:

# smartctl -A /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-514.21.1.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
  9 Power_On_Hours          0x0032   099   099   000    Old_age   Always       -       215
 12 Power_Cycle_Count       0x0032   099   099   000    Old_age   Always       -       9
177 Wear_Leveling_Count     0x0013   100   100   000    Pre-fail  Always       -       0
179 Used_Rsvd_Blk_Cnt_Tot   0x0013   100   100   010    Pre-fail  Always       -       0
181 Program_Fail_Cnt_Total  0x0032   100   100   010    Old_age   Always       -       0
182 Erase_Fail_Count_Total  0x0032   100   100   010    Old_age   Always       -       0
183 Runtime_Bad_Block       0x0013   100   100   010    Pre-fail  Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
190 Airflow_Temperature_Cel 0x0032   069   063   000    Old_age   Always       -       31
195 Hardware_ECC_Recovered  0x001a   200   200   000    Old_age   Always       -       0
199 UDMA_CRC_Error_Count    0x003e   100   100   000    Old_age   Always       -       0
235 Unknown_Attribute       0x0012   099   099   000    Old_age   Always       -       2
241 Total_LBAs_Written      0x0032   099   099   000    Old_age   Always       -       1357065631

Теперь немного информации о данных, которые содержат важную информацию о состоянии вашего диска. В первую очередь обратите внимание на значение RAW_VALUE для параметра Reallocated_Sector_Ct — количество переназначенных секторов. Нулевое значение говорит нам, что диск в полном порядке. Далее обратите внимание на Power_On_Hours, параметр отображает информацию о суммарном времени работы диска. Информация может быть полезна при аренде сервера и дает общее представление о времени его работы. Далее второй по значимости параметр Total_LBAs_Written — общее количество записанных байт.

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

fdisk -l /dev/sda

Установка ionCube Loader в Ubuntu 16.04

IonCube — расширение модуля PHP, которое загружает зашифрованные файлы PHP и ускоряет выполнение PHP-скриптов. Для установки ionCube необходимо прописать соответствующий модуль в файл конфигурации php.ini. Краткий мануал по установке ionCube Loader в Ubuntu 16.04. Предварительно система подготовлена следующим образом. На сервер автоматически установлен PHP 7 вместе с установкой панели Vesta.

Скачиваем последнюю версию Ioncube Loader для системы 64-bit:

cd /tmp
wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz

Или Ioncube Loader для системы 32-bit:

cd /tmp
wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz

Распаковываем:

tar xfz ioncube_loaders_lin_x86.tar.gz

Что бы определить расположение файла php.ini выполните команду:

php --ini |grep Loaded
Loaded Configuration File:         /etc/php/7.0/cli/php.ini

Следует отметить что путь будет указан для php-cli, каталог для php.ini модуля php-fpm должен быть на уровень выше.

Выясним расположение каталога модулей PHP:

# php -i |grep extension_dir
extension_dir => /usr/lib/php/20151012 => /usr/lib/php/20151012

Копируем модуль Ioncube Loader в каталог с расширениями:

cd /tmp/ioncube
cp ioncube_loader_lin_7.0.so /usr/lib/php/20151012

Добавим загрузку модуля в файл php.ini. Откройте файл:

nano /etc/php.ini

И добавьте в его начало следующую строку:

zend_extension = "/usr/lib/php/20151012/ioncube_loader_lin_7.0.so"

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

Перезапустим php-fpm или apache:

service restart apache2
service restart php-fpm

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

# php -v
PHP 7.0.15-0ubuntu0.16.04.4 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with the ionCube PHP Loader (enabled) + Intrusion Protection from ioncube24.com (unconfigured) v6.0.8, Copyright (c) 2002-2015, by ionCube Ltd.

Проксирование в Nginx

Дата: 20.05.2017Метки:

Простой пример конфига Nginx для проксирования HTTP трафика. Смысл заключается в том, что бы перенаправить запросы с frontend сервера, который у меня обозначен как 1.1.1.1 на back-end сервер 2.2.2.2. Дополнительно мы включаем кэширование, что позволяет существенно снизить нагрузку на сервер.

Для начала кратко напишу про настройки кэширования Nginx. В proxy_cache_path мы указываем расположение кэша. Для максимальной производительности я буду хранить его в оперативной памяти. Параметр levels задаёт уровни иерархии кэша. В нашем случае файлы будут сохранятся в каталог по аналогии примеру ниже:

/var/run/proxy_cache/c/29/b7f54b2df7773722d382f4809d65029c

Далее мы указываем имя зоны, время хранения файлов и размер кэша. Если к данным не обращаться более 8 минут, то закэшированные элементы будут удалены. Директива proxy_cache_key используется для создания схемы идентификации — оставляем без изменений. В proxy_cache_valid задаем время кэширования кодов ответа.

В директивах listen 1.1.1.1:80 и server_name proxy.com мы указываем ip-адрес и доменное имя сервера на котором запущен Nginx. После чего proxy_pass указываем адрес сервера на который будут передаваться запросы.

proxy_cache_path /var/run/proxy_cache levels=1:2 keys_zone=backcache:8m max_size=100m;
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

server {
    listen 1.1.1.1:80;
    server_name proxy.com;

    location / {
        proxy_pass http://2.2.2.2;

        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_cache backcache;
        proxy_cache_bypass $http_cache_control;
        add_header X-Proxy-Cache $upstream_cache_status;
    }
}

Ограничить количество одновременных подключений в iptables

Дата: 26.04.2017Метки:

Допустим у вас есть обычный VPS, где крутится популярный среди группы людей сайт и вы хотите защитить его от примитивных атак недоброжелателей. Основная задача которых состоит в том, что бы вызвать исчерпание вычислительных ресурсов VPS с помощью искусственно спровоцированной нагрузки на сервер. В следствие которой, память уйдет в swap и подключится к серверу станет проблематично.

В таком случае для ограничения потребления ресурсов сервера наиболее эффективно использовать cgroups — механизм ядра, который ограничивает вычислительные ресурсы для групп процессов. Используя cgroups мы можем предотвратить полную утилизацию вычислительных ресурсов процессора и памяти сервера, которые могут вызваны нагрузкой на веб-сервер и PHP. Таким образом мы всегда можем сохранить контроль над сервером и обеспечить доступ к серверу по SSH.

О использовании cgroups я постараюсь рассказать позже. Но даже если правильно настроить cgroups, в случае всплеска нагрузки, работа сайта будет нарушена. Как вариант решения проблемы предлагаю с помощью iptables ограничить количество одновременных подключений к серверу. Таким образом можно попытаться отсечь основной источник нагрузки, сохранив доступность ресурса для других посетителей.

Ситуацию я привел в качестве примера, но думаю, что ее можно адаптировать для других задач. Теперь переходим непосредственно к примеру, для начала добавьте следующие правила в iptables:

iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT

Здесь мы разрешаем все входящие соединения на порт 80 нашего сервера. Чтобы ограничить количество одновременных подключений к серверу с одного ip-адреса, необходимо добавить следующие правила:

iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 --connlimit-mask 32 -j DROP

Это правило устанавливает ограничение на 30 одновременных подключений с одного ip-адреса.

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

iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 500 -j DROP

Пример готового скрипта для ограничения подключений к серверу:

iptables -F INPUT 
iptables -P INPUT DROP 
iptables -P FORWARD ACCEPT 
iptables -P OUTPUT ACCEPT 
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP 
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 2 -j DROP

Установка Deluge в Ubuntu Gnome

Из множества BitTorrent-клиентов мне больше всего приглянулся Deluge. Программа состоит из двух независимых компонентов: демона и клиента. Их можно установит сразу на один компьютер, в таком случае Deluge будет работать как большинство обычных BitTorrent-клиентов. Или если у вас NAS, можно установить демон отдельно на сервер, а клиент Deluge на домашний компьютер. После чего удаленно управлять загрузками.

В плане оформления Deluge имеет простой и лаконичный GUI, который использует библиотеку GTK+, а значит не будет выделятся на фоне общего оформления Gnome. За обмен данными по протоколу BitTorrent отвечает библиотека libtorrent, которая поддерживает большинство функций протокола.

По сути нет ничего сложного в установке Deluge в Ubuntu Gnome, но есть некоторые нюансы, которые можно забыть со временем.

Для начала устанавливаем демон и клиент Deluge:

sudo apt-get install deluged
sudo apt-get install deluge

Далее настроим автозапуск Deluge, для этого идем в Gnome Tweak Tool — Startup Applications — жмем ‘+’ и выбираем из списка Deluge. Теперь каждый раз при входе в систему Deluge будет запускаться автоматически.

Было бы удобно, если бы при автозапуске и закрытии программа сворачивалась в трей: открываем Deluge — Edit — Preferences — Interface — и ставим галочки напротив Enable system icon tray, Minimize to tray on close, Start in tray.

И напоследок хочу отметить, что лично мне не нравится расположение и вид трея в Gnome. Я предпочитаю перенести его в верхнюю часть экрана. Установим дополнение TopIcons из каталога дополнений Gnome. Переходим в Gnome Tweak Tool — Extension и включаем дополнение TopIcons. На этом установка и настройка Deluge в Ubuntu Gnome закончена.

Переключение раскладки GNOME

В отличии от Fedora в процессе установки Ubuntu GNOME нельзя выбрать сочетания клавиш для переключения раскладки клавиатуры. Установил я систему, но Alt-Shift ни Ctrl-Shift тут не работают. По умолчанию для переключения раскладки используются Super + Space. Стандартным способом изменить раскладку можно через Settings — Keyboard — Typing — Switch to next input source.

Вот только назначить Ctrl-Shift тут нельзя, возможность выбора сочетаний ограничена до невозможности. Что подтолкнуло разработчиков к такому решению остается только догадываться. Я уж думал плюнуть на это дело и забыть. Но как оказалось, я не тот человек, который быстро меняет свои привычки. Как не пытался, а рука сама нажимает привычные мне клавиши.

Случайно в процессе работы наткнулся на необходимые мне настройки. Изменить переключения раскладки клавиатуры на привычные сочетания можно через Gnome Tweak Tool переходим в Typing — Switch to another layout. Выбираем привычные Alt-Shift или Ctrl-Shift и продолжаем радоваться жизни.

Установка Chrome и Chromium в Ubuntu

Многие уже слышали про прекращение дальнейшей разработки Unity в Ubuntu. Это решение было настолько неожиданно, что многие приняли эту новость за очередную утку. Теперь по умолчанию место Unity в Ubuntu будет занимать Gnome 3. Лично для меня это отличный повод перейти на Ubuntu, а вместе с тем я начинаю цикл записей о том как довести ее до рабочего состояния.

И так сегодня я установил на свой домашний компьютер последнюю версию Ubuntu GNOME 17.04 (Zesty Zapus). Первые впечатления сложились положительные. Система ведет себя достаточно стабильно. И первое, что я сделаю на новой системе выполню установку Chrome. Дополнительно в этой записи я расскажу об установке Chromium. Какой из браузеров устанавливать зависит от ваших личных предпочтений.

Установить Google Chromium в Ubuntu

Начну я пожалуй с установки Chromium в Ubuntu. Если я не ошибаюсь, Chromium полностью соответствует версии браузера после установки пакета google-chrome-unstable. Для установки Chromium в Ubuntu достаточно просто выполнить команду:

sudo apt-get install chromium-browser

В Gnome после установки Chromium по аналогии с Firefox отображается заголовок окна. Не смотря на то, что он добавлен для соответствия концепции интерфейса Gnome, я предпочитаю его отключить. Для этого в настройках Chromium нужно убрать галочку возле опции Use system title bar and borders.

Установить Flash для Chromium в Ubuntu

Если на этапе установки Ubuntu вы выбрали установку программного обеспечения от сторонних производителей, то дополнительно устанавливать Flash не потребуется. В противном случае необходимо включить дополнительный репозиторий. Я использую английскую локализацию поэтому описание приложений и элементов меню будет на английском.

Что бы установить Flash для Chromium в Ubuntu включаем репозиторий Canonical partners. Для этого переходим в Software and Updates — Other Software — установить галочку напротив Canonical partners.

Далее в терминале выполнить:

sudo apt update
sudo apt install adobe-flashplugin

Проверить поддержку HTML5, H.264 и Flash можно на странице youtube.com.

Установить Chrome в Ubuntu

Чтобы установить браузер Chrome из репозитория, откройте терминал и выполните следующие команды:

wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -

Если у вас установлена Ubuntu 64-Bit:

sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

Или для Ubuntu 32-Bit:

sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

Обновляем локальный кэш пакетов и запускаем установку:

sudo apt-get update
sudo apt-get install google-chrome-stable

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

sudo apt-get install google-chrome-beta
sudo apt-get install google-chrome-unstable

Зомби процессы в Linux

Дата: 10.04.2017Метки:

Если в вашей системе завелись зомби процессы, не расстраивайтесь. Не смотря на страшное название зомби процесс не может нанести серьезный вред вашей системе. Для начала давайте разберемся как обычный процесс превращается в зомби.

Когда дочерний процесс получает команду на завершение, он освобождает все используемые ресурсы и продолжает как зомби существовать в системе с ранее присвоенным ему PID. Далее с помощью сигнала SIGCHLD система уведомляет родительский процесс о завершении зомби процесса. Если по какой-либо причине родительский процесс игнорирует этот сигнал, то зомби процесс так и продолжает отображаться в системе.

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

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

# ps aux | grep -w Z
root      2037  0.0  0.0      0     0 ?        Z    09:44   0:00 [httpd] 
root      8470  0.0  0.0 112652   984 pts/10   S+   10:43   0:00 grep --color=auto -w Z

В моем примере PID зомби процесса 2037. Теперь получим PID родительского процесса:

# ps o ppid 2037
 PPID
 2033

Когда мы знаем PID, правильнее всего определить что это за процесс командой top, а затем перезапустить его.

В крайнем случае можно убить родительский процесс:

# kill -9 2033