Lösung: XAMPP/Apache auf virtuellen Win2003 x64 Std. Server

Irgendwelche Probleme mit XAMPP für Windows? Dann ist hier genau der richtige Ort um nachzufragen.

Lösung: XAMPP/Apache auf virtuellen Win2003 x64 Std. Server

Postby Grendelbox » 13. January 2007 15:44

Hallo Leute,

ich hatte folgendes Problem mit XAMPP/Apache...

Ich betreibe einen virtuellen (Virtuozzo) Windows 2003 x64 Standard Server.

Auf diesem läuft eine XAMPP-Standard-Installation (aktuell v1.55) , der IIS ist NICHT installiert.

Die benutzten Services: APACHE, MYSQL und FileZilla-FTP
sind als Dienst (Startart: AUTOMATISCH) konfiguriert.

Der Webserver lief OHNE Probleme und die Webseite war erreichbar wenn ich den Apache-Dienst manuell über das Control-Panel aufstartete.

Wenn ich jedoch den virtuellen Server neu durchgestartete, waren APACHE , MYSQL und FILEZILLA Dienste zwar ohne Fehler im Eventlog gestartet, jedoch ist dann die Webseite nicht mehr erreichbar gewesen.
Sobald ich den Apache-Dienst manuell via Control-Panel stoppte und neu startete war die Webseite auch sofort wieder einwandfrei erreichbar.

Ich habe viel herumprobiert und geholfen haben letztendlich erst die folgende Massnahmen auch nur teilweise...
1)

Ich habe den Apache-Dienst durch neue Abhängigkeitsregeln so eingestellt, das er erst als allerletzter Dienst automatisch nach allen anderen Diensten aufstartet.
(Via REGEDIT die Abhängigkeitsliste des "Apache2" Dienstes entsprechend erweitert)

2)

Zudem habe ich dem Apache-Dienst eine Konten-Änderung von "Lokales System" auf mein lokales System-Administrator-Konto verpasst.

Anschliessend war das Problem behoben
und die Webseite war nun nach einem Reboot auch ohne manuelles neustarten des Apache-Dienstes sofort erreichbar.


Kann sich jemand dieses Verhalten erklären ?
Derartige Probleme habe ich jedenfalls nicht mit XAMPP 1.55 auf meinem XP SP2 Notebook.

Hatte jemand schonmal ähnliche Probleme ?
Last edited by Grendelbox on 13. January 2007 22:17, edited 1 time in total.
User avatar
Grendelbox
 
Posts: 8
Joined: 13. January 2007 14:50

KOMMANDA ZURÜCK - KOMPLETT NEUER ANSATZ !

Postby Grendelbox » 13. January 2007 22:12

Wie sich nun nach einem längeren Dauer-Reboot-Test herausstellte funktionieren auch die obigen 2 Massnahmen leider nur teilweise.
D.h. der Webseiten-Zugriff klappte auch nicht zu 100% nach jedem Reboot... :cry:

Ich habe also einen komplett anderen Ansatz versucht,
der nun auch endlich zu funktionieren scheint...
(mittlerweile > 20 Reboots und es geht noch nach jedem...)


Ich habe mittels AUTOHOTKEY (download siehe http://www.autohotkey.com) ein kleines Programm geschrieben
(Quellcode siehe unten)
und mit dem mitgelieferten Compiler zur .EXE compiliert.


1)

Eure Anpassungen im Quellcode wären die folgenden 2 Zeilen...

a) URL = http://deineURL.de/online.txt

entsprechend durch die gewünschte URL ersetzen

b) settimer, ApacheOk, 60000

Den Verzögerungsintervall bis zur nächsten Prüfung einstellen
(Die Zeit ist in Millisekunden)




Das ganze dann abspeichern als AHK-Datei (z.b. "apachecheck.ahk")
compilieren, fertig ist die .EXE


Hier der Sourcecode zum AUTOHOTKEY-Script.
Code: Select all
#Persistent
AutoTrim Off
URL = http://deineURL.de/online.txt 
settimer, ApacheOk, 60000
return
;-------------------------------------------------------------------------------------------------
ApacheOK:

