[Howto] Apache, PHP, MySQL, .htaccess & Virtual Hosts

Pagina: 1
Acties:
  • 22.422 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • G33rt
  • Registratie: Februari 2002
  • Laatst online: 22-06-2022

HOWTO: Apache, PHP, MySQL, .htaccess & Virtual Hosts


Inleiding

Ik denk dat deze howto weinig uitleg nodig geeft, aangezien de titel bijna alles dekt. We gaan Apache 1.3.29, PHP 4.3.4 en MySQL 4.0.16 installeren, op een Windows machine. Nu hoor ik je al denken - waarom alleen windows? Simpel, omdat ik van mening ben dat als je al een linux server hebt dat je dan je weg naar de documentatie hebt kunnen vinden en je zelf voldoende geduld en doorzettingsvermogen hebt om het uit te zoeken. Overigens is dit niet bedoeld om alle windows-gebruikers over een kam te scheren. Er wordt uitgegaan van een Windows die op NT gebaseerd is (dwz XP of 2k).

Een groot deel van het configuratiestuk is uiteraard wel van toepassing voor Linux of Unix gebruikers, aangezien dat over Apache configuratie in het algemeen gaat.

·^

Vereisten

  • Een computer. Dit zou je niet verwachten, maar het is echt waar :+
  • Apache, in dit geval 1.3.29, hier te halen
  • PHP, in ons geval 4.3.4, hier te vinden
  • MySQL, in deze howto 4.0.16, hier te downloaden

Uiteraard verdient het aanbeveling te laatste stable versies te nemen. Tevens kan je ook nieuwere versies nemen, alleen zijn die op dit moment niet beschikbaar. De 1.3 serie van Apache word gebruikt omdat die mijn persoonlijke voorkeur heeft. De systeemeisen voor een dergelijk systeem zijn erg laagdrempeling, ik draai al tijden Apache op een Pentium-90.

Deze howto gaat uit van de installer van Apache 1.3.29 (apache_1.3.29-win32-x86-no_src.exe; 5.29 MB), de installer van PHP 4.3.4 (php-4.3.4-installer.exe; 1.01MB) en de zip file van MySQL 4.0.16 (mysql-4.0.16-win.zip; 22.7 MB)

·^

Installeren

Goed, we gaan installeren, te beginnen met Apache. Start de installer:

Fig. 1:
start de installer

en druk uiteraard op next, waarna je de EULA accepteert. Klik nog een keer op next bij de informatie over apache, en nu komen we pas ergens. Als het goed is zie je nu het volgende scherm:

Fig. 2:
de eerste instellingen

Vul de waarden die voor jou van toepassing zijn in. Let wel dat een domein invoeren als je geen domein hebt absoluut geen nut heeft, evenals de servername. Je bent echter wel verplicht dit in te vullen, dus doe er wat leuks mee. Een gratis domein kan je altijd halen bij no-ip.com. Een emailadres is wel weer nuttig, aangezien dit ook zal verschijnen op error documents. De waarden zijn later te wijzigen, daar hoef je je geen zorgen over te maken.

Vink aan dat Apache als een service start, dit heeft als voordeel dat Apache ook doordraait als je uitlogt, en start als je nog niet ingelogt bent (wat wel zo praktisch is op een server). Klik nu op next, en kies voor een custom installatie. Je zult nu het volgende scherm zien:

Fig. 3:
wat te installeren, en waar

Je bent uiteraard vrij om te installeren waar je wilt. In deze howto gebruik ik echter C:\apache. Let daar dus op als je later gaat configureren. Kies ook dat alles geinstalleerd word op de harde schijf. Druk nu op install. Je hebt Apache nu geinstalleerd.

Het volgende dat we zullen gaan installeren is PHP. Start de installer, en klik door tot je je eerste keuze moet maken:

Fig. 4:
het installatietype van PHP kiezen

Kies voor een advanced installatie, en installeer PHP in C:\PHP. Let ook hier op als je dit veranderd, in de rest van de howto zal ik C:\PHP blijven gebruiken. Vervolgens is het wel handig om een backup aan te vinken, aangezien je dan kan roll-backen. In de directory ben je uiteraard vrij, ik laat hem echter op de standaard staan (C:\PHP\BACKUP).

Wat nu je moet gaan kiezen is een map voor tijdelijke upload bestanden. PHP kan attachments uploaden met forms, en zal dus ergens tijdelijk files moeten storen. Ook deze setting laat ik op de standaard staan. evenals de setting voor de sessiondata.

Fig. 5:
de SMTP server instellen voor PHP

PHP kent ook een mail functie (iedereen die ooit zijn password heeft laten mailen op GoT of de FrontPage is er wel eens mee in aanraking gekomen). Wat je hier moet instellen is de SMTP server en het mailadres. Je kunt ze gewoon op localhost en je eigen emailadres laten staan, het zal prima functioneren. Vul uiteraard wel een mailadres in als je enigzins netjes wil overkomen.

In het volgende scherm moet je de befaamde error reporting aanzetten. Laat hem op de standaard optie staan (all errors, warnings and notices - E_ALL in php.ini), voor meer informatie hierover is het verstandig de P&W FAQ te lezen.

Hierna moet je de server kiezen - dit lijkt me ietwat triviaal. Kies voor Apache. De extensions kun je zelf kiezen, phtml en php3 zul je in de praktijk echter heel weinig tegekomen. Je bent nu klaar met instellen, kies next. Je zult een waarschuwing krijgen dat Apache niet auto-configured wordt. Dit is normaal, we zullen straks handmatig Apache instellen voor PHP.

Nu zijn we klaar om MySQL te installeren. Pak de zip ergens uit, en start setup.exe. Lees vooral even de releasenotes waarin o.a. dit staat:

NOTE: If you install MySQL in a folder other than
C:\MYSQL or you intend to start MySQL on NT/Win2000
as a service, you must create a file named C:\MY.CNF
or \Windows\my.ini or \winnt\my.ini with the following
information::

[mysqld]basedir=E:/installation-path/
datadir=E:/data-path/

Houd hier dus rekening mee indien je dit veranderd. Wij zullen dat echter niet doen. Kies in het volgende scherm dus ook next, en start ook hier weer een custom install:

Fig. 6:
onderdelen van MySQL kiezen

Het verdient aanbeveling alles te installeren, dan heb je de documentatie bij de hand, en zoveel ruimte neemt het niet in beslag. Klik op next en daarna op finish. Je hebt nu MySQL geinstalleerd.

·^

Configureren

We gaan nu alles configureren. Draai eerst even:

Start > Uitvoeren > Services.msc

kijk nu of de Apache service ertussen staat, en of deze gestart is. Indien hij er niet tussen staat raad ik aan om Apache overnieuw te installeren, en aan te vinken dat het als een service moet draaien.

Open nu je browser en ga naar localhost. Je zou nu de volgende pagina moeten zien:

Fig. 7:
een apache test pagina

Krijg je deze pagina niet raad ik je aan om even goed te kijken of je alle installatiestappen netjes hebt doorlopen. We gaan er echter vanuit dat het wel werkt.

Ga in je filemanager naar C:\Apache\Apache\conf, en open httpd.conf. We gaan ouderwets configuratiepagina's bewerken, een GUI is er hier niet bij (afgezien van die van je editor natuurlijk). Open httpd.conf - je hoeft hier geen backup van te maken als hij nog nieuw is, er is ook een httpd.conf.default

Let vooral even op dit stuk bovenaan in de comments:

# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/foo.log"
# with ServerRoot set to "/usr/local/apache" will be interpreted by the
# server as "/usr/local/apache/logs/foo.log".

en houd er rekening mee als je aliases gaat maken.

We zullen nu httpd.conf even relevantie optie voor relevantie optie doorlopen om apache in te stellen aan je wensen. Indien ik ineens een optie oversla, is hij dus niet relevant (bijvoorbeeld het ServerType, lees de comment erbij maar eens) voor een werkende installatie.

Stel

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

in op een enigszins reele waarde. Als je veel bezoekers krijgt is het niet slim om een hoge timeout in te stellen, aangezien er dan vanalles bij apache blijft hangen. Een timeout van 30 seconden kan prima. Voor je eigen server kan je hem gerust op 300 laten staan.

We gaan nu Section 2 - Main Server Configuration in. De eerste optie die je tegen zult komen is

Port 80

