Установка и настройка web-сервера в LINUX (Deepin)

Стек LAMP - это набор программного обеспечения с открытым исходным кодом, которой обычно устанавливается на сервер для отображения динамических веб-сайтов и веб-приложений. Эта аббревиатура обозначает операционную систему Linux с установленным веб-сервером Apache. Данные сайта хранятся в базе данных MySQL, динамический контент обрабатывается с помощью PHP.
Для создания новых сайтов или тестирования изменений на существующих часто бывает нужен локальный сервер. Новый сайт лучше выкладывать уже в готовом виде, дабы не смущать потенциальных посетителей пустыми страницами, недописанными материалами да полуработающими фичами и не давать проиндексировать Поисковым система пустой сайт. Это позволит работать над сайтом даже при временном отсутствии доступа к интернету. Например, у меня тестовый сервер стоит на нетбуке, поэтому я могу спокойно поработать и где-нибудь в дороге безо всякого интернета.
Наш тестовый сервер ставится на Deepin 15.4 ( на Linux Mint 18 и Ubuntu 16.04 ).
Введение
Итак, определимся, что нам нужно. Ну для начала (на всякий случай, для новичков) расшифруем аббревиатуру LAMP - Linux, Apache, MySQL, PHP. Предполагается, что Linux у нас уже есть (Если нет, то ставим, не боимся. Ubuntu или Mint, например, ставится сейчас едва ли не проще, чем Винда.). Что нужно установить.
- Apache - собственно, сам web-сервер.
- MySQL - система управления базами данных (СУБД).
- PHP - язык программирования.
Если вы не являетесь гуру MySQL, и не собираетесь управлять базами в консоли, вводя команды ручками, то следующим пунктом будет
- phpMyAdmin - графический интерфейс управления СУБД MySQL
Также нужно подумать и об отправке почты с сайта - это тоже частенько приходится тестировать.
- Sendmail - почтовый сервер
Также с большой вероятностью могут понадобится некоторые библиотеки PHP. В частности, у меня установлены
- GD - библиотека для работы с изображениями
- CURL - библиотека для работы с URL
Также стоит озаботиться удаленным доступом к нашему серверу. Зачем? Ну, как я уже упоминал, сервер у меня на нетбуке. А работать мне все же удобнее за компьютером с нормальной клавиатурой и большим монитором. Поэтому непосредственно за нетбуком я работаю только в дороге. А у вас может быть наоборот, сервер на рабочем компьютере (или вообще выделенный где-нибудь в кладовке), а вам хочется развалиться с планшетом на диване. Или хочется получать доступ к своему домашнему серверу из любой точки земного шара (правда для этого нужен реальный внешний IP-адрес вашей квартирной сети). В общем, удобная штука. Впрочем, если все это вам не нужно, то следующий пункт опускаем.
- SSH-сервер - позволяет работать с удаленным компьютером, как с родным
Ну и наконец, еще один необязательный, но очень полезный пункт. Система контроля версий (СКВ). Если у вас что-то перестало работать, а изменения перед этим были значительными, то откатить их может быть достаточно тяжело. СКВ позволяет вести учет всех изменений и откатиться в любое из предыдущих состояний одной командой. Существеут множество СКВ, но для локального использования (без доступа к интернету) лучше всего подойдет Git - детище Линуса Торвальдса.
- Git - система контроля версий
С необходимыми компонентами web-сервера определились, приступаем к установке и настройке
Первые три пункта вполне можно установить одной командой в терминале
sudo apt-get install lamp-server^
Символ ^ в конце не случаен, это часть команды. У нас требуют пароль администратора, вводим.
Первая оговорка: эта команда действует, кажется, начиная с Ubuntu 13.04. В более ранних версиях все и для Deepin компоненты устанавливать придется отдельно. Впрочем, сделать это тоже можно одной командой
sudo apt-get install apache2 php5 php5-mysql mysql-server
По ходу установки необходимо ответить на два вопроса. Сначала будет перечень устанавливаемых пакетов и вопрос, хотим ли мы продолжить установку. Жмем Enter. Затем нас попросят ввести пароль рута для MySQL. Вводим, подтверждаем. Дожидаемся конца установки.
Apache
Открываем браузер и вводим в адресной строке
http://localhost
После перехода по этому адресу видим приветственную страницу.

