- Введение
- Apache
- PHP
- MySQL
- phpMyAdmin
- Библиотеки PHP GD и CURL
- Почтовый сервер
- SSH
- Git
- Удаленный доступ к сайтам
- Владельцы и права
Благодаря данному руководству вы сможете поднять свой сервер как на рабочем (или домашнем) компьютере, так и на каком-нибудь VPS.
Введение
- phpMyAdmin — графический интерфейс управления СУБД MySQL
- Sendmail — почтовый сервер
- GD — библиотека для работы с изображениями
- CURL — библиотека для работы с URL
- SSH-сервер — позволяет работать с удаленным компьютером, как с родным
- Git — система контроля версий
С необходимыми компонентами web-сервера определились, приступаем к установке и настройке
Первые три пункта вполне можно установить одной командой в терминале
1
2
|
sudo apt-get install lamp-server^ |
Символ ^ в конце не случаен, это часть команды. У нас требуют пароль администратора, вводим.
Первая оговорка: эта команда действует, кажется, начиная с Ubuntu 13.04. В более ранних версиях все компоненты устанавливать придется отдельно. Впрочем, сделать это тоже можно одной командой
1
2
|
sudo apt-get install apache2 php5 php5-mysql mysql-server |
По ходу установки необходимо ответить на два вопроса. Сначала будет перечень устанавливаемых пакетов и вопрос, хотим ли мы продолжить установку. Жмем Enter. Затем нас попросят ввести пароль рута для MySQL. Вводим, подтверждаем. Дожидаемся конца установки.
Теперь настроим и протестируем все компоненты.
Apache
Открываем браузер и вводим в адресной строке
http://localhost
После перехода по этому адресу видим приветственную страницу.
Это означает, что сервер работает. В прошлых версиях, кстати, эта страница выглядела значительно проще — просто две строчки текста с заголовком «It works!» на белом фоне.
Теперь выполним кое-какие настройки. Для этого откроем конфигурационный файл Apache /etc/apache2/apache2.conf. Причем сделать это надо из-под рута, т.е. с правами администратора. Можно эту операцию провернуть и в графической оболочке, но их сейчас расплодилось столько, что рассказывать, как это сделать в каждой из них, придется долго. Поэтому, если знаете как — делайте. Если нет, то здесь я опишу, пожалуй, самый простой способ — текстовым редактором gedit.
1
2
|
sudo gedit /etc/apache2/apache2 .conf |
Не забываем. что после ввода команды, начинающейся с sudo, нужно ввести пароль администратора. Больше напоминать не буду.
Здесь ищем теги <Directory
1
2
3
4
5
|
< Directory /home/user/public_html> AllowOverride All Require all granted </ Directory > |
Мы прописали опции общей директории (папки) для всех наших сайтов, а именно: разрешили использовать для нее файл .htaccess (для ЧПУ, например; но не только) и предоставили права доступа (через веб-сервер) для всех.
Дальше хоткеем Alt+/ идем в конец файла и дописываем здесь
1
2
|
ServerName localhost |
Сохраняем.
Поскольку в подавляющем большинстве (если не у всех) у наших сайтов дефолтной страницей будет index.php, а не index.html, то открываем следующий файл.
1
2
|
sudo gedit /etc/apache2/mods-available/dir .conf |
И здесь index.php помещаем в начало строки DirectoryIndex, перед index.html. Должно получиться так.
1
2
3
4
|
< 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.loc (где user — ваше имя пользователя в Linux). Почему там? В случае переустановки системы (ну мало ли что…) не придется заново заливать все сайты (я ж надеюсь /home у вас на отдельном разделе?). Да и с правами меньше мороки.
Сайт этот у нас состоит всего из одного файла index.html, содержащего следующее
1
2
3
4
5
6
7
8
9
10
|
< html > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" > < title >Тестовая страница</ title > </ head > < body > Тестовая страница </ body > </ html > |
Откроем /etc/hosts
1
2
|
sudo gedit /etc/hosts |
Здесь в первую строку добавим имя нашего сайта.
1
2
|
127.0.0.1 localhost testsite.loc |
Сохраняем и закрываем (напомню, Ctrl+o и Ctrl+x соответственно).
Теперь выполняем в терминале
1
2
|
sudo cp /etc/apache2/sites-available/000-default .conf /etc/apache2/sites-available/testsite.loc .conf |
Таким образом мы создали кофигурационный файл сайта testsite.loc, скопировав конфигурационный файл дефолтного сайта. Теперь откроем этот файл и настроим его под наш сайт.
1
2
|
sudo gedit /etc/apache2/sites-available/testsite.loc .conf |
Здесь раскомментируем (т.е. уберем #) строчку
1
2
|
#ServerName www.example.com |
И пропишем имя нашего сайта. Должно получиться:
1
2
|
ServerName testsite.loc |
Далее исправим DocumentRoot, прописав вместо /var/www/html /home/user/public_html/testsite.loc (не забываем вместо user поставить реальное имя пользователя).
Сохраняем и закрываем. Теперь включаем наш сайт.
1
2
|
sudo a2ensite testsite.loc |
В терминале нам любезно подсказывают, что активировать новую конфигурацию мы можем, перезагрузив настроки Апача.
1
2
|
sudo service apache2 reload |
В адресной строке браузера пишем
http://testsite.loc
И видим нашу тестовую страничку. Если не видим — тщательно проверяем правильность своих предыдущих действий.
Ну и в дальнейшем будем работать уже с этим тестовым сайтом, а не с дефолтным.
ЧПУ
В большинстве случаев нам придется работать с ЧПУ-ссылками. Поэтому необходимо подключить модуль Апача mod_rewrite.
1
2
3
|
sudo a2enmod rewrite sudo service apache2 restart |
Теперь проверим. Создадим в корне нашего сайта (папке testsite.loc) файл .htaccess и запишем сюда следующее
1
2
3
|
RewriteEngine on RewriteRule ^test sef.html [L] |
Это означает, что запросы на testsite.loc/test будем перенаправлять на страницу sef.html.
Теперь создаем этот самый файл sef.html с содержимым, аналогичным index.html, кроме заголовка и текста:
1
2
3
4
5
6
7
8
9
10
|
< html > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" > < title >Тест ЧПУ</ title > </ head > < body > Тест ЧПУ </ body > </ html > |
Идем на http://testsite.loc/test. Если видим нашу новосозданную страницу, значит порядок.
PHP
Теперь проверим PHP. Для этого в папке /home/user/public_html/testsite.loc создадим текстовый файлик со следующим содержимым:
1
2
3
4
|
<?php phpinfo(); ?> |
Сохраняем этот файлик под именем, например, info.php. Если мы теперь перейдем по адресу http://testsite.loc/info.php, то увидим полную информацию об установленном в системе PHP.
Если увидели — PHP работает.
Если сервер локальный, и доступа извне к нему нет, то файлик этот можно оставить, он, возможно, еще пригодится. Но ни в коем случае не делайте этого на общедоступном сервере, здесь этот файл должен быть удален незамедлительно после проверки!
php.ini
Ну а теперь поковыряемся в конфигурационном файле PHP, находящемся по адресу /etc/php5/apache2/php.ini. Да не просто поковыряемся, а и кое-что поменяем.
1
2
|
sudo gedit /etc/php5/apache2/php .ini |
Короткая форма записи
1
2
|
short_open_tag = Off |
Это значит, что по умолчанию запрещено использовать короткую форму записи тегов, т.е. <?, а не <?php. И хотя мне нечасто приходится встречать эту форму (сам я ее не использую), иногда все же на некоторых сайтах попадается. Поэтому имеем в виду. Также имеем в виду, что ее включение не позволит включать xml непосредственно в php (только через echo).
Показ ошибок
1
2
|
display_errors = Off |
Отключен показ ошибок. Вполне естественно для рабочих сайтов — посетителям (среди которых и взломщики попадаются) совсем не нужно видеть ошибки (а тем более предупреждения). На нашем же тестовом сервере желательно этот параметр включить. Хотя иногда он может здорово мешать, поэтому здесь индивидуально. В конце концов ошибки можно и в журнале посмотреть. Если хотим выводить — ставим On.
1
2
|
display_startap_errors = Off |
Показ ошибок при запуске. Если нужно отследить ошибки при запуске PHP, меняем на On.
1
2
|
track_errors = Off |
Если поставим On, то последняя произошедшая ошибка будет первой в переменной $php_errormsg.
Сохраняем и закрываем.
Размеры файлов
По умолчанию максимальный размер загружаемого файла ограничен 2 МБ. Это касается и импорта баз данных в phpMyAdmin. А базы довольно часто бывают больше, и даже значительно. В крупных интернет-магазинах база размером 40 МБ — не редкость. Но даже этот размер меркнет перед базой размером более 800 МБ, с которой мне пришлось однажды столкнуться. Там изображения хранились прямо в базе — в формате BLOB. Поэтому в случае, если нам придется работать с подобными базами, меняем следующие параметры:
1
2
3
|
upload_max_filesize = 2M post_max_size = 8M |
Устанавливаем устраивающие нас значения.
Вполне возможно, придется поменять еще и
1
2
|
max_execution_time = 30 |
MySQL
Теперь проверяем MySQL. Для этого в терминале вводим
1
2
|
mysql -p -u root |
Вводим пароль, который мы вводили для пользователя root при установке MySQL. Видим нечто подобное
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu)
Copyright (c) 2000, 2014, 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.loc) и запишем туда следующее.
1
2
3
4
5
6
7
8
9
|
<?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.loc/db-test.php. Если видим текст «OK… Localhost via UNIX socket», то все хорошо.
phpMyAdmin
Поехали дальше. Теперь очередь phpMyAdmin. В терминале вводим
1
2
|
sudo apt-get install phpmyadmin |
После получения списка пакетов нажимаем Enter на вопрос, хотим ли мы продолжить. В ходе установки нас спрашивают, какой сервер будем настраивать. Поскольку у нас Apache, то и выбираем, естественно, его же. Для этого нажимаем пробел, убедившись, что красный курсор установлен в квадратных скобках напротив строчки apache2. И убеждаемся, что там же, в скобках, появилась звездочка.
Нажимаем Enter. Через некоторое время появится еще одно окно с предложением установить и настроить базу данных. У нас уже выбрано «Да», жмем Enter. Вводим пароль административного пользователя базы данных (тот самый, который вводили при установке MySQL), жмем Enter, задаем пароль для регистрации phpmyadmin в базе, подтверждаем. Дожидаемся конца установки.
Теперь в терминале последовательно вводим
1
2
3
|
sudo php5enmod mcrypt sudo service apache2 restart |
И идем в браузер.
http://localhost/phpmyadmin
Видим окно входа в phpMyAdmin
Вводим имя пользователя root и пароль, введенный нами при установке MySQL. Входим в phpMyAdmin.
Порядок.
Библиотеки GD и CURL
Теперь доустановим библиотеки PHP GD и CURL. Здесь все крайне просто. В терминале вводим
1
2
|
sudo apt-get install php5-gd php5-curl |
Опять-таки, подтверждаем, что мы действительно хотим их установить (тоже упоминаю об этом в последний раз). И перезагружаем Apache.
1
2
|
sudo service apache2 restart |
Почтовый сервер
SSMTP
Теперь почтовик. В принципе, можно обойтись SSMTP — это легкая утилита, отправляющая письма через сторонний SMTP-сервер, например Gmail. Но в этом случае о тестировании почты оффлайн придется забыть. Если тестирование оффлайн не актуально, то ставим и настраиваем:
1
2
3
|
sudo apt-get install ssmtp sudo gedit /etc/ssmtp/ssmtp .conf |
И здесь меняем значения на следующие (для Gmail-сервера).
1
2
3
4
5
6
|
root=youraccount@gmail.com mailhub=smtp.gmail.com:587 AuthUser=youraccount@gmail.com AuthPass=password UseSTARTTLS=YES |
Здесь youraccount@gmail.com — ваш существующий адрес на Gmail; password — пароль вашего аккаунта на Gmail. Если не хотите Gmail, то для других сервисов настройки принципиально отличаться не будут.
Далее. В /etc/php5/apache2/php.ini находим строку ;sendmail_path =, раскомментируем ее (т.е. уберем 😉 и пропишем путь к ssmtp. Должно получиться
1
2
|
sendmail_path = /usr/sbin/ssmtp -t |
Перезагружаем сервер.
1
2
|
sudo service apache2 restart |
А теперь проверим. Создадим файл index.php в testsite.loc, откроем его и пропишем туда следующее
1
2
3
4
|
<?php mail( "testaccount@gmail.com" , "Test" , "Test message" ); ?> |
Здесь опять же testaccount@gmail.com — ваш существующий адрес, к которому у вас есть доступ (здесь — какой угодно, не обязательно Gmail).
Теперь перейдем по http://testsite.loc. Отобразиться у нас должна пустая страница. Теперь проверяем testaccount@gmail.com — туда должно прийти наше тестовое письмо.
Sendmail
Если же необходимо тестировать отправку почты оффлайн, ставим Sendmail.
На всякий случай. Речь не идет об одновременном использовании SSMTP и Sendmail — устанавливаем либо то, либо другое!
1
2
|
sudo apt-get install sendmail |
По окончанию установки запускаем
1
2
|
sudo sendmailconfig |
На все три вопроса, задаваемых в ходе установки, отвечаем утвердительно, т.е. жмем Enter.
Теперь
1
2
|
sudo gedit /etc/hosts |
И здесь в строчку с 127.0.0.1 дописываем через пробел
1
2
|
localhost.loc testserver |
Здесь testserver — имя нашего сервера. Оно уже прописано строчкой ниже для 127.0.1.1. Сохраняем, закрываем и перезапускаем сервер.
1
2
|
sudo service apache2 restart |
Теперь командуем
1
2
|
telnet localhost smtp |
Получаем.
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 localhost.loc ESMTP Sendmail 8.14.4/8.14.4/Debian-4.1ubuntu1; Sat, 26 Jul 2014 21:46:56 +0300; (No UCE/UBE) logging access from: localhost(OK)-localhost [127.0.0.1]
Начинаем тестирование. Вводим
1
2
|
helo localhost |
Ответ
1
2
|
250 localhost.loc Hello localhost [127.0.0.1], pleased to meet you |
Далее чередуются команды и ответы
1
2
|
mail from: no-reply@gmail.com |
1
2
|
250 2.1.0 no-reply@gmail.com... Sender ok |
1
2
|
rcpt to: user@localhost |
Здесь user — ваше имя пользователя в Linux.
1
2
|
250 2.1.5 user@localhost... Recipient ok |
1
2
|
data |
1
2
|
354 Enter mail, end with "." on a line by itself |
Теперь мы вводим текст тестового письма. Закончить его обязательно точкой.
1
2
3
|
test message . |
Жмем Enter и получаем ответ.
1
2
|
250 2.0.0 s6QItc6L010145 Message accepted for delivery |
Прекрасно. А теперь настроим почтовый клиент, чтобы иметь возможность видеть отправленные с сайта и полученные в user@localhost письма. Я пользуюсь Thunderbird, поэтому настраивать будем его. Идем в Создать — Другие учетные записи. Выбираем тип учетной записи Unix Mailspool (Movemail), жмем Далее. Выводимое имя абсолютно без разницы, мы сюда письма только получать будем, а Адрес электронной почты прописываем user@localhost (вновь, user — это ваше имя пользователя в Ubuntu). Жмем Далее, затем еще раз Далее, и еще раз Далее, и, наконец, Готово. Если все сделали правильно — во входящих видим наше только что отправленное при тестировании письмо.
Можем протестировать через PHP, аналогично тому, как мы делали это с SSMTP, только в index.php исправим адрес получателя на user@localhost.
Теперь при работе с популярными CMS в админке будем прописывать адрес получателя писем с сайта user@localhost.loc. Почему не user@localhost? Потому что такой адрес не пройдет валидацию. И не устаю напоминать: user заменяем на ваше имя пользователя в Ubuntu.
SSH
Осталось установить SSH-сервер. Как уже говорилось, это нужно лишь в том случае, если необходимо управлять сервером удаленно.
1
2
3
|
sudo apt-get install ssh sudo gedit /etc/ssh/sshd_config |
Открыли конфигурационный файл. Здесь я бы рекомендовал поменять порт, на котором ssh-сервер будет ожидать подключения. Находим строку
1
2
|
Port 22 |
и меняем на любой из диапазона от 1025 до 65536, . Главное — не забыть его потом. В нашем примере пропишем
1
2
|
Port 1111 |
и будем его использовать в дальнейших примерах.
Дальше находим строку
1
2
|
PermitRootLogin yes |
и меняем значение yes на no.
Можно вообще запретить входить по SSH всем, кроме одного пользователя — вас. Для этого добавляем следующую строку (здесь, как всегда, user нужно заменить на ваше имя пользователя).
1
2
|
AllowUsers user |
Перезагружаем SSH-сервер
1
2
|
sudo service ssh restart |
А теперь пробуем подключиться с удаленного устройства. Предположим, что IP-адрес сервера — 192.168.1.2. Вводим (заменив user на свое имя пользователя на сервере)
1
2
|
ssh -p 1111 user@192.168.1.2 |
Вводим свой пароль на сервере и наслаждаемся. Чтобы отключиться, вводим exit.
Примечание. Если вы уже подключались к серверу с какого-либо устройства, но переустановили ОС на сервере, то после этого подключиться уже не получится. В этом случае удалите файл /home/user/.ssh/known_hosts на клиенте, подключитесь вновь и ответьте yes на вопрос Are you sure you want to continue connecting? (действительно ли вы хотите подключиться?). Все, можно работать.
Для заливки файлов на сервер удаленно также можно воспользоваться SSH, а не традиционным FTP. Можно это делать и в консоли. Но можно и проще. Показываю на примере файлового менеджера Dolphin в KDE.
В левой панели (Точки входа) жмем Сеть, здесь Добавить сетевую папку. Выбираем Папка SSH, жмем Далее и заполняем поля:
Имя — пишем что угодно, лишь бы понимать, куда мы подключаемся. Ну например, LocalServer.
Пользователь — имя пользователя на сервере.
Сервер — IP-адрес (или имя, если прописано в /etc/hosts) сервера.
Порт — мы меняли на 1111, его здесь и прописываем. Если не меняли — оставляем 22.
Протокол — выбираем fish.
Папка — для удобства пропишем корневую папку нашего web-сервера, т.е. /home/user/public_html. Теперь при подключении будем сразу попадать туда. Если оставить поле пустым — будет открываться корень Ubuntu, т.е. /.
Теперь жмем Сохранить и подключиться. И можем гонять файлы туда-сюда, как на родном компьютере.
В дальнейшем чтобы подключиться жмем Сеть и в открывшемся окне папку с земным шариком поверх с именем LocalServer.
Git
Устанавливаем.
1
2
|
sudo apt-get install git |
Настраиваем.
1
2
3
|
git config --global user.name "User Name" git config --global user.email "username@gmail.com" |
Здесь username — ваше имя, а username@gmail.com — ваша существующая почта. В общем-то, это все. Об использовании Git в ближайшем будущем надеюсь написать отдельную статью.
Удаленный доступ к сайтам
Осталось понять, как зайти браузером с удаленного компьютера (в локальной сети) на наш сервер. Возьмем мою ситуацию. Напомню, сервер — на нетбуке, а работаю я на стационарном компьютере. Так вот, на компьютере открываем /etc/hosts и в новой строке прописываем
1
2
|
192.168.1.2 testsite.loc |
Здесь 192.168.1.2 — IP-адрес нашего сервера, testsite.loc — имя тестового сайта (их может быть много через пробел). Теперь, набрав в адресной строке http://testsite.loc, мы попадем именно на testsite.loc на нашем сервере.
Владельцы и права
Ну и напоследок, еще три команды.
1
2
3
4
|
sudo adduser user www-data chown user:www-data -R public_html chmod -R 775 public_html |
Здесь user — ваше имя пользователя в Ubuntu. Мы добавили себя в группу www-data (поскольку от пользователя www-data группы www-data работает Apache и, как следствие, все популярные CMS) и сделали группу www-data группой владельца корневой папки наших сайтов и присвоили для этой папки права чтения и записи для владельца и его группы. Это нужно для того, чтобы у пользователя user (от имени которого мы заливаем файлы на сервер) и пользователя www-data (от имени которого работет CMS) имели одинаковые права. При добавлении каждого сайта над его папкой нужно будет производить эту процедуру (кроме первой команды; только не ко всей public_html, а лишь к папке нового сайта). Также нужно это делать для новых файлов, требующих изменения со стороны сервера.
Все, можно работать.