Apache

Server WWW

Apache este un server open source pentru a furniza serviciul HTTP. Cuvântul apache este numele apașilor, triburi de amerindieni (populația nativă din America).
Hypertext Transfer Protocol (HTTP) este un protocol folosit pentru accesarea informațiilor în Internet care sunt păstrate pe servere World Wide Web (WWW). Protocolul HTTP este un protocol de tip text, fiind protocolul "implicit" al WWW.

Instalare server Apache în Ubuntu

Toate comenzile de mai jos sunt realizate de către userul root sau de către un user ce are drept de administrare (de exemplu folosind comanda sudo). Pentru cazul în care utilizatorul root nu este activat vom obține drepturile acestuia folosind comanda:

sudo su -

Sistemul folosit este GNU/Linux iar distribuția este Ubuntu 22.04.3 LTS (Jammy Jellyfish) varianta stabilă LTS (Long Time Support).
Pentru început vom actualiza sistemul, pentru a fi siguri că instalăm ultima versiune considerată stabilă:
apt update && apt upgrade && apt full-upgrade

Cu următoarea comandă vom instala serverul Apache:

apt install apache2

După instalare serviciul pornește automat. Pentru verificare rulăm comanda:

systemctl status apache2

După ce serviciul a pornit putem să ne conectăm, folosind browser-ul de web preferat, la adresa acestuia, în acest caz 192.168.1.62 ce va încărca pagina index.html din directorul rădăcină al serverului Apache, amplasat, în cazul distribuției Ubuntu, în calea /var/www/html/

În cazul in care firewall-ul ufw este activ vom lăsa conexiunile din exterior să se poată conectat la serviciul apache2:

ufw app list
ufw allow "Apache Full"
ufw reload
ufw status

Definirea porturilor pentru serverul Apache sunt definite în fișierul /etc/ufw/applications.d/apache2-utils.ufw.profile

Activăm pornirea serviciului la pornirea calculatorului/serverului:

systemctl enable apache2

Instalare PHP

PHP (acronim recursiv pentru PHP: Hypertext Preprocessor) este un limbaj de scripting de uz general, cu cod-sursă deschis (open source), utilizat pe scară largă, și care este potrivit în special pentru dezvoltarea aplicațiilor web și poate fi integrat în HTML.
Vom instala versiunea 8.1 a PHP din depozitul ppa:ondrej/php.
Vom verifica întâi dacă sunt instalate pachetele necesare pentru aducerea de noi depozite de pachete:

apt install software-properties-common

Instalam depozitul necesar:

sudo add-apt-repository ppa:ondrej/php

Realizăm un update al sursei pachetelor:

apt update

Realizăm upgrade la pachetele necesare, deoarece anterior am fost informți că sunt pachete de actualizat:

apt upgrade

Dupa care instalăm pachetul PHP versiunea 8.2 cu modulele necesare:

apt install php8.2 php8.2-curl php8.2-mbstring php8.2-xml php8.2-gd php8.2-zip php8.2-apcu php8.2-opcache php8.2-yaml

Pentru verificarea instalării vom crea fișierul info.php în directorul rădăcina al serverului apache:

nano /var/www/html/info.php

în care vom scrie urmatoarele:

<?php

phpinfo();

?>

Activăm modulul php pentru apache, folosind comanda:

a2enmod

ocazie cu care vedem toate modulele disponibile instalate:

Dacă rezultatul este ca cel de mai jos, totul este ok

După care ne conectăm la serverul apache pagina info.php creată anterior și vom obține pagina cu informațiile privitoare la configurarea PHP:

Apache cu PHP-FPM

PHP-FPM oferă performanțe îmbunătățite pentru site-urile web aglomerate.
Pentru a instala PHP 8.2 în Ubuntu cu PHP-FPM pentru Apache vom rula comanda de instalare a următoarelor pachete:

apt install php8.2-fpm libapache2-mod-fcgid

Pentru a activa PHP-FPM va trebui să activăm următoare module:

a2enmod proxy_fcgi setenvif

și să activăm fișierul de configurare aferent PHP-FPM:

a2enconf php8.2-fpm

După care va trebui sa notificăm serviciul Apache să reîncarce fișerele de configurare:

systemctl reload apache2

Instalare CMS Grav

Grav este un Content Management System (CMS) - sistem de administrare a conținutului. Acesta este un CMS ce nu are nevoie, pentru management, de o bază de date iar scriere paginilor se realizează folosind limbajul Markdown. Pentru instalare avem nevoie de serviciul apache și limbajul PHP să fie funcționale și instalate cât și de un utilitar de dezarhivare a arhivelor zip, fapt pentru care vom alege unzip.

apt install unzip

După descărcarea CMS-ului Grav cu tot cu pluginul admin la pagina https://github.com/getgrav/grav/releases,

wget https://github.com/getgrav/grav/releases/download/1.7.43/grav-admin-v1.7.43.zip - versiunea folosită la scrierea acestui tutorial.

vom dezarhiva arhiva în directorul rădăcină a serverului Apache:

cd /var/www/
unzip /root/grav-admin-v1.7.43.zip

În continuare conform documentației, determinăm sub ce user și grup rulează apache pentru a schimba drepturile fișierelor:

ps aux | grep -v root | grep apache | cut -d\ -f1 | sort | uniq

iar cu rezultatul întors al utilizatorului în acest caz www-data aflăm grupurile din care face parte:

