1 заметка с тегом

apache

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

Актуально на апрель 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
2016   apache   archlinux   lamp   linux   mysql   PHP   Заметка на память