NGINX + Apache (httpd) + MariaDB (MySQL) + PHP + PHP-FPM (fastCGI) + FTP + PHPMyAdmin + Memcached + xCache + Postfix на CentOS 7

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

Тематические термины: Linux, CentOSNGINX, Apache, MySQL, MariaDBPHP-FPMFTPphpMyAdminMemcachedxCache, Postfix.

Содержание:

Общая настройка системы
Установка NGINX
Установка PHP и PHP-FPM
Установка MariaDB или MySQL
Установка phpMyAdmin
Установка Memcached
Установка xCache
Установка и настройка FTP-сервера
Apache (httpd)
Postfix
Тюнинг веб-сервера
Создание первого сайта

Общая настройка системы

Обновляем CentOS:

yum update

Устанавливаем репозиторий EPEL:

yum install epel-release

Настраиваем время:

yum install ntpdate

\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

ntpdate ru.pool.ntp.org

* первая команда выполняет установку пакета ntp, который необходим для синхронизации времени; вторая устанавливает часовой пояс по московскому времени; третья выполняет синхронизацию времени с сервером ru.pool.ntp.org.

Настраиваем cron для автоматической синхронизации времени:

crontab -e

И настраиваем запуск задания ежедневно в 00:00:

0 0 * * * /sbin/ntpdate ru.pool.ntp.org

Отключаем SELinux:

sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config

setenforce 0

* первая команда редактирует конфигурационный файл, чтобы SELinux не запускался автоматически, вторая — отключает его разово. Подробнее читайте статью Как отключить SELinux.

Открываем необходимые порты в брандмауэре:

firewall-cmd --permanent --add-port=80/tcp

firewall-cmd --permanent --add-port=443/tcp

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

firewall-cmd --permanent --add-port=20-21/tcp

firewall-cmd --permanent --add-port=40900-40999/tcp

firewall-cmd --permanent --add-port=25/tcp

firewall-cmd --permanent --add-port=465/tcp

firewall-cmd --permanent --add-port=587/tcp 

firewall-cmd --reload

* 80, 443 и 8080 порты для веб-сервера; 20, 21 порты нужны для работы FTP; 40900-40999 также необходимы для работы FTP (динамические порты для пассивного режима); 25, 465 и 587 порты нужны для работы почтового сервера по SMTP; последняя команда перезапускает firewalld, чтобы применить новые правила. Подробнее про настройку firewalld.

Установка NGINX

Устанавливаем NGINX:

yum install nginx

Внесем небольшую корректировку в файл nginx.conf:

vi /etc/nginx/nginx.conf

http {
    ...
    server_names_hash_bucket_size 64;
    ....
}

* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.

Разрешаем автозапуск сервиса и запустим его:

systemctl enable nginx

systemctl start nginx

Проверим, что веб-сервер работает. Для этого открываем браузер на другом компьютере, который находится в одной сети и вводим в адресной строке IP-адрес сервера. В итоге мы должны увидеть заголовок «Welcome to nginx!»:

Заголовок Welcome to nginx!

Для настройки http/2 читайте соответствующую статью.

Установка PHP и PHP-FPM

Устанавливаем PHP следующей командой:

yum install php

Устанавливаем php-fpm:

yum install php-fpm

Запускаем php-fpm и разрешаем его автозапуск:

systemctl start php-fpm

systemctl enable php-fpm

Настройка связки NGINX + PHP

Открываем файл для настройки виртуального домена по умолчанию:

vi /etc/nginx/nginx.conf

В секции location редактируем параметр index на следующее значение:

    location / {
        index  index.php;
    }

А внутри секции server добавим следующее:

    location ~ \.php$ {
        set $root_path /usr/share/nginx/html;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param DOCUMENT_ROOT $root_path;
    }

* где /usr/share/nginx/html — корневой путь хранения скриптов; 9000 — порт php-fpm.

Проверяем правильность настроек nginx:

nginx -t

И перезагружаем его:

systemctl restart nginx

Заходим в каталог хранения настроенного сайта:

cd /usr/share/nginx/html

Создаем index.php со следующим содержимым:

vi index.php

<?php phpinfo(); ?>

Открываем в браузере IP-адрес нашего сервера. Теперь мы должны увидеть сводную информацию по PHP и его настройкам:

Информация о php (phpinfo)

* Если необходимо установить PHP 7, читайте статью Как установить PHP 7 на CentOS 7.

Установка MariaDB или MySQL

В данной статье мы установим MariaDB, но процедура установки и настройки MySQL аналогичная. Все расхождения будут отмечены явно в инструкции.

Устанавливаем MariaDB следующей командой:

yum install mariadb mariadb-server

* для установки mysql выполняем команду yum install mysql

Разрешаем автозапуск и запускаем СУБД:

systemctl enable mariadb

systemctl start mariadb

* для работы с mysql меняем mariadb на mysql.

Сразу создаем пароль для учетной записи root:

mysqladmin -u root password

PHP + MariaDB (MySQL)

Для возможности подключаться к базе данных скриптами PHP необходимо установить следующие модули:

yum install php-mysql php-mysqli

После перезагружаем php-fpm:

systemctl restart php-fpm

И открываем наш сайт в браузере. В phpinfo появится новая секция MySQL:

В phpinfo появилась информация о поддержке MySQL

* нас не должно смущать, что установили мы mariadb, а заголовок mysql. Если посмотреть в таблицу, можно увидеть ячейку Client API version, в которой указано, что используется именно mariadb.

Установка phpMyAdmin

Для установки phpMyAdmin вводим следующую команду:

yum install phpmyadmin

Теперь создадим для него отдельный виртуальный домен в NGINX:

vi /etc/nginx/conf.d/phpMyAdmin.conf

И добавим в него следующее содержимое:

server {
        listen       80;
        server_name  phpmyadmin.dmosk.local;
        set $root_path /usr/share/phpMyAdmin;

        location / {
                root $root_path;
                index index.php;
        }

        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
                include fastcgi_params;
                fastcgi_param DOCUMENT_ROOT $root_path;
        }
}

* где phpmyadmin.dmosk.local — адрес для виртуального домена, именно этот адрес должен быть введен в адресную строку браузера, чтобы открылся нужный сайт. Поэтому есть нет возможность зарегистрировать домен и имя узла в DNS, можно воспользоваться локальным файлом hosts. /usr/share/phpMyAdmin — это каталог, в который по умолчанию устанавливается phpMyAdmin.

После перезапускаем NGINX:

systemctl reload nginx

Также нужно перезапустить php-fpm, так как в процессе установки был добавлен модуль mbstring:

systemctl restart php-fpm

И открываем в браузере наш домен, в данном примере, phpmyadmin.dmosk.local. Откроется форма для авторизации — вводим логин root и пароль, который мы указали после установки и запуска mariadb.

Установка Memcached

Для начала, выполняем установку пакетов:

yum install memcached php-pecl-memcached

После разрешаем автозапуск и запускаем сервис кэширования:

systemctl enable memcached

systemctl start memcached

Перезапускаем php-fpm:

systemctl restart php-fpm

Готово. Чтобы проверить, что модуль memcached работаем, открываем наш сайт в браузере — в phpinfo должна появиться новая секция:

В phpinfo появилась информация о поддержке Memcached

Установка xCache

Запускаем установку xCache следующей командой:

yum install php-xcache

Перезапускаем php-fpm:

systemctl restart php-fpm

В phpinfo должно появиться следующее:

В phpinfo появилась информация о поддержке xCache

Установка и настройка FTP-сервера

В качестве FTP-сервера будем использовать ProFTPd, так как он позволяет авторизовываться под uid системных учетных записей. Для его установки вводим следующую команду:

yum install proftpd proftpd-utils

Создаем каталог для хранения настроек:

mkdir /etc/proftpd.d

Создаем виртуального пользователя:

ftpasswd --passwd --file=/etc/proftpd.d/ftpd.passwd --name=ftpwww --uid=48 --gid=48 --home=/var/www --shell=/sbin/nologin

* где /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи; ftpwww — имя пользователя (логин); uid и gid — идентификаторы пользователя и группы системной учетной записи (apache); /var/www — домашний каталог пользователя; /sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.

Открываем на редактирование конфигурационный файл proftpd:

vi /etc/proftpd.conf

И редактируем следующее:

#AuthOrder ...

В конце добавим следующее:

UseIPv6 off
IdentLookups off
PassivePorts 40900 40999

RequireValidShell off
AuthUserFile /etc/proftpd.d/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c

* где 40900 - 40999 — диапазон динамических портов для пассивного режима.

Разрешаем автозапуск FTP-серверу и запускаем его:

systemctl enable proftpd

systemctl start proftpd

Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Cammnader или тот же браузер.

Это базовая и самая простая настройка ProFTPd, но если необходимо настроить TLS или хранить виртуальных пользователей в базе MySQL, читайте подробнее инструкцию по настройке ProFTPd на CentOS 7.

Apache (httpd)

Несмотря на то, что мы установили и настроили PHP-FPM, Apache нам понадобится, как минимум, по двум причинам. Во-первых, многие сайты используют файл .htaccess, который читает только Apache. Во-вторых, последний включает большое число модулей, которые может использовать портал.

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

И так, устанавливаем httpd:

yum install httpd

Заходим в настройки:

vi /etc/httpd/conf/httpd.conf

И редактируем следующее:

Listen 8080

* наш веб-сервер будет слушать на порту 8080, так как на 80 уже работает NGINX.

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

* если не указан конкретный скрипт, сначала веб-сервер пытается найти и запустить index.php, затем index.html

<Directory /var/www/*/www>
    AllowOverride All
    Options Indexes ExecCGI FollowSymLinks
    Allow from all
</Directory>

Разрешаем автозапуск и запускаем службу:

systemctl enable httpd

systemctl start httpd

Создаем php-файл со следующим содержимым:

vi /var/www/html/index.php

<?php phpinfo(); ?>

Открываем браузер и вводим в адресную строку IP-адрес нашего сервера и добавляем :8080. Мы должны увидеть привычную страницу:

Проверка работоспособности Apache с помощью phpinfo

Apache Real IP

Так как все запросы на httpd приходят от NGINX, они воспринимаются как от IP-адреса 127.0.0.1. На практике, это может привести к проблемам, так как некоторым сайтам необходимы реальные адреса посетителей.

Для решения проблемы будем использовать модуль mod_rpaf. Устанавливаем набор разработчика для apache:

yum install httpd-devel gcc

Переходим в каталог /usr/local/src:

cd /usr/local/src

Скачиваем модуль:

wget https://github.com/gnif/mod_rpaf/archive/stable.zip

Распаковываем его:

unzip stable.zip

Переходим в распакованный каталог:

cd mod_rpaf-stable/

Собираем модуль и устанавливаем его:

make

make install

Создаем конфигурационный файл со следующим содержимым:

vi /etc/httpd/conf.d/mod_rpaf.conf

LoadModule              rpaf_module modules/mod_rpaf.so
RPAF_Enable             On
RPAF_ProxyIPs           127.0.0.1
RPAF_SetHostName        On
RPAF_SetHTTPS           On
RPAF_SetPort            On
RPAF_ForbidIfNotProxy   Off

Перезапускаем httpd:

systemctl restart httpd

Для проверки настройки открываем на редактирование уже созданный файл:

vi /var/www/html/index.php

И редактируем содержимое файла на:

<?php echo $_SERVER['REMOTE_ADDR'] ?>

Открываем браузер и вводим в адресную строку IP-адрес нашего сервера и добавляем :8080. Мы должны увидеть внешний адрес компьютера, с которого обращаемся к серверу.

Postfix

В CentOS 7 postfix уже установлен и запущен. Нам необходимо сделать несколько простых настроек:

vi /etc/postfix/main.cf

myorigin = $mydomain
smtp_generic_maps = hash:/etc/postfix/generic_map

* где myhostname — имя узла для почтового сервера (его он будет использовать в представлениях другим почтовым серверам); mydomain — домен сервера; myorigin — имя домена, которое будет подставляться всем отправляемым сообщениям без явного указания оного; smtp_generic_maps указывает на карту с общими правилами пересылки.

Открываем карту пересылки:

vi /etc/postfix/generic_map

И добавляем:

@dmosk.local    no-reply@dmosk.local

* данной настройкой мы будем подставлять всем отправляемым письмам без поля FROM адрес no-reply@dmosk.local.

Создаем карту:

postmap /etc/postfix/generic_map

Для применения настроек перезагружаем почтовый сервер:

systemctl restart postfix

Тюнинг веб-сервера

PHP

Открываем на редактирование следующий файл:

vi /etc/php.ini

И правим следующее:

upload_max_filesize = 256M
post_max_size = 256M
short_open_tag = On
date.timezone = "Europe/Moscow"

Перезапускаем php-fpm и httpd:

systemctl restart php-fpm

systemctl restart httpd

NGINX

Открываем на редактирование следующий файл:

vi /etc/nginx/nginx.conf

И правим следующее:

worker_processes  auto;

И внутри секции http добавляем:

client_max_body_size 256M;

После перезапускаем nginx:

systemctl restart nginx

Postfix

Чтобы отправляемая почта меньше попадала в СПАМ, необходимо выполнить следующие шаги:

  1. Прописать PTR-запись.
  2. Создать запись SPF.
  3. Настроить DKIM

Создание первого сайта

Создаем новый файл виртуального домена NGINX:

vi /etc/nginx/conf.d/site1.conf

* обязательно на конце должен быть .conf, так как только такие файлы веб-сервер подгружает в конфигурацию.

И добавляем следующее содержимое:

server {
    listen       80;
    server_name  site1.local www.site1.local;
    set $root_path /var/www/site1/www;
    
    gzip  on;
    gzip_disable "msie6";
    gzip_min_length 1000;
    gzip_vary on;
    gzip_proxied    expired no-cache no-store private auth;
    gzip_types      text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    
    access_log /var/www/site1/log/nginx/access_log;
    error_log /var/www/site1/log/nginx/error_log;

    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;
    }
    
    location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ {
            root   $root_path;
            expires 4h;
    }
}

* где site1.local — домен, для которого создается виртуальный домен; /var/www/site1 — каталог, в котором будет размещаться сайт.
** все запросы будут переводиться на локальный сервер, порт 8080, на котором работает apache, кроме обращений к статическим файла (jpg, png, css и так далее).
*** обратите внимание на выделения полужирным — здесь нужно подставить свои данные.

Теперь создаем виртуальный домен в Apache:

vi /etc/httpd/conf.d/site1.conf

<VirtualHost *:8080>
    Define root_domain site1.local
    Define root_path /var/www/site1

    ServerName ${root_domain}
    ServerAlias www.${root_domain}
    DocumentRoot ${root_path}/www

    ErrorLog     ${root_path}/log/apache/error_log
    TransferLog  ${root_path}/log/apache/access_log

    php_admin_value upload_tmp_dir ${root_path}/tmp
    php_admin_value doc_root ${root_path}
    php_admin_value open_basedir    ${root_path}:/usr/local/share/smarty:/usr/local/share/pear
    php_admin_value session.save_path 0;0660;${root_path}/tmp
</VirtualHost>

Создаем каталоги для сайта:

TMP_SITE=site1

* где site1 — имя каталога. Нам будет намного удобнее копировать и вставлять команды с переменной (не придется править после копипасты).

mkdir -p /var/www/$TMP_SITE/{www,tmp}

mkdir -p /var/www/$TMP_SITE/log/{nginx,apache}

Создаем индексный файл со следующим содержимым:

vi /var/www/$TMP_SITE/www/index.php

<?php echo "<h1>Hello from site1</h1>"; ?>

Задаем права на папки:

chown -R apache:apache /var/www/$TMP_SITE

chmod -R 775 /var/www/$TMP_SITE

Проверяем корректность настроек конфигурационных файлов:

nginx -t

apachectl configtest

Перезапускаем веб-сервер:

systemctl reload nginx

systemctl reload httpd

Открываем сайт в браузере.

При необходимости, создаем базу данных.

mysql -uroot -p

> CREATE DATABASE site1 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

> GRANT ALL PRIVILEGES ON site1.* TO dbuser@localhost IDENTIFIED BY 'password' WITH GRANT OPTION;

* данными sql-командами мы создаем базу данных site1 и предоставляем к ней доступ для учетной записи dbuser с паролем password. При желании сделать соединение более безопасным, можно убрать WITH GRANT OPTION.

# Сервера # Интернет # UNIX # NGINX # MySQL # Linux # CentOS
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет