Найти тему
El Vinto

Практическая установка и настройка веб-сервера

Для тех, кто ещё только начинает свой путь в ИТ скажу, под словом "сервер" понимается всегда разное. Это может быть физический компьютер, собранный по серверной технологии, это может быть обычный домашний компьютер, на котором установлено ПО работающее в режиме обслуживания клиентов, это может быть просто какая-то программа, которая обслуживает запросы клиентов, т.е. выступает в роли сервера. В связи с этим иногда возникает путаница, и понимание приходит только тогда, когда слово "сервер" погружается в контекст. В данной статье речь пойдёт о специализированном серверном ПО под названием Apache, и на чем физическом и где оно установлено уже особо не имеет значения. Здесь нужно сразу же сделать оговорку. Сам по себе Apache хотя и ведёт обработку запросов клиентов и называется сервером, самостоятельно сам по себе используется достаточно редко, по этому вместе с ним устанавливается транслятор языка PHP и база данных MySQL. Всё это в совокупности называется аббревиатурой LAMP (Linux Apache MySQL PHP).

Статья будет полезна, например, для тех, кто хочет перейти с хостинга на VPS (виртуальный сервер - как бы физический сервер, но вообще ни разу не физический, извините)) ) или просто развернуть домашний полноценный веб-сервер для программирования на PHP и MySQL. Каких-то глубоких настроек я описывать не буду, эта информация есть в инете, и загружать лишним эту статью не нахожу резонным. Мы поговорим как сделать базовые настройки чтобы сайт заработал и можно было начать что-то полезное делать.

Мой веб-сервер Apache будет работать под управлением Linux Ubuntu Server. Как видите из названия, эта версия Линукс специально адаптирована для работы на обслуживание клиентских запросов, а для этого не нужно даже красивого графического интерфейса, и это правильно, т.к. ПО должно быть оптимизировано по скорости того, для чего оно предназначено. Так вот, установка Апаче выполняется одной незамысловатой командой:

sudo apt-get install apache2

Ждём пока пролистает много буковок, радуемся и ставим сразу PHP:

sudo apt-get install php

Как видите, хотя консольная система и выглядит недружелюбно, всё-таки не так уж всё и страшно. Теперь в завершении ставим и MySQL:

sudo apt-get install mysql-server

Ну?! Разве не так я только что сказал - всё просто.

Теперь немного можно и усложнить. Основная настройка сервера, если так можно сказать, это рассказать ему в каком каталоге находится ваш сайт. Для этого открываем так называемый файл настроек виртуальных хостов:

sudo nano /etc/apache2/sites-enabled/000-default.conf

Файл после установки будет выглядеть как-то так:

Если компьютер, на котором у вас установлен LAMP имеет определенное доменное имя, то укажите его в директиве ServerName. Также его нужно обязательно указать, если вы на одном LAMP сервере захотите поддерживать сразу несколько сайтов.

Директива DocumentRoot указывает как раз расположение, где в каком каталоге ваш сайт находится. Если мы посмотрим, что у меня в этом каталоге, то увидим:

-2

Каталог html был создан автоматически при установке, я его скоро удалю, т.к. мне он не нужен. Он даёт стартовую тестовую страницу, что установка прошла успешно. Также на нём можно найти базовые информационные ссылки:

-3

Чтобы проверить работоспособность PHP я рядом с каталогом html создал файл index.php со следующим содержимым:

-4

Метод phpinfo() расскажет что за LAMP сервер мы в конечном итоге установили:

-5

Этим скрином конечно же информация не ограничивается и вниз далее идёт длинная портянка со всеми настройками, параметрами, модулями, их настройками и т.д. Тот факт, что мы это увидели как раз и говорит, что PHP у нас тоже заработал. Теперь нужен механизм для переноса кода нашего сайта на наш LAMP сервер. Для этого есть много разных способов, однако, до сих пор наиболее распространенным является FTP доступ, а для этого нужно установить его сервер в систему. Есть разные FTP-сервера, я пользуюсь vsftpd:

sudo apt-get install vsftpd

-6

После установки его нужно настроить, с этим может возникнуть проблема. Я использую следующие настройки. Обратите внимание на директиву local_root:

# Example config file /etc/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
#
# Run standalone? vsftpd can run either from an inetd or as a standalone
# daemon started from an initscript.
listen=NO
#
# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 "any" address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
listen_ipv6=YES
#
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
#local_umask=022
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
#anon_upload_enable=YES
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
#
# If enabled, vsftpd will display directory listings with the time
# in your local time zone. The default is to display GMT. The
# times returned by the MDTM FTP command are also affected by this
# option.
use_localtime=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
#xferlog_file=/var/log/vsftpd.log
#
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
#xferlog_std_format=YES
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=480
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
#async_abor_enable=YES
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
# You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service.
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd.banned_emails
#
# You may restrict local users to their home directories. See the FAQ for
# the possible risks in this before using chroot_local_user or
# chroot_list_enable below.
#chroot_local_user=YES
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
#chroot_local_user=YES
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list
#
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
#ls_recurse_enable=YES
#
# Customization
#
# Some of vsftpd's settings don't fit the filesystem layout by
# default.
#
# This option should be the name of a directory which is empty. Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
secure_chroot_dir=/var/run/vsftpd/empty
#
# This string is the name of the PAM service vsftpd will use.
pam_service_name=vsftpd
#
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

#
# Uncomment this to indicate that vsftpd use a utf8 filesystem.
#utf8_filesystem=YES

