Apache
Apache HTTP Server è un efficiente ed espandibile web server, uno dei più popolari utilizzati in Internet.
Installazione
Quando si aggiorna la versione di Apache, vedere la guida.
USE flags
USE flags for www-servers/apache The Apache Web Server
+suexec-caps
|
Install suexec with capabilities instead of SUID |
debug
|
Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces |
doc
|
Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally |
gdbm
|
Add support for sys-libs/gdbm (GNU database libraries) |
ldap
|
Add LDAP support (Lightweight Directory Access Protocol) |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
ssl
|
Add support for SSL/TLS connections (Secure Socket Layer / Transport Layer Security) |
static
|
Link in apache2 modules statically rather then plugins |
suexec
|
Install suexec with apache |
suexec-syslog
|
Log suexec to syslog instead of to a separate file |
systemd
|
Enable use of systemd-specific libraries and features like socket activation or session tracking |
threads
|
Add threads support for various packages. Usually pthreads |
Emerge
Modulo Multi-Processing (MPM)
Se si desidera utilizzare l'evento Apache o l'MPM di lavoro, abilitare il flag USE dei thread Apache:
www-servers/apache threads
www-servers/apache threads
Se si vuole utilizzare l'evento Apache MPM, bisogna aggiungere al file make.conf la seguente riga:
APACHE2_MPMS="event"
APACHE2_MPMS="event"
Se si vuole utilizzare Il worker apache MPM, bisogna aggiungere al file make.conf la seguente riga:
APACHE2_MPMS="worker"
APACHE2_MPMS="worker"
If no Multi-Processing Module (MPM) is selected, the default MPM is used. The default MPM depends on platform capabilities (like threads support), read more in the official Apache docs.
Quindi "emergere" Apache:
root #
emerge --ask www-servers/apache
root #
emerge --ask www-servers/apache
Supporto globale
Abilitare la USE flag globale apache2
da il supporto per Apache in altri pacchetti. Questo può determinare che il pacchetto www-servers/apache sarà installato automaticamente se viene emerso un pacchetto dipendente da Apache.
USE="apache2"
Dopo aver settato le variabili USE, aggiornare il sistema in modo che le modifiche abbiano effetto:
root #
emerge --ask --changed-use --deep @world
Configurazione
Files
Ci sono due files principali che configurano il comportamento di Apache2 sul sistema:
- Il file di configurazione per lo script di init Apache2 di Gentoo /etc/conf.d/apache2
- Il file di configurazione convenzionale del server Apache2 /etc/apache2/httpd.conf
/etc/conf.d/apache2
Il file apache2 situato in /etc/conf.d è un file di configurazione dello script init di Gentoo. La sola linea attiva in questo file è la linea di variabile APACHE2_OPTS:
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D SSL -D SSL_DEFAULT_VHOST -D LANGUAGE"
Questa riga definisce le opzioni che saranno interpretate dai vari file di configurazione utilizzando l'istruzione <IfDefine option-name>
per attivare o disattivare alcune parti dell'intera configurazione. Questo argomento sarà ripreso più avanti nell'articolo.
/etc/apache2/httpd.conf
Il file httpd.conf è il file di configurazione convenzionale del server Apache. Infatti esso è solo un entry point per la configurazione. L'intera configurazione è divisa in molti files nella directory /etc/apache2/, i quali sono assemblati insieme utilizzando la direttiva Include
. Per esempio, l'istruzione Include /etc/apache2/modules.d/*.conf
, sul file httpd.conf, mira ad includere tutti i files in /etc/apache2/modules.d/ il cui nome finisce con .conf.
Tenendo conto di ciò che è stato detto nella sezione precendente, e di come la configurazione dei moduli (files in /etc/apache2/modules.d) diviene attiva con l' <IfDefine module-name>
, il contenuto di un file dentro /etc/apache2/modules.d, sarà assemblato con il resto della configurazione SOLO se l'opzione corrispondente è impostata utilizzando un flag -D module-name
nella variabile APACHE2_OPTS, all'interno del file /etc/conf.d/apache2. Il file di configurazione 00_default_settings.conf è un'eccezione a questa regola dato che non parte con un'istruzione IfDefine
e quindi è sempre incluso nella configurazione risultante.
Configurazione di defaults
Dopo una nuova installazione di Apache, la configurazione risultante dall'assemblaggio dei diversi file di configurazione risulta come segue. Iniziamo dall'entry point /etc/apache2/httpd.conf.
Quanto segue è dato soltanto come un riferimento rapido e come overview generale. Siete caldamente invitati a riguardare i commenti inclusi nei vari file in modo da comprendere i pro e i contro della configurazione. Fate riferimento al manuale Apache per una comprensione più approfondita della configurazione.
ServerRoot "/usr/lib64/apache2"
#Module loaded unconditionally, assuming the USE flag is no unset in
# /etc/portage/make.conf or in /etc/portage/package.use
LoadModule actions_modulemodules/mod_actions.so
...
#other modules loaded that way : alias_module, auth_basic_module, authn_alias_module,
# authn_anon_module, authn_dbm_module, authn_default_module, authn_file_module,
# authz_dbm_module, authz_default_module, authz_groupfile_module, authz_host_module,
# authz_owner_module, authz_user_module, autoindex_module, cgi_module, cgid_module,
# deflate_module, dir_module, env_module, expires_module, ext_filter_module, filter_module,
# headers_module, include_module, log_config_module, logio_module, mime_module,
# mime_magic_module, negotiation_module, rewrite_module, setenvif_module,
# speling_module,ssl_module, status_module, unique_id_module, usertrack_module, host_alias_module
#Modules loaded conditionally, assuming matching USE flag is not unset in
# /etc/portage/make.conf or in /etc/portage/package.use (flag to be set in )
<IfDefine AUTHNZ_LDAP>
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
</IfDefine>
#other modules loaded that way : cache_module, dav_module, dav_fs_module,
# dav_lock_module,disk_cache_module, file_cache_module, info_module, ldap_module,
# mem_cache_module, userdir_module
User apache
Group apache
# Supplemental configuration
#**************************************************************************************vvv
#this part is included via Include /etc/apache2/modules.d/*.conf
#included from /etc/apache2/modules.d/00_default_settings.conf-------------v
#this is always included as there is not option to deactivate it.
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
UseCanonicalName Off
AccessFileName .htaccess
ServerTokens Prod
TraceEnable off
ServerSignature On
HostnameLookups Off
EnableMMAP On
EnableSendfile On
FileEtag INode MTime Size
ContentDigest Off
ErrorLog /var/log/apache2/error_log
LogLevel warn
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<IfModule dir_module>
DirectoryIndex index.html index.html.var
</IfModule>
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
#--------------------------------------------------------------------------^
#included from 00_mod_info.conf--------------------------------------------v
<IfDefine INFO>
<Location /server-info>
SetHandler server-info
Require host 127.0.0.1
</Location>
</IfDefine>
#--------------------------------------------------------------------------^
#--------------------------------------------------------------------------v
#included from 00_languages.conf
# Settings for hosting different languages.
<IfDefine LANGUAGE>
AddLanguage ca .ca
...
AddLanguage zh-TW .zh-tw
LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
ForceLanguagePriority Prefer Fallback
AddCharset us-ascii.ascii .us-ascii
AddCharset ISO-8859-1 .iso8859-1 .latin1
...
AddCharset shift_jis .shift_jis .sjis
</IfDefine>
#---------------------------------------------------------------------------^
#**************************************************************************************^^^
#***************************************************************************************vvv
#this part is included via Include /etc/apache2/vhosts.d/*.conf
#from 00_default_ssl_vhost.conf-----------------------------------------------------vv
<IfDefine SSL>
<IfDefine SSL_DEFAULT_VHOST>
<IfModule ssl_module>
Listen 443
<VirtualHost _default_:443>
ServerName localhost
#------------------------------------------v
# this part is included via Include /etc/apache2/vhosts.d/default_vhost.include
ServerAdmin root@localhost
DocumentRoot "/var/www/localhost/htdocs"
<Directory "/var/www/localhost/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/localhost/cgi-bin/"
</IfModule>
<Directory "/var/www/localhost/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
#end of Include ---------------------------^
ErrorLog /var/log/apache2/ssl_error_log
<IfModule log_config_module>
TransferLog /var/log/apache2/ssl_access_log
</IfModule>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /etc/ssl/apache2/server.crt
SSLCertificateKeyFile /etc/ssl/apache2/server.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/localhost/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
<IfModule setenvif_module>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</IfModule>
<IfModule log_config_module>
CustomLog /var/log/apache2/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</IfModule>
</VirtualHost>
</IfModule>
</IfDefine>
</IfDefine>
#---------------------------------------------------------------------------------^^
#from 00_default_vhost.conf-------------------------------------------------------vv
<IfDefine DEFAULT_VHOST>
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
ServerName localhost
#---------------------------------------------------------------v
# this part is included via Include /etc/apache2/vhosts.d/default_vhost.include
ServerAdmin root@localhost
DocumentRoot "/var/www/localhost/htdocs"
<Directory "/var/www/localhost/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/localhost/cgi-bin/"
</IfModule>
<Directory "/var/www/localhost/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
#end of Include -----------------------------------------------^
<IfModule mpm_peruser_module>
ServerEnvironment apache apache
</IfModule>
</VirtualHost>
</IfDefine>
#-----------------------------------------------------------------------------------^^
# end of include ****************************************************************************************^^^
Primi segni di vita
Start the server, as described in the Usage section.
Come si vede nella configurazione iniziale sopra, la directory DocumentRoot
pre-installata nel virtual host è /var/www/localhost/htdocs, il suo server name è localhost. In aggiunta un file index.html è provvisto nella directory DocumentRoot
, in modo da poter verificare che tutto sia correttamente installato collegandosi con un browser a http://localhost.
Dovreste vedere un messaggio "It works!" nella pagina.
Fuori dal box, Firefox ha una caratteristica creata per aiutare gli utenti che sbagliano a digitare l'URL nella barra del browser. Se l'URL non viene risolto, Firefox cerca una coppia di alternative all'URL per trovare quella che l'utente intendeva veramente digitare, aggiungendo
.com
oppure anteponendo www.
alla porzione del nome host dell'URL per vedere se questi possono risolverlo.
Questa caratteristica, che è stata introdotta nelle prime versioni di Firefox, è un pò fastidiosa per gli sviluppatori. La caratteristica significa che quando un server posto su un host locale fallisce la risposta, Firefox decide di cercare localhost.com
o www.localhost.com
. Questo spesso risolve una pagina non trovata.
Per disabilitare questa caratteristica:
- Inserire
about:config
in the browser bar - Cliccare su "I'll be careful" ed entrare nella pagina di configuratione speciale
- Inserire
browser.fixup.alternate.enabled
nella barra di ricerca che appare - Click destro su
browser.fixup.alternate.enabled
che appare nella lista filtrata sotto e scegliere toggle per impostare il valore su false.
Abilitare mod_security
ModSecurity is a rule-based web application firewall that monitors web service traffic, to block attacks exploiting known vulnerabilities.
Installare www-apache/mod_security:
root #
emerge --ask www-apache/mod_security
Abilitare il modulo SECURITY
nella variabile APACHE2_OPTS del file apache2:
APACHE2_OPTS="... -D SECURITY"
Controllare questo modulo editando /etc/apache2/modules.d/79_modsecurity.conf e /etc/apache2/modules.d/80_modsecurity-crs.conf e riavviando Apache.
Abilitazione del supporto PHP
Installare PHP con il flag USE apache2
ed abilitare il modulo:
APACHE2_OPTS="... -D PHP"
Prima di testare se il modulo PHP funziona, controllare che il file /etc/apache2/modules.d/70_mod_php.conf esista e contenga la seguente definizione:
<IfDefine PHP>
# The mod_php.so symlink is controlled by
# eselect-php. However, the module name changed from
# php5_module to php7_module so we can't blindly load whatever
# is there. Instead we let eselect-php manage a small
# configuration file that loads the appropriate module.
#
# This is relative to ServerRoot (see httpd.conf).
Include ../../../var/lib/eselect-php/mod_php.conf
# Tell apache that mod_php should handle PHP files.
#
# NOTE: Avoiding AddHandler/AddType for security (bug
# #538822). Please read the related news item!
<FilesMatch "\.(php|php[57]|phtml)$">
SetHandler application/x-httpd-php
</FilesMatch>
# PHP source files which are meant to be displayed as
# syntax-highlighted source code.
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
DirectoryIndex index.php index.phtml
</IfDefine>
Se esso non esistesse crearlo.
Per verificare se il modulo PHP funziona, creare una pagina di test:
<html>
<body>
<?php phpinfo(); ?>
</body>
</html>
Adesso, rimuovere o rinominare /var/www/localhost/htdocs/index.html ed aprire la pagina di test: http://localhost/
Dovrebbe essere visibile una tabella che descrive le impostazioni di PHP.
Modificare le versioni di PHP
Per cambiare la versione di PHP gestita da Apache, per prima cosa elencare le versioni disponibili per il Server Application Programming Interface (SAPI) di apache2
:
root #
eselect php list apache2
[1] php5.3 [2] php5.4 * [3] php5.5
Selezionare la versione scelta:
root #
eselect php set apache2 N
Sostituire N
nell'esempio sopra con il numero nell'output di eselect php list apache2 come visualizzato in precedenza.
Hosts virtuali
Per ogni virtual host, fornire una directory DocumentRoot
che sia raggiungibile ed accessibile dal demone Apache. Aggiungere un file di configurazione (VirtualHost.conf) nella directory /etc/apache2/vhosts.d che utilizzi questa DocumentRoot
ed il Server Name dell'host virtuale. Non dimanticarsi di aggiungere un'entry per questo dominio in /etc/hosts.
Per assegnare ai files dell'host virtuale i permessi necessari ad utente e gruppo di Apache, utilizzare chown
come nell'esempio seguente:
root #
chown apache:apache /var/www/sitename
Di seguito due esempi di definizione di Virtual Host, uno per domainname1.com ed uno per domainname2.com. Da notare le differenti direttive DocumentRoot
e ServerName
anche se l'host in sè (*:80
) rimane invariato
<VirtualHost *:80>
ServerAdmin email@site.com
DocumentRoot /var/www/website1
ServerName domainname1.com
</VirtualHost>
<VirtualHost *:80>
ServerAdmin email@site.com
DocumentRoot /var/www/website2
ServerName domainname2.com
</VirtualHost>
E' raccomandato anche definire un virtual host IP based. Questo permette all'amministratore di mettere messaggi per quegli utenti che cercano di raggiungere il sito attraverso il suo indirizzo IP:
<VirtualHost *:80>
ServerAdmin email@site.com
DocumentRoot /var/www/html
ServerName xxx.xxx.xxx.xxx
</VirtualHost>
Dopo aver inserito i virtual hosts, affinchè questi divention attivi il server deve essere restartato (anche con graceful).
Abilitare PHP attraverso fcgid
Installare www-apache/mod_fcgid e dev-lang/php. Il pacchetto PHP richiede la flag USE cgi
:
root #
emerge --ask www-apache/mod_fcgid dev-lang/php
Editare il file mod_fcgid.conf:
<IfDefine FCGID>
LoadModule fcgid_module modules/mod_fcgid.so
SocketPath /var/run/fcgidsock
SharememPath /var/run/fcgid_shm
AddHandler php-fcgid .php
AddType application/x-httpd-php .php
Action php-fcgid /fcgid-bin/php-fcgid-wrapper
# max request 128mb
FcgidMaxRequestLen 134217728
<Location /fcgid-bin/>
SetHandler fcgid-script
Options +ExecCGI
</Location>
</IfDefine>
Creare le directory necessarie:
root #
mkdir /var/www/localhost/htdocs/fcgid-bin
Creare un link simbolico per il wrapper PHP:
root #
ln -s /usr/bin/php-cgi /var/www/localhost/htdocs/fcgid-bin/php-fcgid-wrapper
Abilitare il modulo FCGID
:
APACHE2_OPTS="... -D FCGID"
Alla fine, riavviare Apache e controllare il sito phpinfo()
creato precedentemente. Il valore di Server API
dovrebbe essere CGI/FastCGI
Abilitare PHP-FPM attraverso il mod_proxy_fcgi in Apache 2.4
I seguenti pre-requisiti devono essere soddisfatti per abilitare PHP-FPM, attraverso mod_proxy_fcgi:
- >= PHP 5.3
- >= Apache 2.4
Inoltre, ci sono alcune restrizioni nella disponibilità di funzionalità all'interno di Apache 2.4:
- >= Apache 2.4.9, se si vuole comunicare con PHP-FPM attraverso i sockets UNIX
- >= Apache 2.4.10, se si vuole utilizzare SetHandler invece di ProxyPassMatch.
La seguente configurazione funzionerà solo con Apache 2.4.10 e versioni successive. Essa si basa sulla direttiva FilesMatch
e può essere collocata all'interno della configurazione del server principale o VirtualHosts
. La posizione del socket UNIX è determinata dalla direttiva listen
nel file di configurazione php-fpm.conf, consentendo di specificare recipienti separati per ogni sito o funzione.
Nell'esempio seguente, FilesMatch
è collocato all'interno del file di configurazione del modulo PHP di Apache:
<IfDefine PHP>
<FilesMatch "\.php$">
SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
# Set it to handle the files
<IfModule mod_mime.c>
AddHandler application/x-httpd-php .php .php5 .phtml
AddHandler application/x-httpd-php-source .phps
</IfModule>
DirectoryIndex index.php index.phtml
</IfDefine>
Oppure si può utilizzare ProxPassMatch -- la sola opzione utile se la versione di Apache è compresa tra 2.4.0 e 2.4.8, incluse.
<IfDefine PHP>
# Send all requested PHP files to PHP-FPM via fcgi://PHP_FPM_LISTEN_ADDRESS:PHP_FPM_LISTEN_PORT/DOCUMENT_ROOT/$1
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/localhost/htdocs/$1
# Set it to handle the files
<IfModule mod_mime.c>
AddHandler application/x-httpd-php .php .php5 .phtml
AddHandler application/x-httpd-php-source .phps
</IfModule>
DirectoryIndex index.php index.phtml
</IfDefine>
In serie la direttiva listen
non è impostata ad un socket. Per prima cosa bisogna creare la directory per il file socket:
root #
mkdir /var/run/php-fpm
Successivamente, aggiornare il file php-fpm.conf come segue:
; Imposta i permessi per il socket unix, se ne viene utilizzato uno. In Linux, leggi/scrivi
; i permessi devono essere impostati per consentire le connessioni da un server web. Molti
; sistemi derivati da BSD consentono connessioni indipendentemente dai permessi.
; Valori predefiniti: utente e gruppo sono impostati come utente in esecuzione
; la modalità è impostata su 0666
listen.owner = apache
listen.group = apache
;listen.mode = 0666
; L'indirizzo su cui accettare le richieste FastCGI.
; Le sintassi valide sono:
; 'ip.add.re.ss:port' - per ascoltare su un socket TCP a un indirizzo specifico su
; una porta specifica;
; 'port' - ascoltare su un socket TCP tutti gli indirizzi su una
; porta specifica;
; '/path/to/unix/socket' - per ascoltare su un socket unix.
; Nota: questo valore è obbligatorio.
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/www.sock
Quindi abilitare entrambi i moduli PHP
e PROXY
:
APACHE2_OPTS="... -D PHP -D PROXY"
Web frameworks and Apache
Some of the web frameworks that can work with Apache are covered on the wiki:
HTTPS with TLS certificates from Let’s Encrypt
It is important that any public-facing web server provide "secure" HTTPS access. Often, sites providing HTTPS will be configured to redirect HTTP requests to the HTTPS equivalent URL.
Let’s Encrypt is a not-for-profit certificate authority that issues free TLS certificates. certbot is a utility available in the Gentoo repository for easily requesting and installing TLS certificates, and automatically setting up HTTPS access for Apache.
See the Let's Encrypt article for information about using certbot. The EFF also have specific instructions on using certbot on Gentoo to configure Apache.
Utilizzo
Servizi
OpenRC
Avviare il server Apache:
root #
/etc/init.d/apache2 start
Aggiungere Apache al runlevel default:
root #
rc-update add apache2 default
Riavviare il servizio Apache:
root #
/etc/init.d/apache2 restart
Ricaricare i file di configurazione:
root #
/etc/init.d/apache2 reload
systemd
Avviare il server Apache:
root #
systemctl start apache2
Aggiungere Apache al runlevel default:
root #
systemctl enable apache2
Riavviare il servizio Apache:
root #
systemctl restart apache2
Risoluzione dei Problemi
Risorse
Il server Apache può essere difficoltoso da configurare. Di seguito alcune risorse utili in caso di problemi:
Testare
Verificare quali siano le interfaccie IP e le porte sulle quali il server Apache attivo è in ascolto:
root #
netstat -tulpen | grep apache
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 10932720 4544/apache2 tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 0 10932716 4544/apache2
Testare se una connessione verso un server Apache funziona in localhost:
user $
telnet localhost 80
Trying 127.0.0.1... Connected to localhost. Escape character is ['^]'.
Interrompere la connessione con Ctrl+c e Invio.
Errore "apr_sockaddr_info_get() failed for <System_Hostname>"
Errore:
apache2: apr_sockaddr_info_get() failed for System_Hostname
Risoluzione:
Quando questo succede, aggiungete il vostro hostname al file /etc/hosts
127.0.0.1 localhost System_Hostname
Vedere anche
- Lighttpd — a fast and lightweight web server.
- Nginx — a robust, small, high performance web server and reverse proxy server.
Risorse esterne
- Slicehost article: Installing Apache on Gentoo
- Slicehost article: Apache configuration files on Gentoo
- Slicehost article: Configuring the Apache MPM on Gentoo
- Slicehost article: Apache configuration on Gentoo
- Slicehost article: Apache Virtual Hosts on Gentoo
- Slicehost article: Enabling and using apache's mod_status on Gentoo
- apache.org documentation
- Apache2 mod_pagespeed