Macchina Apache Web Server: differenze tra le versioni
Nessun oggetto della modifica |
|||
| Riga 28: | Riga 28: | ||
sudo apt install php-fpm php-mysql | sudo apt install php-fpm php-mysql | ||
sudo apt install php7.4-fpm php7.4-mysql | #sudo apt install php7.4-fpm php7.4-mysql | ||
# Abilitare moduli Apache per PHP FPM | # Abilitare moduli Apache per PHP FPM | ||
sudo a2enmod proxy_fcgi setenvif rewrite http2 brotli | sudo a2enmod proxy_fcgi setenvif rewrite http2 brotli | ||
sudo a2enconf php8. | sudo a2enconf php8.4-fpm | ||
sudo systemctl restart apache2.service | sudo systemctl restart apache2.service | ||
Versione delle 14:15, 25 ago 2025
Installazione Web Server Apache
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
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
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
PHP Configuration
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
- 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
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)
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.11e proseguire
Installare Amazon SSM Agent
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
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
Appena installato python3 impedisce di usare PIP.
Fonte: https://www.makeuseof.com/fix-pip-error-externally-managed-environment-linux/
Soluzione veloce
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
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)
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
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
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
# 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.