chroot_local_user=YES
#chroot_list_enable=YES
allow_writeable_chroot=YES
local_root=/home/ftprouter/www # Корневой каталог файлов сайта, изначально возможно /var/www, но я поменял, т.к. у меня сайт находится внутри пользовательской папки и запускается от имени и с правами определенного пользователя


#chroot_list_file=/etc/vsftpd.chroot_list

Проверьте доступ по FTP, он должен корректно работать.

Однако, файлы загружать ещё рано. Дело в том, что FTP будет запускаться от одного имени пользователя, а LAMP сервер работает от имени пользователя www-data. В соответствие с этим, сразу же или вскоре в обозримом будущем возникнут проблемы при работе PHP, т.к. веб-сервер будет пытаться что-то делать с файлами другого пользователя при запуске сайта, при этом при доступе по FTP вы будете пытаться что-то делать с файлами, которые возможно сайт создал в процессе выполнения, например, кэш, загруженные пользовательские картинки и т.п. Такие коллизии будут приводить к невозможности удалить, переименовать, изменить некоторые файлы. Решать проблему можно несколькими способами, однако, я выбрал способ о котором уже упомянул в комменте чуть выше по директиве local_root в настройке FTP-сервера. Выглядит это так - пользователь переходит на страницу сайта, в этот момент Apache обращается к уже известной нам настройке виртуальных хостов, а там написано что-то, что заставляет выполнять код сайта не от имени www-data, а как раз от имени того пользователя, в чьей домашней папке и находится этот сайт. По этому я сначала добавлю того самого пользователя, к которому будет привязан и сайт и по аккаунту которого будем заходить по FTP:

sudo adduser ТутИмяБудущегоПользователя

-7

Теперь я могу в его домашнюю папку перенести наш начальный сайт из /var/www. В результате будет так:

-8

Устанавливаем нового владельца и права на катало www и всё что внутри:

-9

Указываем новый путь в файле виртуальных хостов, указываем контейнер директивы Directory, и сразу же добавляем раздел модуля mpm_itk:

-10

Контейнер с директорией даёт доступ к этому разделу сайта. Без него сайт выдаст ошибку Forbidden 403. Внимательный читатель сразу же спросит,- Погоди-ка, но ведь сайт был по умолчанию как только мы установили, но тут этой директивы для него не было, зачем тогда для нашего она нужна? - Отвечаю,- На самом деле эта директива для сайта по умолчанию была, но в другом файле настроек, в apache2.conf. Почему разработчики так сделали, не могу сказать, наверно по тому, что изначально сервер Апаче поставляется без настроек виртуальных хостов и эту директиву запихнули в основной файл.

Модуль mpm_itk как раз и объясняет Apache, что запускать выполнение кода для этого виртуального хоста нужно от имени, которое мы указываем, а не от www-data. Однако, модуль этот нужно доустановить:

sudo apt install libapache2-mpm-itk

-11

Проверяем, что модуль успешно установился. Он должен оказаться в этой папке:

-12

Перезапускаем службу Apache:

-13

Проверяем, всё должно быть по прежнему ок, в разделе переменных окружения видим, что пользовательская папка отображена верно:

-14

Убеждаемся, что доступ по FTP тоже работает:

-15

Теперь переходим к настройке MySQL, без неё вряд ли удастся запустить даже самый нетребовательный движок сайта. Выполним команду и заходим в консоль MySQL:

sudo mysql -u root

В консоле вводим SQL команду и создаём новую базу данных сразу указав её имя:

CREATE DATABASE vintorouter;

Проверим, наша база теперь в списке есть:

-16

Теперь создадим одноимённого пользователя базы данных и укажем ему сразу пароль. Я не стал делать разные имена пользователей на FTP, базу данных и т.п., да и сама база данных также называется. Вы разумеется можете дать любое другое имя как базы данных, так и пользователя, они между собой могут быть разными:

CREATE USER 'vintorouter'@'%' IDENTIFIED BY '227pass228z';

Теперь сделаем привязку пользователь базы данных -> база данных, а правильнее сказать дадим пользователю базы данных права к нашей новой базе данных (сначала указана база данных, а после TO указа пользователь:

GRANT ALL PRIVILEGES ON vintorouter.* TO 'vintorouter'@'%' WITH GRANT OPTION;

Выходим из консоли MySQL сервера командой exit:

-17

Теперь нужно удобное средство для работы с базой данных MySQL. Этим средством считается phpmyadmin. Установим его:

sudo apt-get install phpmyadmin

-18

При установке сначала задаст один вопрос - для какого сервера установить этот функционал. Ответить нужно, что для Apache. Потом спросит нужно ли сконфигурировать, отвечаем - ДА. Далее попросит ввести пароль на приложение. Введите что хотите, но запомните его.

Перезапустите сервер Apache:

sudo /etc/init.d/apache2 restart

Теперь переходим на наш сайт, но после корневого слэша введем ссылку на phpmyadmin:

http://vintorouter.uni/phpmyadmin

В браузере должно появиться следующее:

-19

Укажем здесь пользователя базы данных и пароль, которые только что создали в консоле MySQL. После авторизации увидим что-то вроде такого:

-20

Это значит, что всё сделали правильно. Однако, скорее всего phpmyadmin сообщит, что некоторые настройки ему не нравятся:

-21

Для этого потребуются небольшие знания php и пара минут времени. Первая проблема, что функционал говорит, что в настройках нужно ввести ключевую фразу. Вторая проблема, что нет прав на папку кэширования, но ведь оно и понятно, у нас сайт запускается не от www-data, а от специально созданного пользователя. Либо дайте права на эту папку, либо просто создайте путь кэширования в папке этого пользователя и укажите этот другой путь в настройках. При этом, и без этих настроек phpmyadmin будет работоспособен.