среда, 16 декабря 2015 г.

Утилита sipgrep в CentOS7
Ссылка
https://github.com/sipcapture/sipgrep 

Установка в CentOS7
1. Устанавливаем необходимые пакеты
# yum install libpcap-devel pcre-devel git
# yum install tcpdump

2. Скачиваем дистрибутив sipgrep
# cd /usr/src
# git clone https://github.com/sipcapture/sipgrep.git

3. Собираем и устанавливаем пакет
# cd sipgrep
# ./configure
# make && make install

4. Проверка работы:
# ./sipgrep  -V

Примеры использования:
Все вызовы от 9735050
# sipgrep -f 9735050

Все вызовы к 2057004
# sipgrep -t 20574004

Все диалоги с INVITE
# sipgrep '^(INVITE)'

Иногда при запуске sipgrep будет выдавать ошибку о невозможности запустить nflog
SIOCGIFADDR: nflog: No such device: No such device
interface: nflog
pcap compile: NFLOG link-layer type filtering not implemented
В этом случае программу запускаем так:
# sipgrep  -d ens32 -f 2057004
После ключа d указывается имя сетевого интерфейса. В данном случае сетевой интерфейс носит имя ens32. Просмотреть имена сетевых интерфейсов можно командой:
# ip a
или
# ifconfig

Получаем очень наглядный лог обмена sip пакетов:



понедельник, 23 ноября 2015 г.

Установка Freeswitch 1.6 в CentOS 7

1. Подготовка к установке
# yum update
# yum -y install git
# yum -y install epel-release
# rpm -Uvh http://files.freeswitch.org/freeswitch-release-1-6.noarch.rpm
# yum -y install git gcc-c++ autoconf automake libtool wget python ncurses-devel zlib-devel libjpeg-devel openssl-devel e2fsprogs-devel sqlite-devel libcurl-devel pcre-devel speex-devel ldns-devel libedit-devel libxml2-devel
# yum -y install libyuv-devel opus-devel libvpx-devel libvpx2* libdb4* libidn-devel unbound-devel libuuid-devel lua-devel libsndfile-devel

2. Ставим стабильную версию пакета freeswitch - 1.6
# cd /usr/local/src
# git clone -b v1.6 https://freeswitch.org/stash/scm/fs/freeswitch.git
# cd /usr/local/src/freeswitch
# ./bootstrap.sh
# ./configure
После выполнения команды увидим:
-------------------------- FreeSWITCH configuration --------------

  Locations:

      prefix:          /usr/local/freeswitch
      exec_prefix:     /usr/local/freeswitch
      bindir:          ${exec_prefix}/bin
      confdir:         /usr/local/freeswitch/conf
      libdir:          ${exec_prefix}/lib
      datadir:         /usr/local/freeswitch
      localstatedir:   /usr/local/freeswitch
      includedir:      /usr/local/freeswitch/include/freeswitch

      certsdir:        /usr/local/freeswitch/certs
      dbdir:           /usr/local/freeswitch/db
      grammardir:      /usr/local/freeswitch/grammar
      htdocsdir:       /usr/local/freeswitch/htdocs
      fontsdir:        /usr/local/freeswitch/fonts
      logfiledir:      /usr/local/freeswitch/log
      modulesdir:      /usr/local/freeswitch/mod
      pkgconfigdir:    ${exec_prefix}/lib/pkgconfig
      recordingsdir:   /usr/local/freeswitch/recordings
      imagesdir:       /usr/local/freeswitch/images
      runtimedir:      /usr/local/freeswitch/run
      scriptdir:       /usr/local/freeswitch/scripts
      soundsdir:       /usr/local/freeswitch/sounds
      storagedir:      /usr/local/freeswitch/storage
      cachedir:        /usr/local/freeswitch/cache

