Macchina Apache Web Server

Da Webmobili Wiki.

Installazione Web Server Apache

[modifica]

Durante la creazione esplicitare IP privato come 172.31.100.10
(configurazione di rete avanzata => IP Primario)

sudo apt update
sudo apt upgrade
sudo dpkg-reconfigure tzdata

# Cron
sudo apt install cron

#FTP
sudo apt install vsftpd
sudo nano /etc/vsftpd.conf  # configurare come da guida
sudo systemctl reload vsftpd.service

# LAMP
sudo apt install apache2

# Repo per tenere aggiornato PHP e accedere alle versioni precedenti
sudo apt -y install lsb-release apt-transport-https ca-certificates 
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update


sudo apt install php-fpm php-mysql
#sudo apt install php7.4-fpm php7.4-mysql

# Abilitare moduli Apache per PHP FPM
sudo a2enmod proxy_fcgi setenvif rewrite http2 brotli
sudo a2enconf php8.4-fpm
sudo systemctl restart apache2.service

sudo chown www-data:www-data /var/www -R
sudo chmod 775 /var/www -R
sudo chmod g+s /var/www -R
# Aggiungere l'utente corrente al gruppo www-data
sudo adduser admin www-data

sudo systemctl restart apache2.service

Loopback

[modifica]

Inserire nel loopback il nome mysql associato all'IP interno della macchina database corrispondente:

sudo nano /etc/hosts
172.31.200.10    mysql

mysql sarà il nome host per le connection string dei siti.

Certificati SSL

[modifica]
sudo apt install snapd
sudo snap install core
sudo snap refresh
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot


Configurazione PHP per Wordpress

[modifica]

PHP Configuration

[modifica]

A causa della presenza di più istanze Wordpress abbiamo convenuto di modificare i valori di /etc/php/7.4/fpm/php.ini nel seguente modo

upload_max_filesize = 128M
post_max_size = 256M
max_execution_time = 900
max_input_vars = 5000
memory_limit = 4096M
max_input_time = 400

E riavviare il service

sudo systemctl restart php7.4-fpm.service


Modificare /etc/php/7.4/fpm/pool.d/www.conf per i pool
Documentazione: https://www.php.net/manual/en/install.fpm.configuration.php

pm.max_children = 10
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 500
  • pm.max_children: Numero di connessioni simultanee.
  • pm.start_servers: Questo valore determina il numero di processi PHP-FPM che vengono avviati inizialmente al caricamento.
  • pm.min_spare_servers e pm.max_spare_servers: Questi valori controllano il numero minimo e massimo di processi PHP-FPM inattivi mantenuti in standby per gestire eventuali picchi di traffico.
  • pm.max_requests: Questo valore specifica il numero massimo di richieste gestite da un singolo processo PHP prima di essere terminato e ricreato. Ho impostato questo valore a 500 per evitare che i processi accumulino troppe richieste nel tempo, riducendo così il rischio di perdita di memoria o di degrado delle prestazioni nel tempo.

Designbest Script

[modifica]
  • Piazzare lo script createvirtualhost.sh in /opt/script-bash
  • Piazzare il template virtualhost-template in /etc/apache2/sites-available

Scaricare le dipendenze

sudo apt install unzip
  • createvirtualhost.sh
#!/bin/bash

function buildVirtualhost {
	return_value=$(</etc/apache2/sites-available/virtualhost-template)
	return_value=$(echo -e "${return_value//'{vhostname}'/$1}")
	echo "$return_value"
}

echo -e "Scrivi il dominio, per piacere: \c"
read dominio
#check lowercase
dominio=$(echo $dominio | tr '[:upper:]' '[:lower:]')
echo "Verrà creata un'istanza Wordpress per il dominio $dominio e www.$dominio"

