Tuesday, October 22, 2019

Zabbix: настройка мониторинга

Всем привет!
В этой статье рассмотрим настройку мониторинга на zabbix'e: подключим шаблон мониторинга, включим мониторинга порта и системных компонентов. В качестве подопытного возьмем сервер Apache.
Что имеем в самом начале - это установленный сервер Zabbix'a на CentOs'e.

Для начала посмотрим, что предлагает использовать сам Zabbix для мониторинга веб-сервера Apache. Вариантов много, остановимся на решении без подключения внешних скриптов (Template App Apache2 for Zabbix 4.0 that works without any external scripts). Из этого решения нам нужен файл xml, загружаем. При импорте у меня он не захотел импортироваться сразу, поэтому пришлось скопировать содержимое, а сам файлик создать отдельно. 
Проверяем, что модуль status_module в апаче установлен, если нет - устанавливаем.
httpd -M 2>/dev/null | grep status_module

В конфиг апача вносим такие настройки:
<Location /server-status>
    SetHandler server-status
    Order deny,allow
</Location>
ExtendedStatus On 

Перегружаем апач. 
 

На странице Templates создаем новый шаблон изxml-файла.
На странице Configuration-Hosts создаем  новый хост: указываем имя и группу(рекомендую создать отдельную групу для ваших серверов, а не использовать группу по умолчанию).
В настройках агента(/etc/zabbix/zabbix_agentd.conf) этого нового хоста, не забудьте добавить разрешения для основного сервера, с которого осуществляется мониторинг, у меня это 10.30.1.41
Server=127.0.0.1, 10.30.1.41

Далее - прицепляем импортированный шаблон "Template App Apache2 Zabbix agent".

Переходим на вкладку Applications, там должно появиться ваше первое приложения для апача. Добавим еще одно, назовем его Open ports, внутри этого приложения кликаем на Add item - добавим новое условие мониторинга. Указываем название и приложение. В настройках нас интересует ключ net.tcp.service[http,10.30.1.41,80] (служба http, айпи-адрес и порт).
Сохраняем. Ждем пару минут, переходим на вкладку Monitoring-Latest data
Итак, для текущего примера получаем минимальный пакет для мониторинга веб-сервера и работающего порта. В дашборд выведу пару графиков, выглядят они, конечно, приятно, но по большому счету это просто красота:) 


Успехов!

Friday, October 18, 2019

Zabbix: установка оффлайн

Всем привет!
Сегодня устанавливаем Zabbix в оффлайн режиме. Как обычно в оф. документации все просто, проверим - так ли это. Для данной задачи используется сервер с CentOs'ом, который имеет доступ в интернет, чтобы можно было скачать нужные пакеты, и второй сервер без доступа к интернету. На этот сервер и будем устанавливать заббикс.
Для начала берем все нужное(загружаем в папку tmp):
yum install --downloadonly --downloaddir=/tmp /
zabbix40-server-mysql /
zabbix40-web-mysql /
zabbix40-agent /
yum install createrepo -y --downloadonly --downloaddir=/tmp 

Возможно, что еще понадобятся и эти зависимости: deltarpm, python-deltarpm
С помощью createrepo сделаем репозитарий из локальной нашей папки с загруженными пакетами:

createrepo /custom_repo/
Перенесем туда все пакеты, далее переподключаем репозиторий.
yum clear all
yum repolist 

Загрузили, перенесли все пакеты на второй сервер.
Приступаем к установке и сразу же получаем ошибку:
Error: Package: zabbix40-server-mysql-4.0.12-1.el7.x86_64 (LocalRepo)
           Requires: libcrypto.so.10(OPENSSL_1.0.2)(64bit)

Версия openssl требует обновления.
Бежим качаем 2 пакета(на текущий момент такая версия):
openssl-1.0.2k-19.el7.x86_64.rpm
openssl-libs-1.0.2k-19.el7.x86_64.rpm
Далее удаляем старый openssl, обновляем openssl-libs(зависимости) и устанавливаем новую версию openssl. Продолжаем установку:
yum install zabbix40-server-4.0.12-1.el7.noarch.rpm

Далее все гут, едем дальше.
yum install  zabbix40-web-4.0.12-1.el7.noarch.rpm
Получаю ошибку:
Error: Package: php-5.4.16-46.el7.x86_64 (LocalRepo)
           Requires: httpd-mmn = 20120211x8664


Отсутствует httpd - идем качаем зависимости:
yum install httpd -y --downloadonly --downloaddir=/tmp
yum install apr.x86_64 -y --downloadonly --downloaddir=/tmp
yum install apr-util -y --downloadonly --downloaddir=/tmp
yum install httpd-tools -y --downloadonly --downloaddir=/tmp
yum install mailcap -y --downloadonly --downloaddir=/tmp
Продолжаем установку httpd:

yum install httpd

yum install zabbix40-web-4.0.12-1.el7.noarch.rpm 

Далее идет установка СУБД, я устанавливаю MariaDB.

 yum install mariadb-server-5.5.64-1.el7.x86_64.rpm

Если вы получаете ошибки такого рода:
#systemctl status mysql
● mysql.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)
# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)

Значит у вас не запущен сервер СУБД - проверьте тот ли пакет вы установили и запустите службу. 

systemctl start mariadb.service
Создаем БД и импортируем скрипты для работы(строго по порядку):
shell> mysql -uroot -p<пароль> 
mysql> create database zabbix character set utf8 collate utf8_bin; 
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '<пароль>'; 
mysql> quit;

shell> cd database/mysql 
shell> mysql -uzabbix -p<пароль> zabbix < schema.sql
shell> mysql -uzabbix -p<пароль> zabbix < images.sql 
shell> mysql -uzabbix -p<пароль> zabbix < data.sql

В конфиге сервера /etc/zabbix/zabbix_server.conf указываем настройки сервера:
DBHost=localhost 
DBName=zabbix 
DBUser=zabbix 
DBPassword=zabbix_pass
Запускаем сервер
systemctl start zabbix-server
Не забываем включить его в автозапуск
systemctl enable zabbix-serverЕсли у вас на этом же сервере стоит и агент, то включаем его:
systemctl enable zabbix-agent.service 
Вносим изменения в настройки httpd и php. Например, date.timezone = Europe/Moscowр, у меня конфиги из папки http не считывались и возникла ошибка:
Time zone for PHP is not set (configuration parameter "date.timezone").
Поэтому пришлось поправить этот параметр в /etc/php.ini
date.timezone = Europe/Moscow
Запускаем httpd и браузером заходим на адрес сервера http://ip-servera/zabbix
Заполняем все поля, указывваем параметры подклюбчения, имя сервера и другие настройки.
Установка на этом завершена. Логин-пароль по умолчанию Admin/zabbix. 

Успехов!

Tuesday, October 15, 2019

Docker: nginx + wordpress + php-fpm

Всем привет!
Продолжаем контейнеризировать все по-тихонечку. На этот раз переведем сайт на использование вордпресс. Сам официальный туториал не вызывает особого интереса - как мне показалось, там довольно все просто. И когда друг ко мне обратился за помощью, я подумал, что там будет все быстро сделано. Но, есть всегда свои но! Вперед:)
Первое, взглянем на оф. документ по инсталяции. Все просто! Нам понадобится docker-compose, если у вас еще не установлен, устанавливаем.
Второе, создаем директорию, где будем размещать все нужные нам файлы. Для начала хочу заметить, что по оф. доку у меня не получилось так быстро все сделать, т.к. WP не захотел работать без php-fpm, поэтому я сразу решал эту проблему. Далее показываю уже работающий конфиг, а ошибку укажу внизу поста.
Создаем docker-compose.yml
version: '3.1'
services:


Далее создаем контейнеры для WP, вашей базы данных - на выбор или Myslq или MariaDb, для Nginx и для PHP.

Контейнер WP, зависит от контейнера с базой данных:
   wordpress:
        image: wordpress
        restart: always
        ports:
            - 8080:80
        depends_on:
            - db
        environment:
            WORDPRESS_DB_HOST: db
            WORDPRESS_DB_USER: exampleuser
            WORDPRESS_DB_PASSWORD: examplepass
            WORDPRESS_DB_NAME: maindb
        volumes:
         - ./html:/var/www/html 


Контейнер с базой данных:
    db:
        image: mysql:5.7
        restart: always
        environment:
            MYSQL_DATABASE: maindb
            MYSQL_USER: exampleuser
            MYSQL_PASSWORD: examplepass
            MYSQL_RANDOM_ROOT_PASSWORD: '1'
        volumes:
         - ./database:/var/lib/mysql
         - ./my.cnf:/etc/my.cnf

Я добавил файл с некоторыми настройками для MySql. Т.к. у меня на сервере мало оперативной памяти, то я сократил размер буфера. если этого не сделать, то демон mysqld будет ругаться и не стартанет. Содержимое my.cnf:
[mysqld]
innodb_buffer_pool_size = 16M


Контейнер с веб-сервером:
   nginx:
        image: nginx3
        ports:
            - 443:443
        volumes:
            - ./nginx:/etc/nginx/
            - ./logs/nginx:/var/log/nginx
            - ./html:/var/www/html
        links:
            - wordpress
            - php
        restart: always

 
Я настроил nginx, чтобы он работал только по 443 порту и выложил все конфиги в директории ./nginx, аналогично для логов. Конфиг для Nginx'a:
server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  _;
        root   /var/www/html;
       
        ssl_certificate "/etc/ssl/certs/nginx-selfsigned.crt";
        ssl_certificate_key "/etc/ssl/certs/nginx-selfsigned.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location / {
            try_files $uri /index.php?$args;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location /test{
            proxy_pass https://ya.ru;
        }        

}

Тут интерес вызывают только самоподписанные сертификаты и настройки php. Для тестов директория /test перекидывает на сайт яндекса.
Последний контейнер для PHP.
   php:
        build: ./php/
        volumes:
        - ./html:/var/www/html 

 
Для подключения к WP требуется библиотека mysqli, которая не установлена по умолчанию, поэтому собираем из докерфайла образ.  Я образ собираю по докер-файлу, вот содержимое:
FROM php:7-fpm
RUN docker-php-ext-install mysqli


Далее добавляем:
volumes:
    wordpress:
    db:

networks:
    local:


Запустил все с помощью:
docker-compose up -d
Проверяю логи контейнеров:
docker logs IDContainer

На этом настройка Docker'a закончена и далее уже можно переходить к настройкам самого WP. Теперь расскажу на какие грабли я наступил. Ошибки в студию:)
База показывает ошибку:
1) docker wordpress MySQL Connection Error: (2002) Connection refused
2) PHP Warning:  mysqli::__construct(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution in Standard input code on line 22
Браузер показывает ошибку:
3) Error establishing a database connection
Неверный формат файла конфига для базы 
4) [ERROR] Found option without preceding group in config file /etc/my.cnf at line 1!

Успехов! 

Wednesday, October 9, 2019

Linux: вопросы среднего уровня


Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании Linux админам.
В этот раз рассмотрим вопросы среднего уровня(middle)
Весь список тут

Вопросы среднего уровня:
20. Что обозначает ```&``` после команды?



21. Что обозначает ```& disown``` после команды?



22. Что такое фильтр пакетов (packet filter) и как он работает?



23. Что такое виртуальная память(Virtual Memory)?



24.Что такое swap и для чего используется?



Что такое "sticky bit"?



Для чего предназначен бит неизменяемости(immutable bit)?



Что такое жесткая ссылка, символическая? Чем отличаются? Что произойдет если удалить источник, на который указывает ссылка?



Что такое айнод(inode) и какие поля в нем хранятся?



Что такое SNMP и для чего он используется?



Как уменьшить размер файла, который используется в текущий момент(например, файла лога)?



Что такое переадресация SSH-порта?

Как добавить пользователя без использования команд useradd/adduser?

Опишите команду mknod и расскажите когда вы её используете?