en meteen een belangrijke. Dit is de poort waarop de webserver gaat draaien. Weet je niet wat een poort is, raad ik je aan even de NT FAQ door te kijken en google te gebruiken. Poort 80 is standaard voor webservers, dus als je geen :1337 achter je url wil plakken (als je je port op 1337 zet), is dit wel de verstandigste optie. Let er wel op dat sommige providers het niet lief vinden als je webservers gaat lopen draaien (voor meer informatie verwijs ik je uiteraard naar de algemene voorwaarden), kan het wenselijk zijn de port naar een ander getal te veranderen. Aangezien port 80 de standaard webserver port is is er een reele kans dat er op deze port gelet wordt.

Nu komen we aan bij een optie, waar al een waarde staat die je zelf hebt ingevuld:

ServerAdmin g33rt@mytweakers.net

Dit is het e-mail adres van de administrator die je tijdens de installatie hebt ingevoerd. Stel hem wel enigzins netjes in, aangezien hij op alle error documents verschijnt.

De eerst volgende belangrijke optie is ServerName:

ServerName 127.0.0.1

Lees de comment, en je snapt waar het over gaat. Als je dus geen domeinnaam hebt moet je je IP invullen, daar komt het op neer. Uiteraard heb ik mijn servername even weggehaald. Vul niet voor de grap een hostname in, dat wordt erg irritant later. Als je wilt gaan devven is 127.0.0.1 een handige optie.

De belangrijke opties zijn niet van de lucht:

DocumentRoot "C:/Apache/Apache/htdocs"

Dit is de map van waaruit de documenten geserveerd worden. Als je hier een index.html plaatst zal die dus op http://localhost te zien zijn, aangezien dit ook de root is.

Twee opties later zie je

#
# This should be changed to whatever you set DocumentRoot to.
#

Het moge duidelijk zijn wat je met deze optie dient te doen.

Indien je met .htaccess bestanden opties per directory wilt gaan instellen is het slim om bij

# This controls which options the .htaccess files in directories can
# override. Can also be "All", or any combination of "Options", "FileInfo",
# "AuthConfig", and "Limit"
#
AllowOverride None

All in te stellen. Deze optie staat in de Directory tag van je documentroot (die optie die ingesteld moest worden op de waarde van je DocumentRoot).

Als we nu een stuk verderop kijken zien we de volgende optie staan:

UseCanonicalName On

Deze is precies waarom je absoluut niet grappig moet gaan doen met je hostname als deze op 'yes' staat. Bekijk de comment maar, en trek je conclusies. Iets als ../index.html zal door Apache de ServerName en de relevante map worden voorgeplakt als deze op Yes staat. En dat werkt dus niet als je ServerName niet bestaat.

Mocht je meer opties voor je server willen aanpassen, raad ik je aan httpd.conf goed door te kijken. Later zullen .htaccess en virtual hosts nog besproken worden.

Sla je httpd.conf op, maar sluit hem nog niet. We gaan nu relevante dingen voor PHP erin zetten.

Er zijn twee manieren om PHP te laten samenwerken met Apache. Een is php.exe, de ander is een dll. Ik kies zelf ervoor om php.exe te gebruiken. Er zijn voor php.exe enkele exploits. Deze exploits zijn echter te voorkomen door in C:\windows\php.ini het volgende aan te passen:

; cgi.force_redirect is necessary to provide security running PHP as a CGI under
; most web servers. Left undefined, PHP turns this on by default. You can
; turn it off here AT YOUR OWN RISK
; **You CAN safely turn this off for IIS, in fact, you MUST.**
cgi.force_redirect = 1

Het idee is dus om de ; voor de laatste regel weg te halen. Nu ben je tegen de exploits beveiligd. We gaan nu weer terug naar httpd.conf. Plak, liefst onderaan - voor het overzicht, met een commentje erboven zodat je weet wat voor setting het is, de volgende regels:

 ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php.exe"

En nu weet Apache wat er met .php documenten gedaan dient te worden. Echter, het is ook wenselijk om bijvoorbeeld een index.php pagina te laten functioneren als een html pagina. Zoek daarvoor in httpd.conf op 'DirectoryIndex', en maak er het volgende van:


DirectoryIndex index.html index.php

Waarna Apache index.php als DirectoryIndex beschouwt, en /hoi/index.php automagisch geladen word als /hoi opgevraagt wordt. Let er wel op dat bij Dynamic Shared Object (DSO) Support er een module geladen moet zijn, te weten mod_dir.c

·^

MySQL configuratie

