Настройка LAMP-сервера (Linux, Apache, MariaDB/MySQL, PHP) в CentOS/RHEL 7

Содержание


LAMP — акроним, обозначающий набор (комплекс) серверного программного обеспечения, широко используемый во Всемирной паутине. LAMP назван по первым буквам входящих в его состав компонентов:

  • Linux — операционная система Linux;
  • Apache — веб-сервер;
  • MariaDB/MySQL — СУБД;
  • PHP — язык программирования, используемый для создания веб-приложений (помимо PHP могут подразумеваться другие языки, такие как Perl и Python).


 

Установка веб-сервера Apache

Установим пакет httpd, запустим его и внесём необходимые изменения в firewall для его работы:

$ yum -y install httpd
$ nano -w /etc/httpd/conf/httpd.conf
ServerAdmin hostmaster@example.com

$ systemctl enable httpd.service
$ systemctl start httpd.service
$ systemctl status httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
   Active: active (running) since Sun 2014-11-23 18:52:36 MSK; 1s ago
 Main PID: 30216 (httpd)
   Status: "Processing requests..."
   CGroup: /system.slice/httpd.service
           ├─30216 /usr/sbin/httpd -DFOREGROUND
           ├─30217 /usr/sbin/httpd -DFOREGROUND
           ├─30218 /usr/sbin/httpd -DFOREGROUND
           ├─30219 /usr/sbin/httpd -DFOREGROUND
           ├─30220 /usr/sbin/httpd -DFOREGROUND
           └─30221 /usr/sbin/httpd -DFOREGROUND

Nov 23 18:52:36 examle.com systemd[1]: Started The Apache HTTP Server.

$ ss -tnlp | grep httpd
LISTEN     0      128                       *:80                       *:*      users:(("httpd",30221,3),("httpd",30220,3),("httpd",30219,3),("httpd",30218,3),("httpd",30217,3),("httpd",30216,3))
$ firewall-cmd --permanent --zone=public --add-service=http
$ firewall-cmd --reload

Открываем в браузере ссылку http://example.com/ и убеждаемся что веб-сервер работает.
 
Теперь настроим HTTPS в Apache:
Установим специальный модуль для Apache и настроим его (SSL-сертификаты, необходимые для работы модуля, будем использовать уже имеющиеся, которые мы создавали в этой заметке):

$ yum -y install mod_ssl
$ nano -w /etc/httpd/conf.d/ssl.conf
Listen 443 https
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCertificateFile /etc/pki/tls/certs/example.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/example.com.key
SSLCertificateChainFile /etc/pki/tls/certs/sub.class1.server.ca.pem
$ systemctl reload httpd.service
$ firewall-cmd --permanent --zone=public --add-service=https
$ firewall-cmd --reload

Открываем в браузере ссылку https://example.com/ и убеждаемся что веб-сервер работает по протоколу HTTPS.
 

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

Установим необходимые пакеты, запустим и настроим SQL-сервер:

$ yum -y install mariadb mariadb-server
$ systemctl enable mariadb.service 
ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service'
$ systemctl start mariadb.service
$ systemctl status mariadb.service -l
mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled)
   Active: active (running) since Sun 2014-11-23 17:23:44 MSK; 21s ago
  Process: 28722 ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID (code=exited, status=0/SUCCESS)
  Process: 28642 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n (code=exited, status=0/SUCCESS)
 Main PID: 28721 (mysqld_safe)
   CGroup: /system.slice/mariadb.service
           ├─28721 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
           └─28878 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock

Nov 23 17:23:42 example.com mariadb-prepare-db-dir[28642]: The latest information about MariaDB is available at http://mariadb.org/.
Nov 23 17:23:42 example.com mariadb-prepare-db-dir[28642]: You can find additional information about the MySQL part at:
Nov 23 17:23:42 example.com mariadb-prepare-db-dir[28642]: http://dev.mysql.com
Nov 23 17:23:42 example.com mariadb-prepare-db-dir[28642]: Support MariaDB development by buying support/new features from
Nov 23 17:23:42 example.com mariadb-prepare-db-dir[28642]: SkySQL Ab. You can contact us about this at sales@skysql.com.
Nov 23 17:23:42 example.com mariadb-prepare-db-dir[28642]: Alternatively consider joining our community based development effort:
Nov 23 17:23:42 example.com mariadb-prepare-db-dir[28642]: http://mariadb.com/kb/en/contributing-to-the-mariadb-project/
Nov 23 17:23:42 example.com mysqld_safe[28721]: 141123 17:23:42 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
Nov 23 17:23:42 example.com mysqld_safe[28721]: 141123 17:23:42 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
Nov 23 17:23:44 example.com systemd[1]: Started MariaDB database server.

$ mysql_secure_installation 
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): /пароль у нас ещё не установлен, нажимаем «Enter»/
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Не обращаем внимание на ошибку:

/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

она ни на что не влияет, и в следующих версиях этой ошибки уже не будет. Вот описание бага на сайте разработчиков.
Если планируется подключаться к данному SQL-серверу снаружи, нужно разрешить подключения к порту 3306 в фаерволе и настроить MariaDB на работу на этом порту:

$ nano -w /etc/my.cnf.d/server.cnf
[mysqld]
bind-address = 0.0.0.0
$ systemctl restart mariadb.service
$ ss -tnlp | grep 3306
LISTEN     0      50                        *:3306                     *:*      users:(("mysqld",29591,14))
$ firewall-cmd --permanent --zone=public --add-service=mysql
$ firewall-cmd --reload

 

Установка PHP

Установим и изменим кое-какие настройки по умолчанию:

$ yum -y install php php-mysql
$ nano -w /etc/php.ini
post_max_size = 64M
upload_max_filesize = 32M
date.timezone = Europe/Moscow
$ echo "<?php phpinfo(); ?>" >/var/www/html/phpinfo.php
$ systemctl restart httpd.service

Открываем в браузере ссылку https://example.com/phpinfo.php и убеждаемся что PHP работает. Убедившись что PHP работает – удаляем тестовый скрипт:

$ rm -f /var/www/html/phpinfo.php

 

Установка phpMyAdmin

Сначала устанавливаем phpMyAdmin:

$ yum -y install phpmyadmin

Затем прописываем IP-адреса с которых будет разрешено подключение к phpMyAdmin:

$ nano -w /etc/httpd/conf.d/phpMyAdmin.conf

Теперь включаем в SELinux разрешение веб-серверу делать сетевые подключения и отправку почты:

$ setsebool -P httpd_can_network_connect_db on
$ setsebool -P httpd_can_sendmail on

Перезагружаем веб-сервер:

$ systemctl restart httpd.service

Открываем в браузере ссылку https://example.com/phpMyAdmin/setup/ и настраиваем phpMyAdmin.
В первом окне «Обзор», в блоке «Сервера» нажимаем на кнопку «Новый сервер». Заполняем поля «Пользовательское имя сервера», «Хост сервера», выбираем тип соединения и нажимаем на кнопку «Применить». Если нужно добавить несколько серверов в список – можно повторить этот пункт несколько раз.
После этого переключаемся в окно «Настройки», открываем вкладку «Безопасность» и ставим галочку напротив пункта «Предпочитать SSL соединение» и нажимаем на кнопку «Применить».
Теперь в окне «Обзор», в блоке «Конфигурационный файл» выбираем язык по умолчанию и нажимаем на кнопку «Сохранить».
Теперь сохраняем конфигурацию в веб-браузере и переносим её в каталог /etc/phpMyAdmin, после чего папку config удаляем:

$ mv /etc/phpMyAdmin/config.inc.php /etc/phpMyAdmin/config.inc.php.orig
$ mv /var/lib/phpMyAdmin/config/config.inc.php /etc/phpMyAdmin/
$ restorecon -v /etc/phpMyAdmin/config.inc.php
$ chcon -u system_u /etc/phpMyAdmin/config.inc.php
$ chown root:apache /etc/phpMyAdmin/config.inc.php
$ chmod 0640 /etc/phpMyAdmin/config.inc.php
$ rmdir /var/lib/phpMyAdmin/config

 

Создание виртуального хоста в Apache

Установим cronolog, для того чтобы можно было логи писать в файлы с именами access_log.YYYY-MM:

$ yum -y install cronolog

Сначала подготовим Apache к работе с виртуальными хостами в стиле Debian:

$ mkdir /etc/httpd/vhost.d
$ chcon -u system_u /etc/httpd/vhost.d
$ nano -w /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
    DocumentRoot "/var/www/html"
</VirtualHost>
IncludeOptional vhost.d/vhost-*

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

$ mv -v /etc/httpd/vhost.d/{,_}vhost-vhost.example.com

А для того чтобы включить выключенный виртуальный хост – нужно будет выполнить команду:

$ mv -v /etc/httpd/vhost.d/{_,}vhost-vhost.example.com

Чтобы это немного автоматизировать, создадим в .bashrc пару алиасов:

$ nano -w .bashrc
__a2ensite() {
    if [ "$1" == "" ]; then
        echo "Usage: a2ensite www.example.com"
    elif [ ! -f "/etc/httpd/vhost.d/_vhost-$1" ]; then
        echo "ERROR: Site $1 does not exist!"
    else
        mv -v /etc/httpd/vhost.d/{_,}vhost-$1
        echo "Run 'systemctl reload httpd' to activate new configuration!"
    fi
}
__a2dissite() {
    if [ "$1" == "" ]; then
        echo "Usage: a2dissite www.example.com"
    elif [ ! -f "/etc/httpd/vhost.d/vhost-$1" ]; then
        echo "ERROR: Site $1 does not exist!"
    else
        mv -v /etc/httpd/vhost.d/{,_}vhost-$1
        echo "Run 'systemctl reload httpd' to activate new configuration!"
    fi
}
alias a2ensite=__a2ensite
alias a2dissite=__a2dissite

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

$ a2dissite www.example.com

А для включения:

$ a2ensite www.example.com 

Теперь создадим конфигурационный файл нашего виртуального хоста:

$ nano -w /etc/httpd/vhost.d/vhost-vhost.example.com
# HTTP Virtual Host
<VirtualHost *:80>
    ServerName    vhost.example.com
    ServerAdmin   admin@example.com
    DocumentRoot  /var/www/vhost.example.com

    CustomLog     "|/usr/sbin/cronolog logs/vhost.example.com/access_log.%Y-%m" combined env=!dontlog
    ErrorLog      "|/usr/sbin/cronolog logs/vhost.example.com/error_log.%Y-%m"

    <Directory /var/www/vhost.example.com>
        AllowOverride Options
        Require all granted
    </Directory>
</VirtualHost>
# HTTPS Virtual Host
<VirtualHost *:443>
    ServerName    vhost.example.com
    ServerAdmin   admin@example.com
    DocumentRoot  /var/www/vhost.example.com

    CustomLog     "|/usr/sbin/cronolog logs/vhost.example.com/access_log.%Y-%m" combined env=!dontlog
    ErrorLog      "|/usr/sbin/cronolog logs/vhost.example.com/error_log.%Y-%m"

    <Directory /var/www/vhost.example.com>
        AllowOverride Options
        Require all granted
    </Directory>
</VirtualHost>

Если HTTPS не нужно – вторую часть файла можно не писать.
Так же создадим необходимые папки и тестовый файл index.html:

$ mkdir /var/www/vhost.example.com
$ mkdir /var/log/httpd/vhost.example.com
$ chcon -u system_u /var/log/httpd/vhost.example.com
$ echo '<h2>It Works!</h2>' >/var/www/vhost.example.com/index.html

А сейчас сделаем так, чтобы Apache перечитал конфигурационные файлы:

$ systemctl reload httpd.service

После этих действий можно пробовать открыть в браузере ссылку http://vhost.example.com/.
 
Необходимо помнить о нюансах настройки дефолтных алиасов для веб-приложений CentOS с виртуальными хостами. Рассмотрим на примере phpMyAdmin. После установки phpMyAdmin, в файле /etc/httpd/conf.d/phpMyAdmin.conf присутствуют такие строки:

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin

Вполне себе нормальные алиасы. Но проблема в том, что если их оставить в этом файле, то они будут работать для всех виртуальных хостов разом! Чтобы этого избежать, в этом файле эти алиасы нужно закомментировать и перенести их в отдельный конфигурационный файл:

$ nano -w /etc/httpd/conf.d/aliases.cnf
Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin
$ chcon -u system_u /etc/httpd/conf.d/aliases.cnf

Обратите внимание на расширения файла, оно специально не .conf, а .cnf, в противном случае содержимое конфига подтянется там где не нужно. А для точечного включения этих алиасов будем в нужные места добавлять такую строку IncludeOptional conf.d/aliases.cnf. Прежде всего добавим её в файл /etc/httpd/conf.d/vhost.conf:

$ nano -w /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
    ...
    IncludeOptional conf.d/aliases.cnf
</VirtualHost>
$ chcon -u system_u /etc/httpd/conf.d/vhost.conf

а так же в файл /etc/httpd/conf.d/ssl.conf (для того чтобы алиасы так же работали и через https):

$ nano -w /etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443>
    ...
    IncludeOptional conf.d/aliases.cnf
</VirtualHost>

Если же потребуется включить алиасы для какого-нибудь виртуального хоста – это можно сделать, добавить IncludeOptional в нужный нам блок .. в соответствующем конфигурационном файле.
 
После переноса алиасов не забудьте выполнить команду:

$ systemctl reload httpd.service

Comments

  1. Здравствуйте.
    Подскажите, где в Centos 7 находятся настройки IfModule prefork.c?
    В Centos 6 в файле /etc/httpd/conf/httpd.conf
    были строки

    StartServers 8
    MinSpareServers 5
    MaxSpareServers 20
    ServerLimit 256
    MaxClients 256
    MaxRequestsPerChild 4000

    В CentOS 7 нет этого блока в файле конфигурации.по адресу
    /etc/httpd/conf/httpd.conf
    Здесь тоже ничего похожего не нашел.
    /etc/httpd/conf.modules.d/

  2. Не работает!

    # chcon -u system_u /etc/httpd/vhost.d
    chcon: не удалось применить частичный контекст к не помеченному файлу «/etc/httpd/vhost.d»

    Это то же не работает!

    IncludeOptional vhost.d/vhost-*

    httpd: Syntax error on line 353 of /etc/httpd/conf/httpd.conf: Syntax error on line 4 of /etc/httpd/conf.d/vhost.conf: Syntax error on line 13…g closing ‘>’

  3. «Затем прописываем IP-адреса с которых будет разрешено подключение к phpMyAdmin:
    1
    $ nano -w /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 ip 11.22.33.44
      </RequireAny>
      </IfModule>
      <IfModule !mod_authz_core.c>
      # Apache 2.2
      Order Deny,Allow
      Deny from All
      Allow from 127.0.0.1
      Allow from ::1
      Allow from 11.22.33.44
      </IfModule>
      </Directory>

  4. Всё прокатило. При открытии сайта https зачёркнуто. В сведениях написано — Обнаружены проблемы с цепочкой сертификатов сайта (net::ERR_CERT_AUTHORITY_INVALID). Как исправить? Файл pem генерировал с помощью скрипта с этого сайта.
    В файле ssl.conf прописал путь к pem файлу.

  5. $ nano -w /etc/httpd/conf.d/vhost.conf
    нет такого файла centos 7.2

  6. настраиваю в centos 7.2
    Создание виртуального хоста в Apache
    vi /etc/httpd/conf.d/vhost.conf
    файла такого нет

  7. я новичок в настройке linux серверов.возможно я что то не понимаю

    проблемы начались после
    «Сначала подготовим Apache к работе с виртуальными хостами в стиле Debian»

    $ mkdir /etc/httpd/vhost.d
    $ chcon -u system_u /etc/httpd/vhost.d
    $ nano -w /etc/httpd/conf.d/vhost.conf

    в пустой файл вношу только эти значения?

    DocumentRoot «/var/www/html»

    IncludeOptional vhost.d/vhost-*

    далее выполняю все до systemctl reload httpd.service с заменой vhost.example.com на vhost.mail.test.local

    однако зайти на адрес http://vhost.mail.test.local я не могу

    заранее признателен за помощь

    • В файле 4 строчки, в вашем комментарии 2.

  8. извиняюсь там 4 строчки в файле,ошибка моего коментария

  9. Aheron Aeron
    09.08.2016 - 16:08

    на http://mail.test.local выдает страницу
    testing 123
    This page is used to test the proper operation of the Apache HTTP server after it has been installed. If you can read this page it means that this site is working properly. This server is powered by CentOS.

    а на страницу http://vhost.mail.test.local

    Не удается получить доступ к сайту
    Не удается найти DNS-адрес сервера vhost.mail.test.local

    • Не удается найти DNS-адрес сервера vhost.mail.test.local
      Казалось бы, при чём здесь апач..

  10. Aheron Aeron
    09.08.2016 - 16:22

    извините пожалуйста.очень стыдно

  11. а можно объяснить в чем проблема? а то такая же ошибка появляется

  12. >>Не удается найти DNS-адрес сервера vhost.mail.test.local
    >>Казалось бы, при чём здесь апач..
    по етому топику
    есть виртуалка с centos все работает, но при создании виртуальних хостов — ошибка в DNS
    и сам вопрос «причем здесь апач», можно в деталях?

    • Для имени сервера, которое вводите в браузере нет сопоставления имя-адрес в DNS-сервере.
      Браузер по имени не может определить адрес сервера и не знает куда подключаться. До апача дело даже не доходит.

  13. спасибо за быстрый ответ 🙂 ето типа все в CNAME записях? в домашней сети по Вашим инструкциям все работает на пять, есть домейн, субдомейны. а проблема появилась в корпоративной сети, где стоит cisco firewall. и просто непонятно где копаться

  14. https://vhost.example.com/myhost — нормально отрабатывает,
    но и https://example.com/myhost тоже нормально отрабатывает в ту же директорию… это нормально?

Добавить комментарий