Skip to content

How to Start and Stop Apache HTTP Server from a Batch Script

Learn how to automate Apache HTTP Server startup, shutdown, and restart on Windows using Batch scripts, including service management, configuration testing, and deployment workflows.

Apache HTTP Server (commonly called Apache or httpd) is one of the most popular web servers in the world. While typically associated with Linux, Apache runs natively on Windows and can be fully managed from Batch scripts. Automating Apache's startup, shutdown, and restart operations is essential for deployment workflows, maintenance windows, and service monitoring on Windows servers.

In this guide, we will explore how to start, stop, and manage the Apache HTTP Server from a Batch Script, covering both standalone and service-based installations.

Prerequisites

Apache HTTP Server for Windows is typically installed in a directory like C:\Apache24. The primary executables are:

File Purpose
httpd.exe The Apache HTTP Server executable
httpd.exe -k start Start Apache as a console application
httpd.exe -k stop Stop a running Apache instance
httpd.exe -k restart Restart Apache (graceful)
httpd.exe -k install Install Apache as a Windows service

Method 1: Basic Start and Stop

@echo off
setlocal

set "APACHE_HOME=C:\Apache24"

if not exist "%APACHE_HOME%\bin\httpd.exe" (
    echo [ERROR] Apache not found at: %APACHE_HOME%
    pause
    exit /b 1
)

if "%~1"=="" (
    echo Usage: apache.bat [start^|stop^|restart]
    pause
    exit /b 1
)

if /i "%~1"=="start" (
    echo Starting Apache HTTP Server...
    "%APACHE_HOME%\bin\httpd.exe" -k start
    echo [OK] Start command issued.
) else if /i "%~1"=="stop" (
    echo Stopping Apache HTTP Server...
    "%APACHE_HOME%\bin\httpd.exe" -k stop
    echo [OK] Stop command issued.
) else if /i "%~1"=="restart" (
    echo Restarting Apache HTTP Server...
    "%APACHE_HOME%\bin\httpd.exe" -k restart
    echo [OK] Restart command issued.
) else (
    echo [ERROR] Unknown command: %~1
    echo Usage: apache.bat [start^|stop^|restart]
    exit /b 1
)

pause

Method 2: Service-Based Management

When Apache is installed as a Windows service (recommended for production):

@echo off
setlocal

set "APACHE_HOME=C:\Apache24"
set "service_name=Apache2.4"

:: Verify Admin (required for service management)
net session >nul 2>&1
if %errorlevel% neq 0 (
    echo [ERROR] Administrator privileges required.
    pause
    exit /b 1
)

if "%~1"=="" (
    echo =============================================
    echo   APACHE SERVICE MANAGEMENT
    echo =============================================
    echo.
    echo Current status:
    sc query "%service_name%" >nul 2>&1

    if errorlevel 1 (
        echo   Service "%service_name%" is not installed.
    ) else (
        for /f "tokens=3*" %%A in ('sc query "%service_name%" ^| findstr /i "STATE"') do (
            echo   STATE: %%A %%B
        )
    )
    echo.
    echo Usage: apache_svc.bat [start^|stop^|restart^|status^|install^|uninstall]
    pause
    exit /b 0
)

if /i "%~1"=="install" (
    if not exist "%APACHE_HOME%\bin\httpd.exe" (
        echo [ERROR] Apache not found at: %APACHE_HOME%
        exit /b 1
    )
    echo Installing Apache as service "%service_name%"...
    "%APACHE_HOME%\bin\httpd.exe" -k install -n "%service_name%"
) else if /i "%~1"=="uninstall" (
    echo Removing service "%service_name%"...
    net stop "%service_name%" >nul 2>&1
    "%APACHE_HOME%\bin\httpd.exe" -k uninstall -n "%service_name%"
) else if /i "%~1"=="start" (
    echo Starting Apache service...
    net start "%service_name%"
) else if /i "%~1"=="stop" (
    echo Stopping Apache service...
    net stop "%service_name%"
) else if /i "%~1"=="restart" (
    echo Restarting Apache service...
    net stop "%service_name%" >nul 2>&1
    timeout /t 3 /nobreak >nul
    net start "%service_name%"
) else if /i "%~1"=="status" (
    sc query "%service_name%"
) else (
    echo [ERROR] Unknown command: %~1
    echo Usage: apache_svc.bat [start^|stop^|restart^|status^|install^|uninstall]
    exit /b 1
)

pause

Method 3: Start with Configuration Test and Health Check

Always verify the configuration before starting:

@echo off
setlocal enabledelayedexpansion

set "APACHE_HOME=C:\Apache24"
set "service_name=Apache2.4"
set "health_url=http://localhost:80"
set "max_retries=10"
set "retry_delay=3"
set "http_timeout=3"

if not exist "%APACHE_HOME%\bin\httpd.exe" (
    echo [ERROR] Apache not found at: %APACHE_HOME%
    exit /b 1
)

echo =============================================
echo   APACHE HTTP SERVER STARTUP
echo =============================================
echo.

:: Step 1: Test configuration
echo [1/3] Testing configuration...
"%APACHE_HOME%\bin\httpd.exe" -t 2>&1 | findstr /i "Syntax OK" >nul

if %errorlevel% neq 0 (
    echo       [FAIL] Configuration error:
    "%APACHE_HOME%\bin\httpd.exe" -t
    pause
    exit /b 1
)
echo       Syntax OK.

:: Step 2: Start
echo [2/3] Starting Apache...
net start "%service_name%" >nul 2>&1
if !errorlevel! neq 0 (
    echo       [FAIL] Could not start service "%service_name%".
    echo       Check: sc query "%service_name%"
    exit /b 1
)

:: Step 3: Health check
echo [3/3] Verifying...
set "attempt=0"

:check
set /a attempt+=1

powershell -NoProfile -Command ^
    "try {" ^
    "    $r = Invoke-WebRequest -Uri '%health_url%' -UseBasicParsing -TimeoutSec %http_timeout%;" ^
    "    if ($r.StatusCode -eq 200) { exit 0 } else { exit 1 }" ^
    "} catch { exit 1 }" >nul 2>&1

if !errorlevel!==0 (
    echo.
    echo [SUCCESS] Apache is running at %health_url%
    exit /b 0
)

if !attempt! geq %max_retries% (
    echo.
    echo [ERROR] Apache did not respond after !attempt! attempts.
    echo Check error log: %APACHE_HOME%\logs\error.log
    exit /b 1
)

echo       Attempt !attempt!/%max_retries%...
timeout /t %retry_delay% /nobreak >nul
goto check

Method 4: Apache Management Console

@echo off
title Apache HTTP Server Manager
setlocal enabledelayedexpansion

set "APACHE_HOME=C:\Apache24"
set "service_name=Apache2.4"

if not exist "%APACHE_HOME%\bin\httpd.exe" (
    echo [ERROR] Apache not found at: %APACHE_HOME%
    pause
    exit /b 1
)

:menu
cls
echo =============================================
echo   APACHE HTTP SERVER MANAGER
echo   Home: %APACHE_HOME%
echo =============================================
echo.

:: Check status
set "status_text=STOPPED"
sc query "%service_name%" 2>nul | findstr "RUNNING" >nul
if !errorlevel!==0 (
    set "status_text=RUNNING"
)
echo   Status: !status_text!

echo.
echo   [1] Start
echo   [2] Stop
echo   [3] Restart (graceful^)
echo   [4] Test configuration
echo   [5] View error log (last 30 lines^)
echo   [6] View access log (last 20 lines^)
echo   [7] Show loaded modules
echo   [8] Show virtual hosts
echo   [0] Exit
echo.
set /p "choice=Select: "

if "!choice!"=="1" (
    echo.
    net start "%service_name%"
    timeout /t 3 /nobreak >nul
    goto menu
)

if "!choice!"=="2" (
    echo.
    net stop "%service_name%"
    timeout /t 3 /nobreak >nul
    goto menu
)

if "!choice!"=="3" (
    echo.
    "%APACHE_HOME%\bin\httpd.exe" -t >nul 2>&1
    if !errorlevel!==0 (
        "%APACHE_HOME%\bin\httpd.exe" -k restart
        echo [OK] Graceful restart initiated.
    ) else (
        echo [ERROR] Config error. Not restarting. Run option [4] for details.
    )
    pause
    goto menu
)

if "!choice!"=="4" (
    echo.
    "%APACHE_HOME%\bin\httpd.exe" -t
    pause
    goto menu
)

if "!choice!"=="5" (
    echo.
    echo Error log (last 30 lines^):
    echo ============================
    if exist "%APACHE_HOME%\logs\error.log" (
        powershell -NoProfile -Command ^
            "Get-Content '%APACHE_HOME%\logs\error.log' -Tail 30"
    ) else (
        echo   No error.log found.
    )
    pause
    goto menu
)

if "!choice!"=="6" (
    echo.
    echo Access log (last 20 lines^):
    echo =============================
    if exist "%APACHE_HOME%\logs\access.log" (
        powershell -NoProfile -Command ^
            "Get-Content '%APACHE_HOME%\logs\access.log' -Tail 20"
    ) else (
        echo   No access.log found.
    )
    pause
    goto menu
)

if "!choice!"=="7" (
    echo.
    "%APACHE_HOME%\bin\httpd.exe" -M
    pause
    goto menu
)

if "!choice!"=="8" (
    echo.
    "%APACHE_HOME%\bin\httpd.exe" -S
    pause
    goto menu
)

if "!choice!"=="0" exit /b 0

echo [ERROR] Invalid selection.
timeout /t 2 /nobreak >nul
goto menu

Method 5: Deployment with Apache Restart

Deploy updated web content and restart Apache:

@echo off
setlocal enabledelayedexpansion

set "APACHE_HOME=C:\Apache24"
set "service_name=Apache2.4"
set "web_root=%APACHE_HOME%\htdocs\mysite"
set "source=C:\Build\Output\website"
set "health_url=http://localhost/"
set "http_timeout=5"

if not exist "%APACHE_HOME%\bin\httpd.exe" (
    echo [ERROR] Apache not found at: %APACHE_HOME%
    exit /b 1
)

if not exist "%source%\" (
    echo [ERROR] Source directory not found: %source%
    exit /b 1
)

echo =============================================
echo   DEPLOY AND RESTART
echo =============================================
echo.

:: Step 1: Test config
echo [1/4] Validating configuration...
"%APACHE_HOME%\bin\httpd.exe" -t >nul 2>&1
if !errorlevel! neq 0 (
    echo [ABORT] Configuration error:
    "%APACHE_HOME%\bin\httpd.exe" -t
    exit /b 1
)
echo       OK.

:: Step 2: Deploy files
echo [2/4] Deploying...
robocopy "%source%" "%web_root%" /mir /r:2 /w:3 /np /ndl /nfl >nul
set "robo_result=!errorlevel!"
if !robo_result! leq 3 (
    echo       Files updated.
) else (
    echo       [ERROR] File deployment failed (robocopy exit: !robo_result!^).
    exit /b 1
)

:: Step 3: Graceful restart
echo [3/4] Restarting Apache...
"%APACHE_HOME%\bin\httpd.exe" -k restart

:: Step 4: Verify
echo [4/4] Verifying...
timeout /t 3 /nobreak >nul

powershell -NoProfile -Command ^
    "try {" ^
    "    $r = Invoke-WebRequest -Uri '%health_url%' -UseBasicParsing -TimeoutSec %http_timeout%;" ^
    "    if ($r.StatusCode -eq 200) { Write-Host '[OK] Apache responding. HTTP 200'; exit 0 }" ^
    "    else { Write-Host ('[WARNING] HTTP ' + $r.StatusCode); exit 1 }" ^
    "} catch { Write-Host ('[FAIL] ' + $_.Exception.Message); exit 1 }"

if !errorlevel! neq 0 (
    echo [WARNING] Apache may not be responding correctly. Check error.log.
)

pause

Common Mistakes

The Wrong Way: Restarting Without Config Test

:: WRONG - If config has errors, Apache shuts down and cannot restart
net stop Apache2.4
:: Edit httpd.conf with a typo...
net start Apache2.4
:: FAIL - Apache does not start. Site is down!

Output Concern: If you stop Apache and then discover a configuration error, the server remains down. Always test the configuration with httpd.exe -t before any stop/restart operation.

The Wrong Way: Running as Console App in Production

:: WRONG for production - Stops when the user logs off
C:\Apache24\bin\httpd.exe

Running Apache as a console application ties it to the current user session. When the user logs off, Apache stops. Install it as a Windows service for production use.

Best Practices

  1. Test configuration before restart: Always run httpd.exe -t first.
  2. Use Windows service for production: Services auto-start on boot and survive logoffs.
  3. Use graceful restart: -k restart allows active connections to complete before recycling workers.
  4. Monitor error logs: Check logs/error.log when Apache fails to start or behaves unexpectedly.
  5. Verify after restart: Run a health check to confirm Apache is responding.

Conclusion

Starting and stopping Apache HTTP Server from a Batch Script involves either calling httpd.exe directly with -k commands or managing the Windows service with net start/net stop. The critical best practice is always testing the configuration with httpd.exe -t before any restart to prevent downtime from syntax errors. By combining configuration validation, graceful restarts, health checking, and log monitoring into management scripts, administrators maintain reliable Apache operations on Windows servers.

Navigation