<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" ><channel><title>PHP Gangsta - Der PHP Blog mit Praxisbezug &#187; apache</title> <atom:link href="http://www.phpgangsta.de/tag/apache/feed" rel="self" type="application/rss+xml" /><link>http://www.phpgangsta.de</link> <description>Ein PHP Blog mit Themen aller Art. Manchmal vergewaltige ich PHP...</description> <lastBuildDate>Thu, 02 Feb 2012 22:22:51 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.1</generator> <item><title>Linkpool Nummer 26</title><link>http://www.phpgangsta.de/linkpool-nummer-26</link> <comments>http://www.phpgangsta.de/linkpool-nummer-26#comments</comments> <pubDate>Sat, 26 Nov 2011 10:33:11 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[Lesepool]]></category> <category><![CDATA[Linkpool]]></category> <category><![CDATA[Links]]></category> <category><![CDATA[Session]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=3928</guid> <description><![CDATA[Der neue Apache httpd v 2.4 (PDF): http://people.apache.org/~jim/presos/ACNA11/Apache_httpd_cloud.pdf In welchen Fällen bei foreach-Schleifen nutzt PHP intern Kopien und wann nicht: http://nikic.github.com/2011/11/11/PHP-Internals-When-does-foreach-copy.html Was bei Google unter anderem wichtig ist: Qualität, Rechtschreibung &#8230; http://sixrevisions.com/content-strategy/creating-websites-optimized-for-googles-panda-algorithm/ PHP Session Storage via MySQL Cluster und Memcached-Frontend: http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html 6 Kostenloses Web-Speed-Tools: http://t3n.de/news/website-speedtest-6-kostenlose-tools-342243/ Wie Facebook seine Releases deployed, monitored usw. http://www.facebook.com/video/video.php?v=10100259101684977&#38;oid=9445547199&#38;comments Warum man [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/linkpool-nummer-23' rel='bookmark' title='Linkpool Nummer 23'>Linkpool Nummer 23</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-21' rel='bookmark' title='Linkpool Nummer 21'>Linkpool Nummer 21</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-20' rel='bookmark' title='Linkpool Nummer 20'>Linkpool Nummer 20</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Der neue Apache httpd v 2.4 (PDF):</p><p><a href="http://people.apache.org/~jim/presos/ACNA11/Apache_httpd_cloud.pdf" target="_blank">http://people.apache.org/~jim/presos/ACNA11/Apache_httpd_cloud.pdf</a></p><p>In welchen Fällen bei foreach-Schleifen nutzt PHP intern Kopien und wann nicht:</p><p><a href="http://nikic.github.com/2011/11/11/PHP-Internals-When-does-foreach-copy.html" target="_blank">http://nikic.github.com/2011/11/11/PHP-Internals-When-does-foreach-copy.html</a></p><p>Was bei Google unter anderem wichtig ist: Qualität, Rechtschreibung &#8230;</p><p><a href="http://sixrevisions.com/content-strategy/creating-websites-optimized-for-googles-panda-algorithm/" target="_blank">http://sixrevisions.com/content-strategy/creating-websites-optimized-for-googles-panda-algorithm/</a></p><p><span id="more-3928"></span>PHP Session Storage via MySQL Cluster und Memcached-Frontend:</p><p><a href="http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html" target="_blank">http://schlueters.de/blog/archives/164-High-Performance-PHP-Session-Storage-on-Scale.html</a></p><p>6 Kostenloses Web-Speed-Tools:</p><p><a href="http://t3n.de/news/website-speedtest-6-kostenlose-tools-342243/" target="_blank">http://t3n.de/news/website-speedtest-6-kostenlose-tools-342243/</a></p><p>Wie Facebook seine Releases deployed, monitored usw.</p><p><a href="http://www.facebook.com/video/video.php?v=10100259101684977&amp;oid=9445547199&amp;comments" target="_blank">http://www.facebook.com/video/video.php?v=10100259101684977&amp;oid=9445547199&amp;comments</a></p><p>Warum man den Destructor nicht manuell aufrufen sollte:</p><p><a href="http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/" target="_blank">http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/</a></p><p>Auf welche Weise man Selenium 2 nutzen kann:</p><p><a href="http://css.dzone.com/articles/selenium-2-php-code" target="_blank">http://css.dzone.com/articles/selenium-2-php-code</a></p><p>Fallstudie wie 500ms oder 1000ms die Conversion nachhaltig beeinflusst:</p><p><a href="http://www.webperformancetoday.com/2011/11/23/case-study-slow-page-load-mobile-business-metrics/" target="_blank">http://www.webperformancetoday.com/2011/11/23/case-study-slow-page-load-mobile-business-metrics/</a></p><p>PHP Aufgaben mit so wenig Bytes wie möglich lösen:</p><p><a href="http://www.phpgolf.org/" target="_blank">http://www.phpgolf.org/</a></p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/linkpool-nummer-23' rel='bookmark' title='Linkpool Nummer 23'>Linkpool Nummer 23</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-21' rel='bookmark' title='Linkpool Nummer 21'>Linkpool Nummer 21</a></li><li><a href='http://www.phpgangsta.de/linkpool-nummer-20' rel='bookmark' title='Linkpool Nummer 20'>Linkpool Nummer 20</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/linkpool-nummer-26/feed</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Subdomain-Service: Wie erstelle ich dynamisch viele Subdomains?</title><link>http://www.phpgangsta.de/subdomain-service-wie-erstelle-ich-dynamisch-viele-subdomains</link> <comments>http://www.phpgangsta.de/subdomain-service-wie-erstelle-ich-dynamisch-viele-subdomains#comments</comments> <pubDate>Tue, 04 Jan 2011 09:09:58 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[htaccess]]></category> <category><![CDATA[Subdomain]]></category> <category><![CDATA[Subdomain-Dienst]]></category> <category><![CDATA[Subdomain-Script]]></category> <category><![CDATA[Subdomain-Service]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=2044</guid> <description><![CDATA[Was eine Subdomain ist brauche ich ja wahrscheinlich nicht zu erzählen, dass es manchmal mehr Sinn machen kann lieber eine neue Subdomain als einen Unterordner anzulegen und wie das geht möchte ich hier zeigen. Die Länge der folgenden Domains ist gleich, es ist also egal ob ich http://domain.de/forum oder http://forum.domain.de anlege. Es gibt jedoch einige [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/co-de-domain' rel='bookmark' title='co.de Domain'>co.de Domain</a></li><li><a href='http://www.phpgangsta.de/wie-erstelle-ich-einen-socket-server-in-php' rel='bookmark' title='Wie erstelle ich einen Socket-Server in PHP?'>Wie erstelle ich einen Socket-Server in PHP?</a></li></ol>]]></description> <content:encoded><![CDATA[<p>Was eine <a href="http://de.wikipedia.org/wiki/Subdomain#Subdomain" target="_blank">Subdomain</a> ist brauche ich ja wahrscheinlich nicht zu erzählen, dass es manchmal mehr Sinn machen kann lieber eine neue Subdomain als einen Unterordner anzulegen und wie das geht möchte ich hier zeigen.</p><p>Die Länge der folgenden Domains ist gleich, es ist also egal ob ich</p><p>http://domain.de/forum</p><p>oder</p><p>http://forum.domain.de</p><p>anlege. Es gibt jedoch einige technische Unterschiede. Sollte ich beispielsweise später das Forum auf einen eigenen Server umziehen wollen ist das mit der zweiten Möglichkeit einfacher. Des weiteren sind die Sessions durch die Subdomain getrennt, ich kann also im Forum nicht auf die Session-Daten der Hauptdomain zugreifen und andersrum. Sollte ich das doch wollen müßte ich</p><pre class="brush: php; title: ; notranslate">ini_set(&quot;session.cookie_domain&quot;, &quot;.domain.de&quot;);</pre><p>die Einstellung ändern, dann teilen sich alle Subdomains die Session-Daten.<br /> <span id="more-2044"></span><br /> Solange wir nur einige wenige Subdomains für Forum, Blog und Webseite erstellen möchten tun wir das normalerweise manuell direkt in den DNS-Einstellungen, und wir fügen im Apache einen entsprechenden VirtualHost Eintrag hinzu, beispielsweise</p><pre class="brush: plain; title: ; notranslate">NameVirtualHost *:80