We gaan nu verder met het configureren van MySQL. Open een notepad en tik het volgende:

[mysqld]# set basedir to your installation path
basedir=C:/mysql
# set datadir to the location of your data directory
datadir=C:/mysql/data

Uiteraard moet je je eigen waarden meegeven als deze anders zijn. Sla het document op als C:\windows\my.ini (waarbij windows je windows map is).

Open nu C:\mysql\bin\winmysqladmin.exe, je zult als het goed is het volgende scherm zien:

Fig. 8:
WinMySQLAdmin voor de eerste keer

Voer hier een username en een wachtwoord in, dit zijn de waarden voor de mysql root gebruiker. Als het goed is verschijnt er na het drukken op OK een groen stoplichtje in je systemtray. Je zult nu ook als je erop rechtsklikt en 'show me' doet waarna je naar de my.ini tab gaat je my.ini instellingen zien, inclusief de user en wachtwoord dat je net invoerde.

Open nu een prompt en tik:

cd C:\mysql\bin

Tik nu het volgende om MySQL als service te installeren:

C:\mysql\bin>mysqld --install

Als dit verschijnt:

The service already exists!
The current server installed: C:/mysql/bin/mysqld-nt.exe

dan is er al een MySQL service. Kijk ter controle weer in services.msc. Mocht je de service willen verwijderen dan kan dat met de --remove switch.

·^

Controle

Controleer nu beide installaties met:

phpinfo();
?>

Als het goed is zie je ook MySQL informatie. Indien het niet werkt: loop weer netjes alle stappen na.

Zijn na een reboot ineens Apache en/of MySQL uitgevallen? Kijk in services.msc of ze wel automatisch gestart worden

·^

.htaccess

Wat is een .htaccess bestand nou weer? Je kunt er gewoon allerlei handige dingen mee doen - dat is .htaccess vind ik. Zie het als een handige aanvullen op httpd.conf. Overigens heet het bestand altijd .htaccess, htaccess is de extensie.

  • Aangepaste error documents

Je kunt aangepaste error messages (404: page not found bijvoorbeeld) maken met .htaccess. In het algemeen werken ze als:

ErrorDocument codenummer /bestandje 

Een overzicht van de errorcodes die Apache kent:

Successful Client Requests
200OK
201Created
202Accepted
203Non-Authorative Information
204No Content
205Reset Content
206Partial Content
Client Request Redirected
300Multiple Choices
301Moved Permanently
302Moved Temporarily
303See Other
304Not Modified
305Use Proxy
Client Request Errors
400Bad Request
401Authorization Required
402Payment Required (not used yet)
403Forbidden
404Not Found
405Method Not Allowed
406Not Acceptable (encoding)
407Proxy Authentication Required
408Request Timed Out
409Conflicting Request
410Gone
411Content Length Required
412Precondition Failed
413Request Entity Too Long
414Request URI Too Long
415Unsupported Media Type
Server Errors
500Internal Server Error
501Not Implemented
502Bad Gateway
503Service Unavailable
504Gateway Timeout
505HTTP Version Not Supported

Je kunt dus per error je eigen message opgeven, bijvoorbeeld door een van de onderstaande regels te gebruiken, je kan er zelfs html in nestelen:

ErrorDocument 404 /foutje/foetsie.html
ErrorDocument 404 "Is er niet!"
ErrorDocument 404 "Weg"
  • Wachtwoorden

Je kunt met .htaccess hele handige wachtwoord veldjes maken, en wel op de volgende manier:

AuthUserFile c:/niet/bereikbaar/via/web/.htpasswd
AuthName Voer je wachtwoord in
AuthType Basic
require valid-user

Hiermee wordt aangegeven dat de user en wachtwoord informatie uit een niet via de webserver te lezen .htpasswd bestand komt. Met AuthName geef je de naam van het wachtwoordvenster aan, en AuthType basic stelt in dat we het hebben over HTTP authenticatie. In het .htpasswd bestandje worden users en passwords opgeslagen met user:password. Je kunt dit handige tooltje gebruiken om de wachtwoorden op de juiste manier te encrypten.

  • Users weigeren op IP

Ook kan je met .htaccess users weigeren op hun IP, net zoals je dat in het algemeen kan doen in httpd.conf. Nu kan je het echter per directory doen, wat handig is als je een of andere pagina hebt die mensen niet mogen lezen. Je kunt dan bijvoorbeeld alle externe IP's weigeren en .htpasswd gebruiken.

Het werkt als volgt:

order deny,allow
deny from all
allow from 192.168.1.

In dit geval wordt er dus eerst geblokkeerd - alles dus - waarna je er wel in mag. Wat hier dus toegstaan is zijn alle IP's zijn die beginnen met 192.168.1

  • Aangepaste indices

Herinner je je de optie DirectoryIndex uit httpd.conf nog? Wel, exact dezelfde optie kan je dus ook per directory gebruiken door het in een .htaccess te zetten:

DirectoryIndex hoi.html

Nu wordt hoi.html dus een index voor deze ene map, wat erg handig is, aangezien je het per map kan doen. Zoals je nu ongetwijfeld al doorhebt geeft .htaccess je heel veel handige mogelijkheden.

  • Automatisch redirecten

Wat ook al met .htaccess kan (zoals ik al zei - je kan er heel veel mee) is het automatisch redirecten naar een pagina als een andere pagina wordt opgevraagd. Dit werkt simpelweg met:

Redirect oudepagina nieuwepagina

Dit is ook toepasbaar op hele mappen door oudemap en nieuwemap te gebruiken.

  • .htaccess blokkeren

Je wilt natuurlijk niet dat mensen even vrolijk je .htaccess gaan uitlezen om te zien wat jij allemaal wel niet hebt ingesteld. Daarom blokkeren we hem:


order allow,deny
deny from all

Nu levert .htaccess een 403 op. Wat ook kan op Linux systemen is een chmod 644.

  • Directory lists blokkeren

Ook kan je met .htaccess het listen van mappen blokkeren met IndexIgnore:

IndexIgnore *

Met bovenstaande instelling mag er geen enkel type bestand gelist worden. Je kan hetzelfde doen met bijvoorbeeld *.jpg.

  • MIME types

Weet je nog dat we een regel met AddType toevoegden aan httpd.conf? Zoiets kan ook met .htaccess, bijvoorbeeld zo:

AddType application/x-shockwave-flash swf

Let er uiteraard wel op dat je het goed doet, anders heb je er niets aan

·^

Virtual Hosts

Je hebt je vast wel eens afgevraagd hoe je nou meerdere sites kan hosten met een instantie van Apache. Welnu, dat is relatief eenvoudig - de oplossing zijn zogenaamde Virtual Hosts. Een virtual host is niets anders dan een instelling voor Apache dat hij op meerdere hosts gaat luisteren. Onderaan je httpd.conf staat bijvoorbeeld dit voorbeeld:

# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#
#
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot /www/docs/dummy-host.example.com
# ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log common
#

Je kan met een Virtual Host dus ServerAdmin, ServerName, DocumentRoot, ErrorLog en TransferLog of CustomLog instellen voor elke host. Als je bijvoorbeeld dit zou doen:

 

ServerAdmin g33rt@maffehost
DocumentRoot c:/apache/apache/maffehost
ServerName 123.45.156.98
ErrorLog logs/maffehost_error
CustomLog logs/maffehost_access common

dan ben je aan het serveren voor de host 123.45.156.98 met poort 1200. De overige dingen spreken natuurlijk voor zich. Zo word bijvoorbeeld GoT geserveert met >VirtualHost gathering.tweakers.net:80> en een aangepaste documentroot.

Het kan ook gecompliceerder. Stel, je hebt een IP w.x.y.z, en 2 domeinen: www.sub.domein.org en www.domein.org, en je wilt twee verschillende sites op het domein en het subdomein. Dat zou je nu als volgt oplossen:

    Port 80
ServerName server.domain.org

NameVirtualHost w.x.y.z


DocumentRoot /www/domein
ServerName www.domein.org
...



DocumentRoot /www/subdomain
ServerName www.sub.domein.org
...

Het moge nu duidelijk zijn hoe je creatief met vhosts kan gaan :)

·^

Thanks to

Deze howto is geschreven door Geert-Jan, beter bekend als G33rt
Op- of aanmerkingen, en suggesties kunnen worden doorgegeven aan de SA moderators

·^

Lijst met figuren


·^

Inhoudsopgave





[ Voor 128% gewijzigd door elevator op 30-08-2004 16:40 . Reden: stats teller! ]