xxx = % Crypt()
UrlDownloadToFile,*0 %URL%?fakeParam=%xxx%, NUL
if errorlevel
{
  CMDret_RunReturn("cmd /c net stop Apache2")
  CMDret_RunReturn("cmd /c net start Apache2")

}
return
;-------------------------------------------------------------------------------------------------
crypt(l=65)
{
  pass =
  chPool = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!"£$`%^&*()_-=+{}[]`;:``@'#~<>,./?\|¬¦
  StringSplit, list, chPool
  Loop, % l
  {
   Random, rnd, 1, % list0
   i := list%rnd%
   pass = %pass%%i%
  }
  Return, pass
}
;-------------------------------------------------------------------------------------------------
CMDret_RunReturn(CMDin)
{
  Global cmdretPID   ; for external abort
  dly := (A_BatchLines <> -1) * 50 ; needs longer delay when Batchlines <> -1

  VarSetCapacity(lpBuffer,1024)
  VarSetCapacity(sui,68, 0)
  VarSetCapacity(pi, 16, 0)
  VarSetCapacity(pa, 12, 0)
  InsertInteger( 12, pa, 0)
  InsertInteger( 1,  pa, 8)

  IF (DllCall("CreatePipe", "UInt*",hRead, "UInt*",hWrite, UInt,&pa, Int,0) <> 0) {
    InsertInteger(68,    sui, 0 )
    DllCall("GetStartupInfo", "UInt", &sui)
    InsertInteger(0x101, sui, 44)
    InsertInteger(0,     sui, 48)
    InsertInteger(hWrite,sui, 60)
    InsertInteger(hWrite,sui, 64)

    IF (DllCall("CreateProcess",Int,0,Str,CMDin,Int,0,Int,0,Int,1,UInt,0,Int,0,Int,0,UInt,&sui,UInt,&pi)<>0) {
      cmdretPID := ExtractUInt(pi, 8)
      Loop {
        IF DllCall("PeekNamedPipe",uint,hRead, uint,0, uint,0, uint,0, "UInt*",bSize, uint,0) = 0
          break
        Process Exist, %cmdretPID%
        If (ErrorLevel = 0 and bsize = 0)
          break
        If (bsize = 0) {
          Sleep %dly% ; only sleep before early continue
          Continue
        }
        VarSetCapacity(lpBuffer, bSize, 0)
        IF (DllCall("ReadFile",UInt,hRead, Str,lpBuffer, Int,bSize, "UInt*",bRead, Int,0) > 0) {
          IFEqual bRead,0, Continue
          CMDout = %CMDout%%lpBuffer%
          }
      } ; Loop
      cmdretPID =
    } ; IF CreateProcess

    DllCall("CloseHandle", UInt, hWrite)
    DllCall("CloseHandle", UInt, hRead)
  } ; IF CreatePipe

  Return CMDout
}
;-------------------------------------------------------------------------------------------------
InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4) {
   Loop %pSize%
      DllCall("RtlFillMemory", UInt,&pDest+pOffset+A_Index-1, UInt,1, UChar,pInteger >> 8*A_Index-8)
}
;-------------------------------------------------------------------------------------------------
ExtractUInt(ByRef pSource, pOffset = 0, pSize = 4) {
   Loop %pSize%
      result += *(&pSource+pOffset+A_Index-1) << 8*A_Index-8
   Return result
}
;-------------------------------------------------------------------------------------------------


2)

Im Root des Webservers (\htdocs\) eine 0-Byte grosse Textdatei namens "online.txt" anlegen.
(0 Bytes, damit kein unnötiger Traffic erzeugt wird)

3)

Auf eurerm Webserver mittels "Geplante Tasks" eine neue Task anlegen und die compilierte .EXE Datei auswählen.

- Task ausführen "Beim Systemstart"
- Ausführen als Systemadministrator (User + Pass eingeben !!!)
- Haken bei "Task beenden nach" rausnehmen, falls gesetzt




Das kleine Programm checkt dann im jeweils eingestellten Intervall im Hintergrund ob der Webserver korrekt erreichbar ist, indem es eine 0-Byte-Dummydatei downloaded und schaut ob das auch gelingt.
Dabei wird der Cache des Browsers umgangen indem 65-stellige quasi einmalige Fakeparameter beim Datei-Download anhängt werden.
Ist die Dummy-Datei nicht downloadbar, so wird der Apache-Dienst komplett neugestartet (STOP/START)



Zugegeben , die ganze Methode ist ein wenig ungewöhnlich,
aber ist bisher die einzige die mein Erreichbarkeitsproblem nun zu 100% gelöst hat.

Wenn jemand eine bessere oder andere Idee hat,
so kann Er/Sie sich jederzeit bei mir melden...

:P
User avatar
Grendelbox
 
Posts: 8
Joined: 13. January 2007 14:50


Return to XAMPP für Windows

Who is online

Users browsing this forum: No registered users and 14 guests