------------------------------------------------------------------
# make 
При сборке может появится сообщение о невозможности установить модуль поддержки кодека opus:
making all mod_opus
make[4]: Вход в каталог `/usr/local/src/freeswitch/src/mod/codecs/mod_opus'
Makefile:884: *** You must install libopus-dev to build mod_opus.  Останов.
make[4]: Выход из каталога `/usr/local/src/freeswitch/src/mod/codecs/mod_opus'
make[3]: *** [mod_opus-all] Ошибка 1
make[3]: Выход из каталога `/usr/local/src/freeswitch/src/mod'
make[2]: *** [all-recursive] Ошибка 1
make[2]: Выход из каталога `/usr/local/src/freeswitch/src'
make[1]: *** [all-recursive] Ошибка 1
make[1]: Выход из каталога `/usr/local/src/freeswitch'
make: *** [all] Ошибка 2
Несколько попыток установить кодек у меня не увенчались успехом. Поэтому я просто сделал следующее: отключил поддержку этого кодека в сборке:
# make clean
# nano modules.conf
Комментируем строку:
#codecs/mod_opus
Запускаем сборку снова:

# make
Работа команды должна завершиться сообщением:
+---------- FreeSWITCH Build Complete ----------+
 + FreeSWITCH has been successfully built.       +
 + Install by running:                           +
 +                                               +
 +                make install                   +
 +                                               +
 + While you're waiting, register for ClueCon!   +
 + https://www.cluecon.com                       +
 +                                               +
 +-----------------------------------------------+

# make install
В завершении установки увидим:
+---------- FreeSWITCH install Complete ----------+
 + FreeSWITCH has been successfully installed.     +
 +                                                 +
 +       Install sounds:                           +
 +       (uhd-sounds includes hd-sounds, sounds)   +
 +       (hd-sounds includes sounds)               +
 +       ------------------------------------      +
 +                make cd-sounds-install           +
 +                make cd-moh-install              +
 +                                                 +
 +                make uhd-sounds-install          +
 +                make uhd-moh-install             +
 +                                                 +
 +                make hd-sounds-install           +
 +                make hd-moh-install              +
 +                                                 +
 +                make sounds-install              +
 +                make moh-install                 +
 +                                                 +
 +       Install non english sounds:               +
 +       replace XX with language                  +
 +       (ru : Russian)                            +
 +       (fr : French)                             +
 +       ------------------------------------      +
 +                make cd-sounds-XX-install        +
 +                make uhd-sounds-XX-install       +
 +                make hd-sounds-XX-install        +
 +                make sounds-XX-install           +
 +                                                 +
 +       Upgrade to latest:                        +
 +       ----------------------------------        +
 +                make current                     +
 +                                                 +
 +       Rebuild all:                              +
 +       ----------------------------------        +
 +                make sure                        +
 +                                                 +
 +       Install/Re-install default config:        +
 +       ----------------------------------        +
 +                make samples                     +
 +                                                 +
 +                                                 +
 +       Additional resources:                     +
 +       ----------------------------------        +
 +       https://www.freeswitch.org                +
 +       https://freeswitch.org/confluence         +
 +       https://freeswitch.org/jira               +
 +       http://lists.freeswitch.org               +
 +                                                 +
 +       irc.freenode.net / #freeswitch            +
 +                                                 +
 +       Register For ClueCon:                     +
 +       ----------------------------------        +
 +       https://www.cluecon.com                   +
 +                                                 +
 +-------------------------------------------------+

3. Установка звуков (в том числе русских)
# make cd-sounds-install
# make cd-moh-install
# make cd-sounds-ru-install

4. Отключаем поддержку ipv6
# cd /usr/local/freeswitch/conf/sip_profiles
# mv internal-ipv6.xml internal-ipv6.xml.removed
# mv external-ipv6.xml external-ipv6.xml.removed

5. Добавление пользователя freeswitch в систему и блокируем ему пароль
# useradd --system --home-dir /usr/local/freeswitch  freeswitch
# passwd -l freeswitch

6. Первый запуск необходимо провести для того, что бы Freeswitch создал необходимые папки.
# cd /usr/local/freeswitch/bin
# ./freeswitch
Должно появится что-то типа
2015-11-22 12:37:33.710503 [INFO] switch_event.c:685 Activate Eventing Engine.
2015-11-22 12:37:33.720775 [WARNING] switch_event.c:656 Create additional event dispatch thread 0
2015-11-22 12:37:33.974387 [INFO] switch_nat.c:417 Scanning for NAT
2015-11-22 12:37:33.974570 [DEBUG] switch_nat.c:170 Checking for PMP 1/5
2015-11-22 12:37:33.975138 [ERR] switch_nat.c:199 Error checking for PMP [wait sock failed]
2015-11-22 12:37:33.975159 [DEBUG] switch_nat.c:422 Checking for UPnP
……
Потом будет показан ход загрузки
……
.=============================================================.
|   _____              ______        _____ _____ ____ _   _   |
|  |  ___| __ ___  ___/ ___\ \      / /_ _|_   _/ ___| | | |  |
|  | |_ | '__/ _ \/ _ \___ \\ \ /\ / / | |  | || |   | |_| |  |
|  |  _|| | |  __/  __/___) |\ V  V /  | |  | || |___|  _  |  |
|  |_|  |_|  \___|\___|____/  \_/\_/  |___| |_| \____|_| |_|  |
|                                                             |
.=============================================================.
|   Anthony Minessale II, Michael Jerris, Brian West, Others  |
|   FreeSWITCH (http://www.freeswitch.org)                    |
|   Paypal Donations Appreciated: paypal@freeswitch.org       |
|   Brought to you by ClueCon http://www.cluecon.com/         |
.=============================================================.
……
FreeSWITCH Started
Max Sessions [1000]
Session Rate [30]
SQL [Enabled]
2015-11-22 12:37:48.893329 [CONSOLE] switch_core.c:2426
[This app Best viewed at 160x60 or more..]
2015-11-22 12:37:48.894155 [INFO] switch_time.c:607 Clock synchronized to system time. 
freeswitch@test-centos7.svttk.ru>
Что бы убедиться, что все работает, вводим команду «sofia status»
Выход из системы по команде «shutdown».
Когда Freeswitch завершает свою работу, так же выводиться многословный лог.

7. Назначаем права на папки и создаем папку для работы демона freeswitch
# chown -R freeswitch:freeswitch /usr/local/freeswitch/
# chmod -R 770 /usr/local/freeswitch/
# chmod -R 750 /usr/local/freeswitch/bin/*
# mkdir /run/freeswitch
# chown -R freeswitch:freeswitch  /run/freeswitch

8. Для удобства работы создаем символьные ссылки на программы запуска freeswitch
# ln -s /usr/local/freeswitch/bin/freeswitch /usr/bin/
# ln -s /usr/local/freeswitch/bin/fs_cli /usr/bin/

9. Добавляем freeswitch в автозапуск в систему systemd
# cp /usr/local/src/freeswitch/build/freeswitch.service /etc/systemd/system/multi-user.target.wants/
# nano /etc/systemd/system/multi-user.target.wants/freeswitch.service
Приводим юнит к виду:
[Unit]
Description=freeswitch
After=syslog.target network.target local-fs.target

[Service]
; service
Type=forking
RuntimeDirectory=freeswitch
PIDFile=/run/freeswitch/freeswitch.pid
PermissionsStartOnly=true
ExecStart=/usr/bin/freeswitch -ncwait -nonat -run /run/freeswitch
TimeoutSec=45s
Restart=always
; exec
WorkingDirectory=/run/freeswitch
User=freeswitch
Group=daemon
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=60000
;LimitSTACK=240
LimitRTPRIO=infinity
LimitRTTIME=7000000
IOSchedulingClass=realtime
IOSchedulingPriority=2
CPUSchedulingPolicy=rr
CPUSchedulingPriority=89
UMask=0007

[Install]
WantedBy=multi-user.target
Теперь создаем файл конигурации system, который будет всегда создавать директорию /run/freeswitch и наделять ее необходимыми правами
# touch nano /usr/lib/tmpfiles.d/freeswitch.conf
# nano /usr/lib/tmpfiles.d/freeswitch.conf
Вписываем в файл:
d /run/freeswitch   770 freeswitch freeswitch
Рестартуем демон systemd:
# systemctl daemon-reload
Теперь можно запустить сервис freeswitch командой:
# systemctl start freeswitch.service
Проверить состояние сервиса и отсановить его можно так:
# systemctl status freeswitch.service
# systemctl stop freeswitch.service

10. Увеличиваем количество лимитов на открытие файлов и обращений к жесткому диску для пользователя freeswitch
# nano /etc/security/limits.conf
Вписываем в конец файла перед строкой
# End of file
Следующее:
freeswitch         hard    nofile      500000
freeswitch         soft    nofile      500000


воскресенье, 22 ноября 2015 г.


Установка Zabbix 2.4 в CentOS 6.5. Сбор информации syslog с устройств с помощью Zabbix

1. Установка rsyslog
# yum shell
Loaded plugins: fastestmirror
Setting up Yum Shell
> install rsyslog7
Loading mirror speeds from cached hostfile
* base: mirror.yandex.ru
* epel: fedora-mirror01.rbc.ru
* extras: mirror.yandex.ru
* updates: mirror.yandex.ru
Setting up Install Process
> remove rsyslog
Setting up Remove Process
> run
--> Running transaction check
---> Package rsyslog.x86_64 0:5.8.10-8.el6 will be erased
---> Package rsyslog7.x86_64 0:7.4.10-3.el6_6 will be installed


Произойдет установка .............................
Finished Transaction
> Выходим из shell - CTRL + C

2. Запуск и добавление в автозагрузку rsyslog
Запускаем службу
# service rsyslog start
Добавляем в автозапуск
# chkconfig rsyslog on

3. Создаем дополнительный конфигурационный файл rsyslog
# touch /etc/rsyslog.d/zabbix_rsyslog.conf
# nano /etc/rsyslog.d/zabbix_rsyslog.conf

Помещаем в файл
#add template for network devices
$template network-fmt,"%TIMESTAMP:::date-rfc3339% [%fromhost-ip%] %pri-text% %syslogtag%%msg%\n"
#$template network-fmt,"[%fromhost-ip%] %pri-text% %syslogtag%%msg%\n"

#exclude unwanted messages:
#:msg, contains, "Child connection from ::ffff:10.2.0.21" ~
#:msg, contains, "exit after auth (ubnt): Disconnect received" ~
#:msg, contains, "password auth succeeded for 'ubnt' from ::ffff:10.2.0.21" ~
#:msg, contains, "exit before auth: Exited normally" ~
#action for every message:
if $fromhost-ip != '127.0.0.1' then ^/usr/local/bin/zabbix_syslog_lkp_host_1.sh;network-fmt
& ~


4. Вносим изменения в файл /etc/rsyslog.conf для приема Syslog-сообщений по сети через UDP:
# nano /etc/rsyslog.conf
Необходимо раскомментировать следующие директивы:
$ModLoad imudp
$UDPServerRun 514


5. Создаем скрипты, необходимые для приема syslog сообщений zabbix-ом
# touch /usr/local/bin/zabbix_syslog_lkp_host.pl
# chmod +x /usr/local/bin/zabbix_syslog_lkp_host.pl
# nano /usr/local/bin/zabbix_syslog_lkp_host.pl

Вставляем туда содержимое файла zabbix_syslog_lkp_host.pl
Содержимое файл внизу статьи.
Далее:
# touch /usr/local/bin/zabbix_syslog_lkp_host_1.sh
# chmod +x /usr/local/bin/zabbix_syslog_lkp_host_1.sh
# nano /usr/local/bin/zabbix_syslog_lkp_host_1.sh

Вставляем туда:
#!/bin/bash
/usr/bin/perl /usr/local/bin/zabbix_syslog_lkp_host.pl "$1"

Затем:
# touch /usr/local/etc/zabbix_syslog.cfg
# nano /usr/local/etc/zabbix_syslog.cfg

Вставляем туда
url = http://localhost/zabbix/api_jsonrpc.php
user = <логин zabbix api>
password = <пароль zabbix api>
server = localhost
debug=0

Меняем права:
# chown zabbix:zabbix /usr/local/etc/zabbix_syslog.cfg
# chmod 700 /usr/local/etc/zabbix_syslog.cfg


6. Для работы всей системы нужно установить ряд модулей perl
# cpan -i YAML
Во время работы отвечаем везде yes (нажимаем ENTER)
Затем
# PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install Readonly'
# PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install CHI'
# PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install JSON::RPC::Legacy::Client'
# PERL_MM_USE_DEFAULT=1 perl -MCPAN -e 'install Config::General'


7. Выполняем рестарт rsyslog
# service rsyslog restart

ПРИМЕЧАНИЕ:
И все же, что делает скрипт /usr/local/bin/zabbix_syslog_lkp_host.pl, который мы указали запускать rsyslog'у? 

Если вкратце, он просто через zabbix_sender шлет данное сообщение на Zabbix_server или на Zabbix_proxy, ну вот примерно по такому шаблону:


/usr/bin/zabbix_sender -z *ИМЯСЕРВЕРА* -k syslog -o *SYSLOG-СООБЩЕНИЕ* -s *ИМЯУЗЛА*

Попробовать работы системы:
/usr/local/bin/zabbix_syslog_lkp_host.pl '2015-07-15T14:20:00.741158+04:00 [10.200.255.10] local0.notice 15476: 015473: Jul 15 14:21:50 MSK: %SYS-5-CONFIG_I: Configured from console by vitalij on vty1'

=======================================================

Ссылка на оригинал: http://habrahabr.ru/company/zabbix/blog/252915/
Содержимое файла zabbix_syslog_lkp_host.pl

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;
use JSON::RPC::Legacy::Client;
use Data::Dumper;
use Config::General;
use CHI;
use List::MoreUtils qw (any);
use English '-no_match_vars';
use Readonly;
use MIME::Base64 qw(encode_base64);
use IO::Socket::INET;
our $VERSION = 2.0;

Readonly my $CACHE_TIMEOUT => 600;
Readonly my $CACHE_DIR     => '/tmp/zabbix_syslog_cache';

my $conf   = Config::General->new('/usr/local/etc/zabbix_syslog.cfg');
my %Config = $conf->getall;

#Authenticate yourself
my $client = JSON::RPC::Legacy::Client->new();
my $url = $Config{'url'} || die "URL is missing in zabbix_syslog.cfg\n";
my $user = $Config{'user'} || die "API user is missing in zabbix_syslog.cfg\n";
my $password = $Config{'password'} || die "API user password is missing in zabbix_syslog.cfg\n";
my $server = $Config{'server'} || die "server hostname is missing in zabbix_syslog.cfg\n";


my $debug = $Config{'debug'};
my ( $authID, $response, $json );
my $id = 0;

my $message = shift @ARGV   || die
  "Syslog message required as an argument\n";  #Grab syslog message from rsyslog

#get ip from message
my $ip;

#IP regex patter part
my $ipv4_octet = q/(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/;

#if ( $message =~ / \[ ((?:$ipv4_octet[.]){3}${ipv4_octet}) \]/msx ) {
#    $ip = $1;
#}
#else {
#    die "No IP in square brackets found in '$message', cannot continue\n";
#}

my $cache = CHI->new(
    driver   => 'File',
    root_dir => $CACHE_DIR,
);

my $hostname = $cache->get($ip);

if ( !defined $hostname ) {

    $authID = login();
    my @hosts_found;
    my $hostid;
    foreach my $host ( hostinterface_get() ) {

        $hostid = $host->{'hostid'};

        if ( any { /$hostid/msx } @hosts_found ) {
            next;
        }    #check if $hostid already is in array then skip(next)
        else { push @hosts_found, $hostid; }

###########now get hostname
        if ( get_zbx_trapper_syslogid_by_hostid($hostid) ) {

            my $result = host_get($hostid);

            #return hostname if possible
            if ( $result->{'host'} ) {

                if ( $result->{'proxy_hostid'} ==
                    0 )    #check if host monitored directly or via proxy
                {
                    #lease $server as is
                }
                else {
                   #assume that rsyslogd and zabbix_proxy are on the same server
                    $server = 'localhost';
                }
                $hostname = $result->{'host'};
            }

        }

    }
    logout();
    $cache->set( $ip, $hostname, $CACHE_TIMEOUT );
}

zabbix_send( $server, $hostname, 'syslog', $message );

#______SUBS
sub login {

    $json = {
        jsonrpc => '2.0',
        method  => 'user.login',
        params  => {
            user     => $user,
            password => $password

        },
        id => $id++,
    };

    $response = $client->call( $url, $json );

    # Check if response was successful
    die "Authentication failed\n" unless $response->content->{'result'};

    if ( $debug > 0 ) { print Dumper $response->content->{'result'}; }

    return $response->content->{'result'};

}

sub logout {

    $json = {
        jsonrpc => '2.0',
        method  => 'user.logout',
        params  => {},
        id      => $id++,
        auth    => $authID,
    };

    $response = $client->call( $url, $json );

    # Check if response was successful
    warn "Logout failed\n" unless $response->content->{'result'};

    return;
}

sub hostinterface_get {

    $json = {

        jsonrpc => '2.0',
        method  => 'hostinterface.get',
        params  => {
            output => [ 'ip', 'hostid' ],
            filter => { ip => $ip, },

            #    limit => 1,
        },
        id   => $id++,
        auth => $authID,
    };

    $response = $client->call( $url, $json );

    if ( $debug > 0 ) { print Dumper $response; }

    # Check if response was successful (not empty array in result)
    if ( !@{ $response->content->{'result'} } ) {
        logout();
        die "hostinterface.get failed\n";
    }

    return @{ $response->content->{'result'} }

}

sub get_zbx_trapper_syslogid_by_hostid {

    my $hostids = shift;

    $json = {
        jsonrpc => '2.0',
        method  => 'item.get',
        params  => {
            output  => ['itemid'],
            hostids => $hostids,
            search  => {
                'key_' => 'syslog',
                type   => 2,          #type => 2 is zabbix_trapper
                status => 0,

            },
            limit => 1,
        },
        id   => $id++,
        auth => $authID,
    };

    $response = $client->call( $url, $json );
    if ( $debug > 0 ) { print Dumper $response; }

    # Check if response was successful
    if ( !@{ $response->content->{'result'} } ) {
        logout();
        die "item.get failed\n";
    }

    #return itemid of syslog key (trapper type)
    return ${ $response->content->{'result'} }[0]->{itemid};
}

sub host_get {
    my $hostids = shift;

    $json = {

        jsonrpc => '2.0',
        method  => 'host.get',
        params  => {
            hostids => [$hostids],
            output  => [ 'host', 'proxy_hostid', 'status' ],
            filter => { status => 0, },    # only use hosts enabled
            limit  => 1,
        },
        id   => $id++,
        auth => $authID,
    };

    $response = $client->call( $url, $json );

    if ( $debug > 0 ) { print Dumper $response; }

    # Check if response was successful
    if ( !$response->content->{'result'} ) {
        logout();
        die "host.get failed\n";
    }
    return ${ $response->content->{'result'} }[0];    #return result
}

sub zabbix_send {
    my $zabbixserver = shift;
    my $hostname     = shift;
    my $item         = shift;
    my $data         = shift;
    Readonly my $SOCK_TIMEOUT     => 10;
    Readonly my $SOCK_RECV_LENGTH => 1024;

    my $result;

    my $request =
      sprintf
      "<req>\n<host>%s</host>\n<key>%s</key>\n<data>%s</data>\n</req>\n",
      encode_base64($hostname), encode_base64($item), encode_base64($data);

    my $sock = IO::Socket::INET->new(
        PeerAddr => $zabbixserver,
        PeerPort => '10051',
        Proto    => 'tcp',
        Timeout  => $SOCK_TIMEOUT
    );

    die "Could not create socket: $ERRNO\n" unless $sock;
    $sock->send($request);
    my @handles = IO::Select->new($sock)->can_read($SOCK_TIMEOUT);
    if ( $debug > 0 ) { print "item - $item, data - $data\n"; }

    if ( scalar(@handles) > 0 ) {
        $sock->recv( $result, $SOCK_RECV_LENGTH );
        if ( $debug > 0 ) {
            print "answer from zabbix server $zabbixserver: $result\n";
        }
    }
    else {
        if ( $debug > 0 ) { print "no answer from zabbix server\n"; }
    }
    $sock->close();
    return;
}

суббота, 21 ноября 2015 г.

Установка NODE JS в CENTOS7

1. Подключение репозитария EPEL
# yum install epel-release

2. Установка node.js из репозитария
# yum install nodejs

3. Проверка установленной версии node
# node --version
v0.10.36

4. Установка менеджера пакетов npm, который используется для установки модулей node.js
# yum install npm
Установка MySQL(MariaDB), Apache, PHP5 и PHPMYADMIN на CentOS 7

1
Выключаем SELINUX.
# nano /etc/sysconfig/selinux

Комментируем все, вставляем строку
SELINUX=disabled

Перезагружаемся:
# reboot

2
Установка MariaDB.
# yum install mysql mariadb-server

Добавляем с скрипт автозапуска
# systemctl enable mariadb.service

Запускаем сервер MariaDB
# systemctl start  mariadb.service

Задаем пароль root для сервера MySQL
# mysql_secure_installation
Сначала вводим на первый вопрос просто <Enter>, затем на следующих вопросах вводим пароль и его подтверждение. На остальные вопросы отвечаем ДА (y)

Перезагружаем сервис просто так:
# systemctl restart  mariadb.service

3
Установка Web-сервера APACHE
# yum install httpd

Задание имени серверу. Открываем файл /etc/httpd/conf/httpd.conf
# nano /etc/httpd/conf/httpd.conf
Находим строку:
#ServerName www.example.com:80
меняем ее на:
ServerName www.marshal.com:80
Здесь - www.marshal.com – это имя нашего сервера. Для того что бы сам сервер знал всегда свое имя, добавляем это имя в файл hosts
# nano /etc/hosts
Содержимое файла:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 marshal www.marshal.com
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 marshal www.marshal.com
Здесь - www.marshal.com - имя web сервера, marshal – имя самой машины.

Добавляем сервер Apache в скрипт автозапуска
# systemctl enable httpd.service

Запускаем сервер Apache
# systemctl start  httpd.service

Отключаем файрвол
# systemctl stop  firewalld.service
# systemctl disable firewalld.service

Проверяем обратившись к серверу через http и убеждаемся, что через браузер сервер отвечает.
Проверка из командной строки:
# systemctl status httpd.service

4
Устанавка PHP
# yum install php

Перезапускаем web-сервер
# systemctl restart  httpd.service

Создаем файл для проверки работы PHP
# nano /var/www/html/info.php
вписываем туда
<?php
phpinfo();
?>
Теперь при запросе страницы Info.php (например, 192.168.1.222/info.php) можно увидеть информацию о модуле PHP

Установка модулей для связки PHP5 и Mysql, а так же некоторых других модулей php
# yum install php-mysql php-gd php-imap php-ldap php-odbc

Перезапускаем web-сервер
# systemctl restart  httpd.service

Проверяем информацию на странице info.php и убеждаемся, что на странице появился раздел посвященный MySQL.

5
Установка PHPMYADMIN
# yum -y install epel-release (установка репозитария EPEL)
# yum -y install phpmyadmin

Устанавливаем доступ к phpmyadmin с определенных ip (только из локальной сети):
# nano /etc/httpd/conf.d/phpMyAdmin.conf
В следующих блоках добавляем разрешенные сети / Ip-адреса (выделено красным)
<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8

   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       Require ip 127.0.0.1 192.168.0.0/16 10.0.0.0/8
       Require ip ::1
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1 192.168.0.0/16 10.0.0.0/8
     Allow from ::1
   </IfModule>
</Directory>

<Directory /usr/share/phpMyAdmin/setup/>
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
        Require ip 127.0.0.1 192.168.0.0/16 10.0.0.0/8
       Require ip ::1
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1 192.168.0.0/16 10.0.0.0/8
     Allow from ::1
   </IfModule>
</Directory>

Перезапускаем сервер Apache
# systemctl restart  httpd.service

Теперь к странице phpmyadmin можно обратиться так:
http://192.168.1.222/phpmyadmin
Здесь – 192.168.1.222 – ip адрес нашего сервера.