Almost Over

Установка Apache, PHP и MariaDB на CentOS

Установка Apache + MariaDB + PHP на CentOS

Предполагается, что сервер уже базово настроен и на нём присутсвует рабочий NGINX (или Tengine), как это описано здесь.

Установка Apache 2.2.15

$ yum update
$ yum install httpd mod_fcgid

Настройка Apache

$ nano /etc/httpd/conf/httpd.conf
1
2
3
4
5
6
7
8
Listen 127.0.0.1:8080
ServerName localhost
LoadModule cgi_module modules/mod_cgi.so
LoadModule fcgid_module modules/mod_fcgid.so
# for "php_flag" .htaccess directive
#LoadModule php5_module modules/libphp5.so
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %v %l %u %t \"%r\" %>s %b \"%{Referer}i\"" combined

Настройка FastCGI

1
2
3
4
5
6
7
8
9
10
11
12
13
echo '#LoadModule fcgid_module modules/mod_fcgid.so

# Use FastCGI to process .fcg .fcgi & .fpl scripts
AddHandler fcgid-script fcg fcgi fpl

# Sane place to put sockets and shared memory file
FcgidIPCDir /var/run/mod_fcgid
FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm

FcgidIOTimeout 600
FcgidMaxRequestLen 128000000
DirectoryIndex index.php
PHP_Fix_Pathinfo_Enable 1' > /etc/httpd/conf.d/fcgid.conf

Установка mod_rpaf

$ yum install httpd-devel
$ cd /tmp
$ wget https://github.com/gnif/mod_rpaf/archive/stable.zip
$ unzip stable.zip
$ cd mod_rpaf-stable
$ make && make install

Настройка mod_rpaf

1
2
3
4
5
6
7
8
echo 'LoadModule            rpaf_module modules/mod_rpaf.so
RPAF_Enable On
RPAF_ProxyIPs 127.0.0.1 10.0.0.0/24
RPAF_Header X-Forwarded-For
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
RPAF_ForbidIfNotProxy Off' > /etc/httpd/conf.d/mod_rpaf.conf

Ротация логов

1
2
3
4
5
6
7
8
9
10
11
12
echo "/var/log/httpd/*log {
daily
rotate 10
missingok
notifempty
compress
sharedscripts
delaycompress
postrotate
/sbin/service httpd reload > /dev/null 2>/dev/null || true
endscript
}" > /etc/logrotate.d/httpd

$ logrotate -d /etc/logrotate.conf
$ logrotate -v -f /etc/logrotate.conf
$ cat /var/lib/logrotate.status

Установка PHP 5.4

Более подробную информацию по репозиторию можно найти на webtatic.com.

Подключаем Webtatic

1
2
3
Webtatic CentOS 5.x: rpm -Uvh https://mirror.webtatic.com/yum/el5/latest.rpm
Webtatic CentOS 6.x: rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
Webtatic CentOS 7.x: rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
$ yum install php54w php54w-cli php54w-common php54w-mysqlnd php54w-pgsql php54w-odbc php54w-pdo php54w-pecl-memcache php54w-devel php54w-gd php54w-imap php54w-ldap php54w-mbstring php54w-mcrypt php54w-xmlrpc

Настройка PHP

$ nano /etc/php.ini
1
2
3
4
5
6
7
8
9
10
11
cgi.fix_pathinfo=1

short_open_tag = On
disable_functions = system, exec
expose_php = Off
max_execution_time = 0
memory_limit = 256M
post_max_size = 128M
upload_max_filesize = 128M
date.timezone = "Europe/Moscow"
;session.use_only_cookies = 0

ionCube для PHP

$ cd /tmp
$ arch

Для i686

$ wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz && tar xvfz ioncube_loaders_lin_x86.tar.gz

Для x86_64

$ wget http://downloads3.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz && tar zxf ioncube_loaders_lin_x86-64.tar.gz

Переносим в директорию local, Меняем права на root

$ mv ioncube /usr/local/ioncube
$ chown -R root:root /usr/local/ioncube

Редактируем конфиг ionCube

$ nano /etc/php.d/ion.ini
1
2
zend_extension = /usr/local/ioncube/ioncube_loader_lin_5.4.so
zend_extension_ts = /usr/local/ioncube/ioncube_loader_lin_5.4_ts.so
$ service httpd restart
$ php -v

Zend OPcache для PHP

$ yum install php54w-pecl-zendopcache

$ nano /etc/php.d/opcache.ini
1
2
opcache.memory_consumption=64
opcache.max_accelerated_files=2000
$ service httpd restart
$ php -v
1
2
3
4
# opcache-gui
cd ~ && ./add-site.sh
cd /var/www/vhosts/$DOMAIN && wget https://raw.githubusercontent.com/amnuts/opcache-gui/master/index.php
chown -R $USER:$USER /var/www/vhosts/$DOMAIN/index.php

Memcached для PHP

$ yum install memcached
$ nano /etc/sysconfig/memcached
1
2
CACHESIZE="64"
OPTIONS="-l 127.0.0.1"
$ nano /etc/php.ini
1
2
session.save_handler = memcache (или memcached)
session.save_path = "127.0.0.1:11211"
$ chkconfig memcached on
$ service memcached start
$ service httpd restart
$ ps -aux | grep memcached
1
2
3
4
5
6
7
# phpMemcachedAdmin
cd ~ && ./add-site.sh
cd /tmp && wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/phpmemcacheadmin/phpMemcachedAdmin-1.2.2-r262.zip
unzip phpMemcachedAdmin-1.2.2-r262.zip -d /var/www/vhosts/$DOMAIN
chown -R $USER:$USER /var/www/vhosts/$DOMAIN/index.php
cd /var/www/vhosts/$DOMAIN && chmod +rx *
chmod 0777 Config/Memcache.php && chmod 0777 Temp/

Добавляем сайт

$ cd ~
$ wget https://raw.githubusercontent.com/ivan-nginx/scripts/master/add-site.sh
$ chmod 755 add-site.sh
$ ./add-site.sh

$ chkconfig httpd on
$ httpd -t
$ service httpd restart

Настраиваем NGINX

$ nano /etc/nginx/fastcgi_params
1
2
3
...
fastcgi_param HTTP_SCHEME $scheme;
...

Установка MariaDB (MySQL)

Информация о репозиториях расположена на mariadb.org.

Версия 10.0 подойдёт, если не требуется улучшенной master-master (в отличии от стандартной master-slave) репликации баз данных с использованием платформы Galera.
Если же репликация необходима, следует устанавливать версию 10.1, в которой Galera встроена по-умолчанию.
Вкратце о том, как работает Galera:

Версия 10.0.x

10.0 (x86)

$ nano /etc/yum.repos.d/mariadb.repo
1
2
3
4
5
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-x86
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

10.0 (x86_64)

$ nano /etc/yum.repos.d/mariadb.repo
1
2
3
4
5
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Версия 10.1.x (Galera)

10.1 (x86)

$ nano /etc/yum.repos.d/mariadb.repo
1
2
3
4
5
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos6-x86
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

10.1 (x86_64)

$ nano /etc/yum.repos.d/mariadb.repo
1
2
3
4
5
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Установка MariaDB

$ yum install MariaDB-server

$ # Опционально: базовая конфигурация для большого сервера
$ cp /usr/share/mysql/my-large.cnf /etc/my.cnf.d/my.cnf

$ chkconfig mysql on
$ service mysql start
$ /usr/bin/mysql_secure_installation

Обновление с 10.0 до 10.1

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

$ nano /etc/yum.repos.d/mariadb.repo
1
2
- baseurl = http://yum.mariadb.org/10.0/centos6-$arch
+ baseurl = http://yum.mariadb.org/10.1/centos6-$arch
$ yum clean metadata

$ service mysql stop

$ rpm -qa | grep -i '^MariaDB'

$ yum remove MariaDB-* galera

$ yum install MariaDB-server
$ service mysql start
$ mysql_upgrade -u root -p$PASS

$ mysql
1
2
3
4
5
6
7
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 37
Server version: 10.1.20-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

По аналогии можно обновить и архитектуру (с x86 на amd64, или наоборот).

Мониторинг MySQL

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

$ yum install mytop
$ nano /root/.mytop
1
2
3
4
5
6
7
8
9
10
11
12
13
user=root
pass=$ROOT_PASS
host=localhost
db=mysql
delay=3
port=3306
socket=
batchmode=0
header=1
color=1
idle=1
slow=10
long=120
$ mytop -d $DB_NAME

Тонкая настройка MySQL

Для базовой и самой быстрой настройки MySQL/MariaDB можно использовать онлайн визард persona.
Для более тонких и корректных настроек следует использовать предоставленные ниже скрипты.

Tuning Primer
$ cd ~
$ wget https://raw.githubusercontent.com/RootService/tuning-primer/master/tuning-primer.sh
$ chmod 755 tuning-primer.sh
MySQLTuner
$ cd ~
$ wget https://github.com/major/MySQLTuner-perl/tarball/master
$ tar xf master
$ ls
$ cd major-MySQLTuner-perl-xxx
$ ./mysqltuner.pl

P.S. Обратите внимание, тестировать скриптами нужно на уже готовых продакшенах и не единожды, а продолжительное время (через день, например).