# LAMP (Русский)

Ссылки по теме

- MariaDB (Русский)
- PhpMyAdmin (Русский)
- Adminer
- Xampp (Русский)
- mod_perl

LAMP - это комбинированная серверная технология, суть которой состоит в развертывании веб-сервера Apache, сервера баз данных MySQL/MariaDB и интерпретатора PHP на Linux-системе. Эта статья описывает, как установить HTTP-сервер Apache на Arch Linux. Также он описывает, как дополнительно установить PHP и MariaDB и интегрировать их с Apache.

Если вам нужен настроенный сервис для разработки и тестирования, то можете просто установить Xampp.

## Установка пакетов

В статье предполагается, что вы будете устанавливать все разом: Apache, PHP и MariaDB. Впрочем, при желании, все это можно установить и по отдельности.

Установите пакеты apache, php, php-apache и mariadb из официальных репозиториев Arch Linux.

## Настройка

### Apache

По соображениям безопасности при запуске сервера Apache от имени суперпользователя (напрямую или через скрипт инициализации) происходит смена идентификаторов группы и пользователя, от имени которого сервер начинает работу. Значения идентификаторов берутся из конфигурационного файла /etc/httpd/conf/httpd.conf и по умолчанию равны http. Происходит передача управления работой сервера от пользователя root к пользователю http, не имеющего привилегированных полномочий в операционной системе.

Измените конфигурационные файлы `httpd.conf` и `extra/httpd-default.conf` по вашему усмотрению и запустите демон `httpd`, используя систему инициализации systemd.

После этих мероприятий Apache должен запуститься. Протестируйте его работоспособность, набрав в адресной строке браузера `http://localhost/`. Веб-сервер должен отправить вам простую тестовую страничку.

#### Пользовательские каталоги

- По умолчанию доступ к пользовательским каталогам возможен по адресу `http://localhost/~user/`, который показывает содержимое директории `~/public_html` (расположение этой директории можно изменить в конфигурационном файле `/etc/httpd/conf/extra/httpd-userdir.conf`).

- Если вы не хотите, чтобы пользовательские каталоги были доступны через web, закомментируйте следующую строку в `/etc/httpd/conf/httpd.conf`:

    Include conf/extra/httpd-userdir.conf

- Обязательно убедитесь, что права доступа на вашу домашнюю директорию назначены корректно, чтобы Apache смог получить доступ к ней. Ваш домашний каталог и `~/public_html/` должны быть исполняемы для "остального мира":

    $ chmod o+x ~
    $ chmod o+x ~/public_html

- Однако с точки зрения безопасности вышеприведенное решение слишком фривольно. Правильнее поступить по-другому. Сначала добавьте пользователя http в группу, которой принадлежит ваша домашняя папка. Например, если ваша домашняя папка и все ее подкаталоги принадлежат группе piter, можно проделать следующее:

    # usermod -aG piter http

или

    # gpasswd -a http piter

- После этого назначьте права на чтение и исполнение для каталогов `~/`, `~/public_html` и, рекурсивно, на остальные подкаталоги для `~/public_html` для членов группы (в нашем примере для членов группы piter). Опираясь на нижеприведенный шаблон, осуществите эти мероприятия:

    $ chmod g+xr-w /home/yourusername
    $ chmod -R g+xr-w /home/yourusername/public_html

Обратите внимание: Таким образом, только пользователь http и все потенциальные пользователи группы piter будут иметь разделяемый доступ к вашему домашнему каталогу.

Перезапустите httpd.

#### SSL

- Создайте самозаверенный сертификат (вы можете настроить длину ключа и срок его действия):

    # cd /etc/httpd/conf
    # openssl genrsa -out server.key 2048
    # chmod 600 server.key
    # openssl req -new -key server.key -out server.csr
    # openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

- Затем в `/etc/httpd/conf/httpd.conf` раскомментируйте строки, содержащие:

     LoadModule ssl_module modules/mod_ssl.so
     LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
     Include conf/extra/httpd-ssl.conf

после этого перезапустите httpd.

#### Виртуальные хосты

- Ежели вы хотите, чтобы Apache обслуживал множество хостов, раскомментируйте следующую строку в файле в `/etc/httpd/conf/httpd.conf`:

    Include conf/extra/httpd-vhosts.conf