Это означает, что сервер работает. В ранних версиях, кстати, эта страница выглядела значительно проще - просто две строчки текста с заголовком "It works!" на белом фоне. Собственно, в нативном Апаче (не убунтовском) она, по-моему, и сейчас так выглядит.
Теперь выполним кое-какие настройки. Для этого откроем конфигурационный файл Apache /etc/apache2/apache2.conf. Причем сделать это надо из-под рута, т.е. с правами администратора. Можно эту операцию провернуть и в графической оболочке, но их сейчас расплодилось столько, что рассказывать, как это сделать в каждой из них, придется долго. Поэтому, если знаете как - делайте. Если нет, то здесь я опишу, пожалуй, самый простой способ - консольным текстовым редактором nano.
sudo nano /etc/apache2/apache2.conf
Не забываем. что после ввода команды, начинающейся с sudo, нужно ввести пароль администратора. Больше напоминать не буду.
Здесь ищем теги <Directory> (это легко сделать встроенным в nano поиском; вызывается он комбинацией клавиш, или, как говорят, хоткеем Ctrl+w) и под последним из них дописываем
<Directory /home/user/public_html> AllowOverride All Require all granted </Directory>
Здесь мы побежали немного впереди паровоза, но раз уж нам пришлось открыть этот файл, то все изменения сразу и внесем. Яснее станет позже, пока объясню вкратце. Мы прописали опции общей директории (папки) для всех наших сайтов, а именно: разрешили использовать для нее файл .htaccess (для ЧПУ, например; но не только) и предоставили права доступа (через веб-сервер) для всех.
Дальше хоткеем Alt+/ идем в конец файла и дописываем здесь
ServerName localhost
Сохраняем хоткеем Ctrl+o, подтверждаем энтером и выходим из nano (Ctrl+x).
Поскольку в подавляющем большинстве (если не у всех) у наших сайтов дефолтной страницей будет index.php, а не index.html, то открываем следующий файл.
sudo nano /etc/apache2/mods-available/dir.conf
И здесь index.php помещаем в начало строки DirectoryIndex, перед index.html. Должно получиться так.
<IfModule mod_dir.c> DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm </IfModule>
Сохраняем и закрываем.
Виртуальные хосты
Теперь настроим виртуальные хосты. Зачем? Ну, в общем-то, можно обойтись и без этого. Все сайты хранить в отдельных папках в /var/www/html и заходить на них по адресам вида localhost/sitename (где sitename - имя папки с сайтом). Но тут есть нюанс. Если мы работаем с клоном уже существующего сайта, где прописаны URL вида "/file.html", т.е. со слешем в начале (а такие урлы встречаются довольно часто), то при переходе по такому урлу попадем в localhost/file.html (т.е. в никуда, поскольку такого пути у нас нет) вместо localhost/sitename/file.html. Ведь корневая папка у сервера прописана одна - /var/www/html. И она будет корневой для всех сайтов. Т.е. нам нужно, чтобы корневой папкой каждого сайта была именно его папка. И для каждого нашего сайта нужно будет прописать виртуальный хост.
Предположим, что у нас есть тестовый сайт. И расположен он не в /var/www/html, а в /home/user/public_html/testsite (где user - ваше имя пользователя в Linux). Почему там? В случае переустановки системы (ну мало ли что...) не придется заново заливать все сайты (я ж надеюсь /home у вас на отдельном разделе?). Да и с правами меньше мороки.
Сайт этот у нас состоит всего из одного файла index.html, содержащего следующее
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Тестовая страница</title> </head> <body> Тестовая страница </body> </html>
Откроем /etc/hosts
sudo nano /etc/hosts
Здесь в первую строку добавим имя нашего сайта.
127.0.0.1 localhost testsite
Сохраняем и закрываем (напомню, Ctrl+o и Ctrl+x соответственно).
Теперь выполняем в терминале
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/testsite.conf
Таким образом мы создали кофигурационный файл сайта testsite, скопировав конфигурационный файл дефолтного сайта. Теперь откроем этот файл и настроим его под наш сайт.
sudo nano /etc/apache2/sites-available/testsite.conf
Здесь раскомментируем ( уберем #) строчку
#ServerName www.example.com
И пропишем имя нашего сайта. Должно получиться:
ServerName testsite
Далее исправим DocumentRoot, прописав вместо /var/www/html /home/user/public_html/testsite (не забываем вместо user поставить реальное имя пользователя).
Сохраняем и закрываем. Теперь включаем наш сайт.
sudo a2ensite testsite
В терминале нам любезно подсказывают, что активировать новую конфигурацию мы можем, перезагрузив настроки Апача.
sudo service apache2 reload
В адресной строке браузера пишем
http://testsite
И видим нашу тестовую страничку. Если не видим - тщательно проверяем правильность своих предыдущих действий.
Ну и в дальнейшем будем работать уже с этим тестовым сайтом, а не с дефолтным.
ЧПУ
В большинстве случаев нам придется работать с ЧПУ-ссылками. Поэтому необходимо подключить модуль Апача mod_rewrite.
sudo a2enmod rewrite sudo service apache2 restart
Теперь проверим. Создадим в корне нашего сайта (папке testsite) файл .htaccess и запишем сюда следующее
RewriteEngine on RewriteRule ^test sef.html [L]
Это означает, что запросы на testsite/test будем перенаправлять на страницу sef.html.
Теперь создаем этот самый файл sef.html с содержимым, аналогичным index.html, кроме заголовка и текста:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Тест ЧПУ</title> </head> <body> Тест ЧПУ </body> </html>
Переходим по адресу http://testsite/test. Если видим нашу новосозданную страницу, значит порядок.
PHP
Теперь проверим PHP. Для этого в папке /home/user/public_html/testsite создадим текстовый файлик со следующим содержимым:
<?php phpinfo(); ?>
Сохраняем этот файлик под именем, например, info.php. Если мы теперь перейдем по адресу http://testsite/info.php, то увидим полную информацию об установленном в системе PHP.

Если увидели - PHP работает.
Если сервер локальный, и доступа извне к нему нет, то файлик этот можно оставить, он, возможно, еще пригодится. Но ни в коем случае не делайте этого на общедоступном сервере, здесь этот файл должен быть удален незамедлительно после проверки!
php.ini
Ну а теперь поковыряемся в конфигурационном файле PHP, находящемся по адресу /etc/php5/apache2/php.ini. Да не просто поковыряемся, а и кое-что поменяем.
sudo nano /etc/php/7.0/apache2/php.ini
Короткая форма записи
short_open_tag = Off
Это значит, что по умолчанию запрещено использовать короткую форму записи тегов, т.е. <?, а не <?php. И хотя мне нечасто приходится встречать эту форму (сам я ее не использую), иногда все же на некоторых сайтах попадается. Поэтому имеем в виду. Также имеем в виду, что ее включение не позволит включать xml непосредственно в php (только через echo).
Показ ошибок
display_errors = Off
Отключен показ ошибок. Вполне естественно для рабочих сайтов - посетителям (среди которых и взломщики попадаются) совсем не нужно видеть ошибки (а тем более предупреждения). На нашем же тестовом сервере желательно этот параметр включить. Хотя иногда он может здорово мешать, поэтому здесь индивидуально. В конце концов ошибки можно и в журнале посмотреть. Если хотим выводить - ставим On.
display_startap_errors = Off
Показ ошибок при запуске. Если нужно отследить ошибки при запуске PHP, меняем на On.
track_errors = Off
Если поставим On, то последняя произошедшая ошибка будет первой в переменной $php_errormsg.
Сохраняем и закрываем.
Размер файлов
По умолчанию максимальный размер загружаемого файла ограничен 2 МБ. Это касается и импорта баз данных в phpMyAdmin. А базы довольно часто бывают больше, и даже значительно. В крупных интернет-магазинах база размером 100 МБ - не редкость. Поэтому меняем следующие параметры:
upload_max_filesize = 2M post_max_size = 8M
Устанавливаем устраивающие нас значения.
Вполне возможно, придется поменять еще и
max_execution_time = 30
Продление сессии
По умолчанию время сессии установлено в 1440 сек., т.е. в 24 мин. Т.е. каждые 24 минуты придется всюду перелогиниваться. Вовсе неудобно. Поэтому ищем
session.gc_maxlifetime = 1440
И ставим, например, 86400 (т.е. сутки). Слишком много ставить тоже не советую, много нечищенного мусора оставаться будет.
MySQL
Теперь проверяем MySQL. Для этого в терминале вводим
mysql -p -u root
Вводим пароль, который мы вводили для пользователя root при установке MySQL. Видим нечто подобное
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 82
Server version: 5.7.18-1 (Debian)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Все OK. MySQL работает. Вводим quit для выхода.
Можно еще одним махом проверить работу связки MySQL и PHP. Для этого создадим файл db-test.php (все там же, в корне нашего сайта - /home/user/public_html/testsite) и запишем туда следующее.
<?php $link = mysqli_connect('localhost','root','password'); if(!$link) die('Connection error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); echo 'OK... ' . mysqli_get_host_info($link) . "\n"; mysqli_close($link); ?>
Перейдем по адресу http://testsite/db-test.php. Если видим текст "OK... Localhost via UNIX socket", то все хорошо.
phpMyAdmin
Теперь очередь phpMyAdmin. В терминале вводим
sudo apt-get install phpmyadmin
После получения списка пакетов нажимаем Enter на вопрос, хотим ли мы продолжить. В ходе установки нас спрашивают, какой сервер будем настраивать. Поскольку у нас Apache, то и выбираем, естественно, его же. Для этого нажимаем пробел, убедившись, что красный курсор установлен в квадратных скобках напротив строчки apache2. И убеждаемся, что там же, в скобках, появилась звездочка.
Нажимаем Enter. Через некоторое время появится еще одно окно с предложением установить и настроить базу данных. У нас уже выбрано "Да", жмем Enter. Вводим пароль административного пользователя базы данных (тот самый, который вводили при установке MySQL), жмем Enter, задаем пароль для регистрации phpmyadmin в базе, подтверждаем. Дожидаемся конца установки.
Для PHP 5 (т.е. по умолчанию в Ubuntu 14.04) включаем Mcrypt
sudo php5enmod mcrypt
Продлим сессию.
sudo nano /etc/phpmyadmin/config.inc.php
Здесь допишем в конец файла (хоткеем Alt + /)
$cfg['LoginCookieValidity'] = 86400;
Здесь главное, чтоб это число было не больше session.gc_maxlifetime из php.ini, иначе оно не будет иметь смысла.
Перезагружаем сервер.
sudo service apache2 restart
И идем по адресу http://localhost/phpmyadmin Видим окно входа в phpMyAdmin
Вводим имя пользователя root и пароль, введенный нами при установке MySQL. Входим в phpMyAdmin.