Macchina Apache Web Server

Da Webmobili Wiki.

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.3-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

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 = 2048M
max_input_time = 400

E riavviare il service

sudo systemctl restart php7.4-fpm.service

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@172.31.200.10 -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
mkdir /var/log/apache2/$dominio
chown www-data:www-data /var/log/apache2/$dominio/ -R
chmod 775 /var/log/apache2/$dominio/ -R
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 <---"
  • 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>
	<FilesMatch \.php$>
		SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
	</FilesMatch>
	#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

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

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 soffre di un bug quando si cerca di usare PIP.
Fonte: https://www.makeuseof.com/fix-pip-error-externally-managed-environment-linux/

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.

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.

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