Apache httpd
Configuration
Konfigurace

Lukáš Bařinka

© 2021

REV 2.10

TOC

Obsah

  1. Configuration structure
  2. Syntax
  3. Minimal configuration and additional settings
  4. Access control
  5. LAB: Basic configuration
  6. Virtualhosts configuration
  7. LAB: Virtualhosting
  1. Struktura konfiguračních souborů
  2. Syntaxe
  3. Konfigurační minimum a další možnosti
  4. Řízení přístupu
  5. LAB: Základní konfigurace
  6. Konfigurace virtual hosts
  7. LAB: Virtualhosting

Configuration structure

Struktura konfiguračních souborů

Basic structure

Základní struktura

Basic configuration scheme Základní struktura konfiguračních souborů

Debian configuration structure

Debian struktura konfigurace

Debian configuration scheme Debian configuration scheme

Debian tools a2*

Debian nástroje a2*

  • a2query Query configuration status Zjištění konfigurace
    
    									a2query -c [CONF]
    									a2query -m [MOD]
    									a2query -s [SITE]
    								
  • a2(dis|en)(conf|mod|site) Enable/disable configuration file (create/remove links) Nástroje pro správu conf. souborů (linků)
    
    									a2enconf apache2-doc
    								

Syntax

Syntaxe

Configuration syntax

Syntaxe konfigurace

  • One line - one directive
  • Long line can be divided using \ as a last character at the end of line
  • Directives are case insensitive, its parameters can be case sensitive (e.g. pathnames)
  • Comments starts with # character
  • Comments should be on separated lines Not mixed with directives
  • Empty lines and leading whitespaces are ignored So indentation is recommended
  • Jedna direktiva na řádce
  • Při rozdělení direktivy na více řádků – poslední znak \
  • Direktivy – case insensitive, jejich parametry (např. cesty) – mohou být case sensitive
  • Komentář – řádek začínající znakem #
  • Komentáře by neměly být spolu s direktivami
  • Prázdné řádky a bílé znaky před direktivami – ignorovány

Syntax of values

Syntaxe hodnot

  • Values containing space must be quoted (" ")
  • ${VAR}
    • Values from Define directives take precedence
    • Then environment variables (defined before start) → /etc/apache2/envvars
    • Or "defines" from command-line options apache2ctl -k restart -D …=…
    • Example
      • Add following line into …/envvars:
        
        													export APACHE_MANUAL=/man
        												
      • Change path of an Alias in …/conf-enabled/apache2-doc.conf:
        
        													${APACHE_MANUAL}
        												
  • Pokud hodnota obsahuje mezeru, musí být v " "
  • ${VAR}
    • Přednost mají proměnné z direktivy Define
    • Jinak proměnné prostředí (před spouštěním) → /etc/apache2/envvars
    • Nebo apache2ctl -k restart -D …=…
  • Např.:
    • Do …/envvars přidat:
      
      											export APACHE_MANUAL=/man
      										
    • V …/conf-enabled/apache2-doc.conf upravit cestu v Aliasu na:
      
      											${APACHE_MANUAL}
      										

Webspace → Filesystem

Webspace to filesystem mapping scheme

Directives scope

Platnost direktiv (scope)

  • Directives outside any container are applied to the entire server
  • The scope can be limited using containers (sections)
    • Filesystem part (pathnames): <Directory> <DirectoryMatch> <Files> <FilesMatch>
    • Resources (URL): <Location> <LocationMatch> <Proxy>
    • Website (for virtualhosting): <VirtualHost>
  • Some directives makes sense only in some containers/context E.g. request processing or processes/threads creation
  • It's important to use valid context for every directive Consult documentation (directive context)
  • Direktivy mimo kontejner platí pro celý server
  • Platnost direktivy lze omezit vložením do sekcí (kontejnerů), které omezí jejich platnost na
    • Část souborového systému (cesty): <Directory> <DirectoryMatch> <Files> <FilesMatch>
    • Zdroje (URL): <Location> <LocationMatch> <Proxy>
    • Website (pokud je server s podporou virtual hostingu): <VirtualHost>
  • Některé direktivy nemají smysl v některých sekcí Např. nastavení obsluhy požadavků, vytváření vláken/procesů
  • Je nutné dodržovat kontext direktiv (podle dokumentace)

