This is Gentoo's testing wiki. It is a non-operational environment and its textual content is outdated.
Please visit our production wiki at https://wiki.gentoo.org
Apache
The Apache HTTP Server is an efficient, extensible web server. It is one of the most popular web servers used the 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
Se si vuole utilizzare l'evento Apache MPM, bisogna aggiungere al file make.conf la seguente riga:
APACHE2_MPMS="event"
Se si vuole utilizzare Il worker apache MPM, bisogna aggiungere al file make.conf la seguente riga:
APACHE2_MPMS="worker"
Ed attivare la USE flag threads su Apache:
www-servers/apache threads
Quindi "emergere" 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
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
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:
; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many ; BSD-derived systems allow connections regardless of permissions. ; Default Values: user and group are set as the running user ; mode is set to 0666 listen.owner = nobody listen.group = nobody ;listen.mode = 0666 ; The address on which to accept FastCGI requests. ; Valid syntaxes are: ; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on ; a specific port; ; 'port' - to listen on a TCP socket to all addresses on a ; specific port; ; '/path/to/unix/socket' - to listen on a unix socket. ; Note: This value is mandatory. ;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"
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