Загрузка диского пространства 100%, вы удалили огромный файл логов, но df показывает - нет свободного места. В чем проблема?

Вы получаете ошибку "filesystem is full", хотя 'df' говорит об обратном, место есть. В чем проблема?


Расскажите как работает команда 'ps'.


Что происходит с дочерним процессом, который завершил свое выполнение, но у которого нет родительского процесса ожидающего его завершение? Почему это плохо?


Кратко опишите каждое состояние процесса(process states) в ОС Linux.


Вы запускаете скрипт и хотите посмотреть вывод в терминале и сохранить в файл, как это можно сделать?


Объясните, что выполнит данная команда echo "1" > /proc/sys/net/ipv4/ip_forward


Какие типы файлов вы знаете в ОС Linux?


В чем разница между процессом и потоком?



Tuesday, October 8, 2019

Linux: курьезные вопросы


Всем, привет!
Продолжаю список интересных вопросов, которые задают на собеседовании Linux админам.
На этот раз очередь курьезных вопросов или веселых.
Так что будьте готовы к вопросу "чем отличается крокодил от холодильника" :)
Весь список тут

Веселые вопросы:
1. Админ случайно выполнил команду: ```chmod 444 /bin/chmod ```. Как починить?


2. Вы забыли(потеряли) пароль рута, что делать?


3. Вы перезапустили удаленно сервер, но через 10 минут вы по-прежнему не можете к нему подключиться по SSH. В чем может быть проблема?


4. Вы застряли на необитаемом острове, какие 5 утилит командной строки вы бы выбрали?


5. Вы случайно удалили файл с запущенным скриптом, возможно ли его можно восстановить?


6. Что приозойдет 19 Января 2038?


7. Как перегрузить сервер, если команда reboot не отвечает?


8. Чем отличается rest от json'a?


Коллеги, расскажите о вопросах, которые вам показались курьезными на собеседовании! :) Успехов!

Thursday, October 3, 2019

Linux: простые вопросы


Всем, привет!
Русифицировал популярные вопросы, которые задают на собеседовании Linux админам.
Вот весь список. Тут собрал ответы

Простые вопросы:
1. Как называется главный пользователь Linux системы и назовите его UID?


2. Как посмотреть все файлы, включая скрытые в директории?


3. Какой командой можно удалить папку вместе со всем содержимым?


4. Какой командой можно посмотреть утилизацию памяти в Linux'e?


5. Какой командой осуществить поиск строки "my string" внутри директории рекурсивно?


6. Как подключится к удаленному серверу через SSH?


7. Как посмотреть переменные среды?


8. Когда запускаете ```ifconfig -a``` получаете ошибку "command not found". С чем это может быть связано?


9. Что произойдет если нажать TAB-TAB?


10. Какой командой можно посмотреть все доступное место на диске Unix/Linux системы?


11. Какими командами можно проверить записи DNS?


12. Какой командой можно изменить владельца файла? Установить разрешения на файл?


13. Что выполнит данная команда ```chmod +x FILENAME```?


14. Что означают разрешение 0750 для файла? Отличается от разрешений для директории?


15. Как добавить нового юзера без разрешения на логин(login permissions)?


16. Как добавить/удалить пользователя из группы?


17. Что выполнит данная команда CTRL-c?


18. Что находится в файле /etc/services?


19. Как перенаправить стандартный вывод STDOUT и стандартный вывод ошибок STDERR? (> /dev/null 2>&1)


20. Какая разница между подключением по Telnet и SSH?


21. Какими командами можно посмотреть среднюю загрузку системы? Объясните 3 основных значения загрузки системы(load average)?


22. Назовите опции в нижнем регистре для команды ```ls```, которые не являются рабочими.


23. Что такое модуль ядра Linux'a?


24. Что такое протокол ICMP? Для чего используется?


25. Что такое уровень запуска и как посмотреть текущий?

26. Как проверить является ли машина виртуальной?

27. Как принудительно заставить систему выполнить проверку файловой системы при следующем запуске?

28. Какой процесс идет с пидом 1?