.htaccess file

Soubor .htaccess

  • Placed in directories exported to webspace
  • Configuration is limited to containing directory and its subdirectories
  • The same context as for <Directory> container
  • Evaluated during each request to that (sub)directory
  • .htaccess configuration directives
    • AccessFileName Context: server, vrtualhost | Default: .htaccess
    • AllowOverride Context: only <Directory> | None – ignoring .htaccess, All, Directive_type
    • Files are processed in depth order starting from / Unless is forbidden
  • Umístění v adresářích exportovaných na web
  • Konfigurace platí pro daný adresář a jeho podadresáře
  • Stejné direktivy použitelné v kontejneru Např. <Directory>
  • Vyhodnocování při každém požadavku do adresáře
  • Nastavení použití .htaccess souborů
    • Direktiva AccessFileName Kontext: celý server, virtualhost | Default: .htaccess
    • Direktiva AllowOverride Kontext: pouze <Directory> | None – ignoruje .htaccess, All, Typ_direktivy
    • Soubory se načítají postupně od / Pokud to není zakázáno

.htaccess details

Podrobnosti povolení možností .htaccess

  • Directive types: http://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
  • AllowOverrideList Individual directives that are allowed in .htaccess files (extends AllowOverride)
    
    									AllowOverride None
    									AllowOverrideList Redirect RedirectMatch
    								
  • When directive AllowOverrideList is set to None and AllowOverride is set to None
    .htaccess files are completely ignored
  • Typy direktiv: http://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
  • AllowOverrideList Povoluje konkrétní direktivy (doplňuje AllowOverride)
    
    									AllowOverride None
    									AllowOverrideList Redirect RedirectMatch
    								
  • Pokud direktiva AllowOverrideList je nastavená na None a zároveň AllowOverride je nastavená na None
    .htaccess soubory jsou úplně ignorovány

Conditional containers

Kontejnery podmínek

  • Limits directives scope
  • Evaluated only at server startup and restart
    • <IfDefine name> … </IfDefine> Parameter is defined on the httpd command line using -D name Enables / disables server features
    • <IfModule module_name> … </IfModule> When module is loaded (static/dynamic)
    • <IfVersion [<>=]x.y.z> … </IfVersion> According to server version (mod_version)
  • Evaluated for each request
    • <If condition> … </If>, <ElseIf>, <Else> Cannot be nested
  • Omezují platnost direktiv
  • Vyhodnocují se při re/startu
    • <IfDefine název> … </IfDefine> Při definici názvu pomocí přepínače -D název Povoluje / zakazuje vlastnosti serveru
    • <IfModule jméno_modulu> … </IfModule> Při načtení modulu do serveru
    • <IfVersion [<>=]x.y.z> … </IfVersion> Podle verze serveru (mod_version)
  • Vyhodnocují se při každém požadavku
    • <If podmínka> … </If>, <ElseIf>, <Else> Nelze do sebe vnořovat