&lt;VirtualHost *:80&gt;
    DocumentRoot /www/forum
    ServerName forum.domain.de
    ...
&lt;/VirtualHost&gt;

&lt;VirtualHost *:80&gt;
    DocumentRoot /www/blog
    ServerName blog.domain.de
    ...
&lt;/VirtualHost&gt;</pre><p>Ich habe nun die Domain <a href="http://ipv6only.de" target="_blank">ipv6only.de</a>, unter der ich einen Subdomain-Dienst anbieten möchte für Webseiten, die nur via IPv6 zu erreichen sind. Dabei gibt es verschiedene Möglichkeiten, wobei ich vorerst mit einer Weiterleitung anfangen möchte und eventuell einer &#8220;Frameweiterleitung&#8221;. Jemand kann sich also registrieren, beispielsweise die Subdomain <a href="http://simon.ipv6only.de" target="_blank">simon.ipv6only.de</a> , und dann diese Subdomain weiterleiten auf die nicht so gut merkbare IPv6-Adresse <a href="http://[2001:0db8:85a3:08d3:1319:8a2e:0370]/" target="_blank">http://[2001:0db8:85a3:08d3:1319:8a2e:0370]/</a> oder zum Beispiel auf <a href="http://hosterxy.com/user/simon245/" target="_blank">http://hosterxy.com/user/simon245/</a></p><p>Wie geht das nun? Wir richten als erstes einen Wildcard-Eintrag im DNS ein, hier die 6. Zeile mit dem Sternchen (für IPv6 wäre es dann ein AAAA Eintrag):</p><p><img class="alignnone size-full wp-image-2045" title="wildcardsubdomain" src="http://www.phpgangsta.de/wp-content/uploads/wildcardsubdomain.png" alt="" width="629" height="245" /></p><p>Dadurch werden schonmal alle Subdomains auf meinen Webserver 85.214.28.26 geleitet. Dort erstelle ich dann auch einen entsprechenden Wildcard-Eintrag im Apache:</p><pre class="brush: plain; title: ; notranslate">&lt;VirtualHost 85.214.28.26:80&gt;
    ServerName ipv6only.de
    ServerAlias *.ipv6only.de
    DocumentRoot /www/ipv6only
 &lt;/VirtualHost&gt;</pre><p>Nun landen also alle Subdomains im Verzeichnis /www/ipv6only . Soweit so gut, nun können wir mit Hilfe von PHP  für jede Subdomain die entsprechende Weiterleitung herausfinden, beispielsweise aus einer Datenbank.</p><pre class="brush: php; title: ; notranslate">&lt;?