groups www-data

Schimbăm calea directorului curent în directorul unde se află CMS-ul Grav, dezarhivat anterior:

cd /var/www/grav-admin

chgrp -R www-data .
find . -type f | xargs chmod 664
find ./bin -type f | xargs chmod 775
find . -type d | xargs chmod 775
find . -type d | xargs chmod +s
umask 0002

După cum observăm lipsește un modul al serverului apache:
Cu umătoarea comandă activăm modulul:

a2enmod rewrite

După care vom reporni serviciul:

systemctl restart apache2

Dezactivăm configurarea site-ul implicit al serverului apache:

a2dissite 000-default

și creăm un nou fișier de configurare pentru CMS-ul nou instalat în directorl rădăcină. Fișierele de configurare se află în directorul /etc/apache2/sites-available:

nano /etc/apache2/sites-available/grav-site.conf

în fișierul creat cu editorul preferat, în acest caz nano vom adăuga următorul text, la care adresa de email al adminului și numele serverului se vor înlocui cu cele adevărate:

<VirtualHost *:80>
 ServerName nume.server.net
        ServerAlias www.nume.server.net
        ServerAdmin adresa.email@admin.com
 DocumentRoot /var/www/grav-admin

<Directory /var/www/grav-admin>
        Options -Indexes
        AllowOverride All
        Order allow,deny
        allow from all
</Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Activăm noua configurație, ce va realiza un link al fișierului grav-site.conf în directorul /etc/apache2/sites-enabled:

a2ensite grav-site

Vom reponi serverul pentru ca noile configurații să-și facă efectul:

systemctl restart apache2

Verificăm dacă îndeplinim condițiile de utilizare a CMS-ului dar de data aceasta la adresa http://192.168.1.62/admin deoarece în fișierul de configurare am modificat directorul rădăcină al serverului și stabilim credențialele de conectare:

După înregistrarea utilizatorului de administrare vom putea intra panoul de comandă al CMS-ului cu ajutorul căruia vom putea realiza paginile site-ului, vom instala pluginuri, etc.:

Securizarea comunicației

Având în vedere că, comunicația între browser și server este în clar iar pe viitor se dorește a instala servicii și CMS care are cel puțin un form de autentificare cu user și parolă este necesar a se securiza comunicația prin utilizarea unui mijloc de criptare a acesteia folosind, în acest caz, protocolul SSL.

Stabilirea zonei de timp

Pentru a seta zona de timp vom folosi comanda:

timedatectl set-timezone Europe/Bucharest

și verificăm că a avut loc schimbarea cu:

timedatectl

Realizarea cheilor de certificare

Cheile vor fi create folosind o parolă care în pasul al doilea va fi eliminată, nu va trebui să o ținem minte pentru mult timp:).

cd /etc/ssl/private
openssl genrsa -aes128 -out server.key 2048

Eliminăm parola

openssl rsa -in server.key -out server.key

openssl req -new -days 3650 -key server.key -out server.csr

openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650

Verificăm crearea cheilor:

ls

Vom avea nevoie ca modulul SSL din apache să fie încărcat, verificarea modulelor încărcate se realizează cu comanda:

apache2ctl -M

Vom crea un fișier de configurare a site-ului ce va încărca cheile de securitate:

nano /etc/apache2/sites-available/grav-site-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
 ServerName nume.server.net
        ServerAlias www.nume.server.net
        ServerAdmin adresa.email@admin.com
 DocumentRoot /var/www/grav-admin

<Directory /var/www/grav-admin>
        Options -Indexes
        AllowOverride All
        Order allow,deny
        allow from all
</Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on
        SSLCertificateFile    /etc/ssl/private/server.crt
        SSLCertificateKeyFile /etc/ssl/private/server.key
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                        SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                        SSLOptions +StdEnvVars
        </Directory>

</VirtualHost>
</IfModule>

Activăm fișierul de configurare creat:

a2ensite grav-site-ssl

Activăm modulul ssl:

a2enmod ssl

Repornim serviciul apache pentru a incărca noile modificări:

systemctl restart apache2

Folosind browserul preferat vom încărca pagina https://192.168.1.62 de la care vom primi un avertisment ca nefiind de încredere, deoarece cheia creată de noi (este privată) nu este realizată de un organism agrementat (nu poate fi verificată public):

Apăsăm butonul Avansat, pentru a deschide noi opțiuni:

Apăsăm butonul Acceptă riscul și continuă după care pagina va fi încărcată. Cheia va fi descărcata în browser și nu vom mai fi întrebați în viitor atât timp cât avem cheia:

Odată conectați cu userul și parola aleasă pentru administrarea siteului putem face modificări la site prin introducerea de noi pagini și de module. Pagina de administrare arată ca în imaginea de mai jos:

iar pagina de unde putem adăuga pagini noi va arăta ca în imaginea de mai jos:

Atenție - Pentru cazul în care site-ul va deveni public este bine a se lucra cu chei SSL alocate de o entitate recunoscută ca de exemplu Let's Encrypt. Procesul de instalare a resurselor necesare este descris la pagina Let's Encrypt din aria Servere.

Astfel, pentru fiecare pagină, GRAV realizează un director în care se țin fișierele media ale acesteia (imagini, fișiere pdf, etc) și pagina editată în limbajul Markdown, pentru exemplificare o captură a paginii home. În funcție de ierarhia directoarelor se stabilește și ordinea în meniuri: