×
Home > Blog > Come configurare un server WAMP

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:




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

Questo sito prevede l‘utilizzo di cookie. Continuando a navigare si considera accettato il loro utilizzo. Ulteriori informazioni. Accetto i cookie da questo sito