$domain = strtolower($_SERVER['SERVER_NAME']);

// in $subdomain we want to have &quot;simon&quot; or &quot;forum.simon&quot;
$position = strrpos($domain, '.ipv6only.de');
$subdomain = substr($domain, 0, $position);

// get the target url for the subdomain
$row = $dbmodel-&gt;fetchRow(array('subdomain' =&gt; $subdomain));

header(&quot;Location: &quot;.$row['TargetUrl'], true, 301); ?&gt;
You are being redirected to &lt;a href=&quot;&lt;?=$row['TargetUrl']?&gt;&quot;&gt;&lt;?=$row['TargetUrl']?&gt;&lt;/a&gt;</pre><p>Bei einer Frameweiterleitung bleibt die *.ipv6only.de Adresse in der URL stehen, da die Zielseite nur in einem Frame angezeigt wird. Das geht beispielsweise so:</p><pre class="brush: php; title: ; notranslate">&lt;?
$domain = strtolower($_SERVER['SERVER_NAME']);

// in $subdomain we want to have &quot;simon&quot; or &quot;forum.simon&quot;
$position = strrpos($domain, '.ipv6only.de');
$subdomain = substr($domain, 0, $position);

// get the target url for the subdomain
$row = $dbmodel-&gt;fetchRow(array('subdomain' =&gt; $subdomain));

