Webtjenester

Du fnner gode eksempler på konfigurasjoner av .htaccess og VirtualHosts på sidene til Apache – Se: http://httpd.apache.org/docs/2.4/

Eksempel på installasjon av Apache, MariaDB osv. Se: http://www.cyberciti.biz/faq/howto-install-linux-apache-mariadb-php-lamp-stack-on-centos7-rhel7/

Kort om historien til Apache

Apache har sin opprinnelse fra 1995 da en liten gruppe ble dannet for å forsøke å videreutvikle en dugelig webserver. Første offisielle versjon var 0.6.2. Bare i løpet av ett år var denne den mest brukte webserveren. i 1999 ble Apache Software Foundatioin dannet for å få en klarere organisatorisk, juridisk og økonomisk enhet som kan stå på egne ben. Apache er Open Source, og kan fritt benyttes på bl.a. Mac, Windows og Linux/Unix plattformer. Mer om Apache sin historie finner du på Apache sine sider.

Apache er den desidert mest brukte webserveren viser en undersøkelse fra Netcraft fra februar 2014:

Developer February 2014 Percent March 2014 Percent Change
Apache 351,700,572 38.22% 354,956,660 38.60% 0.38
Microsoft 301,781,997 32.80% 286,014,566 31.10% -1.69
nginx 138,056,444 15.00% 143,095,181 15.56% 0.56
Google 21,129,509 2.30% 20,960,422 2.28% -0.02

For mer om informasjon om undersøkelsen til Netcraft m.m. se sidene til Netcraft.

Basis

Som vi har pratet om tidligere i forbindelse med iptables, bruker webserveren å gå på port 80.

Eks Spesifisering av portnummer i nettleser:

En sikker tilkobling (https), benytter som standard port 443.

Eks Samme innhold, med både sikker og vanlig tilkobling:

Derfor – Skal apache og webserveren fungere ordentlig, må tcp portene 80 og 443 være åpnet i brannmur og i vårt tilfelle må de routes til serveren på vårt lokalnett.

Konfigurasjon og filer

Apache fungerer automatisk etter den er installert. Det skal holde at du legger statiske html filer i katalogen “/var/www/html”.

Alle konfigurasjonsfiler finner du på filstien: /etc/httpd

[root@server httpd]# pwd
/etc/httpd
[root@server httpd]# ls -la
total 40
drwxr-xr-x 4 root root 4096 2008-02-26 09:34 .
drwxr-xr-x 88 root root 12288 2008-04-12 04:23 ..
drwxr-xr-x 2 root root 4096 2008-02-26 09:34 conf
drwxr-xr-x 2 root root 4096 2008-04-11 10:56 conf.d
lrwxrwxrwx 1 root root 19 2008-02-26 09:34 logs -> ../../var/log/httpd
lrwxrwxrwx 1 root root 27 2008-02-26 09:34 modules -> ../../usr/lib/httpd/modules
lrwxrwxrwx 1 root root 13 2008-02-26 09:34 run -> ../../var/run

Katalogen “conf” består i hovedsak av basiskonfigurasjonsfilen httpd.conf (for hele systemet)

Katalogen “conf.d” består av konfigurasjonsfiler for ekstra tilleggsmoduler m.m. Eks vil konfigurasjonsfiler for bl.a. Squirrelmail og phpMyadmin legge seg her.

De tre andre katalogene er symbolske linker til bl.a. loggene og de ferdigkompilerte modulene som apache benytter seg av.

Basiskonfigurasjon

httpd.conf – Husk backup før du gjør endringer.

.htaccess – En fil som inneholder direktiver/konfigurasjoner for den bestemte katalogen hvor fila ligger (også rekursivt nedover i katalogstrukturen). OBS! Apache kan settes opp til å ignorere denne.

Utdrag av enkelte viktige elementer fra konfigurasjonen:

