Настройка 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
Mike
02.02.2015 - 04:49
Здравствуйте.
Подскажите, где в 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/
Serji
27.04.2015 - 12:17
Не работает!
# 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 ‘>’
Wakko
27.04.2015 - 12:25
https://www.dropbox.com/s/0zqautloqoelf8c/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202015-04-27%2012.24.28.png?dl=0
staff
18.01.2016 - 23:23
«Затем прописываем IP-адреса с которых будет разрешено подключение к phpMyAdmin:
1
$ nano -w /etc/httpd/conf.d/phpMyAdmin.conf» — можно подробнее что нужно исправить?
Wakko
19.01.2016 - 23:17
Что-нибудь типа:
<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>
QDesNik
02.06.2016 - 23:47
Всё прокатило. При открытии сайта https зачёркнуто. В сведениях написано — Обнаружены проблемы с цепочкой сертификатов сайта (net::ERR_CERT_AUTHORITY_INVALID). Как исправить? Файл pem генерировал с помощью скрипта с этого сайта.
В файле ssl.conf прописал путь к pem файлу.
aheron
06.08.2016 - 22:03
$ nano -w /etc/httpd/conf.d/vhost.conf
нет такого файла centos 7.2
Wakko
06.08.2016 - 23:52
Нету – значит создаём..
aheron
06.08.2016 - 23:49
настраиваю в centos 7.2
Создание виртуального хоста в Apache
vi /etc/httpd/conf.d/vhost.conf
файла такого нет
aheron
09.08.2016 - 15:56
я новичок в настройке 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 я не могу
заранее признателен за помощь
Wakko
09.08.2016 - 16:00
В файле 4 строчки, в вашем комментарии 2.
aheron
09.08.2016 - 16:01
извиняюсь там 4 строчки в файле,ошибка моего коментария
Wakko
09.08.2016 - 16:02
Ок. Что означает «не могу зайти»?
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
Wakko
09.08.2016 - 16:10
Не удается найти DNS-адрес сервера vhost.mail.test.local
Казалось бы, при чём здесь апач..
Aheron Aeron
09.08.2016 - 16:22
извините пожалуйста.очень стыдно
Wakko
09.08.2016 - 16:23
Бывает. Удачи!
Иван
18.11.2016 - 21:52
а можно объяснить в чем проблема? а то такая же ошибка появляется
Wakko
18.11.2016 - 22:02
какая ошибка?
Иван
18.11.2016 - 23:55
>>Не удается найти DNS-адрес сервера vhost.mail.test.local
>>Казалось бы, при чём здесь апач..
по етому топику
есть виртуалка с centos все работает, но при создании виртуальних хостов — ошибка в DNS
и сам вопрос «причем здесь апач», можно в деталях?
Wakko
19.11.2016 - 00:00
Для имени сервера, которое вводите в браузере нет сопоставления имя-адрес в DNS-сервере.
Браузер по имени не может определить адрес сервера и не знает куда подключаться. До апача дело даже не доходит.
Иван
19.11.2016 - 00:07
спасибо за быстрый ответ 🙂 ето типа все в CNAME записях? в домашней сети по Вашим инструкциям все работает на пять, есть домейн, субдомейны. а проблема появилась в корпоративной сети, где стоит cisco firewall. и просто непонятно где копаться
Viktr
06.10.2017 - 11:40
https://vhost.example.com/myhost — нормально отрабатывает,
но и https://example.com/myhost тоже нормально отрабатывает в ту же директорию… это нормально?