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

From Gentoo Wiki (test)
Jump to:navigation Jump to:search
This page is a translated version of the page Apache and the translation is 100% complete.

The Apache HTTP Server is an efficient, extensible web server. It is one of the most popular web servers used the Internet.

Installazione

Nota
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:

FILE /etc/portage/make.confApache event MPM
APACHE2_MPMS="event"

Se si vuole utilizzare Il worker apache MPM, bisogna aggiungere al file make.conf la seguente riga:

FILE /etc/portage/make.confApache worker MPM
APACHE2_MPMS="worker"

Ed attivare la USE flag threads su Apache:

FILE /etc/portage/package.useApache threads support
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.

FILE /etc/portage/make.confAdding Apache to system USE flags
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:

FILE /etc/conf.d/apache2
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.

Attenzione
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.
FILE /etc/apache2/httpd.conf
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.

Warning
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:

  1. Inserire about:config in the browser bar
  2. Cliccare su "I'll be careful" ed entrare nella pagina di configuratione speciale
  3. Inserire browser.fixup.alternate.enabled nella barra di ricerca che appare
  4. 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:

FILE /etc/conf.d/apache2Abilitare il modulo di sicurezza
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:

Template:Importante

FILE /etc/conf.d/apache2Abilitare il modulo PHP
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:

FILE /etc/apache2/modules.d/70_mod_php.confVerificare che il modulo PHP sarà caricato
<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:

FILE /var/www/localhost/htdocs/index.phpPHP test page
<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

CODE Example virtual host definitions
<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:

CODE IP-based virtual host
<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:

FILE /etc/apache2/modules.d/20_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:

FILE /etc/conf.d/apache2Abilitare 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:

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:

FILE /etc/apache2/modules.d/70_mod_php.confUtilizzare PHP-FPM (raccomandato per Apache 2.4.10 e versioni superiori)
<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.

FILE /etc/apache2/modules.d/70_mod_php.confUtilizzare PHP-FPM (raccomandato per Apache 2.4.8 e versioni prcedenti)
<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:

FILE php-fpm.confAggiornare la direttiva listen
; 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:

FILE /etc/conf.d/apache2Abilitare 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

FILE /etc/hostsAggiunta di un Hostname per Apache
127.0.0.1 localhost System_Hostname

Vedere anche

Risorse esterne