echo $ENV:JAVA_HOME
echo $ENV:JRE_HOME
----
==== Oracle ORDS 3.0 (Oracle REST Data Services) installieren/konfigurieren====
Die ORDS Zip Datei überprüfen und auspacken, zum Beispiel nach "d:\oracle\products\ords.3.0.4"
===Überprüfen===
mkdir D:\oracle\product\ords.3.0.4
cd D:\oracle\product\ords.3.0.4
cp C:\Users\gpipperr.jupiter\Downloads\ords.3.0.4.60.12.48.zip D:\oracle\product\ords.3.0.4
Get-FileHash .\ords.3.0.4.60.12.48.zip -Algorithm md5
Algorithm Hash
--------- ----
MD5 185BF02DE71E8B6E3E61762FDB49E8BB
===Auspacken===
unzip ords.3.0.4.60.12.48.zip
rm ords.3.0.4.60.12.48.zip
Mit „mklink“ ein Verzeichnis „ords“ anlegen
===ORDS konfigurieren und in der ORDS Schemas in der DB installieren===
Voraussetzung APEX installiert => [[prog:oracle_apex_install_windows_12c|Oracle Apex 5.0.1 mit der Oracle Datenbank 12c]]:
* APEX 5 installiert
* APEX Listener Schema angelegt + Password aufgeschrieben!
Im ersten Schritt wird der ORDS Standalone konfiguriert und getestet um eine gültige Konfiguration zu erhalten.
Siehe dazu => [[prog:first_steps_oracle_rest_data_service#die_standalone_variante_aufsetzen|Oracle ORDS 3.0 (Oracle REST Data Services)]]
Nach diesem Schritt wird der ORDS in Tomcat integriert
----
==== Apache Tomcat 8 installieren ====
===Arbeitsverzeichnis ===
Verzeichnis für Tomcat anlegen, wie D:\srv
mkkdir D:\srv\tomcat8
===Überprüfen===
Testen ob der Download geklappt hat und die Datei auch wirklich die erwartete Datei ist.
Auf der Apache Website ist folgender MD5 Hash hinterlegt: "7f1c6a4d666b9c76ef3b72038c5a891e *apache-tomcat-8.0.33-windows-x64.zip"
Testen mit:
cd D:\srv\
cp C:\Users\gpipperr\Downloads\apache-tomcat-8.0.33-windows-x64.zip D:\srv
Get-FileHash apache-tomcat-8.0.33-windows-x64.zip -Algorithm MD5
Algorithm Hash
--------- ----
MD5 7F1C6A4D666B9C76EF3B72038C5A891E
Sieht gut aus, dann können wir weitermachen
===Auspacken===
unzip apache-tomcat-8.0.33-windows-x64.zip
# Verzeichniss wird angelegt
# zip wieder entfernen
rm .\apache-tomcat-8.0.33-windows-x64.zip
Das Verzeichnis apache-tomcat-8.0.33 mit dem aktuellen Tomcat wird angelegt.
===Verlinken===
Damit wir nicht bei jedem Update neue Ordnerstrukturen benötigen, versuchen wir jetzt auch mal unter Windows wie unter Linux mit einem Link zu arbeiten, leider lässt sich "[[https://technet.microsoft.com/en-us/library/cc753194.aspx|mklink]]" aber nur unter der alten Dos Schell aufrufen ...
Administrative Powershell starten:
#Anleitung
cmd.exe /c mklink.exe
#link setzen, auf die /d option achten!
cmd.exe /c mklink /d d:\srv\tomcat8 d:\srv\apache-tomcat-8.0.33
===Tomcat Konfigurieren===
Apache Tomcat wird über die folgenden vier Dateien konfiguriert:
* server.xml
* context.xml
* tomcat-users.xml
* web.xml
Die Dateien liegen unter TOMCAT_HOME\conf Verzeichnis
==TCP Port setzen - server.xml ==
Über "server.xml" wird der Port gesetzt, der Default ist 8080.
Soll der Port verändert werden, zum Beispiel auf 8090, folgende Zeile suchen und anpassen:
==Admin User konfigurieren - tomcat-users.xml ==
Über die Datei tomcat-users.xml wird der Admin User für die Admin Oberfläche konfiguriert, dazu werden bestimmte Rollen benötigt
* manager-gui - allows access to the HTML GUI and the status pages
* manager-script - allows access to the text interface and the status pages
* manager-jmx - allows access to the JMX proxy and the status pages
* manager-status - allows access to the status pages only
===Tomcat starten ===
Über die Datei startup.bat im TOMCAT_HOME\bin Verzeichnis kann der Tomcat gestartet werden.
set-item -path ENV:JAVA_HOME -value "C:\Program Files\Java\jdk1.8.0_72"
set-item -path ENV:JRE_HOME -value $ENV:JAVA_HOME
cd D:\srv\tomcat8\bin
& .\startup.bat
Dos Fenster mit dem Tomcat Start Ausgaben öffnet sich.
Firewall Anfrage mit "Allow" beantworten.
Aufruf der Tomcat Oberfläche mit **
#link setzen
cmd.exe /c mklink /d D:\srv\apache-tomcat-8.0.33\webapps\i D:\oracle\apex5\images
symbolic link created for D:\srv\apache-tomcat-8.0.33\webapps\i <<===>> D:\oracle\apex\images
Bisher scheint das dann bei der späteren Verwendung von APEX zu klappen!
----
==== ORDS War File deployen ====
Nun die Datei "ords.war" aus D:\oracle\products\ords.3.0.4 nach TOMCAT_HOME\webapps kopieren.
cp D:\oracle\products\ords.3.0.4\ords.war D:\srv\apache-tomcat-8.0.33\webapps
Läuft Tomcat noch, sieht man nun in der Console, dass die war datei deployed wird unter TOMCAT_HOME\webapps\ords liegt nun die ORDS Web Applikation.
Überprüfen ob das nun schon über **
config.dir
D:\srv\ords
=== Script für den Start anlegen ===
#Java Settings
set-item -path ENV:JAVA_HOME -value "D:\Java\8.92"
set-item -path ENV:JRE_HOME -value $ENV:JAVA_HOME
#Tomcat
set-item -path ENV:TOMCAT_HOME -value "D:\srv\tomcat8"
cd $ENV:TOMCAT_HOME\bin\
& "$ENV:TOMCAT_HOME\bin\startup.bat"
Nun kann bei Bedarf über das Script der Tomcat inkl. ORDS gestartet werden.
----
==== Apache Tomcat 8 als Service unter Windows einrichten ====
Am einfachsten geht das mit dem Programm unter $TOMCAT_HOME/bin/tomcat8.exe
Aus der Doku:
Install the service named 'Tomcat8':
cd %TOMCAT_HOME%/bin
service.bat install Tomcat8
Kontrolle mit **TOMCAT_HOME/bin/tomcat8w.exe**
Siehe auch unter https://tomcat.apache.org/tomcat-8.0-doc/windows-service-howto.html
Läuft die Datenbank auch auf dem gleichen Server, noch eine Abhängigkeit der Dienste einrichten, damit die DB auch wirklich schon VOR dem Tomcat läuft!
sc config Tomcat8 depend=OracleOraDB12Home1TNSListener/OracleServiceORCL
Das muss allerdings nicht immer 100% klappen, es wird ja nur geprüft ob der Service der DB läuft, nicht ob die DB auch schon Verbindungen annehmen kann!
----
==== Apache Tomcat härten ====
Nach dem ersten Test ob alles funktioniert wie erwartet muss unbedingt
unzip .\httpd-2.4.20-win64-VC14.zip -d D:\srv
Mod_JK in das Module Verzeichnis kopieren:
unzip .\mod_jk-1.2.41-win64-VC14.zip -d D:\srv\Apache24\modules
=== Apache als Service einrichten ===
Apache mit "httpd -k install" als Service einrichten.
=== Apache konfigurieren ===
Pfade in der httpd.conf anpassen und Verweise auf die Apex Konfiguration aufnehmen:
..
ServerRoot "D:\srv\Apache24"
..
DocumentRoot D:\oracle\apex_public
..
ScriptAlias /cgi-bin/ "D:\srv\Apache24\cgi-bin"
..
ServerName 12cwin2012ora01.pipperr.local
..
#Module aktiveren
LoadModule expires_module modules/mod_expires.so
LoadModule rewrite_module modules/mod_rewrite.so
# für Mod_jk
include d:\srv\Apache24\conf\apex.conf
include d:\srv\Apache24\conf\jk.conf
#alternativ für mod_proxy_ajp
#include d:\srv\Apache24\conf\apex_proxy.conf
Eine eigenen Konfigurationsdatei unter "d:\srv\Apache24\conf" wie apex_jk.conf anlegen, diese kann dann auch so später in den virtuellen Host für SSL referenziert werden, daher die mod_jk Konfiguration in eine eigenen Datei ausgelagert.
apex.conf:
#----------------
# Apex Images under i
#----------------
Alias /i D:\oracle\apex\images
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
# Send servlet for context /examples to worker named worker1
JkMount /ords/* worker1
Damit es später leichter wird SSL einzubinden, die JWorker Konfiguration in eine eigene conf Datei auslagern:
jk.conf:
#-----------------
# mod_jk configuratoin
#-----------------
# Load mod_jk module
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile D:\srv\Apache24\conf\workers.properties
# Where to put jk logs
JkLogFile D:\srv\Apache24\logs\mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
Datei "workers.properties" anlegen:
# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300
#----------------
# Apex Images under i
#----------------
Alias /i D:\oracle\apex\images
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
#----------------
#enable ajp
#----------------
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
ProxyRequests Off
Order allow,deny
Allow from all
# Alles weiterleiten auf Tomcat
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
=== Apache Starten ===
Starten:
& .\httpd.exe
Testen ob nun über **
mkdir D:\srv\cert
cd D:\srv\cert
# Um Fehlermeldngen beim Anlegen vermeiden:
cp D:\srv\Apache24\conf\openssl.cnf D:\srv\cert
set-item -path ENV:RANDFILE -value D:\srv\cert\.rnd
set-item -path ENV:OPENSSL_CONF -value D:\srv\cert\openssl.cnf
# passphrase beim Anlegen des Keys angeben und aufschreiben!
D:\srv\Apache24\bin\openssl genrsa -des3 -out server.pem 1024
Generating RSA private key, 1024 bit long modulus
..............................++++++
....++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
PS D:\srv\cert> D:\srv\Apache24\bin\openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
................++++++
.++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
# Key entschlüsslen
D:\srv\Apache24\bin\openssl rsa -in .\server.pem -out server.key
Enter pass phrase for .\server.key:
writing RSA key
# unsigned certificate CSR bzw Certificate Signing Request daraus anlegen
D:\srv\Apache24\bin\openssl req -new -key .\server.key -out server.csr
Enter pass phrase for .\server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Bavaria
Locality Name (eg, city) []:Munich
Organization Name (eg, company) [Internet Widgits Pty Ltd]:GPI Consult
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:12CWIN2012ORA01.pipperr.local
Email Address []:info@pipperr.de
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Dieses Zertifikat muss nun an eine CR gesandt werden, zum Beispiel die von der aktuellen Windows Domain wie
D:\srv\Apache24\bin\openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=DE/ST=Bavaria/L=Munich/O=GPI Consult/OU=IT/CN=12CWIN2012ORA01.pipperr.local/emailAddress=info@pipperr.de
Getting Private key
Enter pass phrase for server.key:
===Zertifikat in Apache einbinden===
Anpassen der httpd.conf
Mod SSL einkommentieren und dass laden der SSL Konfiguration enablen:
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
# Secure (SSL/TLS) connections
Include conf/extra/httpd-ssl.conf
Die SSL Conf D:\srv\Apache24\conf\extra\httpd-ssl.conf anpassen:
#Nur noch TLSv1.2
SSLCipherSuite HIGH:MEDIUM:!SSLv3:!kRSA
SSLProxyCipherSuite HIGH:MEDIUM:!SSLv3:!kRSA
SSLProtocol +TLSv1.2 +TLSv1.1 +TLSv1
SSLProxyProtocol +TLSv1.2 +TLSv1.1 +TLSv1
SSLSessionCache "shmcb:d:/srv/Apache24/logs/ssl_scache(512000)"
#Virtual Host Einstellungen anpassen!
DocumentRoot "D:\oracle\apex_public"
ServerName 12cwin2012ora01.pipperr.local:443
ServerAdmin info@pipperr.de
ErrorLog "d:/srv/Apache24/logs/error.log"
TransferLog "d:/srv/Apache24/logs/access.log"
# Pfade zu den Zertifikaten anpassen
SSLCertificateFile "d:/srv/cert/server.crt"
SSLCertificateKeyFile "d:/srv/cert/server.pem"
SSLOptions +StdEnvVars
CustomLog "d:/srv/Apache24/logs/ssl_request.log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
Nachdem SSL nun funktioniert, muss der Pfad zu dem ORDS noch von der Apache Konfiguration unter Port 80 auf Port 443 umgezogen werden.
SSL Conf D:\srv\Apache24\conf\extra\httpd-ssl.conf:
##### APEX ###########
Include D:\srv\Apache24\conf\apex.conf
Da nur noch SSL eingesetzt werden soll, in der httpd.conf den APEX Include auskommentieren und per Mod Rewrite immer auf SSL umschalten!
##### use only SSL
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule (.*) https://%{SERVER_NAME}$1 [R,L]
Nun kann der Apache neu gestartet werden und SSL getestet werden.
Mit Openssl:
D:\srv\Apache24\bin\openssl s_client -connect 10.10.10.180:443
...
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
...
Alternativ testen mit SSLyze - Fast and full-featured SSL scanner => https://github.com/nabla-c0d3/sslyze
sslyze-master.zip jerunterladen und in eine Verzeichnis wie C:\tools auspacken:
#Vorraussetzung nassl installiertn
C:\Python27\python.exe -m pip install nassl
#test starten
C:\Python27\python.exe C:\tools\sslyze-master\sslyze_cli.py --regular 10.10.10.180:443
----
====Log Rotate der Apache Logs einbinden====
Unter Windows können die Logs vom Apache nicht so einfach im laufenden Betrieb gelöscht werden, per Pipe Mechanismus werden daher die Log Informationen an einen eigenen Prozesse geschicket, der jeden Tag eine neue Datei anlegt.
In der http.conf:
#ErrorLog "logs/error.log"
ErrorLog "|bin/rotatelogs.exe -l D:/srv/Apache24/logs/error.%Y.%m.%d.log 86400"
#CustomLog "logs/access.log" common
CustomLog "|bin/rotatelogs.exe -l D:/srv/Apache24/logs/access.%Y.%m.%d.log 86400" common
D:\srv\Apache24\conf\extra\httpd-ssl.conf:
#ErrorLog "d:/srv/Apache24/logs/error.log"
#TransferLog "d:/srv/Apache24/logs/access.log"
#CustomLog "d:/srv/Apache24/logs/ssl_request.log" \
# "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ErrorLog "|bin/rotatelogs.exe -l D:/srv/Apache24/logs/ssl_error.%Y.%m.%d.log 86400"
TransferLog "|bin/rotatelogs.exe -l D:/srv/Apache24/logs/ssl_access.%Y.%m.%d.log 86400"
CustomLog "|bin/rotatelogs.exe -l D:/srv/Apache24/logs/ssl_request.%Y.%m.%d.log 86400" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
Aufräumen mit der Powershell (alles löschen was älter als 30 Tage ist):
#testen mit dem -WhatIf Flag
Get-ChildItem 'D:\srv\Apache24\logs\*.log' | Where {$_.lastwritetime -lt (Get-Date).AddDays(-30)} | Remove-Item -Force -WhatIf
#Produktiv löschen
Get-ChildItem 'D:\srv\Apache24\logs\*.log' | Where {$_.lastwritetime -lt (Get-Date).AddDays(-30)} | Remove-Item -Force
----
==== Tomcat Härten ====
Nur noch Zugriff auf Tomcat über "localhost" erlauben (address="127.0.0.1" hinzufügen), dazu server.xml anpassen.
server.xml:
...
...
----
===== Single Sign on mit Apache einrichten =====
=== Linux Kerberos ===
Unter Linux muss nun **mod_auth_kerb** eingebunden werden, soll allerdings das auch unter Windows verwendet werden, scheitert es daran, das für Windows das Modul so nicht vorliegt.
So würde das dann unter Linux laufen => * http://de.slideshare.net/nielsdb/mt-ag-howtosingle-signonforapexapplicationsusingkerberos-46435415
=== Windows NTLM ===
Alternativ unter Windows ist noch NTLM mit **Mod Auth NTLM ** möglich, allerdings ist NTLM bereits etwas veraltet und gilt nicht als 100% sicher.
Ein NTLM Modul für Windows kann hier gefunden werden
=> http://www.apachehaus.com/cgi-bin/download.plx#MODULES24VC14
* Mod Auth NTLM for Apache 2.4.x x64 mod_authn_ntml-1.0-2.4.x-x64-vc14.zip
Modul auspacken und in das Apache Modul Verzeichnis kopieren, in meinen Beispiel D\srv\Apache24\modules .
Auf Basis der beiliegenden README.txt die apex_jk.conf Konfiguration ergänzen:
LoadModule auth_ntlm_module modules/mod_authn_ntlm.so
LoadModule headers_module modules/mod_headers.so
AuthName "APEX Workspace"
AuthType SSPI
NTLMAuth On
NTLMAuthoritative On
Require valid-user
#require sspi-user EMEA\group_name
# use this to add the authenticated username to you header
# so any backend system can fetch the current user
# rewrite_module needs to be loaded then
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1]
RequestHeader set WIN_USER %{RU}e
Im Header wird in der Variablen WIN_USER der aktuellen User hinterlegt, alle Applikationen hinter dem Single Sign on sind nun offen! In der Applikation selber muss bei Bedarf das dann noch besser im Detail angepasst werden.
== Testen von Linux aus ==
Test mit curl und NTLM Auth:
curl -v -k https://myapexserver/ords/ --ntlm -u DOMAIN\\username:password
=== Kerberos auf Tomcat Ebene ===
Alternativ noch in Tomcat die Security aufsetzen, siehe zum Beispiel => https://dzone.com/articles/do-not-publish-configuring-tomcat-single-sign-on-w und https://community.oracle.com/message/12748733
=== Alternativ ISS unter Windows einsetzen ===
Siehe hierzu auch => http://de.slideshare.net/nielsdb/mt-ag-howtosingle-signonforapexapplicationsusingkerberos-46435415
=== SAML 2 ===
Über SAML => https://en.wikipedia.org/wiki/SAML_2.0
siehe => https://www.ukoug.org/what-we-offer/library/integrating-apex-with-a-federated-environment-for-single-sign-on-using-saml-20-jon-tupman/1jon-tupman.pdf
----
==== Apex Authentication Scheme einrichten ====
Die Windows Anmeldung wird nun mit der Single Sign On Konfiguration an die Applikation weitergereicht.
Damit sich der User nun nicht nochmal anmelden muss, muss in APEX das "Authentification Scheme" auf Applikationsebene gesetzt werden.
* In der Applikation auf "Shared Components" klicken, "Authentication Schemes" auswählen {{ :prog:apex:apex_single_sign_on_01.png?direct&300 | Authentication Schemes anlegen }}
* Create Button rechte wählen
* Vorlage auswählen : Based on a pre-configured scheme from the gallery => Next{{ :prog:apex:apex_single_sign_on_02.png?direct&300 | Authentication Schemes anlegen}}
* Nun einen Namen vergeben und die Methode HTTP HEADER Variable auswählen {{ :prog:apex:apex_single_sign_on_03.png?direct&300 |Authentication Schemes anlegen}}
* Hinterlegen in welchen Header Feld der Username steht {{ :prog:apex:apex_single_sign_on_04.png?direct&300 | Authentication Scheme Header Variable hinterlegen}}
* Speichern
In den Application Settings prüfen ob auch das richtige Schema gewählt wurde:
{{ :prog:apex:apex_single_sign_on_05.png | Authentication Schemes überprüfen }}
Nun kann der Test beginnen ob das auch geklappt hat.
Außerhalb der Domaine sollte jetzt eine Benutzerabfrage erfolgen, angemeldet an der Domain sollte sich die Applikation ohne Login starten lassen.
Debuggen:
Klappt es nicht, die Header Variablen auf einer Seite mit Hilfe von "owa_util.print_cgi_env;" anzeigen lassen (Page mit einer Region auf PL/SQL Basis):
begin
htp.p(owa_util.get_cgi_env('WIN_USER'));
htp.p('');
owa_util.print_cgi_env
end;
Um nun noch den Zugriff auf die einzelnen Seite in Apex zu steuern siehe hier => [[prog:oracle_apex_active_directory_integration|Oracle Apex 5 Securtiy und Microsoft Active Directory Integration]]
----
----
==== Quellen ====
ORDS:
* http://docs.oracle.com/cd/E56351_01/doc.30/e56293/toc.htm
* http://www.opal-consulting.de/downloads/presentations/2015-11-DOAG-ORDS-Setup/2015-11-DOAG-ORDS-in-production.pdf
Tomcat:
* http://www.c-sharpcorner.com/UploadFile/fd0172/how-to-configure-and-install-apache-tomcat-server-in-windows/
Apache:
* http://www.apachelounge.com/download/contr/Perf-tun-srv-2012.docx
* http://www.microhowto.info/howto/configure_apache_to_use_kerberos_authentication.html
AJP
* https://confluence.sakaiproject.org/display/~steve.swinsburg/Fronting+Tomcat+with+Apache+via+mod_proxy_ajp
Single-Sign-On
* http://de.slideshare.net/nielsdb/mt-ag-howtosingle-signonforapexapplicationsusingkerberos-46435415
* http://blog.hallowelt.com/wp-content/uploads/SSO_mit_mod_auth_kerb_v3.pdf
* https://www.schaeuffelhut-berger.de/blog/2014/01/apache-ads-sso/
APEX Security Möglichkeiten
* http://de.slideshare.net/Enkitec/making-sense-of-apex-security-by-christoph-ruepprich
Quellen zu SSL
* => https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html
* => https://wiki.apache.org/httpd/NameBasedSSLVHosts
* => https://www.apachelounge.com/download/contr/InstallingApacheonWindows.pdf
Log Rotate => http://theheat.dk/blog/?p=1353