- В конфигурационном файле `/etc/httpd/conf/extra/httpd-vhosts.conf` настройте виртуальные хосты по нижеследующему примеру:

    /etc/httpd/conf/extra/httpd-vhosts.conf

    NameVirtualHost *:80 # используем виртуальные хосты, основанные на доменных именах

    #this first virtualhost enables: http://127.0.0.1, or: http://localhost,
    #to still go to /srv/http/*index.html(otherwise it will 404_error).
    #the reason for this: once you tell httpd.conf to include extra/httpd-vhosts.conf,
    #ALL vhosts are handled in httpd-vhosts.conf(including the default one),
    # E.G. the default virtualhost in httpd.conf is not used and must be included here,
    #otherwise, only domainname1.dom & domainname2.dom will be accessible
    #from your web browser and NOT http://127.0.0.1, or: http://localhost, etc.
    #

    <VirtualHost *:80>
        DocumentRoot "/srv/http"
        ServerAdmin root@localhost
        ErrorLog "/var/log/httpd/127.0.0.1-error_log"
        CustomLog "/var/log/httpd/127.0.0.1-access_log" common
        <Directory /srv/http/>
          DirectoryIndex index.htm index.html
          AddHandler cgi-script .cgi .pl
          Options ExecCGI Indexes FollowSymLinks MultiViews +Includes
          AllowOverride None
          Order allow,deny
          Allow from all
        </Directory>
    </VirtualHost>

    <VirtualHost *:80>
        ServerAdmin your@domainname1.dom
        DocumentRoot "/home/username/yoursites/domainname1.dom/www"
        ServerName domainname1.dom
        ServerAlias domainname1.dom
        <Directory /home/username/yoursites/domainname1.dom/www/>
          DirectoryIndex index.htm index.html
          AddHandler cgi-script .cgi .pl
          Options ExecCGI Indexes FollowSymLinks MultiViews +Includes
          AllowOverride None
          Order allow,deny
          Allow from all
    </Directory>
    </VirtualHost>

    <VirtualHost *:80>
        ServerAdmin your@domainname2.dom
        DocumentRoot "/home/username/yoursites/domainname2.dom/www"
        ServerName domainname2.dom
        ServerAlias domainname2.dom
        <Directory /home/username/yoursites/domainname2.dom/www/>
          DirectoryIndex index.htm index.html
          AddHandler cgi-script .cgi .pl
          Options ExecCGI Indexes FollowSymLinks MultiViews +Includes
          AllowOverride None
          Order allow,deny
          Allow from all
    </Directory>
    </VirtualHost>

- Теперь добавьте имена для виртуальных хостов в файл `/etc/hosts` (это не является обязательным мероприятием, если DNS-сервер уже настроен на обслуживание соответствующих доменов, хотя и не станет лишним):

    127.0.0.1 domainname1.dom
    127.0.0.1 domainname2.dom

после этого перезапустите httpd.

- Если вы установили виртуальные хосты внутри вашей пользовательской директории, в некоторых случаях это может конфликтовать с настройками Apache для `Userdir`. Для того чтобы эту проблему обойти, отключите `Userdir`, закомментировав строку:

    # User home directories
    #Include conf/extra/httpd-userdir.conf

- Как было указано выше, убедитесь в правах доступа:

    # chmod 0775 /home/yourusername/

- Если Apache предназначен для обслуживания очень большого количества виртуальных хостов, можно настроить легкое и быстрое включение/отключение последних. Для этого рекомендуется создать по одному конфигурационному файлу на каждый хост и хранить их все в одной папке, например `/etc/httpd/conf/vhosts`.

- Сперва создайте папку:

    # mkdir /etc/httpd/conf/vhosts

- Затем поместите отдельные конфигурационные файлы в нее:

    # nano /etc/httpd/conf/vhosts/domainname1.dom
    # nano /etc/httpd/conf/vhosts/domainname2.dom

- Затем включите отдельные конфигурации в ваш `/etc/httpd/conf/httpd.conf`:

    #Enabled Vhosts:
    Include conf/vhosts/domainname1.dom
    Include conf/vhosts/domainname2.dom

- Теперь можно быстро включать/отключать требуемые виртуальные хосты путем простого раскомментирования/комментирования.

#### Расширенные параметры

Данные настройки в `/etc/httpd/conf/httpd.conf` носят опциональный характер и, быть может, окажутся интересными для вас.

    # Listen 80

- Это TCP-порт, через который Apache обменивается данными с внешним миром.

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

    # Listen 127.0.0.1:80

- Страница ошибки Apache может содержать почтовый адрес администратора веб-сервера. Измените адрес на свое усмотрение:

    # ServerAdmin you@example.com

- Корневой каталог Apache, где можно разместить ваши веб-страницы:

    # DocumentRoot "/srv/http"

Смените его, если хотите, но не забудьте поменять

    <Directory "/srv/http">

в противном случае получите 403 ошибку (недостаточно полномочий) при попытке получить доступ к новой корневой папке Apache. Также не забудьте изменить строку `Deny from all`, иначе опять получите 403 ошибку:

- Следующая директива Apache относится к секции `<Directory>` и означает игнорирование файлов `.htaccess`.

    # AllowOverride None

Обратите внимание: Ежели у вас возникают проблемы с настройками Apache, то можно проверить их корректность с помощью команды: `apachectl configtest`

- Смотрите дополнительные настройки Apache в `/etc/httpd/conf/extra/httpd-default.conf`

- Для отключения сигнатуры вашего сервера используйте:

    ServerSignature Off

- Для сокрытия информации о версиях Apache и PHP используйте:

    ServerTokens Prod

### PHP

- Для включения PHP добавьте нижеследующие строки в `/etc/httpd/conf/httpd.conf`:

  Поместите нижеследующую строку в любом месте после строки `LoadModule dir_module modules/mod_dir.so`:

     LoadModule php5_module modules/libphp5.so

  Разместите эту строку в конце списка `Include`:

     Include conf/extra/php5_module.conf

  Убедитесь, что следующая строка раскомментирована в секции `<IfModule mime_module>`:

     TypesConfig conf/mime.types

  Раскомментируйте следующую строку (опционально):

     MIMEMagicFile conf/magic

  Добавьте нижеследующую строку в `/etc/httpd/conf/mime.types`:

     application/x-httpd-php       php    php5

Обратите внимание: Если вы не обнаружите библиотеку `libphp5.so` в каталоге (`/etc/httpd/modules`), то вероятнее всего, что вы не установили php-apache.

- Если ваш корневой каталог `DocumentRoot` не `/srv/http`, добавьте его в опцию `open_basedir` файла `/etc/php/php.ini`:

     open_basedir=/srv/http/:/home/:/tmp/:/usr/share/pear/:/path/to/documentroot

- Перезапустите httpd-демона.

- Для определения того, корректно ли настроен PHP, создайте файл `test.php` в директории `DocumentRoot` (то есть в `/srv/http/` или `~/public_html`) и поместите в него следующий код:

    <?php phpinfo(); ?>

  Проверьте работоспособность PHP, пройдя по ссылке http://localhost/test.php или http://localhost/~myname/test.php

  Если PHP-код не исполняется, а на странице браузера вы увидите содержимое `test.php`, проверьте добавили ли вы `Includes` в строку `Options` для вашего корневого каталога в `/etc/httpd/conf/httpd.conf`. Кроме того, убедитесь, что `TypesConfig conf/mime.types` раскомментирован в секции <IfModule mime_module>. Также можно попробовать добавить нижеследующую строку в секцию `<IfModule mime_module>` файла `httpd.conf`:

    AddHandler application/x-httpd-php .php

#### Расширенные параметры

- Рекомендуется правильно настроить вашу временную зону (список временных зон) в `/etc/php/php.ini` по примеру:

    date.timezone = Europe/Moscow

- По желанию включите режим показа ошибок при отладке PHP-кода, для этого измените значение опции `display_errors` на `On` в файле `/etc/php/php.ini`:

    display_errors=On

- Ежели вы хотите использовать модуль `libGD`, установите php-gd и раскомментируйте `extension=gd.so` в `/etc/php/php.ini`:

Обратите внимание: Пакет php-gd требует libpng, libjpeg-turbo и freetype2.

    extension=gd.so

Обратите внимание: Проверьте, какие расширения PHP вы раскомментируете. Подключайте только те расширения, которые необходимы и достаточны для работы.

- Для использования модуля `mcrypt` установите php-mcrypt и раскомментируйте `extension=mcrypt.so` в `/etc/php/php.ini`:

    extension=mcrypt.so

- Не забудьте добавить индексные файлы `/etc/httpd/conf/extra/php5_module.conf`, если это необходимо:

    DirectoryIndex index.php index.phtml index.html

#### PHP-модули apache2-mpm-worker и mod_fcgid

- Раскомментируйте нижеследующую строку в `/etc/conf.d/apache`:

    HTTPD=/usr/sbin/httpd.worker

- Раскомментируйте нижеследующую строку в `/etc/httpd/conf/httpd.conf`:

    Include conf/extra/httpd-mpm.conf

- Установите пакеты mod_fcgid и php-cgi из официальных репозиториев.

- Создайте конфигурационный файл `/etc/httpd/conf/extra/php5_fcgid.conf` со следующим содержимым:

    /etc/httpd/conf/extra/php5_fcgid.conf

    # Required modules: fcgid_module

    <IfModule fcgid_module>
    	AddHandler php-fcgid .php
    	AddType application/x-httpd-php .php
    	Action php-fcgid /fcgid-bin/php-fcgid-wrapper
    	ScriptAlias /fcgid-bin/ /srv/http/fcgid-bin/
    	SocketPath /var/run/httpd/fcgidsock
    	SharememPath /var/run/httpd/fcgid_shm
            # If you don't allow bigger requests many applications may fail (such as WordPress login)
            FcgidMaxRequestLen 536870912
            PHP_Fix_Pathinfo_Enable 1
            # Path to php.ini – defaults to /etc/phpX/cgi
            DefaultInitEnv PHPRC=/etc/php/
            # Number of PHP childs that will be launched. Leave undefined to let PHP decide.
            #DefaultInitEnv PHP_FCGI_CHILDREN 3
            # Maximum requests before a process is stopped and a new one is launched
            #DefaultInitEnv PHP_FCGI_MAX_REQUESTS 5000
            <Location /fcgid-bin/>
    		SetHandler fcgid-script
    		Options +ExecCGI
    	</Location>
    </IfModule>

- Создайте необходимый каталог для php-wrapper и симлинк на него:

    # mkdir /srv/http/fcgid-bin
    # ln -s /usr/bin/php-cgi /srv/http/fcgid-bin/php-fcgid-wrapper

- Отредактируйте `/etc/httpd/conf/httpd.conf`:

    #LoadModule php5_module modules/libphp5.so
    LoadModule fcgid_module modules/mod_fcgid.so
    Include conf/extra/php5_fcgid.conf

- Убедитесь, что в файле `/etc/php/php.ini` включена директива:

    cgi.fix_pathinfo=1

перезапустите httpd.

Обратите внимание: Так же как и в Apache 2.4 вы можете использовать mod_proxy_fcgi вместе с PHP-FPM. Посмотрите здесь пример конфигурации.

### MariaDB

- Сконфигурируйте MySQL/MariaDB так, как описано в MariaDB.

- Раскомментируйте по меньшей мере одну из нижеприведенных строчек в `/etc/php/php.ini`:

    extension=pdo_mysql.so
    extension=mysqli.so
    extension=mysql.so

Tip: Если вы используете библиотеку mysqli.so, то необходимо раскомментировать как 'extension=mysqli.so', так и 'extension=mysql.so'.
Важно: Начиная с PHP версии 5.5, библиотека mysql.so получила статус устаревшей и ее использование не рекомендуется.

- Вы можете добавить новых пользователей MySQL. Быть может вы захотите настроить доступ к серверу MySQL только с localhost. Для этого достаточно раскомментировать `skip-networking` в `/etc/mysql/my.cnf`. После этого необходим перезапуск MySQL для того, чтобы изменения вступили в силу.

- Перезапустите демона httpd.

Tip: Возможно вы захотите установить инструменты для разработки и сопровождения баз данных phpMyAdmin, Adminer или mysql-workbench.

## Внешние ссылки

- Официальный сайт веб-сервера Apache
- Официальный сайт PHP
- MariaDB Официальный сайт
- Руководство по созданию самозаверенных сертификатов
- Поиск и устранение неисправностей при настройке Apache

Categories:

- Русский
- Networking (Русский)