if ($row['Type'] == 'Frame') { ?&gt;
    &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Frameset//EN&quot; &quot;http://www.w3.org/TR/html4/frameset.dtd&quot;&gt;
    &lt;html&gt;
        &lt;head&gt;
            &lt;title&gt;&lt;?=$domain ?&gt;&lt;/title&gt;
        &lt;/head&gt;
        &lt;frameset&gt;
          &lt;frame src=&quot;&lt;?=$row['TargetUrl']?&gt;&quot;&gt;
        &lt;/frameset&gt;
    &lt;/html&gt;
&lt;?
} elseif ($row['Type'] == 'Forward') {
    header(&quot;Location: &quot;.$row['TargetUrl'], true, 301); ?&gt;
    You are being redirected to &lt;a href=&quot;&lt;?=$row['TargetUrl']?&gt;&quot;&gt;&lt;?=$row['TargetUrl']?&gt;&lt;/a&gt;
&lt;?
}</pre><p>Anstatt dies alles mit PHP zu machen könnte man sich auch eine  Umsetzung mit mod_rewrite vorstellen, allerdings ist man damit nicht so  flexibel. Für jede Weiterleitung würde also eine entsprechende Regel in der .htaccess stehen:</p><pre class="brush: plain; title: ; notranslate">RewriteEngine On
RewriteCond %{HTTP_HOST} ^simon\.ipv6only\.de$ [NC]
RewriteRule ^(.*) http://hosterxy.com/user/simon245 [R=301,L]</pre><p>Die .htaccess-Datei würde auch recht groß bei vielen Tausend  Einträgen, das Editieren würde komplexer (wenn jemand die Ziel-URL ändert müßte die .htaccess Datei neu generiert werden), und spätestens bei der &#8220;Frameweiterleitung&#8221; wäre PHP auf jeden Fall nötig.</p><p>Wie hättet ihr es gemacht, hat jemand bereits Erfahrungen mit solchen Diensten? Bei der Recherche bin ich auch auf einige &#8220;Subdomain-Service-Scripte&#8221; gestossen, die man für 19€ oder 99€ kaufen kann. Weiß jemand was genau diese Scripte bieten außer ein paar Formulare zum Administrieren der Datenbank (Registrierung, Weiterleitungstyp, Ziel-URL etc.) und der oben gezeigten Funktionalität?</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/co-de-domain' rel='bookmark' title='co.de Domain'>co.de Domain</a></li><li><a href='http://www.phpgangsta.de/wie-erstelle-ich-einen-socket-server-in-php' rel='bookmark' title='Wie erstelle ich einen Socket-Server in PHP?'>Wie erstelle ich einen Socket-Server in PHP?</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/subdomain-service-wie-erstelle-ich-dynamisch-viele-subdomains/feed</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>Test von Googles neuem Apache Modul mod_pagespeed</title><link>http://www.phpgangsta.de/test-von-googles-neuem-apache-modul-mod_pagespeed</link> <comments>http://www.phpgangsta.de/test-von-googles-neuem-apache-modul-mod_pagespeed#comments</comments> <pubDate>Thu, 04 Nov 2010 23:32:37 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[Linux]]></category> <category><![CDATA[Server-Software]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[mod_pagespeed]]></category> <category><![CDATA[performance]]></category> <category><![CDATA[speed]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=1818</guid> <description><![CDATA[Google kündigt an, die Welt applaudiert: Das neue Apache-Modul mod_pagespeed soll automatisch Webseiten schneller machen, ohne Aufwand und für jede Seite, eine bis zu 50% schnellere Webseite wird versprochen. Google selbst hat natürlich auch etwas davon: Wenn jede Webseite schneller abrufbar ist, können die Suchmaschinen-Spider schneller und mehr crawlen&#8230; Doch wenn man es selbst ausprobiert [...]<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p>Google kündigt an, die Welt applaudiert: Das neue <a href="http://code.google.com/intl/de-DE/speed/page-speed/docs/module.html" target="_blank">Apache-Modul mod_pagespeed</a> soll automatisch Webseiten schneller machen, ohne Aufwand und für jede Seite, eine bis zu 50% schnellere Webseite wird versprochen. Google selbst hat natürlich auch etwas davon: Wenn jede Webseite schneller abrufbar ist, können die Suchmaschinen-Spider schneller und mehr crawlen&#8230;</p><p>Doch wenn man es selbst ausprobiert sind die Ergebnisse ernüchternd. Ich habe heute Abend das Modul installiert und aktiviert (in unter 3 Minuten), und ein paar Messergebnisse mit <a href="https://addons.mozilla.org/de/firefox/addon/1843/" target="_blank">Firebug</a>, <a href="http://code.google.com/intl/de-DE/speed/page-speed/download.html" target="_blank">PageSpeed</a> und <a href="https://addons.mozilla.org/de/firefox/addon/5369/" target="_blank">YSlow</a> zusammengetragen.</p><p>Ergebnis: kein nennenswerter Geschwindigkeitsschub, teilweise sogar langsamer als vorher. Einige haben bei ersten Benchmarks das selbe Ergebnis wie ich erhalten, andere jedoch sprechen von 46% Verbesserung. Es scheint sehr davon abzuhängen wie die Seite aufgebaut ist und ob bereits Maßnahmen zur Verbesserung der Performance getroffen wurden.<br /> Außerdem habe ich auf meiner Seite nach der Aktivierung Probleme mit dem HTML-Validator gefunden die vorher nicht da waren, durch die &#8220;Verbesserungen&#8221; habe ich plötzlich ungültigen HTML-Code!</p><p>Hat jemand von Euch bereits Tests gemacht, was ist dabei herausgekommen?</p><p>==========================<br /> Die <a href="http://code.google.com/intl/de-DE/speed/page-speed/download.html" target="_blank">Installation unter Ubuntu</a> (32bit) ist denkbar einfach:<br /> <span id="more-1818"></span></p><pre class="brush: plain; title: ; notranslate">wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-beta_current_i386.deb
dpkg -i mod-pagespeed-beta_current_i386.deb
/etc/init.d/apache2 restart</pre><p>Danach kann man die Konfiguration anpassen:</p><pre class="brush: plain; title: ; notranslate">vi /etc/apache2/mods-enabled/pagespeed.conf</pre><p>Meine ersten Ergebnisse:</p><pre class="brush: plain; title: ; notranslate">Browser Cache deaktiviert

Ohne Pagespeed:
51 Requests
Firebug Netzwerk Tab: 4,64   3,79   3,5    3,8   3,81
PageSpeed		83/100
YSlow			81
Size			154,4KB

Standard Konfiguration
50 Requests
Firebug Netzwerk Tab: 4,69   5,13   5,91   4,99   6,3
PageSpeed		84/100
YSlow			82
Size			155,1KB

Fast alle Filter aktiviert:
50 Requests
Firebug Netzwerk Tab: 6,0    5,85   6,47   5,34   5,83
PageSpeed		83/100
YSlow			82
Size			154,9KB

===============================================================

Browser Cache aktiviert

Ohne Pagespeed:
18 Requests
Firebug Netzwerk Tab:  3,2     2,7    2,9    2,8    2,85
PageSpeed		80/100
YSlow			81
Complete Size		59,5KB
index size		12,3KB

Standard Konfiguration
18 Requests
Firebug Netzwerk Tab: 2,8    2,7     3,1    3,0    2,85
PageSpeed		80/100
YSlow			84
Complete Size		61,2KB
index size		14,0KB

Fast alle Filter aktiviert:
18 Requests
Firebug Netzwerk Tab: 3,4    3,6    3,4    3,1    3,7
PageSpeed		80/100
YSlow			84
Complete Size		61KB
index size		13,8KB</pre><br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/test-von-googles-neuem-apache-modul-mod_pagespeed/feed</wfw:commentRss> <slash:comments>17</slash:comments> </item> <item><title>Client-IP Problem bei Reverse-Proxy-Betrieb</title><link>http://www.phpgangsta.de/client-ip-problem-bei-reverse-proxy-betrieb</link> <comments>http://www.phpgangsta.de/client-ip-problem-bei-reverse-proxy-betrieb#comments</comments> <pubDate>Wed, 07 Oct 2009 06:35:25 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[Access Log]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[Client IP]]></category> <category><![CDATA[mod_rpaf]]></category> <category><![CDATA[nginx]]></category> <category><![CDATA[REMOTE_ADDR]]></category> <category><![CDATA[Reverse Proxy]]></category> <category><![CDATA[X_Forwarded_For]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=453</guid> <description><![CDATA[In einem meiner letzten Artikel schrieb ich ja bereits über Reverse-Proxies. Der Reverse-Proxy nimmt die Verbindung vom Client (Browser) entgegen, dann kann er entweder selbst den Request bedienen (statische Dateien von der lokalen Platte oder aus dem Cache), oder er verbindet sich zu einem der Backend-Webserver, ruft dort die geforderte Datei ab, und sendet sie [...]<br/><br/> Ähnliche Artikel:<ol><li><a href='http://www.phpgangsta.de/bessere-performance-mit-einem-reverse-proxy' rel='bookmark' title='Bessere Performance mit einem Reverse Proxy'>Bessere Performance mit einem Reverse Proxy</a></li><li><a href='http://www.phpgangsta.de/pdt-2-1-unter-windows-mit-subclipse-svn-client' rel='bookmark' title='PDT 2.1 unter Windows mit Subclipse SVN Client'>PDT 2.1 unter Windows mit Subclipse SVN Client</a></li></ol>]]></description> <content:encoded><![CDATA[<p>In einem meiner <a href="http://www.phpgangsta.de/451" target="_blank">letzten Artikel schrieb ich ja bereits über Reverse-Proxies</a>. Der Reverse-Proxy nimmt die Verbindung vom Client (Browser) entgegen, dann kann er entweder selbst den Request bedienen (statische Dateien von der lokalen Platte oder aus dem Cache), oder er verbindet sich zu einem der Backend-Webserver, ruft dort die geforderte Datei ab, und sendet sie dem Client zurück.</p><p>Ein Problem entsteht nun auf dem Backend-Webserver: Alle Requests kommen vom Reverse-Proxy. Wenn nun in den PHP-Scripten die Client-IP-Adresse verwendet wird, steht darin die IP des Reverse-Proxies.</p><p>Betroffen ist in diesem Fall die PHP-Variable  $_SERVER['REMOTE_ADDR']  als auch das Apache-Log, denn dort taucht auch immer nur die IP des Reverse-Proxy auf.</p><p><img class="alignnone size-full wp-image-467" title="xforwardedfor3" src="http://www.phpgangsta.de/wp-content/uploads/xforwardedfor3.jpg" alt="xforwardedfor3" width="611" height="75" /></p><pre class="brush: plain; title: ; notranslate">127.0.0.1 - - [03/Oct/2009:10:45:24 +0200] &quot;GET /phpinfo.php HTTP/1.0&quot; 200 7800 &quot;-&quot; &quot;Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) FirePHP/0.3&quot;</pre><p>127.0.0.1 deshalb, da ich direkt auf der Linux-Maschine sowohl den nginx als auch den Apache laufen habe.</p><p>Da gibt es natürlich Lösungen. Zuerst einmal müssen wir die Client-IP irgendwie an den Backend-Webserver übergeben. Dafür gibt es den Header &#8220;X_FORWARDED_FOR&#8221;, da wird der nginx die Client-IP reinschreiben.</p><p>Im nginx muss dann folgendes gesetzt werden:</p><pre class="brush: plain; title: ; notranslate">location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
........</pre><p>Ein phpinfo() liefert dann die korrekte Client-IP in X_FORWARDED_FOR (34 ist der Server, 33 der Client):</p><pre><img class="alignnone size-full wp-image-469" title="xforwardedfor4" src="http://www.phpgangsta.de/wp-content/uploads/xforwardedfor4.jpg" alt="xforwardedfor4" width="612" height="106" /></pre><p>Nun installieren wir noch ein Apache-Modul. Dieses Modul sorgt dafür, dass in die Variable $_SERVER['REMOTE_ADDR']  der Wert aus X-FORWARDED-FOR geschreiben wird, damit wir keine PHP-Scripte anpassen müssen. Außerdem sorgt dieses Modul dafür, dass im Apache-Log dieser Wert auftaucht.</p><p>Das Module, das es für diese Aufgabe gibt, lautet &#8220;mod_rpaf&#8221;. Einfach danach googlen, downloaden und in der Apache-Konfiguration laden. Oder unter Linux:</p><pre class="brush: bash; title: ; notranslate">sudo apt-get install libapache2-mod-rpaf</pre><p>Noch kurz konfigurieren /etc/apache2/mods-available/rpaf.conf:</p><pre class="brush: plain; title: ; notranslate">&lt;IfModule mod_rpaf.c&gt;
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
&lt;/IfModule&gt;</pre><p>Das Ergebnis sieht dann so aus:</p><p><img class="alignnone size-full wp-image-468" title="xforwardedfor2" src="http://www.phpgangsta.de/wp-content/uploads/xforwardedfor21.jpg" alt="xforwardedfor2" width="611" height="120" /></p><pre class="brush: plain; title: ; notranslate">192.168.1.33 - - [03/Oct/2009:10:47:23 +0200] &quot;GET /phpinfo.php HTTP/1.0&quot; 200 7808 &quot;-&quot; &quot;Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729) FirePHP/0.3&quot;</pre><p>Möchte man das Modul nicht installieren, muß man überall in seinen PHP-Scripten die Variable $_SERVER['X_FORWARDED_FOR'] statt $_SERVER['REMOTE_ADDR'] nutzen, und das Apache-Log anpassen:</p><pre class="brush: plain; title: ; notranslate">LogFormat &quot;%{X-Forwarded-For}i %l %u %t \&quot;%r\&quot; %&gt;s %b \&quot;%{Referer}i\&quot; \&quot;%{User-Agent}i\&quot;&quot; combined</pre><p>Damit hätten wir das Problem auch gelöst, überall steht nun die Client-IP zur Verfügung, die Anwendungen und Logs laufen wieder korrekt.</p> <br/><br/><p>Ähnliche Artikel:</p><ol><li><a href='http://www.phpgangsta.de/bessere-performance-mit-einem-reverse-proxy' rel='bookmark' title='Bessere Performance mit einem Reverse Proxy'>Bessere Performance mit einem Reverse Proxy</a></li><li><a href='http://www.phpgangsta.de/pdt-2-1-unter-windows-mit-subclipse-svn-client' rel='bookmark' title='PDT 2.1 unter Windows mit Subclipse SVN Client'>PDT 2.1 unter Windows mit Subclipse SVN Client</a></li></ol>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/client-ip-problem-bei-reverse-proxy-betrieb/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Traffic pro eingeloggtem User herausfinden</title><link>http://www.phpgangsta.de/traffic-pro-eingeloggtem-user-herausfinden</link> <comments>http://www.phpgangsta.de/traffic-pro-eingeloggtem-user-herausfinden#comments</comments> <pubDate>Tue, 01 Sep 2009 18:29:40 +0000</pubDate> <dc:creator>Michael Kliewe</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[access_log]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[datenbank]]></category> <category><![CDATA[log]]></category> <category><![CDATA[mysql]]></category> <category><![CDATA[webserver]]></category><guid isPermaLink="false">http://www.phpgangsta.de/?p=359</guid> <description><![CDATA[Den Traffic einer ganzen Seite herauszufinden ist nicht sonderlich schwer in Zeiten von awstats, webalizer und diversen anderen Apache-Log-Analyzern. Doch ich wollte damals bei meinem eigenen Browsergame den Traffic pro eingeloggtem User messen. Idee war damals, den &#8220;Free Accounts&#8221; 100MB pro Monat zu schenken, falls mehr benötigt wird, muss ein Premium-Account her. Doch wie stellt [...]<br/><br/> Keine ähnlichen Artikel.]]></description> <content:encoded><![CDATA[<p>Den Traffic einer ganzen Seite herauszufinden ist nicht sonderlich schwer in Zeiten von awstats, webalizer und diversen anderen Apache-Log-Analyzern.</p><p>Doch ich wollte damals bei meinem eigenen Browsergame den Traffic pro eingeloggtem User messen. Idee war damals, den &#8220;Free Accounts&#8221; 100MB pro Monat zu schenken, falls mehr benötigt wird, muss ein Premium-Account her.</p><p>Doch wie stellt man das an? Das Apache-Log hilft nicht wirklich, denn dort kann man nicht die einzelnen (eingeloggten) User unterscheiden. Ich habe damals 3 Lösungen gefunden:</p><ul><li>mit dem Output Buffer von PHP arbeiten, Stringlänge bestimmen und mitloggen, dann Seite an den Browser schicken</li><li>Irgendwie die IP-Adressen des Users merken, und dann das Apache-Log durchparsen und rechnen.</li><li>die Apache-Extension mod_log_sql</li></ul><p>Möglichkeit 1 sieht dann ungefähr so aus:</p><pre class="brush: php; title: ; notranslate">&lt;?php
ob_start();

// some html content here

$trafficbytes = strlen(ob_get_flush());
// insert traffic into database

?&gt;</pre><p>Habe es nie ausführlich getestet, aber ich denke es ist langsam (da das HTML erst am Ende geflushed wird anstatt zwischendurch schon Häppchen zu verschicken). Außerdem muß man sich noch um Bilder kümmern, denn die sollen ja auch mitgezählt werden. Dazu würde ich eine <a href="http://de.wikipedia.org/wiki/Rewrite-Engine" target="_blank">Rewrite-Rule</a> empfehlen, die bei jedem Bildrequest noch schnell ein php-Script ausführt. Auch das beeinflusst natürlich die Performance des Besuchers und des Webservers.</p><p>Die zweite Möglichkeit ist nicht ganz einfach umzusetzen. Die IP-Adresse allein ist nicht sonderlich aussagekräftig, einen Benutzer damit zu verfolgen recht aufwändig. In Zeiten von Proxies (Grüße an AOL), Neueinwahl bei DSL, mehrere Benutzer hinter einem Heimrouter etc reicht das nicht aus, um darüber den Benutzer zu bestimmen, gerade wenn Bruder und Schwester gemeinsam über eine Leitung im Internet sind usw.</p><p>Die dritte Alternative ist das Apache-Modul, welches ich dann auch genutzt habe: <a href="http://www.outoforder.cc/projects/apache/mod_log_sql/" target="_blank">mod_log_sql</a>. Dieses bindet man einfach in die entsprechene Apache-Config ein, und schon wird ein zusätzliches Log erzeugt, nämlich in der Datenbank. Dies kann man entweder für alle Seiten tun, oder nur für bestimmte VirtualHosts. Welche Spalten dort gefüllt werden sollen, in welcher Reihenfolge und mit welchen Daten, konfiguriert man in der apache-Config. Hier eine Beispielkonfiguration (hier für Linux, für Windows sieht es ähnlich aus: .dll statt .so usw.):</p><pre class="brush: plain; title: ; notranslate">LoadModule log_sql_module modules/mod_log_sql.so
LoadModule log_sql_mysql_module modules/mod_log_sql_mysql.so

