Правильный 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