Andreas Bergman

Icon

Skapa användningsgrafer för Nginx

I en tidigare post(http://www.abergman.se/hall-koll-pa-din-nginx-servers-status/) skrev jag om en modul för att hålla koll på Nginx status.

Alla som vet något om sälj, vet att säljare och chefer älskar statistik, dessutom så är det ganska smidigt för att se trender över tid, så man kan motivera att köpa in en ny server.

För att göra det så har en smart snubbe(http://kovyrin.net/2006/04/29/monitoring-nginx-with-rrdtool/) skrivit ett litet RRD script för att skapa grafer.

Ladda ner scriptet: http://kovyrin.net/files/mrtg/rrd_nginx.pl.txt

Innan du provar köra det, installera de här paketen om du inte redan har dem:

librrds-perl
libwww-perl

Anpassa inställningarna i scriptet så de passar dig, så bilderna landar där du vill ha dem etc. Sedan lägger du in en rad i cron för att köra scriptet en gång i minuten.

* *     * * *   root    /some/path/rrd_nginx.pl

Jag använde crontab -e, så jag uteslöt “root” ur min fil.

Om allt funkar kommer scriptet nu att spotta ur sin finfina grafer, som du tex kan infoga på en HTMLsida för att kunna kika på dem via webbläsaren, eller så kan du använda dem i nästa rapport där du ber om en ny server.


			

Håll koll på din Nginx servers status

Vill du veta hur många anslutningar som din nginxserver har aktiva just nu? Eller hur många anslutningar den har tagot emot totalt? Eller vill du skapa en asfet graf i ditt övervakningssystem på hur mycket last Nginx tar?

Oavsett så löser du det såhär:

location /nginx_status { 
  stub_status on;
  access_log   off;
  allow EN.IP.ADRESS;
  deny all;
}

Det ska skrivas i en site-config och inte direkt i nginx.conf. Om du inte riktigt bryr dig om vem som tittar på dina stats, eller om du kanske rent utav vill visa upp dem så kan du ju alltid sätta “allow all” och ta bort “deny all”.

Nginx och dess loggar

Jag kom idag på en sak som jag förbisett tidigare, nämligen debug-flaggans potential att skapa gigantiska loggfiler, debugflaggan kan man slå på för errorloggarna och då får man fram massor av fantastisk information, tex vilka regler i vhosten som slår på aktuell request eller vilka fel som php-genererar. Dock så blir det ganska stora filer, så det rekomenderas att antingen hålla ordentlig koll på filerna, eller slå av flaggan om du inte jobbar med att debugga siten.

Då jag har så många siter igång och inte orkar ändra alla vhostar så valde jag att skriva om reglerna för logrotate samt sätta maxfile size kontroller på filerna, eftersom en bra errorlog är en tom errorlog:) så nu får jag ett larm om någon fil överstiger 1Mb.

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!

Nginx och Phpmyadmin

I många fall är det behagligt att kunna administrera sina databaser visuellt, ett kanonbra verktyg för det är phpmyadmin, det är dessutom gratis och opensource, vilket gör det hela ännu roligare.

När du installerar phpmyadmin via en pakethanterare, tex APT, så kommer den i många fall ge dig valet att välja vilken webbserver du vill konfigurera phpmyadmin för, än så länge finns inte valet Nginx, men det betyder inte att det inte går att köra phpmyadmin på Nginx. Jag valde att ladda ner phpmyadmin själv och inte använda den version som kommer med när man drar ner den via apt, detta av ren och skär lättja.

Börja med att ladda hem PhpMyAdmin från: http://www.phpmyadmin.net/home_page/downloads.php packa upp grejerna i en passande mapp, jag valde /usr/share men du kan lika gärna använda /var/www, kom ihåg vart du lägger filerna bara då du måste anpassa konfigurationen därefter.

När du packat upp filerna så är det bara att fixa konfigurationen för Nginx, min ser ut som nedan.

server {
        listen   80;
        server_name  host.se;
      access_log  /var/log/nginx/phpmyadmin.access.log;
        error_log   /var/log/nginx/phpmyadmin.error.log debug;

            location / {
                root  /usr/share/phpmyadmin/;
                index  index.php;
               
             }
          location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /usr/share/phpmyadmin$fastcgi_script_name;
                include fastcgi_params;
            }
            location ~ /\.ht {
               deny  all;
            }  

}

Det är alles, lycka till!

CodeIgniter och Nginx

I sitt blogginläggCmsDirekt skriver David V. Wallin lite kort om hur man får ramverket CodeIgniter att lira på Nginx: Det är egentligen bara en rewriteregel och en liten förändring på hur man skickar sidor till php-fpm. Såhär ser  konfigurationen ut som du kompletterar din vhost med:

location /{
if (!-f $request_filename) {
rewrite ^(.*) /index.php?$1 last;
}
}
 
location ~ \.php$ {
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param  SCRIPT_FILENAME  /var/www/example.org/index.php;
}
 

Notera att efter SCRIPT_FILENAME så skickar vi inte med variablen $FASTCGI som vi gör när vi konfigurerar för vanligt php, utan vi skickar explicit med index.php eller vilken sida man nu har som förstasida.

php5-fpm och “Short open tag”

I php så kan man tydligen fuska med taggarna, detta var inget jag visste sedan tidigare, men David visste. Så när han byggde www.ngweb.se så använda han sig av sådana taggar, dvs <? och ?>.

När vi sedan migrerade från apache2 till Nginx och php5-fpm så slutade dessa funka, ingen av oss visste riktigt varför men det visade sig efter att jag kollat igeom php.ini för php5-fpm att det är ett val i konfigurationen som stänger av eller slår på detta. Nu hade David redan fixat det här i koden, men det är värt att skriva ner ifall jag eller någon annan stöter på det igen. I konfigurationen för php5-fpm(och troligen all annan php) finns ett val som heter “short_open_tag” detta kan vara On eller Off, mer läsning om short_open_tag kan du hitta på: http://php.net/short-open-tag och www.cmsdirekt.se.

Catch all-host och redirect

Ibland har man domäner på sin maskin som man inte använder, som man kanske vill parkera så länge eller så har man ibland flyttat den till en annan adress, till exempel i samband med att siten bytte namn. För att hantera detta på ett snyggt sätt och slippa duplicate content i sökmotorerna så kan man lägga en ‘redirect’ på domänen i fråga. En redirect är en HTTP-status kod som talar om för webbläsaren, sökmotorn etc hur de ska hantera sidan, om de ska gå vidare eller om de ska slå upp den. De två vanligaste HTTP-statuskoderna är 200 och 404.

404 betyder att innehållet man letar efter inte finns, man kanske försöker öppna en fil som inte finns eller liknande.
200 betyder helt enkelt att filen hittas och det är OK att slå upp/visa sidan.
300-serien indikerar att filen/siten har flyttats, tex så betyder 301 att den flyttat permanent och 302 att den flyttat temporärt och kommer att komma tillbaka.
500-serien indikerar att det är något som är fel på servern.

I mitt fall har vi en server där jag hanterar många olika domäner, dock så har servern själv ingen egen domän som är dess ‘primära’ utan en domän utan hemsida som bara är för managementsyfte. Dessutom så vill vi inte att min maskin ska visa blanka sidor eller säga att en site inte finns, så för att hantera det så har jag lagt en redirect med status 301 på en virtuell host som fångar alla domäner som inte är specificerade någon annanstans, exemplet hittade jag på Nginx Wiki: NginxVirtualHostExample.

server {
  server_name _;
  server_name_in_redirect  off;
  rewrite ^/(.*) http://www.ngweb.se/$1 permanent;
}

Den här Vhost konfigurationen tar alla anrop till servern till en domän som inte finns på maskinen och skickar dem till www.ngweb.se.

För att göra det tydligare så överväger jag att be David skriva en undersida som talar om att det är en domän som ägs av ngweb.se, så det blir riktigt tydligt.

Nginx rewrite för drupal

Har du en drupalsite som du vill köra på Nginx så måste du skriva om rewrite reglerna för siten, precis som för WordPress( som du kan läsa om här: Nginx rewrite för wordpress ).

Precis som för wordpress ska du lägga till rewriteregler i location för roten för siten, det bör se ut såhär:

if (!-e $request_filename) {
    rewrite ^/(.*)$ /index.php?q=$1 last;
}

Eventuellt kan du behöva lägga till “break;” innan slutklammern för rewrite regeln.

 

Installera Nginx med PHP5

Nginx är en snabb och effektiv webbserver med många användningsområden, den kan agera som gateway, lastbalanserare mm.
Jag ska installera den tillsammans med PHP5-FPM och  konfigurera upp en standardwebbsite. Det här gör jag på en maskin som kör debian stable/Debian Lenny. Många använder fastcgi för att köra php, men det finns ett bättre sätt; PHP5-FPM.

Vi börjar med att lägga till Dotdeb som källa för apt, detta gör att debian ännu så länge inte har php5-fpm paketerat.

sudo echo "deb http://php53.dotdeb.org stable all" >> /etc/apt/sources.list

Uppdatera nu paketförråden med apt-get update och installera sedan Nginx och php5-cli.

apt-get install nginx php5-cli php5-common php5-suhosin

Installera därefter php5-fpm.

apt-get install php5-fpm php5-cgi

Nu ska vi konfigurera en Virtuell Host i Nginx som kommer att använda php5. Jag utgår från Nginx default/exempel konfig som finns i /etc/nginx/sites-available/default

server {
        listen   80;
        server_name  localhost;
      access_log  /var/log/nginx/localhost.access.log;
        error_log   /var/log/nginx/localhost.error.log debug;

            location / {
                root   /var/www/nginx-default;
                index  index.html;
             }
          location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
                include fastcgi_params;
            }
            location ~ /\.ht {
               deny  all;
            }

  }

Nu är det bara att skapa en fil i mappen /var/www/nginx/default med innehåller <?php phpinfo(); ?> och köra /etc/init.d/php5-fpm restart så ska det fungera och du bör se en text som liknar den nedan!

php5-fpm

 

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.