Настройка веб сервера на Centos 7 (Apache + PHP 5.6 (opcache)+ NGINX + MySQL + MyPhpAdmin)

В данной статье будет рассказывается про установку и настройку веб сервера на Centos 7 в конфигурации Apache + PHP 5.6 (opcache)+ NGINX + MySQL + MyPhpAdmin. Такая связка для большинства задач является наиболее производительным решением на сегодняшний день (октябрь 2015 года).

Про установку и первичную настройку Centos 7 можно прочитать в статье «Установка и настройка CentOS 7». Или же можно заказать готовый виртуальный сервер на любом хостинге с уже установленным шаблоном «чистый Centos 7», я рекомендую хостинг ruweb.net.

Сервер конфигурируем таким образом, чтобы на 80 порту висел nginx и отдавал всю статику, а запросы на динамику отдавал апачу, который будет находиться на порту 8080. В качестве сервера MySQL будем использовать MariaDB, это полностью совместимый аналог MySQL, но по некоторым операциям MariaDB в десятки раз производительнее.

Первоначальные настройки Centos 7

Обновляем ОС

yum update

Подключаем репозиторий EPEL

yum install epel-release

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

yum repolist

Для наблюдения за загрузкой и производительностью сервера устанавливаем ATOP (вызывается командой atop):

yum install atop

Установка Apache на Centos 7

Apache у нас будет использоваться для отдачи динамического содержимого, непосредственно с клиентом будет общаться nginx.

Установка apache из репозитория:

yum install httpd

В файле конфигурации httpd.conf, который находится по пути /etc/nginx, меняем порт на 8080

Listen 8080

Запускаем сервис и настраиваем его для автозапуска

systemctl start httpd 
systemctl enable httpd

Установка PHP 5.6 с оптимизацией opcache

Устанавливаем PHP 5.6 c opcache и модулем для работы с mysqlnd

rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install -y php56w php56w-opcache php56w-mysqlnd

Для проверки работы Apache и php временно открываем порт 8080 для внешних подключений (после перезагрузки он будет снова закрыт). В Centos 7 вместо привычной всем IPtables установлена более современная служба файрвола Firewalld.

firewall-cmd --add-port=8080/tcp

В папке /var/www/html создаем файл phpinfo.php со следующим содержимым.

<?php
phpinfo();
?>

Заходим на сервер из любого браузера по нашему IP адресу с указанием порта 8080 — http://IP-сервера:8080/phpinfo.php . Мы должны увидеть информацию о php, apache и установленных модулях.

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

MariaDB является полностью совместимым и более производительным аналогом MySQL, поэтому я на своих серверах устанавливаю именно ее и проблем пока не встречал.

yum -y install mariadb-server
systemctl start mariadb 
systemctl enable mariadb

Для настройки безопасности MySQL запускаем соответствующий скрипт

mysql_secure_installation

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

Установка nginx на Centos 7

Устанавливаем nginx

yum install nginx

Дописываем в конфигурационный файл /etc/nginx/nginx.conf в секции location следующие строки

location / {
            proxy_pass      http://127.0.0.1:8080/;
            proxy_redirect    off;
            proxy_set_header  Host $host;
            proxy_set_header  X-Real-IP $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
            client_max_body_size 10m;
            proxy_connect_timeout 90;
        }

Запускаем nginx и настраиваем его автозапуск

systemctl start nginx
systemctl enable nginx

Теперь нам необходимо на файрволе открыть 80 порт (http), чтобы наш сервер стал доступен снаружи.

firewall-cmd --add-service=http --permanent

Ключ —permanent указывает на то, что порт открывается на постоянной основе и после перезагрузки останется открытым.

Перезагружаем сервер

reboot

Пробуем в браузере набрать IP адрес нашего сервера, мы должны увидеть страницу «nginx error!». Значит nginx установлен и работает!

Настройка SELinux

