Tutorial 1: Create apache dynamic vhost file with php from mysql

Door xleeuwx op maandag 26 mei 2014 16:27 - Reacties (24)
Categorie: PHP Scripts, Views: 5.783

Voorwoordje

Het probleem:
Omdat de groei van klanten sterk toe nam kwam er de vraag om dit proces van website's aan te maken te versoepelen.
Eerst werd er handmatig in een apparte vhost file de website's aangepast met alle gevolgen en problemen. Terwijl alle data al beschikbaar was in de database inverband met facturatie.
Dus de vraag kwam om een script te maken dat als er een wijziging of nieuwe klant kwam er automatisch een update verwerkt werd in de vhost file.
De oplossing:
Een webbased script dat als er een nieuwe klant of een wijziging bij een klant wordt doorgevoerd de vhost file word aangepast
Het systeem:
Het systeem waarop gewerkt word is Windows server 2012 met Apache 2.4 en mysql 5.6 (eventjes uit het hoofdje)
Het idee
Onlangs zag ik op het forum van Tweakers een topic verschijnen met de vraag of je met apache mysql tabel kon uitlezen om een vhost file aan te maken.
De zelfde soort probleem / oplossing hebben wij hier op het werk en ik vond dit wel grappig om zulke php oplossingen te delen met jullie. Ik ga er per definitie van uit dat er andere oplossingen zijn zoals dit vaak is in de programmeer wereld, maar uiteindelijk gaat het er om dat het probleem opgelost word met een stabiele oplossing en dat het in het totaal plaatje past.


Om even duidelijk te maken het gehele webbased systeem werkt met PHP en de kennis onder de collega's is het PHP de programmeertaal die het wint onder de programmeer talen.
Alternatieven
voor vhost file is een alternatief (bijgedrage door @DexterDee):

PHP:
1
2
3
4
5
6
UseCanonicalName Off

<VirtualHost 11.22.33.44>
   ServerName www.mijndomein.nl
   VirtualDocumentRoot /var/www/%0   
</VirtualHost>



ServerName is in dit geval fictief maar wel verplicht door Apache

%0 = volledige domeinnaam
%1 = naam van eerste subdomein

Met bovenstaande configuratie zal automatisch het domein www.xleeuwx.nl gekoppeld worden aan /var/www/www.xleeuwx.nl en elk willekeurig ander domein op /var/www/<domeinnaam>. Het gebruik van MySQL heeft in deze weinig meerwaarde, omdat je toch per VirtualHost een nieuwe directory zal moeten aanmaken op de server. Op bovenstaande manier kun je elk domein koppelen zonder Apache hiervoor te hoeven herladen / herstarten, simpel door de naam van het domein als directory aan te maken.

De tutorial

Er vanuitgaand dat we een vhost file hebben met daarbij de schrijfrechten vanuit php (iets wat op windows snel gaat, houd hier wel rekening mee met unix)

Eerst maken we de config:

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php
// Config
    //MySQL 
        $dbhost = 'localhost'; // server ip or hostname of server
        $dbuser = 'root'; // mysql username
        $dbpass = 'Secr*t'; // mysql password
        $dbname = 'vhosts'; // mysql database
    
    // File
        $path = 'extra/'; // path to config file
        $file = 'vhost_dynamic.conf'; // file in path




Daarna gaan we een mysql connectie aan te maken. En anno 2014 doen we dat natuurlijk met de mysqli driver:

PHP:
1
2
3
4
5
6
7
8
9
10
<?php

// Connect DB
$mysqli = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); 

// SQL query
$sql = "SELECT `server_admin`, `from_domain`, `to_domain` FROM `vhost_table`"; 

 // run query
$res = mysqli_query($mysqli, $sql);




Daarna halen we de data op uit de database tabel en stoppen we dat in een array (zodat het makkelijk te verwerken is, je zou dit direct kunnen doen maar vanwege debug redenen had ik het los gedaan)

PHP:
1
2
3
4
// Put database results into a array
while($row = mysqli_fetch_assoc($res)) {
    $vhosts[] = $row;
}



We starten de variabel waar we de output in op gaan slaan

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Start writing to variabel
    $file_content = '';

    // Start comments for file
    $file_content .= '#'.PHP_EOL;
    $file_content .= '#Dynamic file from mysql'.PHP_EOL;
    $file_content .= '#'.PHP_EOL;
if(count($vhosts) > 0) {
    foreach($vhosts as $key => $value) {
        // Commands for vhost
        $file_content .= PHP_EOL;
        $file_content .= "#".PHP_EOL;
        $file_content .= "# VHOST: ".$value["from_domain"].PHP_EOL;
        $file_content .= "#".PHP_EOL;
        $file_content .= PHP_EOL;
        
        // Vhost
        $file_content .= "<VirtualHost *:80>".PHP_EOL;
        $file_content .= "\tServerAdmin ".$value["server_admin"].PHP_EOL;
        $file_content .= "\tServerName ".$value["from_domain"].PHP_EOL;
        $file_content .= "\tProxyRequest Off".PHP_EOL;
        $file_content .= "\t".PHP_EOL;
        $file_content .= "\tProxyPreserveHost On".PHP_EOL;
        $file_content .= "\t".PHP_EOL;
        $file_content .= "\t<Proxy *>".PHP_EOL;
        $file_content .= "\t\t Order deny,allow".PHP_EOL;
        $file_content .= "\t\t Allow from all".PHP_EOL;
        $file_content .= "\t</Proxy>".PHP_EOL;
        $file_content .= "\t".PHP_EOL;
        $file_content .= "\tProxyPass / ".$value["to_domain"].PHP_EOL;
        $file_content .= "\tProxyPassReverse / ".$value["to_domain"].PHP_EOL;
        $file_content .= "</VirtualHost>".PHP_EOL;
    }
}




Vervolgens als laatste schrijven we de variabel weg naar een file zoals wel in de config hebben geconfigureerd

PHP:
1
2
3
4
5
6
7
8
9
10
// Write variabel to file 
file_put_contents($path.$file, $file_content);

// Reload Apache (Windows only!!!)
exec("sc stop apache2.4");
exec("sc start apache2.4");
    
// Reload Apache (CentOS Only)
// exec("service httpd reload");
?>

Script totaal

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php
// Config
    //MySQL 
        $dbhost = 'localhost'; // server ip or hostname of server
        $dbuser = 'root'; // mysql username
        $dbpass = 'Secr*t'; // mysql password
        $dbname = 'vhosts'; // mysql database
    
    // File
        $path = 'extra/'; // path to config file
        $file = 'vhost_dynamic.conf'; // file in path
        
        

// Connect DB
$mysqli = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); 

// SQL query
$sql = "SELECT `server_admin`, `from_domain`, `to_domain` FROM `vhost_table`"; 

 // run query
$res = mysqli_query($mysqli, $sql);

// Put database results into a array
while($row = mysqli_fetch_assoc($res)) {
    $vhosts[] = $row;
}


// Start writing to variabel
    $file_content = '';

    // Start comments for file
    $file_content .= '#'.PHP_EOL;
    $file_content .= '#Dynamic file from mysql'.PHP_EOL;
    $file_content .= '#'.PHP_EOL;
if(count($vhosts) > 0) {
    foreach($vhosts as $key => $value) {
        // Commands for vhost
        $file_content .= PHP_EOL;
        $file_content .= "#".PHP_EOL;
        $file_content .= "# VHOST: ".$value["from_domain"].PHP_EOL;
        $file_content .= "#".PHP_EOL;
        $file_content .= PHP_EOL;
        
        // Vhost
        $file_content .= "<VirtualHost *:80>".PHP_EOL;
        $file_content .= "\tServerAdmin ".$value["server_admin"].PHP_EOL;
        $file_content .= "\tServerName ".$value["from_domain"].PHP_EOL;
        $file_content .= "\tProxyRequest Off".PHP_EOL;
        $file_content .= "\t".PHP_EOL;
        $file_content .= "\tProxyPreserveHost On".PHP_EOL;
        $file_content .= "\t".PHP_EOL;
        $file_content .= "\t<Proxy *>".PHP_EOL;
        $file_content .= "\t\t Order deny,allow".PHP_EOL;
        $file_content .= "\t\t Allow from all".PHP_EOL;
        $file_content .= "\t</Proxy>".PHP_EOL;
        $file_content .= "\t".PHP_EOL;
        $file_content .= "\tProxyPass / ".$value["to_domain"].PHP_EOL;
        $file_content .= "\tProxyPassReverse / ".$value["to_domain"].PHP_EOL;
        $file_content .= "</VirtualHost>".PHP_EOL;
    }
}

// Write variabel to file 
file_put_contents($path.$file, $file_content);

// Reload Apache (Windows only!!!)
exec("sc stop apache2.4");
exec("sc start apache2.4");
    
// Reload Apache (CentOS Only)
// exec("service httpd reload");
?>



Hieronder volgt de normale vhost file voor onder andere subdomeinen enz.
Deze is opzich hetzelfde opgebouwd alleen de variabelen en output is iets anders

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?php
// Config
    //MySQL 
        $dbhost = 'localhost'; // server ip or hostname of server
        $dbuser = 'root'; // mysql username
        $dbpass = 'Secr*t'; // mysql password
        $dbname = 'vhosts'; // mysql database
    
    // File
        $path = 'extra/'; // path to config file
        $file = 'vhost_dynamic.conf'; // file in path
        
        
// Connect DB
$mysqli = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); 

// SQL query
$sql = "SELECT * FROM `vhost_table` WHERE `history` IS NULL"; 

 // run query
$res = mysqli_query($mysqli, $sql);

// Put database results into a array
while($row = mysqli_fetch_assoc($res)) {
    $vhosts[] = $row;
}


// Start writing to variabel
    $file_content = '';

    // Start comments for file
    $file_content .= '#'.PHP_EOL;
    $file_content .= '#Dynamic file from mysql'.PHP_EOL;
    $file_content .= '#'.PHP_EOL;
if(count($vhosts) > 0) {
    foreach($vhosts as $key => $value) {
        $file_content .= PHP_EOL;
        $file_content .= "##".PHP_EOL;
        $file_content .= "# VHOSTID: ".$value["vhostID"].PHP_EOL;
        $file_content .= "# VHOST NAME: ".$value["ServerName"].PHP_EOL;
        $file_content .= "##".PHP_EOL;
        $file_content .= PHP_EOL;
        $file_content .= "<VirtualHost *:80>".PHP_EOL;
        $file_content .= "\tServerAdmin ".$value["serverAdmin"].PHP_EOL;
        $file_content .= "\tDocumentRoot \"".$value["DocumentRoot"]."\"".PHP_EOL;
        $file_content .= "\tServerName ".$value["ServerName"].PHP_EOL;      
        $file_content .= "\tServerAlias ".$value["ServerAlias"].PHP_EOL;
        $file_content .= "\tErrorLog \"".(isset($value["ErrorLog"]) && !empty($value["ErrorLog"]) ? $value["ErrorLog"] : "logs/".$value['ServerName'])."-error.log\"".PHP_EOL;
        $file_content .= "\tCustomLog \"".(isset($value["CustomLog"]) && !empty($value["CustomLog"]) ? $value["CustomLog"] : "logs/".$value['ServerName'])."-access.log\" common".PHP_EOL;
        $file_content .= "</VirtualHost>".PHP_EOL;
    }
}

// Write variabel to file 
file_put_contents($path.$file, $file_content);

// Reload Apache (Windows only!!!)
exec("sc stop apache2.4");
exec("sc start apache2.4");
    
// Reload Apache (CentOS Only)
// exec("service httpd reload");
?>

Edit's:
  • probleem / oplossing toegevoegd
  • alternatief toegevoegd
  • iets meer structuur toegevoegd

Volgende week

Het probleem
Een groot ledenbestand (50k+) met een hoop geld te innen via automatisch incasso bestand dit moet omgezet worden in een SEPA bestand. Bij mijn weten iets waar velen tegen aan zullen lopen komende tijd.

Oplossing
Een webbased script dat van leden bestand een sepa batch bestand kan maken.

Volgende: Tutorial 2: Create SEPA batch (pain.008.001.02.) 06-'14 Tutorial 2: Create SEPA batch (pain.008.001.02.)

Reacties


Door Tweakers user Douweegbertje, maandag 26 mei 2014 17:35

Volgens mij gaan een aantal dingen niet werken. Ten eerste in een fatsoenlijke omgeving zou je PHP geen schrijf rechten hebben voor dit, dus daar moet je dan wel rekening mee houden.

Verder lijkt deze wel grappig:

exec("sc stop apache2.4");
exec("sc start apache2.4")

Ik heb nooit dit soort dingen gebruikt maar naar mijn mening ga je nu iets leuks krijgen waarbij je zelfstandig je script killed omdat je apache stopt. Zonder apache draait je PHP ook niet meer (denk ik!).

Los van dat heb je ook root rechten nodig om iets met apache te doen via PHP of wat dan ook. Volgens mij kun je wel iets van een sudo gebruiken om vervolgens een exec op de service te doen.

Al met al is het wel leuk om zoiets te gebruiken maar er zitten zo veel haken en ogen aan. Los van de veiligheid, is PHP niet de taal/oplossing om je apache te beheren :p

Door Tweakers user i-chat, maandag 26 mei 2014 18:06

ik ga mee met Douweegbertje boven mij, php gebruiken om je config files aan te passen lijkt me geen geweldig plan, bovendien zou het niet nodig moeten zijn, apache ondersteunt al sins jaar en dag plugins, dus ik vraag me wel een beetje af of je dit niet beter in een apache pugin op kunt nemen.. als die al niet bestaat.

edit: http://httpd.apache.org/docs/current/vhosts/mass.html
en .htacces voor de finetuning...

[Reactie gewijzigd op maandag 26 mei 2014 18:10]


Door Tweakers user cosmo_roel, maandag 26 mei 2014 18:57

PHP draait ook gewoon vanaf de commandline. Dit hoeft niet per se over http te gaan. Wie weet dacht xleeuwx wel: hé, waarom Bash of Perl of iets dergelijks gaan leren, als ik al PHP kan.

Door Tweakers user Douweegbertje, maandag 26 mei 2014 19:18

cosmo_roel schreef op maandag 26 mei 2014 @ 18:57:
PHP draait ook gewoon vanaf de commandline. Dit hoeft niet per se over http te gaan. Wie weet dacht xleeuwx wel: hé, waarom Bash of Perl of iets dergelijks gaan leren, als ik al PHP kan.
Leuk, maar totaal nutteloos.
Elke taal heeft zijn sterke en zwakke punten, dat je een taal begrijpt wil nog niet zeggen dat het voor elk doel geschikt is ondanks het feit dat het mogelijk werkt.
Zoals eerder is gezegd zijn er ook plugins aanwezig, en vast nog andere oplossingen.

Leuk script verder, maar totaal niet geschikt om te gebruiken.

Door Tweakers user Eegee, maandag 26 mei 2014 19:24

Douweegbertje schreef op maandag 26 mei 2014 @ 19:18:
[...]


Leuk, maar totaal nutteloos.
Elke taal heeft zijn sterke en zwakke punten, dat je een taal begrijpt wil nog niet zeggen dat het voor elk doel geschikt is ondanks het feit dat het mogelijk werkt.
Zoals eerder is gezegd zijn er ook plugins aanwezig, en vast nog andere oplossingen.

Leuk script verder, maar totaal niet geschikt om te gebruiken.
Ik mis de onderbouwing en volgens mij zie je problemen die er niet zijn. Perl is een taal waar het mee kan en PHP is een taal waar het mee kan, en er zullen inderdaad vast andere oplossingen zijn. Waarom zou een andere oplossing beter zijn dan deze?

[Reactie gewijzigd op maandag 26 mei 2014 19:41]


Door Tweakers user Douweegbertje, maandag 26 mei 2014 20:21

Stel je wilt het als automatisch script draaien, en dan heb ik het over een back-end systeempje waarbij je het allemaal wilt updaten. Bijvoorbeeld na een update/insert/delete op je DB (immers haal je al de gegevens daar uit). Dan moet PHP eigenlijk draaien als root, dat wil je domweg niet. Je wilt root en chmod 0777 vermijden. Dat is in feite basic beveiliging.
Zelfde geldt voor het benaderen van apache via PHP. Dan moet je PHP process als root draaien :/

PHP is in dit geval gemaakt voor iets anders. Zorg ervoor dat het een bestand genereert wat je download. Of je output het, om vervolgens een copy/paste te kunnen doen. Dat kan PHP goed, en dan is er geen enkel probleem.

Sure, je kan het uitvoeren via de CLI, maar dat is dan weer net zo handmatig als bovenstaande. CLI is eigenlijk niets meer dan handmatig buiten een browser om iets aanroepen.

Uiteindelijk kan alles, maar niet alles is wenselijk. PHP is gewoon niet gemaakt om op root niveau allerlei meuk te gaan uitvoeren. Niet voor niets heb je basis settings zoals dat je niet zomaar kan schrijven en uitvoeren op een dir. Verder kan PHP by default niet in het "systeem proces" komen. PHP is maar een schil om iets voor elkaar te krijgen, vergelijk het maar met het volgende;
Een PHP applicatie kan niet op jouw computer een programma wijzigen. Een executable bijvoorbeeld weer wel.

Om even terug te komen op een plugin, je kan namelijk wel simpel een htaccess beheren. Staat immers in je html_public of w/e en is zeer zeker benaderbaar zonder moeilijkheden met PHP. Daar heb je dan toegang tot de RewriteEngine en mod rewrite. Dat is er juist om zoiets op applicatie niveau op te vangen. Geen idee wat het uiteindelijk doel is, maar een htaccess kan per definitie ook al heel veel en is dan wel weer geschikt voor zo'n koppeling...

Door Tweakers user Rob, maandag 26 mei 2014 20:30

PHP kan best wel commandline hier geschikt voor zijn.
Het script geeft alleen geen output, dat is toch wel een beetje jammer

Door Tweakers user wheez50, maandag 26 mei 2014 21:09

Ik ben echt heel erg in de war. Ik kan op mijn servertje apache rustig uitgooien, waardoor je van buiten geen antwoord meer krijgt (en dus logischerwijs niets, dus ook phpscripts niet, kan uitvoeren). Desondanks kan ik als non-root gewoon php-scripts uitvoeren (net als python, perl en ruby-scripts. Sterker nog: ik kan zelfs bash-scripts uitvoeren in mijn shell).

Dus als mijn php-script ff apache uit/aan gooit, heb ik daar geen enkel probleem mee. Al zou ik dat doen via een 'sudo service apache2 restart'. Al met al denk ik dat mensen hier antwoorden en te vast zitten in een php-is-alleen-voor-web modus. PHP is allang geen hypertekst preprocessor meer. Sterker nog: het eigenlijke preprocessen is iets wat je eigenlijk niet meer doet :) Dus ook het argument dat je php ergens voor gebruikt waar het niet voor gemaakt is snijdt voor mij geen hout. PHP is tegenwoordig een vrij multifunctioneel gereedschap. En als je alleen PHP spreekt is php een prima methode dit uit te voeren. Niet iedereen is een digtale polyglot.

Door Tweakers user xleeuwx, maandag 26 mei 2014 21:17

Douweegbertje schreef op maandag 26 mei 2014 @ 20:21:
Stel je wilt het als automatisch script draaien, en dan heb ik het over een back-end systeempje waarbij je het allemaal wilt updaten. Bijvoorbeeld na een update/insert/delete op je DB (immers haal je al de gegevens daar uit). Dan moet PHP eigenlijk draaien als root, dat wil je domweg niet. Je wilt root en chmod 0777 vermijden. Dat is in feite basic beveiliging.
Zelfde geldt voor het benaderen van apache via PHP. Dan moet je PHP process als root draaien :/

PHP is in dit geval gemaakt voor iets anders. Zorg ervoor dat het een bestand genereert wat je download. Of je output het, om vervolgens een copy/paste te kunnen doen. Dat kan PHP goed, en dan is er geen enkel probleem.

Sure, je kan het uitvoeren via de CLI, maar dat is dan weer net zo handmatig als bovenstaande. CLI is eigenlijk niets meer dan handmatig buiten een browser om iets aanroepen.

Uiteindelijk kan alles, maar niet alles is wenselijk. PHP is gewoon niet gemaakt om op root niveau allerlei meuk te gaan uitvoeren. Niet voor niets heb je basis settings zoals dat je niet zomaar kan schrijven en uitvoeren op een dir. Verder kan PHP by default niet in het "systeem proces" komen. PHP is maar een schil om iets voor elkaar te krijgen, vergelijk het maar met het volgende;
Een PHP applicatie kan niet op jouw computer een programma wijzigen. Een executable bijvoorbeeld weer wel.

Om even terug te komen op een plugin, je kan namelijk wel simpel een htaccess beheren. Staat immers in je html_public of w/e en is zeer zeker benaderbaar zonder moeilijkheden met PHP. Daar heb je dan toegang tot de RewriteEngine en mod rewrite. Dat is er juist om zoiets op applicatie niveau op te vangen. Geen idee wat het uiteindelijk doel is, maar een htaccess kan per definitie ook al heel veel en is dan wel weer geschikt voor zo'n koppeling...
Dit script is voornamelijk bedoelt voor windows servers, hoewel een minder deel van de servers hierop draaid heb ik het ook werkbaar gemaakt voor unix omgeving.

Daarnaast is dit script niet bedoelt voor de hedendaagse programmeur maar gewoon om te kijken wat er mogelijk is en de uitzonderingen die ik zo af en toe tegen kom ;)

Om precies te zijn hebben wij een complete hosting pakket gemaakt in php en dan wil je dynamisch de vhosts kunnen veranderen en niet als de server opstart dat ze vast staan. Dit kan door apache te reloaden inplaasts van te restarten. Alleen heb je dan wel het absolute pad nodig van de httpd.exe en dient deze als service geinstalleerd te wezen. Iets wat in unix al heel anders is.

Daarnaast programmeer ik ook in java en c++ (niet mijn beste taal) en omdat ik in mijn werkomgeving alleen maar php programmeurs heb zijn deze talen voor mijn onbruikbaar.

En verder ga jij maar eens proberen een proxy pass of een vhost aan te maken in .htaccess daarvoor heb je echt een vhost file nodig

[Reactie gewijzigd op dinsdag 27 mei 2014 09:17]


Door Tweakers user xleeuwx, maandag 26 mei 2014 21:19

Rob schreef op maandag 26 mei 2014 @ 20:30:
PHP kan best wel commandline hier geschikt voor zijn.
Het script geeft alleen geen output, dat is toch wel een beetje jammer
Hmm, tegenwoordig kan je best wat vanaf commandline ;) http://www.php.net/manual/en/features.commandline.php

Door Tweakers user dvdheiden, dinsdag 27 mei 2014 08:24

Is het niet makkelijker een template file te maken en daarin enkel de waardes te replacen?

Door Tweakers user -RetroX-, dinsdag 27 mei 2014 08:45

Of je kiest voor Nginx waarbij je variabelen in je .conf kan meenemen.

net zoals er voor apache een handige bundel is (xampp) is er ook wel een voor nginx: wnmp

Door Tweakers user xleeuwx, dinsdag 27 mei 2014 09:11

dvdheiden schreef op dinsdag 27 mei 2014 @ 08:24:
Is het niet makkelijker een template file te maken en daarin enkel de waardes te replacen?
Het ging om een dynamische file oftewel uiteindelijk zouden er misschien 100 misschien 20 inzitten. Daarnaast als je er 1000 aanmaakt is het nog binnen een seconde verwerkt.
-RetroX- schreef op dinsdag 27 mei 2014 @ 08:45:
Of je kiest voor Nginx waarbij je variabelen in je .conf kan meenemen.

net zoals er voor apache een handige bundel is (xampp) is er ook wel een voor nginx: wnmp
Hmm hoewel ik voorstander ben van Nginx werken we met apache. Dus er is een bestaand systeem en dat systeem moest aangepast worden.

Door Tweakers user Blokker_1999, dinsdag 27 mei 2014 09:25

cosmo_roel schreef op maandag 26 mei 2014 @ 18:57:
PHP draait ook gewoon vanaf de commandline. Dit hoeft niet per se over http te gaan. Wie weet dacht xleeuwx wel: hé, waarom Bash of Perl of iets dergelijks gaan leren, als ik al PHP kan.
Alleen start de blogpost met het feit dat apache een mysql tabel zou uitlezen. Het is dus mogelijk om het via de CLI te doen, maar dan moet de blogpost daar even op aangepast worden.
Ik draai ook dagelijks geplande taken met php+mysql op een windows machine (geen andere keuze :( ). Ik zou hiervoor natuurlijk ook powershell kunnen gebruiken, maar de PHP kennis heb ik al om het te doen, een script is dan snel geschreven. Ik ben dan zeker ook een tevreden php cli gebruiker.

[Reactie gewijzigd op dinsdag 27 mei 2014 09:27]


Door Tweakers user xleeuwx, dinsdag 27 mei 2014 09:39

[...]

Alleen start de blogpost met het feit dat apache een mysql tabel zou uitlezen. Het is dus mogelijk om het via de CLI te doen, maar dan moet de blogpost daar even op aangepast worden.
Zal het strax even ter verduildelijking aanpassen
[...]

Ik draai ook dagelijks geplande taken met php+mysql op een windows machine (geen andere keuze :( ). Ik zou hiervoor natuurlijk ook powershell kunnen gebruiken, maar de PHP kennis heb ik al om het te doen, een script is dan snel geschreven. Ik ben dan zeker ook een tevreden php cli gebruiker.
Wij hebben hier ook 50 crontask draaien, (in windows scheduletasks) Alternatief die ik gezien heb is via programma wget (draaid ook op windows) de php file aanroepen. Desnoods met ip restriction

Door Tweakers user DexterDee, dinsdag 27 mei 2014 11:18

De oplossing die je beschrijft is waanzinnig complex voor een probleem dat Apache al lang op een iets andere manier voor je opgelost heeft.

code:
1
2
3
4
5
6
UseCanonicalName Off

<VirtualHost 11.22.33.44>
   ServerName www.mijndomein.nl
   VirtualDocumentRoot /var/www/%0   
</VirtualHost>


ServerName is in dit geval fictief maar wel verplicht door Apache

%0 = volledige domeinnaam
%1 = naam van eerste subdomein

Met bovenstaande configuratie zal automatisch het domein www.xleeuwx.nl gekoppeld worden aan /var/www/www.xleeuwx.nl en elk willekeurig ander domein op /var/www/<domeinnaam>. Het gebruik van MySQL heeft in deze weinig meerwaarde, omdat je toch per VirtualHost een nieuwe directory zal moeten aanmaken op de server. Op bovenstaande manier kun je elk domein koppelen zonder Apache hiervoor te hoeven herladen / herstarten, simpel door de naam van het domein als directory aan te maken.

[Reactie gewijzigd op dinsdag 27 mei 2014 11:19]


Door Tweakers user xleeuwx, dinsdag 27 mei 2014 11:25

[..]
Met bovenstaande configuratie zal automatisch het domein www.xleeuwx.nl gekoppeld worden aan /var/www/www.xleeuwx.nl en elk willekeurig ander domein op /var/www/<domeinnaam>. Het gebruik van MySQL heeft in deze weinig meerwaarde, omdat je toch per VirtualHost een nieuwe directory zal moeten aanmaken op de server. Op bovenstaande manier kun je elk domein koppelen zonder Apache hiervoor te hoeven herladen / herstarten, simpel door de naam van het domein als directory aan te maken.
Hoewel dit voor normale vhost's werkt wil ik dit nog wel eens zien werken voor proxyPass iets waar dit oorspronkelijk voor is geschreven.

Door Tweakers user DexterDee, dinsdag 27 mei 2014 11:38

xleeuwx schreef op dinsdag 27 mei 2014 @ 11:25:
[...]

Hoewel dit voor normale vhost's werkt wil ik dit nog wel eens zien werken voor proxyPass iets waar dit oorspronkelijk voor is geschreven.
Met ProxyPass zal het wellicht lastig worden, maar ik ben er vrij zeker van dat een mod_rewrite rule met het proxy vlaggetje [P] wel gaat werken. Dit doet effectief hetzelfde als ProxyPass.

Door Tweakers user xleeuwx, dinsdag 27 mei 2014 11:45

DexterDee schreef op dinsdag 27 mei 2014 @ 11:38:
[...]

Met ProxyPass zal het wellicht lastig worden, maar ik ben er vrij zeker van dat een mod_rewrite rule met het proxy vlaggetje [P] wel gaat werken. Dit doet effectief hetzelfde als ProxyPass.
Wij hebben dus een systeem wat op zich al *** is ingericht, en dus staan de klanten in een map met hun klantnummer met daaronder submappen met website's. Opzich nog niks mis mee, tot de server begon vol te raken. Hebben ze een tweede server aangeschaft en waar nu staat er in de database opgeslagen op welk van de ondertussen 8 servers. De klanten die naar een andere server connecten dan hun eigen zullen dus op deze manier naar de juiste server geredirect worden.

Door Tweakers user DexterDee, dinsdag 27 mei 2014 14:23

xleeuwx schreef op dinsdag 27 mei 2014 @ 11:45:
Wij hebben dus een systeem wat op zich al *** is ingericht, en dus staan de klanten in een map met hun klantnummer met daaronder submappen met website's. Opzich nog niks mis mee, tot de server begon vol te raken. Hebben ze een tweede server aangeschaft en waar nu staat er in de database opgeslagen op welk van de ondertussen 8 servers. De klanten die naar een andere server connecten dan hun eigen zullen dus op deze manier naar de juiste server geredirect worden.
Als ik dat zo lees dan plak je met jouw script weer een pleister op een infrastructuur vol met pleisters, zonder het onderliggende probleem aan te pakken. De echte uitdaging zit 'm denk ik niet in deze specifieke technische oplossing, maar om deze vicieuze cirkel te doorbreken en de hele boel eens fatsoenlijk opnieuw op te zetten :)

Door Tweakers user xleeuwx, dinsdag 27 mei 2014 14:35

[...]

Als ik dat zo lees dan plak je met jouw script weer een pleister op een infrastructuur vol met pleisters, zonder het onderliggende probleem aan te pakken. De echte uitdaging zit 'm denk ik niet in deze specifieke technische oplossing, maar om deze vicieuze cirkel te doorbreken en de hele boel eens fatsoenlijk opnieuw op te zetten :)
Moet je daarvoor wel de bevoegdheid hebben :(. Het is niet iets dat je eventjes op de vrijdag middag nog doet. Het kost dus tijd en geld wat er niet voor over is. Maar ben het wel zeker met je eens, dus alternatief was dit. Toen ik zag dat er iemand op het forum ongeveer het zelfde vroeg vond ik het wel grappig om zulke rare dingen die bijna nooit voorkomen als blog te maken.

[Reactie gewijzigd op dinsdag 27 mei 2014 14:36]


Door Tweakers user Patriot, woensdag 28 mei 2014 15:24

DexterDee schreef op dinsdag 27 mei 2014 @ 14:23:
[...]

Als ik dat zo lees dan plak je met jouw script weer een pleister op een infrastructuur vol met pleisters, zonder het onderliggende probleem aan te pakken. De echte uitdaging zit 'm denk ik niet in deze specifieke technische oplossing, maar om deze vicieuze cirkel te doorbreken en de hele boel eens fatsoenlijk opnieuw op te zetten :)
Het is als je dit weet wel enigszins poëtisch te noemen dat hij juist PHP heeft gebruikt om tot zijn oplossing te komen :+

Door Tweakers user robindv, vrijdag 30 mei 2014 16:37

Mocht je trouwens nog bezig zijn met de SEPA implementatie. Ik heb dit zelf al een tijdje terug geschreven en op GitHub gezet: https://github.com/Celp-nl/sepa-dd-xml

Werkte succesvol bij de Rabobank :)

Door Tweakers user xleeuwx, vrijdag 30 mei 2014 17:02

robindv schreef op vrijdag 30 mei 2014 @ 16:37:
Mocht je trouwens nog bezig zijn met de SEPA implementatie. Ik heb dit zelf al een tijdje terug geschreven en op GitHub gezet: https://github.com/Celp-nl/sepa-dd-xml

Werkte succesvol bij de Rabobank :)
Nee al een tijde geleden afgerond :)

Ben nog even de nodige documentatie aan het schrijven waar dat mist (overal) :)

Reageren is niet meer mogelijk