В данной статье будет рассказывается про установку и настройку веб сервера на 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, но это тема уже другой статьи.