В Centos 7 много сделано для повышения безопасности, однако это иногда добавляет головной боли. В частности, в Centos 7 по умолчанию включен SELinux. Скорее всего сервер будет работать как-то не так и в файле /var/log/nginx/error.log выдавать ошибку:

2015/10/20 14:44:16 [crit] 11593#0: *20 connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream, client: X.X.X.X, server: msadmin.ru, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "msadmin.ru"

Для простоты SELinux можно просто отключить. Для этого находим файл /etc/sysconfig/selinux, исправляем в нем соответствующую строчку на SELINUX=disabled и перезагружаемся.

Но поступать таким варварским способом я считаю неправильно. Лучше не нарушать безопасность и использовать политики SELinux для nginx:

yum install policycoreutils-python
cat /var/log/audit/audit.log|grep nginx | grep denied | tail -n 1 |audit2allow -M mynginx
semodule -i mynginx.pp

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

Настройка сервера apache+nginx для обслуживания веб домена

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

  • написание конфигурационного фала apache для домена
  • написание конфигурационного фала nginx для домена

Предположим нам необходимо сделать, чтобы сервер обслуживал домен msadmin.ru. В папке /etc/httpd/conf.d создаем файл msadmin.ru.conf со следующим содержимым:

    ServerName msadmin.ru
    DirectoryIndex index.php
    DocumentRoot /var/www/msadmin.ru
    ServerAdmin webmaster@hotdem.ru
    ServerAlias www.msadmin.ru
    CustomLog /var/log/httpd/msadmin.access.log combined
    ErrorLog /var/log/httpd/msadmin.error.log


    AllowOverride All
    Options +Includes

В папке /etc/nginx/conf.d создаем файл с таким же именем msadmin.ru.conf со следующим содержимым:

server {
#  listen msadmin.ru:80;
    listen 80;
    server_name msadmin.ru;
# Ведём журнал доступа:
access_log  /var/log/nginx/msadmin.ru_access.log;

# Разделяем статику и динамку, статику храним в кэше 10 дней:
    location ~* \.(jpg|jpeg|png|ico|css|bmp|swf|doc|docx|pdf|xls|xlsx|rar|zip|tbz|7z|exe)$ {
    root /var/www/msadmin.ru/;
    expires 10d;
    }

location / {
    proxy_pass         http://127.0.0.1:8080/;
    proxy_redirect     off;
    log_not_found      off;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   Host $http_host;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Создаем папку /var/www/msadmin.ru и располагаем в ней файлы нашего сайта. После создания или внесения изменений в конфигурационных файлах необходимо перезапустить сервисы.

service httpd restart
service nginx restart

Поздравляем, настройка сервера завершена!

Установка phpMyAdmin

Устанавливаем phpMyAdmin

yum install phpmyadmin

После установки phpMyAdmin доступен только для локальной работы, для удобства необходимо разрешить ему работать с внешней сетью. Для этого вносим следующие изменения в конфигурационный файл /etc/httpd/conf.d/phpMyAdmin.conf:

<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8
   <IfModule mod_authz_core.c>
     # Apache 2.4
     <RequireAny>
       # Require ip 127.0.0.1
       # Require ip ::1
       Require all granted
     </RequireAny>
   </IfModule>
   <IfModule !mod_authz_core.c>
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     # Order Allow,Deny
       # Require ip 127.0.0.1
       # Require ip ::1
       Require all granted
   </IfModule>
</Directory>

Не забываем перезапустить apache и разрешить доступ к порту 8080 на постоянной основе (т.к. apache у нас установлен на порту 8080):

service httpd restart
firewall-cmd --add-port=8080/tcp --permanent

Теперь можно заходить в phpMyAdmin по адресу http://ip_сервера:8080/phpmyadmin. Публиковать phpMyAdmin в nginx нет смысла, т.к. массовых обращений к нему не будет и экономии производительности мы не достигнем. Конечно правильнее было бы опубликовать phpMyAdmin по https, но это тема уже другой статьи.