Come configurare un server WAMP
scritto martedì 05 Marzo 2024
La premessa è doverosa: Windows non è l' OS più adatto per uno stack Apache-MariaDB/MySQL-PHP.
Con la stessa sincerità possiamo affermare che è possibile configurarlo con risultati soddisfacenti.
Per avere idea di quanto sia pratica comune, i download di software come XAMPP, WampServer e Laragon oscillano da 500.000 a 1.000.000 ogni settimana! dati SourceForge
Nel nostro caso di studio procederemo con semplicità, consapevolezze e trasparenza,
alla configurazione di un ambiente di sviluppo solido, evitando di affidarci a soluzioni generiche preimpostate, talvolta insidiose per la sicurezza.
Software
Procediamo a step partendo dal download del software.
Per agevolare l'installazione e l'aggiornamento consiglio l'uso di Scoop, di seguito i comandi Powershell per installarlo.
In alternativa linkerò le fonti che lo stesso Scoop utilizza.
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
Subito dopo lanciamo il terminale come amministratore e installiamo un tool tipico dei sistemi Unix
scoop install -g main/sudo
Per comodità definisco un path da utilizzare come base per i software, una sorta di cartella Programmi creata da noi:
- C:\env\
Per i software scaricati con Scoop -g (global), questa cartella sarà:
- C:\ProgramData\scoop\
Saranno necessari dei certificati per utilizzare il web server con ssl, come consiglio in seguito.
E' possibile crearli con openssl oppure scricare una versione selfsigned da qui
1a. Apache
Il sito Apache Lounge offre i binari compilati del web server e di diversi moduli.
A noi sono necessari:
- Apache 2.4.* Win64
- FastCGI ASF module non presente in Scoop, servirà scaricarlo da qui in ogni caso
Comando Scoop:
sudo scoop install -g main/apache
# installiamo il service
sudo C:\ProgramData\scoop\apps\apache\current\bin\httpd.exe -k install -n "Apache2"
Estraiamo il modulo FastCGI in:
- C:\env\lib\apache\mod_fcgid.so
2a. MariaDB
Nato come fork del celeberrimo MySQL, lo ha gradualmente sostituito nei sistemi Linux based per via della natura più "community driven".
Pur mantenendo la retrocompatibilità, le sue feature sono cresciute esponenzialmente e ad oggi è la nostra scelta.
Siete ad ogni modo liberi di installare MySQL, i passi successivi dovrebbero andar ugualmente bene.
Comando Scoop:
sudo scoop install -g main/mariadb
# se non avviene automaticamente:
sudo mysql_install_db --service=MariaDB --password=PASSWORD
3a. PHP
Se per i precedenti software si è deliberatamente deciso di usare la versione più recente, con PHP ci spingeremo oltre!
Utilizzeremo contemporaneamente 2 versioni, differenziandole nei .conf di Apache. Per web-app più datate useremo PHP 7.4, per le più recenti PHP 8.1 .
In questo caso consiglio di NON usare Scoop e di procedere manualmente.
Scoop usa la variabile PHP_INI_SCAN_DIR che compromette il corretto utilizzo di più versioni PHP negli IDE di sviluppo.
Come avrete notato vengono compilate due differenti versioni di PHP: TS e NTS.
La differenza sostanziale è che la versione TS ( Thread-safe ) funziona nativamente in un contesto di server Web multi-thread ma è un approccio più esoso di risorse.
Noi non abbiamo questa necessità perchè andremo ad utilizzare PHP tramite FastCGI rendendo l'esecuzione del codice visibilmente più veloce!
Questo è un valido vantaggio non sempre presente nei pacchetti preconfigurati (vedi XAMPP).
Un'altra implementazione importante riguarda la libreria php_ssh2. Scarichiamo la versione adatta da:
Estraiamo gli archivi PHP rispettivamente in:
- C:\env\bin\php74nts
- C:\env\bin\php81nts
E le librerie in:
- C:\env\lib\php74nts
- C:\env\lib\php81nts
Stessa operazione se si desidera utilizzare Xdebug. Trovate la versione adatta qui:
Configurazione
Il software necessario è pronto ma la parte più delicata sarà la configurazione di Apache + PHP + FastCGI.
1b. Apache
Avendo scaricato il web server con Scoop -g, troveremo i file conf in:
- C:\ProgramData\scoop\apps\apache\current\conf
Di seguito la lista di righe da modificare/decommentare
httpd.conf
...
Define SRVROOT "C:/ProgramData/scoop/apps/apache/current"
Define SRVCONF "C:/ProgramData/scoop/persist/apache/conf"
Define SRVBIN "C:/env/bin"
Define SRVETC "C:/env/etc"
Define SRVLIB "C:/env/lib"
Define SRVPOSTMASTER "MAIL@PROVIDER.com"
define SRVSSL "C:/env/etc/ssl"
ServerRoot "${SRVROOT}"
...
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule http2_module modules/mod_http2.so
LoadModule headers_module modules/mod_headers.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
...
ServerAdmin ${SRVPOSTMASTER}
...
# discrezionale
ServerName www.server.test:80
...
Options Indexes FollowSymLinks Includes ExecCGI
...
DirectoryIndex index.html index.php
...
Include conf/extra/httpd-mpm.conf
...
Include conf/extra/httpd-default.conf
...
Include conf/extra/httpd-ssl.conf
# fine file
AcceptFilter http none
AcceptFilter https none
EnableSendfile Off
EnableMMAP Off
IncludeOptional "${SRVCONF}/sites-enabled/*.conf"
LoadModule fcgid_module "${SRVLIB}/apache/mod_fcgid.so"
extra/httpd-ssl.conf
# discrezionale
ServerName www.server.test:443
ServerAdmin ${SRVPOSTMASTER}
...
SSLCertificateFile "${SRVSSL}/www.server.test.pem"
SSLCertificateKeyFile "${SRVSSL}/www.server.test.key"
Il seguente conf è un template che verrà caricato dal virtualhost in sites-enabled.
Ogni web-app potrebbe avere delle differenze ma sommariamente andrà bene.
vhost_template.conf
DocumentRoot "${ROOT}"
ServerName ${SITE}
ServerAlias ${ALIAS}
FcgidInitialEnv PATH "${SRVBIN}/${PHP};C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/Windows/Temp"
FcgidInitialEnv TMP "C:/Windows/Temp"
FcgidInitialEnv windir "C:/Windows"
FcgidIOTimeout 3600
FcgidConnectTimeout 16
FcgidMaxRequestsPerProcess 0
FcgidMaxProcesses 50
FcgidMaxRequestLen 8131072
FcgidInitialEnv PHPRC "${SRVBIN}/${PHP}"
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 0
AllowOverride All
Require all granted
"
AddHandler fcgid-script .php
Options +ExecCGI
FcgidWrapper "${SRVBIN}/${PHP}/php-cgi.exe" .php
DocumentRoot "${ROOT}"
ServerName ${SITE}
ServerAlias ${ALIAS}
FcgidInitialEnv PATH "${SRVBIN}/${PHP};C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/Windows/Temp"
FcgidInitialEnv TMP "C:/Windows/Temp"
FcgidInitialEnv windir "C:/Windows"
FcgidIOTimeout 3600
FcgidConnectTimeout 16
FcgidMaxRequestsPerProcess 0
FcgidMaxProcesses 50
FcgidMaxRequestLen 81310720
FcgidInitialEnv PHPRC "${SRVBIN}/${PHP}"
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 0
AllowOverride All
Require all granted
"
AddHandler fcgid-script .php
Options +ExecCGI
FcgidWrapper "${SRVBIN}/${PHP}/php-cgi.exe" .php
SSLEngine on
SSLCertificateFile ${SSL}.pem
SSLCertificateKeyFile ${SSL}.key
Di seguito un esempio di virtualhost.conf
Avendo isolato le direttive comuni nel template, per ogni sito si dovranno specificare poche righe di define e sarà possibile usare la versione PHP desiderata:
- define PHP "php74nts"
- define PHP "php81nts"
sites-enabled/www.app.test.conf
define ROOT "C:/env/www/app/public"
define SITE "www.app.test"
define ALIAS "app.test"
define PHP "php81nts"
define SSL "${SRVSSL}/www.app.test"
Include "${SRVCONF}/vhost_template.conf"
1b. PHP
Nella directory php81nts sono presenti 2 template di configurazione, uno per produzione e l'altro orientato allo sviluppo.
Siete liberi di scegliere su quale delle 2 effetturare le modifiche.
Copiamo php.ini-development o php.ini-production in php.ini e modifichiamo le seguenti varibili:
php.ini
max_execution_time = 3600
...
max_input_vars = 5000
...
memory_limit = 256M
...
post_max_size = 512M
...
# su windows è necessario specificare il full path delle estensioni
extension_dir = "C:/env/bin/php81nts/ext"
...
upload_max_filesize = 256M
...
extension=bz2
extension=curl
;extension=ffi
extension=ftp
extension=fileinfo
extension=gd
extension=gettext
extension=gmp
extension=intl
extension=imap
;extension=ldap
extension=mbstring
extension=exif ; Must be after mbstring as it depends on it
extension=mysqli
;extension=oci8_12c ; Use with Oracle Database 12c Instant Client
;extension=oci8_19 ; Use with Oracle Database 19 Instant Client
extension=odbc
extension=openssl
;extension=pdo_firebird
extension=pdo_mysql
;extension=pdo_oci
extension=pdo_odbc
;extension=pdo_pgsql
extension=pdo_sqlite
;extension=pgsql
;extension=shmop
; The MIBS data available in the PHP distribution must be installed.
; See https://www.php.net/manual/en/snmp.installation.php
;extension=snmp
extension=soap
;extension=sockets
extension=sodium
extension=sqlite3
;extension=tidy
extension=xsl
zend_extension=opcache
extension=C:/env/lib/php81nts/php_ssh2.dll
...
date.timezone = "Europe/Rome"
...
session.gc_maxlifetime = 7200
Modifiche simili andranno bene anche per PHP 7.4.
Conclusione
Avendo usato il dominio "www.app.test" dovremo aggiornare il nostro C:\Windows\System32\drivers\etc\hosts file manualmente o con software come PowerToys.
In alternativa è possibile usare un server DNS locale come Pi-Hole.
Inoltre, è possibile utilizzare agilmente tool come Composer e testing framework come PHPUnit
dopo aver aggiunto alla variabile d'ambiente di Windows, path, la directory C:\env\bin\php81nts