#
# Load config files from the config directory “/etc/httpd/conf.d”.
#
Include conf.d/*.conf

Denne gjør at den faktisk leser konfigurasjonsfiler fra katalogen conf.d. som beskrevet over. Husk at alle konfigurasjonsfiler i denne katalogen MÅ ende på .conf.

# Tedms
ServerAdmin tms@tedms.no

Det er høflig at webserveren viser hvem som kan kontaktes hvis noe går galt..

# Tedms
ServerName www.tedms.no:80

Navnet på hovedwebserveren. Apache kan finne det automatisk, men når det er flere “virtual hosts” inne i bildet, anbefaler jeg sterkt å spesifisere hovedside her.

# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot “/var/www/html”

Spesifiserer hvilken filsti hovedsidens html-filer ligger på.

<Directory “/var/www/html”>

#
# Possible values for the Options directive are “None”, “All”,
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that “MultiViews” must be named *explicitly* — “Options All”
# doesn’t give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be “All”, “None”, or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Order allow,deny
Allow from all

</Directory>

Spesifiserer hvilke sett med regler som finners for hovedsiden. Bygger på “tag-struktur”. Alt innenfor <Directory> </Directory> blir tatt som standard konfigurasjon for det aktuelle området.

Denne standardkonfigurasjonen gjelder for directory “/var/www/html”. Linjen som begynner med Options sier hvlke valg som skal tillates. Her tillates “Indexes” (dvs at den skal liste opp filer fra katalogen, hvis det ikke er angitt en index.html e.l fil i katalogen). I tillegg er det tillatt å benytte symbolske filer i dette webområdet.

AllowOverride None, sier at den skal ignorere .htaccessfiler som ligger i webområdet. Dvs. – Hvis vi skal bruke .htaccessfiler noen steder nå, må det området spesifiserers bestemt i et annet “direktiv”.

# UserDir: The name of the directory that is appended onto a user’s home
# directory if a ~user request is received.
#
# The path to the end user account ‘public_html’ directory must be
# accessible to the webserver userid. This usually means that ~userid
# must have permissions of 711, ~userid/public_html must have permissions
# of 755, and documents contained therein must be world-readable.
# Otherwise, the client will only receive a “403 Forbidden” message.
#
# See also: http://httpd.apache.org/docs/misc/FAQ.html#forbidden
#
<IfModule mod_userdir.c>
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#

#Tedms
#UserDir disable

#
# To enable requests to /~user/ to serve the user’s public_html
# directory, remove the “UserDir disable” line above, and uncomment
# the following line instead:
#

# TEdms
UserDir htdocs

</IfModule>

Dette er en beskrivelse på hvordan apache skal benytte sin “userdir” modul (dvs at en bruker kan få sitt eget webområde på formen http://www.eksempel.no/~brukernavn) . Her er den satt til aktiv (ved å kommentere ut “Userdir disable”), og i tillegg er det bestemt i klartekst at den skal benytte katalogen “htdocs” som sin “DocumentRoot” for hver enkelt bruker.

# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
# The index.html.var file (a type-map) is used to deliver content-
# negotiated documents. The MultiViews Option can be used for the
# same purpose, but it is much slower.

# Tedms
DirectoryIndex index.html index.html.var index.htm index.php index.shtml index.py default.html default.php

Her spesifiserer vi hvilke “default-filer” apache skal lete etter i hver katalog. Eks: http://argo.hiof.no/katalog – Ved oppslag på denne adressen, vil apache lete først etter index.html, deretter index.html.var osv osv.. Finner den ikke noen på den aktuelle listen, så bestemmer tidligere konfigurasjon hva apache skal gjøre. Hvis det er satt at den skal tillate “indexes”, vil den liste opp alle filer som ligger i denne katalogen. Hvis det ikke er tillatt, vil du få en klar feilmelding.

OBS! Stemmer ikke rekkefølgen på “DirectoryIndex” direktivet? Sjekk at det ikke finnes forekomster av DirectoryIndex direktiv i andre *.conf filer i “/etc/httpd/cond.d/” katalogen. Jeg vet at det kan finne forekomster av dette.. f.eks. i “php.conf” konfigurasjonsfila.

#
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ~ “^\.ht”>
Order allow,deny
Deny from all
</Files>

Her settes det at det er fila .htaccess som skal benyttes for å evt endre konfigurasjonen lokalt i en bestemt katalog. Siden disse filene sier mye om hvordan systemet er satt opp, og evt path til passordfiler, ønsker vi ikke å vise disse på nytt. Den siste konfigurasjonen hindrer noen å se filer på webben som inneholder “.ht”.

Konfigurasjon av spesielle kataloger/tjenester

Du kan som nevnt overstyre default innstillinger ved å sette spesielle direktiver for bestemte kataloger.

Alias /test /var/www/test

<Location /test>
Order deny,allow
Deny from all
Allow from .hiof.no
Allow from .tedms.no
Allow from 192.168.1.
</Location>

Her setter vi en regel for webområdet “http://www.server.no/test”. Som basis nekter den alle tilgang til /test, men tillatter aller fra hiof.no og tedms.no domenet. Den tillater også alle fra subnettet 192.168.1. Som vi ser av Alias, så henvises det til det fysiske filområdet “/var/www/test”, mens direktivene setter vi på lokasjonen/webområdet “/test”.

Ligger det nå en katalog “test” i mappa “/var/www/html” (siden vi antar at det er default DocumentRoot), så vil den bli ignorert.

Forskjell på “Alias” og “Redirect”

I forrige avsnitt lagde vi et Alias – og henviste forespørsler til www.domene.no/test til å lese filer fra /var/www/test. Som nevnt blir altså da en evt katalog med navn “test” i DocumentRoot ignorert. Vi kan forenklet si at “Alias” benytter vi når vi skal lage snarveier til andre filområder på disken, også utenfor DocumentRoot. Men, hvis du skal redirecte til en annen url, så må du benytte “Redirect”

Alias /tpe /home/torepeng/tpe

<Directory /home/torpeng/tpe>
Deny for all
Allow from 192.168.0.100
AllowOverride All
</Directory>

Redirect /studieplaner http://studieplaner.hiof.no

Redirect permanent /ansatte http://www.it.hiof.no/ansatte

Redirect gone /pressemelding_opptak_2008

Her lager jeg først et alias “/tpe” som henviser til et bestemt område på harddisken på server. Deretter setter jeg rettigheter på akkurat det området.

Så lager jeg tre redirects (For enkelhets skyld tar jeg utgangspunkt i www.hiof.no):

  1. Slår noen opp http://www.hiof.no/studieplaner – Vil de bli henvist til http://www.hiof.no/studieplaner – Den nye adressen vil også stå i adressefeltet på nettleseren
  2. Slår noen opp http://www.hiof.no/ansatte – Vil de bli henvist til http://www.it.hiof.no/ansatte – Den nye adressen vil bli stående i adressefeltet, og http-headeren som blir sendt fra apache sier også at dette er en permanent handling. Nettleseren bryr seg ikke om det, men Googles roboter skjønner da at den skal slette alle henvisninger til den gamle adressen, og kun indeksere den nye.
  3. Slår noen opp adressen http://www.hiof.no/pressemelding_opptak_2008, vil du få en “gone” feilmelding, som sier at denne siden ikke finnes lengre. Søkemotoren får også denne beskjeden fra headeren, og vil deretter slette denne adressen fra sin indeks.

I de to siste “Redirectene” har jeg angitt en status. Hvis en ikke angir en status, blir statusen “temp” benyttet. Da antar bl.a. redirecten er temporær, og at den originale adressen snart skal benyttes igjen. Søkemotorene skal da per def. ikke oppdatere sin indeks.

Rent generelt er det viktig at man er klar over hvilken rekkefølge apache benytter seg av for å avgjøre hvordan den skal vise to like forekomster.
La oss anta følgende eksempler etter hverandre i en konfigurasjonsfil:

  1. Redirect /temp http://www.nyserver.no/temp
  2. Alias /temp /var/vwww/temp

En skulle tro at det er Alias direktivet som vil gjelde, siden dette står sist. Dette gjelder ikke i Apache. Redirects har alltid presedens over Alias, slik at her ville det skjedd en redirect til http://www.nyserver.no/temp.

Statuskoder

Apache og andre webservere sender ut statuskoder i headerne sammen med innholdet på sidene som de får beskjed om å vise frem.

Normalt sett ser det jo vi brukere som ber om innhold fra webserverene, når vi skriver inn adresser i nettleserne våre. Som vi aller har sett, hender det noen ganger at serveren av en eller annen grunn ikke kan vise ønsket side. Da er det kjekt å vite litt om disse forskjellige statuskodene.

Den vanligste feilkoden er “404-Not Found”. Her finner rett og slett ikke webserveren det dokumentet som den aktuelle brukeren etterspørr. Det vi kanskje ikke tenker på, er at den desidert vanligste statuskoden er “202 -OK”. Det vil si at Apache skjønner hvilken side det er snakk om og vil vise disse sidene frem til deg.

Statuskodene er delt opp i 3 siffrede tallkombinasjoner. Hvor det første tallet sier noe om klassen for respons, (dvs feil, redirect, error e.l.) De to siste er bare et nummer som er bestemt og gitt et navn.

Følgende er hentet fra RFC til HTTP1.1 protokollen (som også sier noe om statuskoder)

      - 1xx: Informational - Request received, continuing process

      - 2xx: Success - The action was successfully received,
        understood, and accepted

      - 3xx: Redirection - Further action must be taken in order to
        complete the request

      - 4xx: Client Error - The request contains bad syntax or cannot
        be fulfilled

      - 5xx: Server Error - The server failed to fulfill an apparently
        valid request

I bunn og grunn er det lurt å ha litt oversikt over noen av de viktiste statuskodene. Disse kan gi deg god tilbakemelding på hvor du bør begynne å lete hvis du får feilmelding. De samme statuskodene finner vi også igjen i logfilene til Apache. Desse logfilene ligger som standard på “/var/log/httpd”. De viktigste filene (hvis du ikke har ssl) er error_log og access_log. Skriver du kommandoen “tail -f /var/log/httpd/access_log”, ser du løpende hvilke sider som roboter og klienter forsøker å nå på din server.

Utdrag av access_log et lite sekund på min server:

158.39.165.103 – – [23/Apr/2008:10:35:07 +0200] “GET /static/sernet/templates/ja_purity/images/vdot.gif HTTP/1.1″ 200 43
158.39.165.103 – – [23/Apr/2008:10:35:07 +0200] “GET /static/sernet/templates/ja_purity/images/vdot.gif HTTP/1.1″ 200 43 “http://argo.hiof.no/static/sernet/templates/ja_purity/css/template.css” “Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14″
38.99.44.102 – – [23/Apr/2008:10:35:16 +0200] “GET /index.php?option=com_events&task=view_day&year=2015&month=06&day=14&Itemid=40 HTTP/1.0″ 200 29623
38.99.44.102 – – [23/Apr/2008:10:35:16 +0200] “GET /index.php?option=com_events&task=view_day&year=2015&month=06&day=14&Itemid=40 HTTP/1.0″ 200 29623 “-” “Mozilla/5.0 (Twiceler-0.9 http://www.cuill.com/twiceler/robot.html)”
66.249.70.193 – – [23/Apr/2008:10:35:20 +0200] “GET /personlig-blog/test-viktig-sak-1262.html?Itemid=9 HTTP/1.1″ 200 16520
66.249.70.193 – – [23/Apr/2008:10:35:20 +0200] “GET /personlig-blog/test-viktig-sak-1262.html?Itemid=9 HTTP/1.1″ 200 16520 “-” “Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)”

Først ser du IP-adressen på den som har besøkt siden din, deretter får du dato/klokkeslett, deretter forespørselen klienten har gjort, så statuskoden (200 på dette eksempelet) og tilslutt får du beskjed om hva slags klient som har besøkt siden. Siste oppføring hos meg, sier meg at en robot fra Google indekserer min side akkurat for øyeblikket.

Virtual Hosts

Som vi så litt på under oppsett av Bind, kan hver enkelt ip-adresse ha mange forskjellige hostnames, og også ha helt forskjellige domener. Både www.hiof.no og neted1.hiof.no går til fysisk samme maskin, med sin bestemte ip-adresse. Men slår vi opp begge adressene i en nettleser, kommer det opp forskjellige sider. Dette er gjort med å sette Virtual Hosts i Apache.

Det er litt viktig å holde tunga rett i munn når du setter opp VirtualHosts. For det kan hende at du får litt uventede resultater hvis du ikke er klar over alle adressene som folk prlver å nå deg på.

Først kan derfor være lurt å liste opp alle adressene som vu vil at apache skal svare på. På min undervisningspc, har jeg følgende adresser:

Per definisjon er det disse adressene/navnene som apache kan svare på.

Jeg har bestemt meg for at det er www.testserver.com som skal være “hovedwebside”, og som jeg da må konfigurere som en en del av defaultinnstillingene i httpd.conf. Når det er gjort, vil alle de andre vise akkurat de samme siden, og leser fra samme DocumentRoot.

I det jeg begynner å sette opp VirtualHosts, skjer det ting med de andre navnene, som kanskje ikke er helt forventet.

Eksempel. Jeg skal sette opp en VirtualHost www.nyweb.com – som skal lese fra katalogen /var/www/nyweb.com

<VirtualHost *:80>
ServerName www.nyweb.com
ServerAdmin webmaster@nyweb.com
DocumentRoot /var/www/nyweb.com
ErrorLog /var/log/httpd/nyweb.com/error_log
CustomLog /var/log/httpd/nyweb.com/access_log custom
</VirtualHost>

Her har jeg satt opp en VirtualHost for min nye side www.nyweb.com. For at loggene skal gå til riktig sted, må du opprette katalogen nyweb.com, og også opprette to tomme filer (access_log og error_log) i denne katalogen.

Hvis du sjekker www.nyweb.com, er alt som forventet, men slår du opp de andre navnene, så får du deg kanskje en overraskelse. Den kan nemlilg også nå peke til den nye siden.

Derfor: Opprett VirtualHosts for alle de forskjellige navnene du skal benytte deg av. Det er eneste måten du er sikker på at allle sider blir vist som du ønsker.

I mitt tilfelle ville jeg derfor gjort som følger:

<VirtualHost *:80>
ServerName www.testserver.com
ServerAdmin webmaster@testserver.com
DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *:80>
ServerName localhost
ServerAdmin webmaster@testserver.com
DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *:80>
ServerName 127.0.0.1
ServerAdmin webmaster@testserver.com
DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *:80>
ServerName 158.39.165.104
ServerAdmin webmaster@testserver.com
DocumentRoot /var/www/html
</VirtualHost>

Herved har du sikret deg at du alltid har kontroll over hvor apache leser sine filer fra.