Andreas Bergman

Icon

Snabbare siter med mod_pagespeed

Google, som försett internet med grymma tjänster som Gmail och adsense och det fenomenala verktyget Pagespeed. Som ett komplement till sistnämnda har det nu även släppts en modul för Apache2(2.2 och senare) som ska underlätta för administratören att få bra krut i siten. Personligen kan jag tycka att det är ännu ett bevis på att en snabb site bäst uppnås genom att optimera både kod och plattformen som siten körs på.

Än så länge så kan inte mod_pagespeed kontrolleras från en .htaccess-fil, men enligt det här länken så verkar det vara på gång vilket skulle vara ett stort steg i rätt riktning mot att göra användarupplevelsen på internet ännu bättre! Men som jag sa så måste det till mer än bara en servermodul för att det ska bli bättre, alla måste ta tag i sina siter också.

För att installera modulen så måste du manuellt installera en .deb fil med dpkg -i, men bra instruktioner finns på http://code.google.com/p/modpagespeed/

Behöver du hjälp med att konfigurera mod_pagespeed på din server så kan jag hjälpa dig!

Xen vs KVM

Jag har nu ett par dagar försökt få igång XEN på Debian och Ubuntu, men det har inte gått särskilt bra. Främst av det enkla skälet att Ubuntu uttalat sagt att man väljer att inte aktiva supporta XEN utan KVM. Varför det inte funkar i Debian kan jag inte svara på, men troligen för att XEN enligt rykten är väldigt svårt att underhålla i paketform, om det är sant eller inte låter jag förbli osagt.

Hur som helst så var det kalasenkelt att installera KVM i Ubuntu, så nu lirar det utan problem på laptopen. Visst det kanske inte är det ultimata att installera KVM på en laptop, men det funkar! Nu ska jag börja koda på någon form av webbgränssnitt för att styra KVM, tyvärr så verkar det inte finnas några riktigt bra PHP bindningar för libvirt, men jag har hittat det här (phplibvirt) som ser ut att supporta det jag vill ha.

CentOS – grusade drömmar och inkompatibel kärlek.

Jag hade en nyfunnen kärlek för CentOS, allt bara funkade och det var så fantasiskt bra att arbeta med, tills jag skulle försöka få igång XenApi på min server.

Efter att ha försökt i evigheter att få igång det, jag provade ansluta lokalt,remote startade om server och allt annat jag kunde komma på. När jag i min irritation och förtvivlan hittade den här tråden: https://bugzilla.redhat.com/show_bug.cgi?id=310051 efter att ha kontrollerat paketversionen på XEN i min installation så insåg jag att det här var anledningen till att det inte funkade.

För att sammanfatta, det kommer inte finnas något XenApi i RHEL 5, då det är för mycket jobba att skriva om xen userspace som är baserat på XEN 3.0.3 och i den versionen finns inte XenApi med, och eftersom CentOS är RHEL fast i communityversion så lär knappast den funktioner implementeras.

Kvar stod jag med en klump i magen och en känsla av hopplöshet, men som en 16 årig pojke på rebound så installerade jag debian och som i en dröm så bara fungerade det.

Gentoo och EAPI problem.

Jag bytte Profil på min gentooinstallation från 2008.0 till 10 och då slutade helt plötsligt portage att “funka”, alla paket blev masked. Tydligen såhar man infört något som heter EAPI som syftar till att rensa upp i portage och hålla versionerna uppdaterade.

För att lösa problemet så körde jag emerge –nodep portage och emerge –nodep python.

Backup med Rsync

Jag har suttit och läst om backup med rysnc, jag behöver offiste backupa en server och jag vill inte göra en jättestor process av det, utan tycker att rsync med ssh blir lagom. Jag hittade då den här siten: http://www.mikerubel.org/computers/rsync_snapshots/ Nyttig och pedagogisk läsning!

Benchmarktest Nginx vs Apache2 och Cherokee

Jag ska under natten och morgondagen företa mig att göra benchmarktester av Nginx, Apache2 och Cherokee. De två första är jag väldigt bekant med, men Cherokee bli en ny bekantskap för mig. Cherokee ska jag också passa på att presentera lite mer utförligt och se hur det fungerar med PHP, så det blir en benchmark av WordPress och PHP också, precis om i den här posten: http://www.abergman.se/w3-total-cache-och-nginx/

Precis som förra gången så kommer jag att publicera resultatet dels här och på www.cmsdirekt.se, stay tuned!

Vsftp med Virtuella användare i mysql

För att kunna ge mina användare tillgång till de webbmappar där de ska lagra sina statiska filer i mitt Content Delivery Network (http://www.abergman.se/bygg-ditt-eget-cdn-content-delivery-network/) projekt, behövde jag ett sätt för dem att enkelt ansluta till maskinen, det var tvunget att vara väldigt nedlåst och enkelt att använda.Valet föll på FTP, av den enkla anledningen att det är enkelt, många publiceringssystem har redan stöd för det och i princip alla webbadministratörer kan använda det.

Mitt första val av ftpserver var ProFtpd, då jag använt den i ett annat projekt där jag byggde en helautomatisk hostingplattform med One-Click installation, fakturering, DNS och Ftp-stöd. Dock så fick jag det inte att fungera den här gången, av någon knepig anledning. Hur som helst så hittade jag att vsftp kunde göra samma sak som ProFtpd, nämligen authensiera användare  mot en Mysqldatabas, Vsftp använder sig av tillägget till PAM som kör mot en mysqlserver(pam_sql).

Den här guiden förutsätter att du redan har en mysqlserver installerad.

Installera Vsftpd

apt-get install vsftp

Sedan är det bara att hacka i konfigurationen, som finns i /etc/vsftp.conf

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
pasv_min_port=63200
pasv_max_port=63204
nopriv_user=cdnuser
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
guest_enable=YES
guest_username=cdnuser
local_root=/var/cdn/$USER
user_sub_token=$USER
virtual_use_local_privs=YES

Jag valde att använda mig av användaren cdnuser för att köra FTP-servern, viktigt är också att notera raden: pam_service_name=vsftpd, det är det namn som pam kommer använda för att avgöra vilken konfigurationsfil den ska använda. Som synes på raden /var/cdn/$USER så finns alla användares hemkataloger under /var/cdn/$USER där $USER såklart är en variabel för användarnamnet, det gör att jag inte behöver ange vilken arbetsmapp användaren ska ha utan det sköts automatiskt. Av den enkla anledningen finns det bara två kolumner i tabellen som styr användarna.

Sätta upp databasen

Skapa en databas som heter “vsftpd” med en tabell som heter “accounts” med nedan kolumner:

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(30) | NO   | UNI | NULL    |                |
| pass     | varchar(50) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

En ny användare skapar du med: INSERT INTO accounts (username, pass) VALUES(‘USERNAME’, PASSWORD(‘PASSWORD’));

Konfigurera PAM

Sista saken som ska konfigureras innan vi är klara, PAM. Glöm inte att backup:a orginalfilen innan du skapar den här konfigurationsfilen /etc/pam.d/vsftpd

auth required pam_mysql.so user=DBUSER passwd=DBPASSWORD host=DBHOST db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2
account required pam_mysql.so user=DBUSER passwd=DBPASSWORD host=DBHOST db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2

Glöm inte att ändra databasanvändarnamn, lösenord och host samt skapa en mapp i /var/cdn som motsvara användarens lösenord och som ägs av samma användare som FTP-servern körs som!

Den här guiden är löst baserad på en annan bloggares post, men jag kan inte hitta URL:en just nu, säg till om du hittar den!


Konfigurera Nginx och Varnish

I mitt lilla projekt om att sätta upp ett eget CDN, Content Delivery Network så har jag nu konfigurerat om Nginx samt installerat Varnish. Det funkar så att Varnish ligger som gateway på port 80 och går igenom alla inkommande requests, om någon request matchar konfigurationen i Varnish så hanterar den det enligt gällande regler. För att uppnå det måste Nginx konfigureras om för att lyssna på en annan port, jag valde för enkelhetens skull port 8080.

 Om du inte redan har installerat Nginx, så finns en guide här

Konfiguration av Nginx, ändra nedan i alla dina vhostar:

Listen 8080

Det gör att Nginx kommer att lyssna på port 8080 istället för 80, det är viktigt att ställa om det på alla vhostar, annars kommer nginx eller varnish inte starta om ordentligt. vill du kan du även skriva 127.0.0.1:8080 så kommer Nginx att bara lyssna på requests som kommer internt på maskinen och inte externt, jag väljer att inte skriva det då jag vill kunna komma åt webbservern direkt externt också, i testsyften.

Installation av Varnish

Varnish finns i Debian stabels paketförråd och installeras med:

apt-get install varnish

Sedan så är det mer eller mindre klart, varnish startas med /etc/init.d/varnish och loggdemonen med /etc/varnishlog start, med största sannolikhet är de redan startade. 

Nu börjar det roliga, men samtidigt besvärliga, vad är det jag vill cacha? Jag har ett enkelt exempel där jag bara cachar statiska filer på en viss domän:

backend default {
        set backend.host = “127.0.0.1″;
        set backend.port = “8080″;
}

sub vcl_recv {
           if (req.http.host ~ “http://cdn.sngw.se“) {
             pass;
           } else {
             if (req.request != “GET” && req.request != “HEAD”) {
                 pipe;
             }
             if (req.request == “POST”) {
                 pass;
             }
             if (req.request == “GET” && req.url ~ “\.(jpg|jpeg|gif|ico|png)$”) {
                 lookup;
             }
             if (req.request == “GET” && req.url ~ “\.(css|js)$”) {

 lookup;
             }

             if (req.request == “GET”) {
                 lookup;
             }
             lookup;
          }
        }
         sub vcl_pipe {
             pipe;
         }

         sub vcl_pass {
             pass;
         }

         sub vcl_hit {
             if (!obj.cacheable) {
                 pass;
             }
             if (req.http.Cookie) {
                pass;
             }
             deliver;
         }

         sub vcl_miss {

fetch;
         }

         sub vcl_fetch {
             if (!obj.valid) {
                 error;
             }
             if (!obj.cacheable) {
                 pass;
             }
             insert;
         }

         sub vcl_deliver {
             deliver;
         }

         sub vcl_timeout {
             discard;
         }

         sub vcl_discard {

     discard;

         }

 

De här reglerna  cache:ar bara statiska filer och gör ingenting konstigt med dem. Nu är du redo att fortsätta upptäcka mer fantastiska grejer med Varnish ocg nginx, lycka till!

HipHop for PHP på Debian (Testing)

I mitt sökande efter bra sätt att optimera prestandan på maskinerna så sprang jag över “HipHop for PHP” som är utvecklat av killarna bakom facebook, som ett sätt för dem att kunna utnyttja sina maskiner bättre. Enligt egen utsago så har de kunnat halvera CPU-belastningen med upp till 50%!

Detta kan de uppnå genom att använda sig av HipHop for PHP som konverterar PHP:t till C++ och sedan kompilerar det, så man kan köra sin PHP-applikation som en demon, antingen direkt på port 80 och slippa ha en webbserver, eller som jag planerar göra; På någon annan obskyr port och använda Nginx som gateway.

Som vanligt när man ska testa något så får man inleda med att installera det, och då HipHop For php är relativt nytt så finns det ännu inga färdiga paket att installera, dessutom så kräver HipHop for PHP en del patchade paket för att funka, så vi är utlämnade till en manuell installation. När jag först skulle installera beroendena så provade jag på Debian Lenny, men tyvärr så fanns inte ett paket som hör ihop med libboost till Stable än, så istället för att försöka haxxa in det manuellt så valde jag att uppdatera burken till testing istället, då kunde jag utan problem dra in alla beroenden.

apt-get install cmake g++ libboost-dev flex bison re2c libmysqlclient14-dev libxml2-dev libmcrypt-dev libicu-dev openssl binutils-dev libcap-dev libgd2-xpm-dev zlib1g-dev libtbb-dev libonig-dev libpcre3-dev git-core autoconf libtool libcurl4-openssl-dev libboost-system-dev libboost-program-options-dev libboost-filesystem-dev

När det här är installerat, så är det dags att ge sig på HipHop for PHP och de paket som måste patchas och installeras manuellt, som jag uppfattar det så är patcharna skickade till respektive projekt för att komma med i paketet, men det verkar inte vara klart än. Först, ladda hem källkoden för HipHop:

mkdir hiphop
cd hiphop
git clone git://github.com/facebook/hiphop-php
cd hiphop-php
export CMAKE_PREFIX_PATH=`/bin/pwd`/../
export HPHP_HOME=`/bin/pwd`
export HPHP_LIB=`/bin/pwd`/bin
git submodule init
git submodule update
cd ..

Sedan är det dags att ladda ner  och patcha libevent.

wget http://www.monkey.org/~provos/libevent-1.4.13-stable.tar.gz
tar -xzvf libevent-1.4.13-stable.tar.gz
cd libevent-1.4.13-stable
cp ../hiphop-php/src/third_party/libevent.fb-changes.diff .
patch < libevent.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

Det ska inte vara något problem att kompilera, skulle du köra fast av någon anledning så får du skriva en kommentar så ska jag försöka hjälpa dig! Nästa i tur för att kompileras är ICU4, detta behöver inte patchas utan ska bara installeras.

wget http://download.icu-project.org/files/icu4c/4.2.1/icu4c-4_2_1-src.tgz
tar -xvzf icu4c-4_2_1-src.tgz
cd icu/source
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ../../

Inga konstigheter där heller, nästa och sista paketet innan HipHop for PHP är libcurl, det är viktigt att komma ihåg -p0 som flagga i patch och att se till att tiden på maskinen är korrekt.

wget http://curl.haxx.se/download/curl-7.20.0.tar.gz
tar -xvzf curl-7.20.0.tar.gz
cd curl-7.20.0
cp ../hiphop-php/src/third_party/libcurl.fb-changes.diff .
patch -p0 < libcurl.fb-changes.diff
./configure --prefix=$CMAKE_PREFIX_PATH
make
make install
cd ..

Så var det dags för det sista innan vi kan testa; Kompilera HipHop for PHP!

cd hiphop-php
cmake .
make

Hela installationsprocessen är ganska straight forward och inga större konstigheter, dock så är den lite tidskrävande om man ska göra den på många maskiner. Hur man sedan använder HipHop återkommer jag med i ett senare inlägg.

För att testa så det fungerar som det ska så ska jag testa HipHop for PHP med ett enkelt “Hello World”-exempel: Läs det här

Källa: http://mediakey.dk/~cc/howto-install-hiphop-for-php-on-ubuntu/ som i sin tur tagit den från http://wiki.github.com/facebook/hiphop-php/building-and-installing-on-ubuntu-910

Den här bloggen

skriver jag, Andreas Bergman, vilket i sig inte bör vara så förvånande. Jag driver en SMS tjänst och jobbar som tekniker/allt i allo på SEA där jag bland annat driftar en stor bloggportal och ett webbhotell. Vi håller även på att bygga ett datacenter.


Jag har några microsoft titlar, ett gäng DELL certifikat och jobbar dagligen med hårt belastade webbservrar. Utöver det jobbar jag också med virtualisering och server/storage. Någon gång ibland säljer jag även server och storagelösningar.

Maila mig gärna om något av ovan, eller annat, jag är ganska trevlig sägs det. andreas@abergman.se.