За да работи правилно един Apache сървър трябва да са пренасочени портове 80 и 443 от рутера към хоста(сървъра), като протокола да е TCP. Това е най-популярния HTTP сървър в момента. Към него могат да се прикачат модули и да се направи връзка с бази данни, с удостоверяване на потребителя и много други благини. За начало да проверим няколко неща:
# hostname -f home.tlan.net
Пълното име (FQDN) е home.tachko.com
# cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 home.tlan.net home 109.160.78.103 home.tlan.net home
Във файла /etc/hosts, хоста е описан чрез localhost и реално IP
# cat /etc/resolv.conf domain tlan.net search tlan.net nameserver 127.0.0.1
# nslookup home.tachko.com Server: 127.0.0.1 Address: 127.0.0.1#53 Name: home.tlan.net Address: 109.160.78.103
DNS сървъра работи нормално и на home.tachko.com отговаря IP 109.160.78.103 Време е да инсталираме и самото Apache.
# apt-get install apache2
След като се инсталират пакетите, Apache се стартира автоматично. Mоже да инсталираме и документацията към Apache както и помощни програми, но не е задължително.
# apt-get install apache2-doc apache2-utils
Първото нещо което трябва да се направи е да проверим дали работи правилно. Няколко команди правят едно и също.
# /etc/init.d/apache2 status # systemctl status apache2 # service apache2 status ● apache2.service - LSB: Apache2 web server Loaded: loaded (/etc/init.d/apache2) Active: active (running) since Thu 2016-04-07 19:09:53 EEST; 36min ago Process: 430 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS) CGroup: /system.slice/apache2.service ├─478 /usr/sbin/apache2 -k start ├─481 /usr/sbin/apache2 -k start └─482 /usr/sbin/apache2 -k start Apr 07 19:09:53 home apache2[430]: Starting web server: apache2.
Всичко е стартирало правилно, но ще проверим логовете за грешки
# cat /var/log/apache2/error.log
Няма отразени грешки, значи всичко е стартирало и работи правилно Може да проверим и правилността на синтаксиса
# apache2ctl configtest Syntax OK
Няма грешка в конфигурационните файлове (чиста инсталация, иначе щеше да е бъг на системата), Горната команда има и още опции като fullstatus, graceful, graceful-stop, help, restart, start, status, stop. И щом няма грешка, и сме пренасочили портовете да пробваме как работи. Пишем в браузъра http://home.tlan.net
Прекрасно, Apache работи и се отваря страницата на http://home.tlan.net но също така се отваря същата страница когато напишем в браузъра http://home.tachko.com и http://109.160.78.103. За да не се получава това се правят виртуални хостове в Apache, за което ще стане по-надолу дума. Трябва да се знае, че основния конфигурационен файл се намира в /etc/apache2/apache2.conf. Той зарежда още конфигурационни файлове намиращи се в папките conf-enabled, mods-enabled и sites-enabled. И трите папки са важни, защото по време на работа ще се наложи или да въвеждаме нови модули или да създаваме нови виртуални хостове и т.н. Текущата ни задача е: - да спрем да се показва едно и също независимо какво пишем в браузъра (дали home.tachko.com или home.tlan.net или http://109.160.78.103 ) - да създадем виртуален хост home.tlan.net който да работи с http и още един виртуален хост който да работи под https. - когато напишем http://home.tlan.net да се пренасочва автоматично към https://home.tlan.net За да изпълним първото условие просто трябва да забраним виртуалния сайт 000-default.conf. Има няколко начина за това, единия е като се изпълни следната команда:
# a2dissite 000-default.conf Site 000-default disabled. To activate the new configuration, you need to run: service apache2 reload
Това на практика изтри файла 000-default.conf от папка /etc/apache2/sites-enabled/ или по-точно казано изтри линка на файла 000-default.conf. Оригиналното място на файла се намира в /etc/apache2/sites-available/.
# ls /etc/apache2/sites-enabled/
Няма нищо (празна директория), значи няма инсталиран виртуален сайт и е време да създадем нашите сайтове.
За създаване на този виртуален сайт ще създадем конфигурационен файл в /etc/apache2/sites-available/
# vi /etc/apache2/sites-available/home.tlan.net.conf <VirtualHost *:80> ServerAdmin tachko@tlan.net ServerName home.tlan.net DocumentRoot /home/www/home.tlan.net/public_html/ ErrorLog /home/www/home.tlan.net/logs/error.log CustomLog /home/www/home.tlan.net/logs/access.log combined </VirtualHost>
От файла се вижда, че трябва да създадем няколко директории (за логовете и html файловете)
# mkdir -p /home/www/home.tlan.net/logs/ # mkdir -p /home/www/home.tlan.net/public_html/
На практика с горните команди създадохме едновременно следните папки: /home/www/home.tlan.net/, /home/www/home.tlan.net/logs/ и /home/www/home.tlan.net/public_html/. И сега ако презаредим Apache, ще има действащ сайт http://home.tlan.net Да поместим и някакъв файл в /home/www/home.tlan.net/public_html/ за тест
# vi /home/www/home.tlan.net/public_html/index.html <!DOCTYPE html> <html> <body> <h1> My First Heading </h1> <p> My first paragraph. </p> </body> </html>
За да активираме сайта или изпълняваме командата
# a2ensite home.tlan.net.conf Enabling site home.tlan.net. To activate the new configuration, you need to run: systemctl reload apache2
или създаваме линк в /etc/apache2/sites-enabled/ на файла /etc/apache2/sites-available/home.tlan.net.conf Крайния резултат може да се види по следния начин
# ls -l /etc/apache2/sites-enabled/ total 0 lrwxrwxrwx 1 root root 39 Apr 7 20:38 home.tachko.com.conf -> ../sites-available/home.tachko.com.conf
Рестартираме Apache за да влязат актуализациите в сила
# service apache2 reload # service apache2 status
И макар да нямаме грешка при проверката когато напишем в браузъра http://home.tlan.net/ то се появява следния надпис:
Това е така защото Apache няма права в директорията /home/www/home.tlan.net/public_html/ За целта или редактираме виртуалния хост или редактираме Apache чрез конфигурационния му файл. В първия вариант е да разрешим директорията чрез описване в конфигурационния файл на самото Apache. За пример:
# vi /etc/apache2/apache2.conf <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> ### И под нея допълваме със следното: <Directory /home/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
Лошото е че тази директория се наследява автоматично и в другите виртуални сайтове. Лично аз предпочитам всеки виртуален сайт да го опиша и да знам какви права и ограничения има, а не да ги наследява. За целта:
# vi /etc/apache2/sites-available/home.tlan.net.conf <VirtualHost *:80> ServerAdmin tachko@tlan.net ServerName home.tlan.net DocumentRoot /home/www/home.tlan.net/public_html/ ErrorLog /home/www/home.tlan.net/logs/error.log CustomLog /home/www/home.tlan.net/logs/access.log combined <Directory /home/www/home.tlan.net> AllowOverride None Options +Indexes +ExecCGI Order deny,allow Allow from all Require all granted </Directory> </VirtualHost>
Какво добавихме: Directory /home/www/home.tla.net - дефинирахме директорията в която виртуалния сайт ще има права и за тази директория: AllowOverride None – в тази директория само ще се чете, ако сайта е примерно ел. магазин или сайт с база данни и вътре в директорията ще се пише то вместо None се поставя All Options +indexes +ExecCGI – показва съдържанието на папката при отсъствие на индексния файл (index.html), ако вместо + е – то тогава няма да се показват. ExecCGI служи за изпълнение на CGI скриптове и казваме че в папката може да се изпълняват CGI скриптове. Order deny,allow – вид защитна среда, позволяваща ни да блокираме разни потребители по IP адреси или по хост имена. Allow from all – в случая сме разрешили на защитената среда да пропуска всички Рестартираме Apache и тестваме
# service apache2 reload # service apache2 status
Първия виртуален хост е готов за тест. В браузъра пишем http://home.tlan.net
Работи. Следващата ни цел ще е да създадем виртуален сайт, който ще работи само под https и пак ще се казва home.tlan.net. Разликата е ще е, че предния го извиквахме чрез http://home.tlan.net , а този ще е https://home.tlan.net . Объркващо е, грубо казано е следното, независимо какво пишем в браузъра http://home.tlan.net или https://home.tlan.net винаги ще се показва https://home.tlan.net За целта първо създаваме новия конфигурационен файл
# vi /etc/apache2/sites-available/home.tlan.net-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin tachko@tlan.net
ServerName home.tlan.net:443
DocumentRoot /home/www/home.tlan.net/public_html/
ErrorLog /home/www/home.tlan.net/logs/error-ssl.log
CustomLog /home/www/home.tlan.net/logs/access-ssl.log combined
# SSL Engine Switch:
# Set various options for the SSL engine.
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
# SSL Engine Options:
# Set various options for the SSL engine.
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
<Directory /home/www/home.tlan.net/>
AllowOverride None
Options +indexes +ExecCGI
Order deny,allow
Allow from all
Require all granted
</Directory>
</VirtualHost>
</IfModule>
Активираме виртуалния сайт
# a2ensite home.tlan.net-ssl.conf Enabling site home.tlan.net-ssl. To activate the new configuration, you need to run: systemctl reload apache2
Рестартираме Apache и гледаме статуса му (дали работи правилно)
# service apache2 restart # service apache2 status
Всичко е наред, да пробваме в браузъра като напишем: https://home.tlan.net
За начало да видим логовете какво ще кажат
# ls /home/www/home.tlan.net/logs/ access.log error.log
Няма логове. Или сме объркали конфигурационния файл или мода за ssl липсва. Това се проверява чрез:
# ls /etc/apache2/mods-enabled/ssl* ls: cannot access '/etc/apache2/mods-enabled/ssl*': No such file or directory
Няма ги, значи ще ги активираме
# a2enmod ssl Considering dependency setenvif for ssl: Module setenvif already enabled Considering dependency mime for ssl: Module mime already enabled Considering dependency socache_shmcb for ssl: Enabling module socache_shmcb. Enabling module ssl. See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates. To activate the new configuration, you need to run: systemctl restart apache2
Рестартираме Apache
# service apache2 restart # service apache2 status
Всичко се стартира и работи без грешки. Да пробваме отново като напишем в браузъра: https://home.tlan.net .
Работи. Да направим така, че независимо какво ще напишем от http://home.tlan.net или https://home.tlan.net винаги да се отваря страницата https://home.tlan.net . За целта ще редактираме конфигурационния файл за виртуалния сайт на http://home.tlan.net
# vi /etc/apache2/sites-available/home.tlan.net.conf <VirtualHost *:80> ServerAdmin tachko@tlan.net ServerName home.tlan.net # DocumentRoot /home/www/home.tlan.net/public_html/ ErrorLog /home/www/home.tlan.net/logs/error.log CustomLog /home/www/home.tlan.net/logs/access.log combined <Directory /home/www/home.tlan.net> AllowOverride None Options +Indexes +ExecCGI Order deny,allow Allow from all Require all granted </Directory> Redirect permanent / https://home.tlan.net/ </VirtualHost>
Наново рестартирамe Apache
# service apache2 restart # service apache2 status
Всичко е наред Проверяваме като напишем в браузъра следното: http://home.tlan.net
Веднага ни прехвърля на https://home.tlan.net. По нататък ще включим и PHP и MySQL към Apache и още благинки ще си направим.
Само едно нещо остана да оправим, а именно сертификатите. Не са удостоверени публично и излизат като Not secure. За да се разбира от браузърите че сертификата е удостоверен трябва да се издаде от лицензиран източник, в противен случай пак ще работи но ще излиза че не е удостоверен. На помощ идива https://letsencrypt.org/. Компанията е много сериозна и гиганти като Mozilla, Cisco, Chrome и т.н. я поддръжат, затова ще използваме сертификати удостоверени от Let’s Encrypt. Когато влезеш на страницата на Let’s Encrypt и натиснеш бутона Get Started, виждаш, че има за тази цел Certbot ACME client. И така да посетим самия CertBot https://certbot.eff.org/. От страницата може да изберем какво ползваме за HTTP (примерно Apache, Nginx, Plesk и т.н.) и съответно каква дистрибуция ползваме (примерно Debian 8, Debian 9, Ubuntu 18.04, Gentoo и т.н.) и след като изберем какво ползваме се отваря ръководство. Тука ще се помъчим да исталираме с Apache върху Debian 9. И така по ръководството от Certbot първото условие е да има инсталиран SSH на сървъра ни. Тази стъпке беше направена по-рано. Второ условие е да добавим Certbot в рпозиторите. За Debian 9.9.0 какъвто е в момента последния стабилен релиз това не е необходимо. Третото условие е да инсталираме самия Certboot.
# apt-get install certbot python-certbot-apache
Пускаме автоматичното установяване на сертификата:
# certbot --apache Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator apache, Installer apache Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): tachko@home.tlan.net # въвеждаме мейл адрес където ще идва техническа информация, проблеми, грешки и пр. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel: A # съгласяваме се с условията от фирмата. Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: N # не искаме нашия мейл адрес да се споделя с други организации. Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: home.tachko.com 2: home.tlan.net - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): # предлага кои домейни да са привързани към сертификата, ако оставим полето празно то всички домейни ще се привържат. Натискаме просто Enter. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2 # предлага да пренасочим HTTP заявките към HTTPS. Грубо казано каквото и да напишем винаги ще се отваря HTTPS страница. IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/home.tachko.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/home.tachko.com/privkey.pem Your cert will expire on 2019-10-02. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Супер, сертификатите са генерирани и се намират в /etc/letsencrypt/live/home.tachko.com/
/# ls -l /etc/letsencrypt/live/home.tachko.com/ total 4 lrwxrwxrwx 1 root root 39 Jul 4 19:09 cert.pem -> ../../archive/home.tachko.com/cert1.pem lrwxrwxrwx 1 root root 40 Jul 4 19:09 chain.pem -> ../../archive/home.tachko.com/chain1.pem lrwxrwxrwx 1 root root 44 Jul 4 19:09 fullchain.pem -> ../../archive/home.tachko.com/fullchain1.pem lrwxrwxrwx 1 root root 42 Jul 4 19:09 privkey.pem -> ../../archive/home.tachko.com/privkey1.pem -rw-r--r-- 1 root root 692 Jul 4 19:09 README
Сертификатите са там, да рестартираме Apache:
# service apache2 restart
И да тестваме като напишем в браузъра http://home.tlan.net
Сертификата валиден, пренасочването работи. Да проверим статуса на SSL сертификата, като напишем в браузъра: https://www.ssllabs.com/ssltest/analyze.html?d=home.tlan.net&latest. Изчаква се достатъчно време, въртят се едни проценти, изследва се сайта и накрая трябва да се получи следното нещо:
Прекрасно, всичко си е наред. Сега да видим дали ще се зарежда всеки път автоматично, защото сертификата има трайност 90 дена и след това трябва наново да се генерира. За целта правим следното:
root@home:/etc# certbot renew --dry-run Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/home.tachko.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator apache, Installer apache Renewing an existing certificate Performing the following challenges: http-01 challenge for home.tachko.com http-01 challenge for home.tlan.net Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of apache server; fullchain is /etc/letsencrypt/live/home.tachko.com/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/home.tachko.com/fullchain.pem (success) ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates above have not been saved.) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal.
Малко появнение: Горната команда създаде в /etc/cron.d файл certbot. Това лесно може да се провери
# ls -l /etc/cron.d total 4 -rw-r--r-- 1 root root 775 Sep 15 2018 certbot
Ако се загледаме в самия файл,
# vi /etc/cron.d/certbot SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
ще видим, че преди да изтече сертификата автоматично ще се обнови. Същото можеше да проверим и чрез:
# systemctl list-timers NEXT LEFT LAST PASSED UNIT ACTIVATES Fri 2019-07-05 06:29:08 EEST 10h left Thu 2019-07-04 18:10:10 EEST 1h 39min ago apt-daily-upgrade.timer apt-daily-upgrade.service Fri 2019-07-05 08:28:10 EEST 12h left n/a n/a certbot.timer certbot.service Fri 2019-07-05 08:38:20 EEST 12h left Thu 2019-07-04 18:10:10 EEST 1h 39min ago apt-daily.timer apt-daily.service Fri 2019-07-05 19:01:39 EEST 23h left Thu 2019-07-04 19:01:39 EEST 48min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service 4 timers listed. Pass --all to see loaded but inactive timers, too.
Тук приключваме с Apache. Уговорката е, че всичко това е само началото. Ако трябва нещо по сериозно то тогава или през GOOGLE или трябва да се прочете малко специализирана литература по въпроса