LogSQLLoginInfo mysqli://apacheloguser:apachelogpwd@localhost/apachelogdb
LogSQLCreateTables On
LogSQLMachineID mylocalmaschine
LogSQLTransferLogFormat AbHIhMmpRSstTUuvz
LogSQLTransferLogTable ztraffic_access_log
#LogSQLNotesLogTable ztraffic_notes
LogSQLCookieLogTable ztraffic_cookies
#LogSQLHeadersInLogTable ztraffic_headers_in
#LogSQLHeadersOutLogTable ztraffic_headers_out
LogSQLWhichCookies UserID     # hier könnten noch mehr Cookies stehen</pre><p>Man kann alternativ zur eigenen Cookie-Tabelle auch ein bestimmtes Cookie mit &#8216;c&#8217; und &#8220;LogSQLWhichCookie&#8221; in die access_log schrieben lassen. Hier eine <a href="http://www.outoforder.cc/projects/apache/mod_log_sql/docs-2.0/?chapter=/3/6/3/" target="_blank">Liste der Informationen, die man speichern kann</a>.</p><p>Damit das Modul funktioniert, muß man noch das Modul &#8220;unique&#8221; aktivieren, entweder per</p><pre class="brush: plain; title: ; notranslate">a2enmod unique_id</pre><p>oder via Einkommentieren von</p><pre class="brush: plain; title: ; notranslate">LoadModule unique_id_module modules/mod_unique_id.so</pre><p>Apache reload. Wenn man danach eine Seite besucht, liest man folgendes im apache error log:</p><pre class="brush: plain; title: ; notranslate">[Tue Sep 01 19:59:46 2009] [notice] mod_log_sql: child established database connection
[Tue Sep 01 19:59:46 2009] [error] mysql_query returned (1)
[Tue Sep 01 19:59:46 2009] [error] table does not exist, preserving query
[Tue Sep 01 19:59:46 2009] [error] table doesn't exist...creating now
[Tue Sep 01 19:59:47 2009] [error] tables successfully created - retrying query
[Tue Sep 01 19:59:47 2009] [notice] query successful after table creation</pre><p>Die Tabelle wurde also erfolgreich angelegt. Das Ergebnis sieht dann so aus:</p><p><img class="alignnone size-full wp-image-385" title="modlogsql0" src="http://www.phpgangsta.de/wp-content/uploads/modlogsql0.jpg" alt="modlogsql0" width="819" height="647" /></p><p>Der Inhalt der Tabelle (nur 1 Zeile):</p><p><img class="alignnone size-full wp-image-384" title="modlogsql" src="http://www.phpgangsta.de/wp-content/uploads/modlogsql.jpg" alt="modlogsql" width="917" height="593" /></p><p>Wäre dieser Test-Request kein 304er (Not Modified), hätten wir bei &#8220;bytes_sent&#8221; auch eine Traffic-Angabe.</p><p>Mit Hilfe der Cookie-Tabelle können wir dann zB einmal täglich den Traffic jeden Users berechnen und in die entsprechende User-Tabelle füllen. Die Log-Tabelle sollte man dann wieder aufräumen und nicht länger benötigte Zeilen löschen.</p><p>Übrigens ist das Modul nur für Linux supported. Unter Windows kann man es zwar auch kompilieren, das ist aber mehr hohem Aufwand verbunden. Ich habe damals (2004) durch Zufall eine kompilierte Version gefunden. Die ist aber heute nicht mehr brauchbar, da sie für eine sehr alte Apache-Version kompiliert wurde.</p><p>Wenn ihr Fragen habt, fragt! Oder wenn ihr evtl. bessere Lösungen kenn, her damit! Oder was könnte man noch alles anstellen mit diesen Apache-Logs in einer Datenbank?</p><p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p><p>Weitere interessante Links zum Thema:</p><p><a href="http://www.howtoforge.com/apache2-logging-to-a-mysql-database-with-mod_log_sql-on-debian-etch" target="_blank">Anleitung für Debian Etch</a></p><p><a href="http://www.outoforder.cc/projects/apache/mod_log_sql/" target="_blank">Die offizielle Webseite des Moduls</a></p> <br/><br/><p>Keine ähnlichen Artikel.</p>]]></content:encoded> <wfw:commentRss>http://www.phpgangsta.de/traffic-pro-eingeloggtem-user-herausfinden/feed</wfw:commentRss> <slash:comments>7</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: basic
Database Caching 1/39 queries in 0.548 seconds using disk: basic
Object Caching 1599/1645 objects using disk: basic

Served from: www.phpgangsta.de @ 2012-02-04 13:10:54 -->
