Правильный LAMP на archlinux

03 September 2016
#Apache#Lamp#Archlinux#Linux#MySQL#PHP

Актуально на апрель 2016.

Версия apache, php, mysql:

    $ httpd -v
    Server version: Apache/2.4.20 (Unix)
    Server built:   Apr 11 2016 10:04:04
    
    $ php -v
    PHP 7.0.5 (cli) (built: Apr  2 2016 23:10:23) ( NTS )
    Copyright (c) 1997-2016 The PHP Group
    Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    
    $ mysql -V
    mysql  Ver 15.1 Distrib 10.1.13-MariaDB, for Linux (x86_64) using readline 5.1

Я не буду подробно акцентироват внимание на конфигурировании, лишь общие настройки.

Для начала следует обновить все пакеты

    sudo pacman -Syu

Ставим всё необходимое, а именно apache, php, mysql, openssl (если необходим доступ по https) и т.д.

    sudo pacman -S apache php php-apache mysql openssl

Если mysql не стоял ранее:

    sudo systemctl start mysqld
    sudo mysql_secure_installation

Можно попробовать проверить работоспособность сервера базы

    mysql -u root -p

Мне нравится способ конфигурирования apache в ubuntu, поэтому переделаем настройки на убунтуподобность)

Открываем httpd.conf

    sudo nano /etc/httpd/conf/httpd.conf

и в конец файла добавляем:

    IncludeOptional conf/sites-enabled/*.conf
    IncludeOptional conf/mods-enabled/*.conf

Это позволит подхватывать все конфиги из {sites, mods}-enabled директорий.

Теперь создадим указанные каталоги:

        sudo mkdir /etc/httpd/conf/{sites-available,sites-enabled,mods-available,mods-enabled}

Для включения/выключения сайтов создадим скрипт.

Я не стал брать скрипты из ubuntu из-за их монстроузости, вместо этого в интернете нашёл вполне подходящие для наших целей.

Первый скрипт. "Включает" выбранный конфиг сайта.

    sudo nano /usr/sbin/a2ensite
    

    #!/bin/bash
    if test -d /etc/httpd/conf/sites-available && test -d /etc/httpd/conf/sites-enabled  ; then
    echo "-------------------------------"
    else
    echo "Error!! Folders /etc/httpd/conf/sites-available & etc/httpd/conf/sites-enabled not found."
    exit 0
    fi
    
    avail=/etc/httpd/conf/sites-available/$1.conf
    enabled=/etc/httpd/conf/sites-enabled
    site=`ls /etc/httpd/conf/sites-available/`
    
    if [ "$#" != "1" ]; then
            echo "Use script: a2ensite site_config"
            echo -e "\nAvailable virtual hosts:\n$site"
            exit 0
    else
    if test -e $avail; then
    sudo ln -s $avail $enabled
    else
    echo -e "$avail virtual host does not exist! Please create one!\n$site"
    exit 0
    fi
    if test -e $enabled/$1.conf; then
    echo "Success!! Now restart Apache server: sudo systemctl restart httpd"
    else
    echo  -e "Virtual host $avail does not exist!\nPlease see avail virtual hosts:\n$site"
    exit 0
    fi
    fi

Делаем скрипт выполняемым.

    sudo chmod +x /usr/sbin/a2ensite

Второй скрипт. "Выключает" выбранный конфиг сайта.

    sudo nano /usr/sbin/a2dissite
    

    #!/bin/bash
    if test -d /etc/httpd/conf/sites-available && test -d /etc/httpd/conf/sites-enabled  ; then
    echo "-------------------------------"
    else
    echo "Error!! Folders /etc/httpd/conf/sites-available & etc/httpd/conf/sites-enabled not found."
    exit 0
    fi
    
    avail=/etc/httpd/conf/sites-enabled/$1.conf
    enabled=/etc/httpd/conf/sites-enabled
    site=`ls /etc/httpd/conf/sites-enabled`
    
    if [ "$#" != "1" ]; then
            echo "Use script: a2dissite site_config"
            echo -e "\nEnabled virtual hosts: \n$site"
            exit 0
    else
    if test -e $avail; then
    sudo rm  $avail
    else
    echo -e "$avail virtual host does not exist! Exiting"
    exit 0
    fi
    if test -e $enabled/$1.conf; then
    echo "Error!! Could not remove $avail virtual host!"
    else
    echo  -e "Success! $avail has been removed!\nsudo systemctl restart httpd"
    exit 0
    fi
    fi

Делаем скрипт выполняемым.

    sudo chmod +x /usr/sbin/a2dissite

Теперь создадим скрипты включения/отключения модулей

    sudo nano /usr/sbin/a2enmod
    

    #!/bin/bash
    if test -d /etc/httpd/conf/mods-available && test -d /etc/httpd/conf/mods-enabled  ; then
    echo "-------------------------------"
    else
    echo "Error!! Folders /etc/httpd/conf/mods-available & etc/httpd/conf/mods-enabled not found."
    exit 0
    fi
    
    avail=/etc/httpd/conf/mods-available/$1.conf
    enabled=/etc/httpd/conf/mods-enabled
    mods=`ls /etc/httpd/conf/mods-available/`
    
    if [ "$#" != "1" ]; then
            echo "Use script: a2enmod mod_name"
            echo -e "\nAvailable mods config:\n$mods"
            exit 0
    else
    if test -e $avail; then
    sudo ln -s $avail $enabled
    else
    echo -e "$avail mod not exist! Please create one!\n$mods"
    exit 0
    fi
    if test -e $enabled/$1.conf; then
    echo "Success!! Now restart Apache server: sudo systemctl restart httpd"
    else
    echo  -e "Mod $avail does not exist!\nPlease see avail mods:\n$mods"
    exit 0
    fi
    fi

Делаем скрипт выполняемым.

    sudo chmod +x /usr/sbin/a2enmod

И второй скрипт (ну или 4 =) )

    sudo nano /usr/sbin/a2dismod
    

    #!/bin/bash
    if test -d /etc/httpd/conf/mods-available && test -d /etc/httpd/conf/mods-enabled  ; then
    echo "-------------------------------"
    else
    echo "Error!! Folders /etc/httpd/conf/mods-available & etc/httpd/conf/mods-enabled not found."
    exit 0
    fi
    
    avail=/etc/httpd/conf/mods-enabled/$1.conf
    enabled=/etc/httpd/conf/mods-enabled
    mods=`ls /etc/httpd/conf/mods-enabled`
    
    if [ "$#" != "1" ]; then
            echo "Use script: a2dismod mod_config"
            echo -e "\nEnabled mods: \n$mods"
            exit 0
    else
    if test -e $avail; then
    sudo rm  $avail
    else
    echo -e "$avail mod does not exist! Exiting"
    exit 0
    fi
    if test -e $enabled/$1.conf; then
    echo "Error!! Could not remove $avail mod!"
    else
    echo  -e "Success! $avail has been removed!\nsudo systemctl restart httpd"
    exit 0
    fi
    fi

Делаем скрипт выполняемым.

    sudo chmod +x /usr/sbin/a2dismod

Создаём виртуальный хост

    sudo nano /etc/httpd/conf/sites-available/localhost.conf

Пример конфигурации

    <VirtualHost *:80>
        DocumentRoot "/mnt/srv/www/localhost/public"
        <Directory "/mnt/srv/www/localhost/public">
            Options FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
        ServerName localhost
        ErrorLog "/mnt/srv/www/logs/localhost.error.log"
        CustomLog "/mnt/srv/www/logs/localhost.access.log" combined
    </VirtualHost>

Теперь его можно включить

    sudo a2ensite localhost
    

    $ sudo a2ensite localhost
    -------------------------------
    Success!! Now restart Apache server: sudo systemctl restart httpd

и добавить в /ets/hosts адрес если это требуется, попробовать запустить/перезапустить apache (как подсказывает скрипт)

Я попробовал перезапустить apache, и на данном этапе у меня всё работает.

Нужно уже браться за мод ssl. Но сначала напишем скрипт создания сертификатов, и создадим их.

    sudo nano /usr/sbin/agenssl
    

    #!/bin/bash
    if test -d /etc/httpd/conf/ssl ; then
    echo "..."
    else
    echo "make dir..."
    mkdir /etc/httpd/conf/ssl
    fi
    
    cd /etc/httpd/conf/ssl
    
    echo -e "Enter your virtual host FQDN"
    read cert
    
    openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
    chmod 600 $cert.key
    openssl req -new -key $cert.key -out $cert.csr
    openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt
    
    echo -e " The certificate "$cert" has been generated!\nPlease link it to Apache SSL available website!"
    
    ls -all /etc/httpd/conf/ssl
    exit 0

Сделаем скрипт выполняемым

    sudo chmod +x /usr/sbin/agenssl

Можно смело запускать. Из обязательного нужно заполнить "Common Name (e.g. server FQDN or YOUR name) []", указав в качестве имени адрес сайта.

    sudo agenssl
    

    $ sudo agenssl
    ...
    Enter your virtual host FQDN
    localhost
    .....................+++
    ..............................................................................+++
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:RU
    State or Province Name (full name) [Some-State]:
    Locality Name (eg, city) []:
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:
    Organizational Unit Name (eg, section) []:
    Common Name (e.g. server FQDN or YOUR name) []:localhost
    Email Address []:
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    Signature ok
    subject=/C=RU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=localhost
    Getting Private key
    The certificate localhost has been generated!
    
    Please link it to Apache SSL available website!
    drwxr-xr-x 2 root root 4096 апр 19 23:43 .
    drwxr-xr-x 8 root root 4096 апр 19 21:27 ..
    -rw-r--r-- 1 root root 1164 апр 19 23:43 localhost.crt
    -rw-r--r-- 1 root root  985 апр 19 23:43 localhost.csr
    -rw------- 1 root root 1704 апр 19 23:42 localhost.key

Мод ssl

    sudo nano /etc/httpd/conf/mods-enabled/ssl.conf
    

    LoadModule ssl_module modules/mod_ssl.so
    LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
    Listen 443
    SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
    SSLPassPhraseDialog  builtin
    SSLSessionCache        "shmcb:/run/httpd/ssl_scache(512000)"
    SSLSessionCacheTimeout  300

Включаем его

    sudo a2enmod ssl
    

    $ sudo a2enmod ssl
    -------------------------------
    Success!! Now restart Apache server: sudo systemctl restart httpd

Попробуем добавить конфигурацию виртуального хоста с ssl

    sudo nano /etc/httpd/conf/sites-available/localhost-ssl.conf
    

    <VirtualHost *:443>
        ServerAdmin webmaster@localhost
        ServerName localhost
        DocumentRoot /mnt/srv/www/localhost/public
    
        LogLevel info ssl:warn
    
        <Directory "/mnt/srv/www/localhost/public">
            Options FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
    
        ErrorLog "/mnt/srv/logs//localhost.error.log"
        CustomLog "/mnt/srv/logs/localhost.access.log" combined
    
        SSLEngine on
        SSLCertificateFile      /etc/httpd/conf/ssl/localhost.crt
        SSLCertificateKeyFile   /etc/httpd/conf/ssl/localhost.key
    
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
    
        BrowserMatch "MSIE [2-6]" \
            nokeepalive ssl-unclean-shutdown \
            downgrade-1.0 force-response-1.0
    
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    </VirtualHost>

Перезапускаем apach и пробуем наш https

    sudo systemctl restart httpd