Instead of DEFINE command line option, the configuration is controlled by symbolic links in *-enabled/*.conf in Debian The Init script does not use -D … options

V Debianu se místo DEFINE konfigurace ovládá symbolickými linky v *-enabled/*.conf Init skript nemá prostor pro zadávání -D …

<If/ElseIf/Else> containers

Kontejnéry <If/ElseIf/Else>

  • Operators Operátory Numeric, string, file, in, =~, !~ Číselné, řetězcové, souborové, in, =~, !~
  • Variables (e.g.) Proměnné (např.)
    • %{VARIABLE} variable syntaxzápis proměnné
    • HTTP_* HTTP parametersparametry HTTP protokolu
    • REQUEST_* request informationinformace o požadavku
    • REMOTE_* client informationinformace o klientovi
    • SERVER_* server informationinformace o serveru
    • TIME_* current date and timeaktuální datum a čas
  • Functions case-insensitive, function usage example: Funkce Nejsou case-sensitive, příklad použití funkce:
    
    									# %{ funcname : funcargs }
    									Header set foo-checksum "expr=%{md5:foo}"
    									# funcname ( args )
    									<If "md5('foo') == 'abc…'">
    								
  • Operátory Číselné, řetězcové, souborové, in, =~, !~
  • Proměnné (např.)
    • %{VARIABLE} zápis proměnné
    • HTTP_* parametry HTTP protokolu
    • REQUEST_* informace o požadavku
    • REMOTE_* informace o klientovi
    • SERVER_* informace o serveru
    • TIME_* aktuální datum a čas
  • Funkce Nejsou case-sensitive, příklad použití funkce:
    
    									# %{ funcname : funcargs }
    									Header set foo-checksum "expr=%{md5:foo}"
    									# funcname ( args )
    									<If "md5('foo') == 'abc…'">
    								

List of variables, operators and functions is in /manual/en/expr.html

Seznam proměnných, operátorů a funkcí je v /manual/en/expr.html

<If> container examples
Příklady použití kontejneru <If>

							# Force text/plain if requesting a file with the query string contains 'forcetext'
							<If "%{QUERY_STRING} =~ /forcetext/">
							  ForceType text/plain
							</If>

							# Check an environment variable for a regular expression, negated.
							<If "! reqenv('REDIRECT_FOO') =~ /bar/">
							  Header set matched true
							</If>

							# Check result of URI mapping by running in Directory context with -f
							<Directory "/var/www">
							  AddEncoding x-gzip gz
							  <If "-f '%{REQUEST_FILENAME}.unzipme' && ! %{HTTP:Accept-Encoding} =~ /gzip/">
							    SetOutputFilter INFLATE
							  </If>
							<Directory>
						
<If> container examples
Příklady použití kontejneru <If>

							# …/conf-enabled/apache2-doc.conf

							<Directory  …>
							  …
							  Require all denied
							  <If "%{TIME_SEC} =~ /[02468]$/">
							    Require all granted
							  </If>
							  …
							</Directory>
						

							while sleep 1; do
							  date
							  curl -I http://localhost/manual 2>/dev/null | head -1
							done
						

<Directory> and <DirectoryMatch> containers

Kontejnery <Directory> a <DirectoryMatch>

  1. All containers <Directory pattern> in order of matching length from the shortest to the longest E.g. for directory /home/*/public_html:
    1. /
    2. /home
    3. /home/user
    4. /home/user/public_html
  2. .htaccess files
  3. All containers <Directory ~ ERE> and <DirectoryMatch ERE> in order of appearance in configuration
  1. Všechny kontejnery <Directory vzor> v pořadí podle délky shody od nejkratší shody po nejdelší Např. pro adresář /home/*/public_html:
    1. /
    2. /home
    3. /home/user
    4. /home/user/public_html
  2. Soubory .htaccess
  3. Všechny kontejnery <Directory ~ ERE> a <DirectoryMatch ERE> v pořadí podle uvedení v konfiguraci
  1. Containers <If> a <VirtualHost> are the last ones To be able to differentiate virtualhosts setup from main server setup
  1. Naposledy se aplikují <If> a <VirtualHost> kontejnery Aby bylo možné pro virtualhost upravit nastavení main serveru
!
  • <Directory /> is granted for all by default
  • So, the entire filesystem is accessible
  • It is usually needed to disable access to / !
  • Kontejner <Directory /> je povolen po všechny
  • Dostupný je tudíž celý souborový systém
  • Obvykle je nutno přístup do / zakázat !

<Files>, <FilesMatch>, <Location> containers

Kontejnery <Files>, <FilesMatch> a <Location>

  1. After <Directory …> containers processing
  2. All containers <Files …> In order of appearance in configuration
    • <Files pattern>
    • <Files ~ ERE>
    • <FilesMatch ERE>
    Can be nested inside <Directory> container
  3. Applied in case of (ERE) pattern match with URL
    • <Location pattern>
    • <Location ~ ERE>
    • <LocationMatch ERE>
  1. Po zpracování kontejnerů <Directory …>
  2. Všechny kontejnery <Files …> V pořadí podle uvedení v konfiguraci
    • <Files vzor>
    • <Files ~ ERE>
    • <FilesMatch ERE>
    Může být součástí kontejneru <Directory>
  3. Aplikuje v případně shody vzoru (ERE) s URL
    • <Location vzor>
    • <Location ~ ERE>
    • <LocationMatch ERE>

Patterns and expressions

Vzory a výrazy

  • Patterns wildcards (shell)
    • ?, *, []
    • / character is not expanded, must be present explicitly
  • Expressions Extended Regular Expressions
    • . , ?, *, +, |, ^, $, ...
  • Vzory wildcards (shellové)
    • ?, *, []
    • Znak / se nenahrazuje, musí být explicitně uveden
  • Výrazy extended regular expressions
    • . , ?, *, +, |, ^, $, ...

Paths containing // characters can be, or can be not equal to /

Cesty obsahující znaky // mohou, ale nemusejí být shodné s /

  • /adr1//adr2/adr1/adr2
  • //adr !~ ^/adr

Minimal configuration

Konfigurační minimum

Basic configuration

Základní konfigurace

  • ServerRoot (core) Root directory with server installation (--prefix) Kořenový adresář s instalací serveru (--prefix)
    
    									ServerRoot "/usr/lib64/apache2"
    								
  • Listen (mpm) IP address/domain-name, TCP port (can be used several times) IP adresa/jméno, TCP port serveru (je možno použít vícekrát)
    
    									Listen 80
    								
  • ServerName (core) Server name for response (e.g. during redirection) Jméno serveru pro odpovědi (např. při přesměrování)
    
    									ServerName www.example.com
    								
  • User / Group (mpm) User / Group identity inside operating system when started by root Identita uživatele / skupiny pro běh serveru v případě, že je server spuštěn rootem
    
    									User apache
    									Group apache
    								
  • DocumentRoot (core) Webspace root (/) to filesystem mapping Mapování kořene webu (/) na filesystém
    
    									DocumentRoot "/var/www/localhost/htdocs"
    								

Additional configuration

Další možnosti konfigurace

  • Dynamic load of modules (mod_so) Dynamické načítání modulů (mod_so)
    
    									LoadModule dir_module modules/mod_dir.so
    								
  • Default page for directory (mod_dir) Výchozí stránka pro adresář (mod_dir)
    
    									DirectoryIndex index.html index.htm
    								
  • Generated index file (mod_autoindex) Automaticky generovaný index (mod_autoindex)
    
    									Options +Indexes
    									IndexOptions FoldersFirst IgnoreCase
    									IndexIgnore README .htaccess *.bak *~
    									AddIcon (IMG,/icons/image.xbm) .gif .jpg .xbm
    								

Options -FollowSymlinks Links does not change filename when compared to request filename. That allows to circumvent conditions inside <Directory> containers. It's recommended to forbid FollowSymlinks for security reasons. U linků se nemění název, vždy se porovnává ten z dotazu. Umožňuje to tak obejít podmínku v <Directory>. Pro větší bezpečnost je vhodné zakázat FollowSymlinks.

  • Code-page setting (core) Nastavení znakové sady (core)
    
    									AddDefaultCharset utf-8
    								
  • Logging (core) Logování (core)
    
    									ErrorLog /var/log/apache2/error_log
    									LogLevel error
    									HostnameLookups off
    								
  • Logging – custom (mod_log_config) Logování – vlastní (mod_log_config)
    
    									LogFormat "%h %l %u %t \"%r\" %>s %b" common
    									CustomLog logs/access_log common
    								

Access control

Řízení přístupu

Access control (contemporary)

Řízení přístupu (současné)

  • Require directive Direktiva Require
    
    									Require host address
    									Require ip ip.address
    									Require forward-dns hostname
    									Require local
    									Require all denied|granted
    									Require not …
    								
  • <RequireAll>, <RequireAny>, <RequireNone> containers Kontejnery <RequireAll>, <RequireAny>, <RequireNone>
    
    									<RequireAll>
    									  Require all granted
    									  Require not ip 10.252.46.165
    									</RequireAll>
    								

More Require directives outside <RequireAll/Any/None> containers act like inside <RequireAny> container.

Pokud je více direktiv Require mimo kontejnery <RequireAll/Any/None>, platí mezi nimi logické OR. Tedy jako by byly v kontejneru <RequireAny>

Access control (legacy)

Řízení přístupu (legacy)

Authorization (mod_access_compat)

Autorizace (mod_access_compat)

  • Order Deny, Allow Determines order of permissions and prohibitions Určuje pořadí zákazů a povolení
  • Allow From …
  • Deny From … Determines which client is or is not authorized Určuje, který klient je resp. není autorizován
    • IP addressIP adresa - 147.32.80.90
    • IP address prefixčást IP adresy - 147.32.80
    • network address (CIDR)síť (CIDR) - 10.0.0.0/8
    • domain namedoménové jméno - mypc.example.org
    • domain prefixčást doménového jména - example.org.net
    • "all" reserved keywordvšichni = vyhrazené slovo - all

Order of permissions and prohibitions (legacy)

Pořadí povolení a zákazů (legacy)

Match Allow,Deny Deny,Allow
only Allow allowed allowed
only Deny denied denied
none denied allowed
both denied allowed
Shoda Allow,Deny Deny,Allow
pouze Allow povoleno povoleno
pouze Deny zakázáno zakázáno
neshoda zakázáno povoleno
obojí zakázáno povoleno

LAB: Basic configuration

LAB: Základní konfigurace

Basic configuration

Základní konfigurace

The goal is to change basic configuration to serve the content from chosen directory. Some directories should be accessible and others will be inaccessible. Errors should be stored in log file.

Cílem je upravit základní konfiguraci pro poskytování obsahu ze zvoleného adresáře. Některé podadresáře budou přístupné a jiné nepřístupné Chyby se objeví v logu.

  • Start Apache server from distribution packages
  • Set DocumentRoot and enable directory lists
  • Set default character encoding for text content
  • Allow access to subdirectories and setup error logging
  • Map a directory outside DocumentRoot into WS
  • Spustit Apache z distribuce
  • Nastavit DocumentRoot a umožnit adresářové výpisy
  • Nastavit výchozí znakovou sadu (kódování textu)
  • Nastavit přístupy pro podadresáře a logování chyb
  • Namapovat adresář mimo DocumentRoot do WS

Start Apache from distribution - Troubleshooting

Spuštění distribučního Apache - Troubleshooting

  • The Apache httpd server from Debian distribution will be used from now:
    
    									systemctl enable apache2
    									systemctl start apache2
    								
  • Was the start of Apache server from distribution successful? Why not? What to do?
    
    									journalctl -xe
    									netstat -tapln
    								
  • Does it work now? What is the home page now?
  • Nyní již budeme používat Apache httpd server z distribuce:
    
    									systemctl enable apache2
    									systemctl start apache2
    								
  • Distribuční Apache nejde nastartovat? Proč? Co je potřeba udělat?
    
    									journalctl -xe
    									netstat -tapln
    								
  • Funguje to? Jaká je teď výchozí stránka?

It is important to set VirtualBox network type to Bridge to access webserver from outside of VirtualBox machine.

Pro přístup do VirtualBoxu zvenčí je potřeba nastavit síť na Bridge.

Tips

Tipy

  • Don't forget the cache when using web browser!
  • To test web server responses easily use curl command
    
    									curl -i localhost # headers as a part of output (GET)
    									curl -I localhost # headers only (HEAD)
    								
  • To search for configuration directive inside configuration files use
    
    									grep -i -R 'documentroot' . # -i = case-insensitive -R = recursive
    								
  • To restart server use systemctl command
    
    									systemctl restart apache2.service
    								
  • You should always check the configuration validity before server restart
    
    									apachectl -t
    									alias a='apachectl -t && systemctl restart apache2 && echo Restart OK'
    								
  • Při testování pomocí webového prohlížeč, nezapomeňte na cache!
  • Pro pohodlné testování použijte curl
    
    									curl -i localhost # hlavičky součástí výstupu (GET)
    									curl -I localhost # jenom hlavičky (HEAD)
    								
  • Hledání v konfiguračních souborech lze i rekurzivně
    
    									grep -i -R 'documentroot' . # -i = case-insensitive -R = recursive
    								
  • Restart serveru pomocí systemctl
    
    									systemctl restart apache2.service
    								
  • Před restartem serveru konfiguraci otestujte
    
    									apachectl -t
    									alias a='apachectl -t && systemctl restart apache2 && echo Restart OK'
    								
  1. Set /var/www/main directory as a web server root (for http://localhost/ URL)
  2. Set AddDefaultCharset to be UTF-8 for that directory (discover whether is that already set elsewhere)
  3. In case the homepage is displayed incorrectly (use web browser to check that), use the directive documentation and telnet or curl to diagnose the problem
  4. Forbid access to /var/www/main/private directory
  1. Adresář /var/www/main bude přístupný jako kořen webu (tedy jako http://localhost/)
  2. V adresáři nastavte AddDefaultCharset na hodnotu UTF-8 (zjistěte, zda již někde není nastaveno)
  3. Pokud se stránka zobrazí špatně, použijte dokumentaci k direktivě a telnet/curl pro diagnostikování a odstranění problému
  4. Zakažte přístup do adresáře /var/www/main/private
  1. Enable directory listing in /var/www/main/users directory in case there is no index file available
  2. Disable that feature for all subdirectories Try the correct behavior:
  3. Enable .htaccess files usage in all subdirectories of /var/www/main/users/ and allow to overwrite Options and Limit This step will allow to process .htaccess file in Alice directory. Does it change the situation anyhow?
  1. V adresáři /var/www/main/users povolte vypsání obsahu adresáře, pokud není k dispozici index
  2. Pro všechny podadresáře tuto vlastnost zakažte! Vyzkoušejte správnost nastavení na:
  3. Ve všech podadresářích /var/www/main/users/ povolte použití .htaccess souborů a přenastavení Options a Limit Tento krok povolí zpracování .htaccess souboru Alice, změní se nějak situace?
  1. Enable directory listing inside /var/www/main/users/alice/data using .htaccess file
  2. Disable displaying all files with bak or txt suffixes
  3. Try to display text file http://localhost/users/bob/data/fail.txt
  4. Display directory listing from http://localhost/users/alice/data/
  1. Povolte výpis obsahu adresáře /var/www/main/users/alice/data pomocí souboru .htaccess
  2. Zakažte zobrazení všech souborů s příponou
    bak nebo txt
  3. Pokuste se zobrazit textový soubor v http://localhost/users/bob/data/fail.txt
  4. Nechte si vypsat obsah adresáře http://localhost/users/alice/data/
  1. Enable displaying files with txt or bak suffixes inside /var/www/main/users/alice/data directory using .htaccess file
  2. Try to display text file http://localhost/users/alice/data/ok.txt
  1. Pomocí souboru .htaccess povolte zobrazení souborů s příponou txt a bak v adresáři /var/www/main/users/alice/data
  2. Pokuste se zobrazit textový soubor v http://localhost/users/alice/data/tohle_byste_videt_meli.txt

Troubleshooting

Is there a problem displaying a file?

Nezobrazuje se soubor, který by měl?

  • Look into log files Podívejte se do logu
    
    									tail -f /var/log/apache2/*
    									[…] [authz_core:error] [pid …] [client …] AH01630: client denied by server configuration: …
    								
  • Search for .htaccess files inside DocumentRoot directory Hledejte .htaccess soubor v DocumentRoot
    
    									find /var/www/main -name .htaccess
    									/var/www/main/users/alice/data/.htaccess
    
    									cat /var/www/main/users/alice/data/.htaccess
    									Options +Indexes
    									<FilesMatch "\.(bak|txt)$">
    									  Order deny,allow
    									  Allow from all
    									</FilesMatch>
    								

Do not mix legacy authorization (Allow/Deny) with
contemporary authorization model (Require)!

Nemixujte legacy autorizaci (Allow/Deny) a
současný přístup (Require)!

  1. Map /vhosts web space into /var/www/vhosts directory using Alias directive
  2. Discover where the log messages are stored
  3. Request non-existing resoruce http://localhost/foo using web browser
  4. Increase log level at least by 3 steps, so more messages will be logged
  5. Restart server and look into log file and see the difference
  1. Pomocí direktivy Alias namapujte do struktury webu na URL /vhosts adresář /var/www/vhosts
  2. Zjistěte, kam server loguje chybová hlášení
  3. Požádejte pomocí prohlížeče server o neexistující zdroj http://localhost/neexistuje
  4. Zvyšte úroveň logování alespoň o 3 úrovně tak, aby se logovalo více informací
  5. Server restartujte a prostudujte obsah logu

Troubleshooting

  • Find Alias directive documentation: http://httpd.apache.org/docs/2.4/mod/mod_alias.html#alias Alias what(webspace) where(filesystem)
  • Search for configuration directives using grep command
    
    									grep -ri errorlog /etc/apache2
    									c() { grep -rin -C2 --color=always "$@" /etc/apache2 | cut -d/ -f4; }
    								
  • Display current (running) configuration using info module page: mod_info module must be loaded, then use <F3>: ErrorLog http://localhost/server-info
  • Syntaxi direktivy Alias najděte v dokumentaci: http://httpd.apache.org/docs/2.4/mod/mod_alias.html#alias Alias co(webspace) kam(filesystem)
  • Konfigurační direktivy můžete hledat pomocí příkazu grep
    
    									grep -ri errorlog /etc/apache2
    									c() { grep -rin -C2 --color=always "$@" /etc/apache2 | cut -d/ -f4; }
    								
  • Aktuální (běžící) Konfigurace je také ve výpisu modulu info: Při zapnutém modulu info (mod_info) [<F3>: ErrorLog] http://localhost/server-info

Virtual hosts configuration

Konfigurace virtual hosts

<VirtualHost> container

Kontejner <VirtualHost>

  • IP-based virtual hosting
    • ServerName
    • ServerAlias
    • DocumentRoot
    If there is none matching ip-vh, the _default_ one will be used, else main server configuration will be used
  • Name-based (host-based) virtual hosting The server name is needed, the rest is as same as in ip-vh
    • NameVirtualHost IP[:port] # legacy It was necessary to define IP addresses used for name-vh in advance
  • IP-based virtual hosting
    • ServerName
    • ServerAlias
    • DocumentRoot
    Pokud nebude nalezen odpovídající ip-vh, použije se _default_, pokud není ani ten, použije se nastavení hlavního serveru
  • Name-based (host-based) virtual hosting Je nutné specifikovat jméno serveru, jinak shodné s ip-vh
    • NameVirtualHost IP[:port] # legacy Bylo nutno dopředu definovat IP adresy použité pro name-based vh

Virtualhost selection (legacy)

Výběr virtuálního hostitele (legacy)

Virtualhost selection legacy algorithm scheme Virtualhost selection legacy algorithm scheme

Virtualhost selection (2.4.)

Výběr virtuálního hostitele (2.4.)

Virtualhost selection current algorithm scheme Virtualhost selection current algorithm scheme

LAB: Virtualhosting

Network setup

Nastavení sítě

  1. Create network interfaces dum1, dum2, dum3 with IP addresses 10.0.-X-.1 to 10.0.-X-.3 The -X- mark in IP address must correspond to 4th IP address octet of your default network interface Vytvořte síťové rozhraní dum1, dum2, dum3 s IP adresami 10.0.-X-.110.0.-X-.3 Značka -X- v IP adrese musí odpovídat 4. oktetu IP adresy výchozího síťového rozhraní
    
    									ip=$( ip route get 1.2 | awk '{ print $7 }' | cut -d. -f4 )
    
    									for n in {1..3}; do
    									  ip link add dum$n type dummy
    									  ip addr add 10.0.$ip.$n/24 dev dum$n
    									  ip link set dum$n up
    									done
    								
  1. Check whether /etc/hosts file contains following records The -X- mark in IP address must correspond to 3th IP address octet of your dumX network interface Zkontrolujte, zda soubor /etc/hosts obsahuje následujcící záznamy Značka -X- v IP adrese musí odpovídat 3. oktetu IP adresy rozhraní dumX
    
    									10.0.-X-.1     www.mycorp.net
    									10.0.-X-.1     www.aliascorp.net
    									10.0.-X-.2     www.othercorp1.net
    									10.0.-X-.2     www.othercorp2.net
    									10.0.-X-.2     www.othercorp3.net
    									10.0.-X-.3     www.nocorp.net
    								
    
    									vi /etc/hosts
    								

IP-based virtualhosting

The goal is to configure IP-based virtualhosting. So, there will be different content served for different IP addresses. You should create separate configuration file for this task.

Cílem je vytvořit konfiguraci pro IP-based virtualhosting. Tedy pro různé IP adresy bude webserver poskytovat různý obsah. Pro tuto konfiguraci vytvořte samostatný soubor.

  • Configure www.mycorp.net domain
  • Configure error logging
  • Create configuration for default virtualhost (_default_)
  • Vytvořit konfiguraci pro doménu www.mycorp.net
  • Nastavit logování chybových hlášení
  • Vytvořit konfiguraci pro výchozího hostitele (_default_)
  1. Create new configuration file for this IP-based virtualhost and include that file using Include directive inside main configuration file It is possible to create that file inside sites-available directory and then enable that site using a2ensite … and add Listen …:80 directive into ports.conf file
    (instead of Include directive)
  2. Set 10.0.-X-.1 IP address for server www.mycorp.net and set its alias to www.aliascorp.net
  3. Define root directory for documents to /var/www/vhosts/mycorp
  1. Pro konfiguraci IP-based virtual hostingu si vytvořte samostatný soubor, pomocí direktivy Include jej načtěte do hlavního konfiguračního souboru Je možné místo Include použít příkaz a2ensite … a přidat Listen …:80 do souboru ports.conf (konfigurace virtualhosta by měla být v adresáři sites-available)
  2. IP adresu 10.0.-X-.1 vyhraďte pro server se jménem www.mycorp.net a aliasem www.aliascorp.net
  3. Kořen tohoto webu nastavte na /var/www/vhosts/mycorp
  1. Send error messages for this virtualhost into /var/log/apache2/mycorp_error_log file
  2. Try to send following requests:
  3. Try to explain server logging behavior
  4. Discover where the requests for non-existing resources were logged
  1. Chybová hlášení z tohoto virtuálního hostitele směrujte do /var/log/apache2/mycorp_error_log
  2. Vyzkoušejte požadavky na:
  3. Pokuste se vysvětlit chování serveru
  4. Zjistěte, kam byly zalogovány požadavky na neexistující zdroje
  1. Define default IP-based virtualhost
  2. Set its DocumentRoot to /var/www/vhosts/default The default DocumentRoot is /var/www/html in Debian distribution
  3. Try to repeat requests from tasks 5-7 and explain the server behavior
  1. Definujte výchozího IP-based virtuálního hostitele
  2. Nastavte pro něj DocumentRoot na /var/www/vhosts/default V Debianu je výchozí DocumentRoot ve /var/www/html
  3. Opět vyzkoušejte a vysvětlete chování v 5.-7.

Name-based virtualhosting

The goal is to configure name-based virtualhosting. So, the server serves different content for the same IP address. Create separate configuration file for this task.

Cílem je vytvořit konfiguraci pro name-based virtualhosting. Tedy pro stejnou IP adresu bude webserver poskytovat různý obsah. Pro tuto konfiguraci vytvořte samostatný soubor.

  • Configure www.othercorp1.net virtualhost
  • Configure www.othercorp2.net virtualhost
  • Discover server behavior for unconfigured domain
  • Vytvořit konfiguraci pro doménu www.othercorp1.net
  • Vytvořit konfiguraci pro doménu www.othercorp2.net
  • Zjistit chování pro doménu bez konfigurace
  1. Ensure the IP-based configuration is disabled for this task
  2. Create new file for this configuration and use Include directive inside main configuration file It is possible to use a2ensite … as well in this case instead of Include directive
  3. Setup default virtualhost:
    • ServerName is www.othercorp1.net
    • DocumentRoot is /var/www/vhosts/othercorp1
  1. Setup one more virtualhost:
    • ServerName is www.othercorp2.net
    • DocumentRoot is /var/www/vhosts/othercorp2
  2. Try to send requests to following addresses:
  1. Nastavte dalšího virtuálního hostitele na:
    • Jméno serveru je www.othercorp2.net
    • DocumentRoot je /var/www/vhosts/othercorp2
  2. Vyzkoušejte požadavky na:

Mixed virtualhosting

The goal is to create configuration that includes IP-based and name-based virtualhosting at the same time. For this task use already created files.

Cílem je vytvořit konfiguraci pro souběh IP-based a name-based virtualhostingu. Pro tuto konfiguraci použijte již vytvořené soubory.

  • Include/enable both previous configuration files at once
  • Check proper behavior for all domains
  • Discover behavior for domain without configuration
  • Načíst/povolit oba předchozí konfigurační soubory najednou
  • Ověřit funkčnost pro všechny domény
  • Zjistit chování pro doménu bez konfigurace
  1. Ensure the configuration for IP-based and name-based virtualhosting are included/enabled
  2. Try to send requests to following addresses:
  1. Pro tuto část se ujistěte, že načítáte konfiguraci pro IP-based i name-based virtualhosting
  2. Vyzkoušejte požadavky na: