1. Hvad en Native Webstack består af

Komponenterne har hvert sit ansvar og kan udskiftes eller opdateres uden at vente på en samlet programpakke:

Apache
Webserveren, som modtager browserens forespørgsel og leverer siden.
PHP 8.4
Servermiljøet, som udfører PHP-programmets logik.
MariaDB
Databaseserveren, som opbevarer programmets strukturerede data.
SQL
Sproget, som bruges til at oprette, læse og ændre data i databasen.
Python
Et selvstændigt runtime-miljø til scripts, automatisering og lokale backend-tjenester.

Browseren bruger normalt adressen http://localhost/. localhost betyder denne computer.

2. Opret en tydelig mappestruktur

En kort sti uden mellemrum gør konfiguration og fejlfinding lettere. Denne struktur holder programmer, konfiguration, hemmeligheder og backup adskilt:

C:\native_webstack\
├── apache\
├── php84\
├── www\
├── secrets\
└── backups\

Kun C:\native_webstack\www skal være Apache-webroot. MariaDB og Python kan installeres i deres normale Windows-placeringer, mens projektfiler og virtuelle Python-miljøer placeres under den relevante projektmappe.

Mappen secrets må aldrig ligge under www eller tilføjes til Git.

3. Installer og konfigurer Apache

Apache-projektet udgiver kildekode, men ikke officielle færdige Windows-binærfiler. Projektets Windows-dokumentation og PHPs Windows-side henviser til eksterne distributører som Apache Lounge.

  1. Hent en aktuel 64-bit Apache 2.4-build fra den distributør, der henvises til af Apache og PHP.
  2. Installer den Microsoft Visual C++ Runtime, som den valgte build kræver.
  3. Pak Apache ud i C:\native_webstack\apache.
  4. Tilpas conf\httpd.conf, og kontrollér konfigurationen før start.

En lokal grundkonfiguration kan tage udgangspunkt i:

ServerRoot "C:/native_webstack/apache"
Listen 127.0.0.1:80
ServerName localhost:80

DocumentRoot "C:/native_webstack/www"
<Directory "C:/native_webstack/www">
    Options -Indexes
    AllowOverride All
    Require local
</Directory>

DirectoryIndex index.php index.html

Kontrollér syntaksen fra en kommandoprompt med administratorrettigheder:

C:\native_webstack\apache\bin\httpd.exe -t

Apache kan afprøves i konsollen eller installeres som en navngiven Windows-tjeneste:

C:\native_webstack\apache\bin\httpd.exe -k install -n NativeWebstackApache
C:\native_webstack\apache\bin\httpd.exe -k start -n NativeWebstackApache

Begræns Windows Firewall til lokal adgang. Listen 127.0.0.1:80 sikrer samtidig, at Apache kun lytter på denne computer.

4. Installer PHP 8.4

Ved brug af PHP som Apache-modul skal PHPs officielle Thread Safe-build anvendes. Vælg samme processorarkitektur og kompatible Visual Studio-runtime som Apache-builden.

  1. Hent PHP 8.4 Thread Safe til 64-bit Windows fra PHPs officielle Windows-side.
  2. Pak filerne ud i C:\native_webstack\php84.
  3. Kopiér php.ini-development til php.ini.
  4. Aktivér kun de udvidelser, programmerne faktisk bruger, eksempelvis curl, gd, mbstring og pdo_mysql.

Tilføj PHP-modulet i Apache-filen conf\httpd.conf:

LoadModule php_module "C:/native_webstack/php84/php8apache2_4.dll"
AddHandler application/x-httpd-php .php
PHPIniDir "C:/native_webstack/php84"

Kontrollér PHP og Apache, før tjenesten genstartes:

C:\native_webstack\php84\php.exe --version
C:\native_webstack\php84\php.exe --ini
C:\native_webstack\php84\php.exe -m
C:\native_webstack\apache\bin\httpd.exe -t

Brug php.ini-development som udgangspunkt lokalt. En offentligt tilgængelig server kræver en separat produktionskonfiguration og yderligere hardening.

5. Opret dit første PHP-program

Opret projektmappen C:\native_webstack\www\mit-program og filen index.php:

<?php
declare(strict_types=1);

$navn = 'Morten';
?>
<!doctype html>
<html lang="da">
<head>
    <meta charset="utf-8">
    <title>Mit lokale program</title>
</head>
<body>
    <h1>Hej <?= htmlspecialchars($navn, ENT_QUOTES, 'UTF-8') ?></h1>
</body>
</html>

Programmet åbnes på http://localhost/mit-program/. PHP-koden udføres af Apache; browseren modtager kun det færdige HTML-resultat.

Kontrollér filen for syntaksfejl:

C:\native_webstack\php84\php.exe -l C:\native_webstack\www\mit-program\index.php

6. Installer MariaDB og opret en database med SQL

  1. Hent MariaDB Servers officielle 64-bit MSI-installationspakke.
  2. Installer databaseinstansen som en Windows-tjeneste.
  3. Angiv et stærkt root-password, og tillad ikke ekstern root-adgang eller anonyme brugere.
  4. Bevar standardporten 3306, medmindre en anden lokal tjeneste allerede bruger den.
  5. Begræns om muligt MariaDB til 127.0.0.1 i my.ini, når databasen kun skal bruges lokalt.

Åbn MariaDB-klienten, og log ind som administrator:

mariadb -u root -p

Opret derefter en database og en begrænset programbruger. Udskift dummy-passwordet med et stærkt password:

CREATE DATABASE mit_program
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

CREATE USER 'mit_program_user'@'localhost'
    IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';

GRANT ALL PRIVILEGES ON mit_program.*
    TO 'mit_program_user'@'localhost';

Brug ikke root fra selve programmet. En enkel tabel kan oprettes sådan:

USE mit_program;

CREATE TABLE kunder (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    navn VARCHAR(150) NOT NULL,
    oprettet_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

7. Forbind PHP til MariaDB

PHPs PDO-udvidelse understøtter forberedte SQL-forespørgsler og en kontrolleret fejlhåndtering:

<?php
declare(strict_types=1);

$dsn = 'mysql:host=127.0.0.1;dbname=mit_program;charset=utf8mb4';
$bruger = 'mit_program_user';
$password = 'CHANGE_ME_STRONG_PASSWORD';

try {
    $database = new PDO($dsn, $bruger, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ]);
} catch (PDOException $exception) {
    error_log($exception->getMessage());
    exit('Databasen kunne ikke åbnes.');
}

Eksemplet bruger bevidst en dummyværdi. Rigtige passwords og andre secrets skal ligge uden for C:\native_webstack\www og må ikke gemmes i Git.

8. Installer og isoler Python

Installer Python med Python Install Manager fra Python-projektets officielle Windows-vejledning. Kontrollér derefter installationen:

python --version
python -c "print('Python er klar')"

Opret et virtuelt miljø i hvert Python-projekt, så pakker og versioner ikke blandes mellem programmer:

cd C:\native_webstack\www\mit-python-program
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip

Apache udfører ikke automatisk Python-filer. Python kan bruges direkte til lokale scripts og automatisering. Et egentligt Python-webprogram bør køre som en separat lokal tjeneste, som Apache eventuelt viderestiller til via en projektspecifik reverse proxy-konfiguration.

Installér kun de Python-pakker, det konkrete projekt kræver, og gem dem i en versionsfastlåst kravfil.

9. Backup og kontrollerede opdateringer

Tag backup af projektfiler, konfiguration og database hver for sig. Denne kommando spørger efter databasebrugerens password:

mariadb-dump -u mit_program_user -p mit_program > C:\native_webstack\backups\mit_program.sql

Gendan til en allerede oprettet, tom database med:

mariadb -u mit_program_user -p mit_program < C:\native_webstack\backups\mit_program.sql

Opdater én komponent ad gangen. Gem de eksisterende konfigurationsfiler, læs versionsnoterne, kontrollér kompatibilitet og test programmerne, før den gamle installation fjernes.

Kontrollér de aktive versioner efter en opdatering:

C:\native_webstack\apache\bin\httpd.exe -V
C:\native_webstack\php84\php.exe --version
mariadb --version
python --version

Gem backup på et andet drev eller et andet sikkert medie, og afprøv jævnligt, at den kan gendannes.

10. Fejlfinding og sikker lokal drift

ProblemKontrol
Apache starter ikkeKør httpd.exe -t, kontrollér port 80 og 443, og læs Apache-fejlloggen.
PHP-koden vises som tekstKontrollér LoadModule, AddHandler og PHPIniDir, og genstart Apache.
En PHP-udvidelse manglerKontrollér den aktive php.ini med php.exe --ini og den indlæste modulliste med php.exe -m.
MariaDB starter ikkeKontrollér Windows-tjenesten, port 3306 og MariaDB-fejlloggen. Tag backup, før datafiler repareres.
Databaseforbindelsen fejlerVerificér host, databasenavn, bruger, password, rettigheder og at pdo_mysql er aktiv.
Python findes ikkeGenåbn terminalen, kontrollér Python Install Manager, og kør python --version.
Siden findes ikkeKontrollér Apache DocumentRoot, projektmappen og at URL'en svarer til mappenavnet.

Kilder og officielle vejledninger