#echo "---> Inizio creazione database MySql..."
dominio_escaped=$(echo ${dominio//./_})
# Eseguo la creazione del database sull'altra macchina
ssh ubuntu@mysql -i /opt/script-bash/webmobili-key-pem.pem 'mysql -u designbest --password=W3bm0b1l! -e "CREATE DATABASE wp_'${dominio_escaped}';"'
#mysql -u root --password=W3bm0b1l! -e "CREATE DATABASE wp_${dominio_escaped};"
#echo "---> Database MySql creato <---"

echo "---> WORDPRESS, download ed estrazione..."
cd /var/www/
wget -O wp-temp.zip -v https://wordpress.org/latest.zip
unzip wp-temp.zip
mv wordpress $dominio
chown www-data:www-data $dominio -R
chmod 775 $dominio -R
rm wp-temp.zip
echo "---> Fine WORDPRESS <---"

echo "---> VIRTUALHOST, creazione + enable site..."
cd /etc/apache2/sites-available/
virtualhost_str=$(buildVirtualhost $dominio)
echo "$virtualhost_str" > $dominio.conf
a2ensite $dominio.conf
echo "---> Fine VIRTUALHOST <---"

echo "---> CERTIFICATO SSL, creazione..."
#certbot --apache -d $dominio -d www.$dominio
certbot --apache -d $dominio
systemctl reload apache2.service
echo "---> Fine grazie <---"

Ricordarsi che in ambiente di Staging il percorso della macchina database cambia in ubuntu@mysqlstaging

  • virtualhost-template
#
# {vhostname}
#
<VirtualHost *:80>
        ServerName {vhostname}
        Redirect / https://%{SERVER_NAME}%{REQUEST_URI}
</VirtualHost>

<VirtualHost *:443>
	ServerAdmin info@designbest.com
	ServerName {vhostname}
	ServerAlias {vhostname} www.{vhostname}

	DirectoryIndex index.html index.htm index.php
	DocumentRoot /var/www/{vhostname}	

	<Directory />
		Options FollowSymLinks
		AllowOverride All
	</Directory>

	<Directory /var/www/{vhostname}/>
		Options -Indexes +FollowSymLinks +MultiViews
		AllowOverride All
		Order allow,deny
		Allow from all
		Require all granted
	</Directory>
	#Logfiles
	ErrorLog /var/log/apache2/{vhostname}.error.log
</VirtualHost>

Dipendenze raccomandate

[modifica]

Per eliminare tutti i warning dati dalla sezione "Salute del Sito"
procedere con

sudo apt install php7.4-curl php7.4-xml php7.4-imagick php7.4-gd php7.4-mbstring php7.4-zip php7.4-intl
sudo apt install memcached php7.4-memcached

Configurare la memoria di memcached

sudo nano /etc/memcached.conf

e impostare un valore a -m

-m 512
  • Installare il plugin W3 Total Cache

PHPMyAdmin (non usato)

[modifica]

Questa guida è da seguire una volta terminata la Macchina Database

Il database sta su una macchina diversa da localhost, perciò l'installazione standard di phpmyadmin non è appropriata.

sudo apt install phpmyadmin

E scegliere NO quando chiede di installare CommonDatabase in automatico.

sudo dpkg-reconfigure phpmyadmin
  • Specificare che l'istanza del database si trova su un altro host
  • Immettere l'host es. 172.31.200.11 e proseguire

Installare Amazon SSM Agent

[modifica]

Le istanze Debian non hanno questo servizio pre-installato.
Permette all'istanza di comunicare tramite AWS CLI.

mkdir /tmp/ssm
cd /tmp/ssm
wget https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb
sudo dpkg -i amazon-ssm-agent.deb

Fonte: https://docs.aws.amazon.com/it_it/systems-manager/latest/userguide/agent-install-deb.html

Python3 per Backup

[modifica]

Abbiamo uno script in Python che backuppa i siti di produzione e li copia sullo spazio di Drive automaticamente.

sudo apt install python3 python3-pip

Python PIP

[modifica]

Appena installato python3 impedisce di usare PIP.
Fonte: https://www.makeuseof.com/fix-pip-error-externally-managed-environment-linux/

Soluzione veloce

[modifica]

La soluzione è quella di cancellare un file di testo presente nella cartella di installazione:

cd /usr/lib/python3.11
sudo rm EXTERNALLY-MANAGED

Ricordiamo che PIP agisce localmente, perciò i moduli installati sono solo per l'utente che li sta installando.
IMPORTANTE: se il programma python viene schedulato o usato da altri utenti (come root), è necessario che tutti questi utenti abbiano runnato pip per installare le librerie.

Copiare il programmino in /opt/script-python/GoogleDriveUpload.

cd /opt/script-python/GoogleDriveUpload
# Importante che il gruppo di culoz.json abbia i permessi 7
sudo chmod 775 culoz.json
pip3 install -r requirements.txt
# Installare le dipendenze anche per l'utente root
sudo pip3 install -r requirements.txt

Per installare i pacchetti richiesti.

Soluzione Consigliata

[modifica]

Installare un virtual environment in ogni singolo progetto, non nel globale.

# Installa la gestione di virtual environment
sudo apt install python3-venv

cd /opt/script-python/NomeProgetto
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
deactivate

installa i pacchetti nella cartella venv.

/opt/mioprogetto/
├── venv/
│   ├── bin/        # Contiene l'interprete Python e altri eseguibili (su Linux/macOS)
│   ├── include/
│   ├── lib/        # Contiene le librerie installate con pip
│   └── pyvenv.cfg  # File di configurazione dell'ambiente virtuale
└── altri_file_del_progetto

Il comando deactivate esce dall'environment.

Per eseguire il progetto è necessario usare l'interprete python presente in venv/bin

/opt/percorsomioprogramma/venv/bin/python3 /opt/percorsomioprogramma/mioprogramma.py

Port Forwarding NAT (Non usato)

[modifica]

Utilizziamo iptables per permettere la connessione di Workbench all'istanza privata database.

# Necessario essere superuser
sudo su
# Abilitare l'inoltro dei pacchetti a livello di sistema
sudo nano /etc/sysctl.conf
# net.ipv4.ip_forward = 1

# Attivare la modifica
sudo sysctl -p

# Redirigo il traffico della porta 3306 verso la macchina 172.31.100.75
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination 172.31.100.75:3306
# Verifico la regola con
iptables -t nat -L

# Non so se sia necessaria
iptables -A FORWARD -p tcp -d 172.31.100.75 --dport 3306 -j ACCEPT
# Questa gestisce l'eventuale traffico che ritorna dal forwarding
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Uscire da superuser
exit

Uno strumento per verificare il forward è lanciare

sudo tcpdump -i enX0 port 3306

che si mette in ascolto della porta 3306,
provare una connessione per verificare gli inoltri da terminale.

Con mysql-client si può provare in questo modo

mysql --host=<ippubblico> --user=designbest --password=W3bm0b1l! sys


Backup automatici dei siti

[modifica]

Un nostro script si occupa di backuppare i siti presenti sulla macchina e di inviarli al GoogleDrive della casella webmobili@gmail.com.

Lo script si appoggia un programma python GoogleDriveUpload
collocato in /opt/script-python/GoogleDriveUpload
che prende come argomento un file di tipo tar.gz e lo uploada nella cartella scelta di Drive.

Lo script principale si trova sotto /opt/script-bash/sitesbackup/wordpressbackup

#!/bin/sh

# Recupero la data in formato YYYYmmgg
DATE=$(date +%Y%m%d)

SCRIPT_PYTHON="/opt/script-python/GoogleDriveUpload/main.py"
SCRIPT_PYTHON_DELETE="/opt/script-python/GoogleDriveUpload/delete.py"

script_dir=$(realpath $(dirname $0))

cd /opt/script-python/GoogleDriveUpload/

# Eseguo tutti gli script presenti in sites.conf
for script in "$script_dir"/sites.conf/*.sh; do
  . "$script"
done


python3 $SCRIPT_PYTHON_DELETE

chown www-data:www-data /var/www/backup/sites/ -R
chmod 775 /var/www/backup/sites/ -R

# Cancello i  backups più vecchi di 2 giorni
find /var/www/backup/sites -mtime +2 -exec rm {} \;

legge tutti i file .sh presenti nella cartella /opt/script-bash/sitesbackup/sites.conf e li esegue.

Il loro contenuto è simile a questo cambiando i percorsi e i nomi a seconda del sito:

#!/bin/bash

SCRIPT_PYTHON="/opt/script-python/GoogleDriveUpload/main.py"
FOLDER_NAME="designbestmagazine.com"

# Comprimo i file
tar cvzf /var/www/backup/sites/"$DATE"_"$FOLDER_NAME".tar.gz /var/www/"$FOLDER_NAME"
# Carico il file su Drive
python3 $SCRIPT_PYTHON /var/www/backup/sites/"$DATE"_"$FOLDER_NAME".tar.gz
# Rimuovo il backup
rm /var/www/backup/sites/"$DATE"_"$FOLDER_NAME".tar.gz

Probabilmente le variabili sono condivise durante l'esecuzione dei diversi script

Samba server

[modifica]

Per avere accesso al file system di questa macchina condividiamo i folder tramite Samba.
Sarà possibile accedervi solo passando dalla rete interna, dalla macchina IIS

Credenziali

designbest
W3bm0b1l!

Liberare la porta del gruppo di sicurezza 445 (si trova nei preconfigurati col nome Samba)

# Creare l'utente designbest
sudo adduser designbest
# password la solita: W3bm0b1l!

# Aggiungere designbest al gruppo dei sudoers
sudo adduser designbest sudo
# Aggiungere designbest al gruppo dei www-data
sudo adduser designbest www-data

# Installare Samba
sudo apt install samba cifs-utils
# Aggiungere l'utente a Samba
sudo smbpasswd -a designbest
# Impostare la password a W3bm0b1l!

Poi editare il file di configurazione principale

sudo nano /etc/samba/smb.conf

andare al fondo e aggiungere una sezione

[ApacheWWW]
  comment = Folder dei siti
  read only = no
  locking = yes
  path = /var/www
  guest ok = no

specificando in path la cartella da condividere.

Cambiare l'hostname con un nome "amico"

sudo nano /etc/hostname

ad esempio apache


Restartare il servizio

sudo systemctl restart smbd

Il collegamento a SAMBA da Windows non funziona perché di default è disattivato.

https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/guest-access-in-smb2-is-disabled-by-default