Nginx + PHP5-fpm auf Debian/Ubuntu

Zurück zur “Webseiten beschleunigen” – Übersicht

5.3) Nginx als Webserver


nginx_logo

Wer komplett auf nginx als Webserver umsteigen will kann dies auch sehr einfach bewerkstelligen. Ich persönlich nutzte diese Methode und es laufen mehrere WordPress-Webseiten, e107, DokuWiki u.s.w. tadellos mit diesem System.

Als erstes müssen wir unsere sources.list ein wenig erweitern… um php5-fpm direkt mit dem Projektmanager installieren zu können, wie dies Funktioniert habe ich bereits in einem anderen Beitrag beschreiben: php-5-FPM

Danach installieren wir nginx (Webserver) + PHP, wenn du noch apache2 oder einen anderen Webserver, welcher auf Port 80 lauscht installiert hast, musst du diesen nun deinstallieren bzw. erst einmal stoppen und ggf. einige libraries nachinstallieren, falls du Ubuntu und nicht Debian nutzt.


ggf. nur bei Ubuntu

wget http://us.archive.ubuntu.com/ubuntu/pool/main/k/krb5/libkrb53_1.6.dfsg.4~beta1-5ubuntu2_i386.deb
wget http://us.archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu38_3.8-6ubuntu0.2_i386.deb
sudo dpkg -i *.deb

ggf. root-Rechte

sudo bash

ggf. apache stoppen

/etc/init.d/apache2 stop
aptitude install nginx php5-fpm

Nun kommen wir zur Konfiguration, ich poste hier einfach mal meine komplette Konfig, daher sollte diese ohne Probleme lauffähig sein, wenn du die aktuelle Version installiert hast.

vim /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
worker_rlimit_nofile 3000;
pid /var/run/nginx.pid;

# [ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log;

#google_perftools_profiles /tmp/profile/;

events {
        worker_connections 2048;
        # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ;
        use epoll;
        multi_accept on;
}

http {
        server_names_hash_bucket_size 64;

        ## Size Limits
        client_max_body_size        10M;
        client_header_buffer_size   32k;
        client_body_buffer_size     128k;
        large_client_header_buffers 64 8k;

        ## Timeouts
        client_body_timeout   3m;
        client_header_timeout 3m;
        send_timeout          3m;
        #expires              24h;
        keepalive_timeout     120 120;

        ## General Options
        ignore_invalid_headers   on;
        keepalive_requests       100;
        limit_zone normal $binary_remote_addr 5m;
        recursive_error_pages    on;
        sendfile                 on;
        server_name_in_redirect  off;
        server_names_hash_max_size 512;
        server_tokens            off;
        set_real_ip_from 127.0.0.1;
        real_ip_header X-Forwarded-For;

        ## TCP options
        #tcp_nopush on;
        tcp_nodelay off;
        #send_lowat 12000;

        include mime.types;
        default_type application/octet-stream;

        access_log /var/log/nginx/access.log;

        log_format main '$remote_addr - $remote_user [$time_local] $status '
        '\"$request\" $body_bytes_sent \"$http_referer\" '
        '\"$http_user_agent\" \"http_x_forwarded_for\"';

        ## Cache
        open_file_cache max=1000 inactive=24h;
        open_file_cache_valid    24h;
        open_file_cache_min_uses 2;
        open_file_cache_errors   on;

        ## Compression
        gzip              on;
        gzip_static       on;
        gzip_disable      "MSIE [1-6]\.";
        gzip_buffers      32 8k;
        gzip_comp_level   5;
        gzip_http_version 1.0;
        gzip_min_length   0;
        gzip_proxied      any;
        gzip_types text/plain text/css text/xml text/javascript application/json application/xml application/xml+rss application/x-javascript image/x-icon application/x-perl application/x-httpd-cgi;
        gzip_vary         on;

        output_buffers   10 128k;
        postpone_output  1500;

        # Beispiel: Loadbalance
        #upstream webbackend  {
                #ip_hash;
                #server web1.domain.lan weight=10 max_fails=3 fail_timeout=30s;
                #server web2.domain.lan weight=1 backup;
        #}

        # Beispiel: Reverse-Proxy
        #server {
                #access_log  /var/log/nginx/access.proxy.log main;
                #error_log   /var/log/nginx/error.proxy.log;
                #listen      80;
                #server_name _;

                ## PROXY - Web
                #location ~ \.php$ {
                        #proxy_cache            cache;
                        #proxy_pass  http://127.0.0.1:8080;
                #}
        #}

        # Beispiel: HTTP Server (sollte jedoch besser unter /etc/nginx/sites-available/ angelegt werden)
        #server {
                #listen       80;
                #listen       somename:80;
                #server_name  somename  alias  another.alias;

                #location / {
                        #root   html;
                        #index  index.html index.htm;
                        #}
                #}

        # Beispiel: HTTPS Server (sollte jedoch besser unter /etc/nginx/sites-available/ angelegt werden)
        #server {
                #listen       443;
                #server_name  localhost;

                #ssl                  on;
                #ssl_certificate      cert.pem;
                #ssl_certificate_key  cert.key;

                #ssl_session_timeout  5m;

                #ssl_protocols  SSLv2 SSLv3 TLSv1;
                #ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
                #ssl_prefer_server_ciphers   on;

                #location / {
                #root   html;
                #index  index.html index.htm;
                #}
        #}

#include /etc/nginx/proxy.conf;
include /etc/nginx/sites-enabled/*.conf;
}
vim /etc/nginx/proxy.conf
proxy_buffering            on;
proxy_cache_min_uses       3;
proxy_cache_path           /usr/local/nginx/proxy_cache/ levels=1:2 keys_zone=cache:10m inactive=24h max_size=1000M;
proxy_cache                cache;
proxy_cache_valid          200 24h;
proxy_cache_use_stale      error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_ignore_client_abort  off;
proxy_intercept_errors     on;
proxy_next_upstream        error timeout invalid_header;
proxy_redirect             off;
proxy_set_header           Host            $host;
proxy_set_header           X-Real-IP       $remote_addr;
proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffers              32 1M;
proxy_busy_buffers_size    31M;
proxy_temp_file_write_size 30M;
proxy_buffer_size          30M;
proxy_connect_timeout      90;
proxy_send_timeout         90;
proxy_read_timeout         90;
proxy_ignore_headers       Expires Cache-Control;

so nun richten wir unsere erste Webseite ein… (domain.de muss in den nachfolgenden Howto durch deine eigene Domain ersetzt werden und natürlich für jede neue Werbepräsenz eine neue Datei angelegt werden.

cd /etc/nginx/sites-available/
vim domain.de.conf
server {
        server_name domain.de www.domain.de *.domain.de;
        root /var/www/www.domian.de/web/;
        listen 80;
        index index.php;
        access_log /var/log/nginx/www.domian.de.access.log main;
        error_log /var/log/nginx/www.domian.de.error.log;

        if (-f $request_filename) {
                break;
        }

        location / {
                try_files $uri $uri/ @domian;
        }

        location ~* ^.+.(htm|html|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
                access_log off;
                expires max;
                root /var/www/www.domian.de/web/;
        }

        location @domian {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root/index.php;
                include /etc/nginx/fastcgi_params;
                fastcgi_param SCRIPT_NAME /index.php;
        }

        location ~ \.php$ {
                try_files $uri @domian;
                fastcgi_index index.php;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }

        location ~ /\.ht {
                deny  all;
        }
}
vim /etc/nginx/fastcgi_params
fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

fastcgi_param  REDIRECT_STATUS    200;

nun müssen wir die Webseite nur noch aktivieren, indem wir die soeben erstellte Datei verlinken.

cd /etc/nginx/sites-enabled/
ln -s ../sites-available/domain.de.conf .
nginx -t
/etc/init.d/nginx restart

Und schon läuft unser neuer Webserver. :-) Um die neuste Version von Nginx auf Debian/Ubuntu zu installieren kann man ggf. noch folgende Quellen in die “sources.list” eintragen.

echo "deb  http://ppa.launchpad.net/nginx/stable/ubuntu lucid main" >> /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C
apt-get update
apt-get install nginx

… oder du verwendest die letzte Development-Version:

echo "deb  http://ppa.launchpad.net/nginx/development/ubuntu lucid main" >> /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C
apt-get update
apt-get install nginx

Nun müssen wir PHP5-FPM noch ein wenig anpassen, so dass php-fpm mit den Rechten des jeweilligen Webs ausgeführt wird:

mkdir /etc/php5/fpm/pools/
vim /etc/php5/fpm/php5-fpm.conf
[...]
[global]
pid = /var/run/php5-fpm.pid
error_log = /var/log/php-fpm.log
log_level = notice
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 5s
daemonize = yes

;  pools defined in virtual hosts
include=/etc/php5/fpm/pools/*.conf
[..]

Nun leben wir für eine Webseite eine PHP-Konfiguration an:

vim /etc/php5/fpm/pools/domain.conf
[domain]

; one Port for one Website
listen = 127.0.0.1:11000

; uid/gid
user = domain_user
group = domain_group

; logging
request_slowlog_timeout = 5s
slowlog = /var/log/slowlog-domain.log

; Choose how the process manager will control the number of child processes.
pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 500

; Pass environment variables
env[TMP] = /var/www/www.domain.de/phptmp
env[TMPDIR] = /var/www/www.domain.de/phptmp
env[TEMP] = /var/www/www.domain.de/phptmp

; inculde defaults
include = /etc/php5/fpm/common.conf

; host-specific php ini settings here
;php_admin_value[open_basedir] =
vim /etc/php5/fpm/common.conf
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.status_path = /status
ping.path = /ping
ping.response = pong
request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes
env[HOSTNAME] = $HOSTNAME
env[PATH] = /bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin
Jetzt läuft der PHP-fpm Prozess mit den Rechten des jeweiligen Users und mit eigenem Tmp-Verzeichnis, wer will kann php-fpm sogar in einer chroot-Umgebung ausführen lassen :-)
Links:

.bashrc

Wer Einstellungen an der bash ändern möchte oder z.B. einige Kommandos bzw. die
passenden Parameter nur schwer behalten kann oder eher selten auf der
Kommandozeile arbeitet, für den sind Einträge in der .bashrc sehr hilfreich.

Global -> /etc/bash.bashrc

User -> ~/.bashrc

 

Download:

https://github.com/voku/dotfiles/blob/master/.bashrc

 

Es folgen einige Einträge welche man ggf. in der .bashrc eintragen kann

export

# Datum zum Historylog hinzufuegen
export HISTTIMEFORMAT="%F %T "
# History auf 3000 Eintraege erweitern
export HISTSIZE=3000
# keine doppelten Einträge speichern
export HISTCONTROL=ignoredups
LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01; 35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:'
export LS_COLORS
# Source Globale Definitionen
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Schalte vervollstaendigung fuer Programme ein
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi

alias

alias checkupdates='sudo apt-get update'

-> aktualisiert die Quellen (sources.list)

alias mkdd='mkdir $(date +%Y%m%d)'

-> erstellt ein Verzeichnis mit angehängtem Datum (yyyymmdd)

alias launchpadkey='sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys'

-> fuegt einen neuen Key Launchpad PPAs fuer Ubuntu hinzu

z.B.: launchpadkey 4E5E17B5

alias grep='grep --color=auto'

-> Ergebnisse von grep werden nun farblich markiert

alias ls='ls --color=auto -Fh'

-> verleiht dem “ls”-Befehl Farbe

alias la='ls -laFh --color=auto'

-> zeigt alle Dateien und Verzeichnisse ausführlich an

alias ll='ls -lFh --color=auto --group-directories-first'

-> zeigt Dateien und Verzeichnisse ausführlich an

alias llr='ls -lartFh --color=auto --group-directories-first'

-> zeigt die zuletzt geänderten Dateien unten an

alias dir='ls --color=auto --format=vertical'

-> zeigt Dateien und Verzeichnisse an

alias vdir='ls --color=auto --format=long'

-> zeigt mehr Infos zu Dateien und Verzeichnissen an

alias tree='tree -Csu'

-> zeigt einen Verzeichnis-Baum an

alias timestamp='date "+%Y%m%dT%H%M%S"'

-> zeigt den aktuellen Timestamp im ISO 8601 Format an

alias lf='find ./* -ctime -1 | xargs ls -ltr --color'

-> zeigt rekursiv Dateien und Verzeichnisse die in der letzten Stunde anfasst wurden an

alias myip='GET http://www.whatismyip.com/automation/n09230945.asp && echo'

-> zeigt deine oeffentliche IP-Adresse an

alias ..='cd ../'

-> wechselt ein Verzeichnis nach oben

alias ::='cd ../..'

-> wechselt zwei Verzeichnisse nach oben

alias 'psx'='ps auxwf | grep'

-> zeigt die/den entsprechenden Prozess an

alias pst='pstree -Alpha'

-> zeigt die Prozessstruktur uebersichtlich an

alias psmy='ps -ef | grep $USER'

-> zeigt alle meine Prozesse an

alias lsport='sudo lsof -i -T -n'

-> zeigt die Ports an, welche die Applikationen verwenden

alias llport='netstat -nape --inet'

-> zeigt weitere Infos über die Ports an, welche die Applikationen verwenden

alias du='du -kh'

-> zeigt den Festplattenverbrauch eines Verzeichnisses leserlich an

alias df='df -kTh'

-> zeigt den kompletten Festplattenverbrauch leserlich an

function

# Netzwerk Info
netinfo ()
{
  echo "--------------- Network Information ---------------"
  /sbin/ifconfig | awk /'inet Adresse/ {print $2}'
  echo ""
  /sbin/ifconfig | awk /'Bcast/ {print $3}'
  echo ""
  /sbin/ifconfig | awk /'inet Adresse/ {print $4}'
  echo "---------------------------------------------------"
}
# entpacken von Komprimierten Dateien
extract()
{
  if [ -f $1 ] ; then
    case $1 in
             *.tar.bz2)   tar xvjf $1     ;;
             *.tar.gz)    tar xvzf $1     ;;
             *.bz2)       bunzip2 $1      ;;
             *.rar)       unrar x $1      ;;
             *.gz)        gunzip $1       ;;
             *.tar)       tar xvf $1      ;;
             *.tbz2)      tar xvjf $1     ;;
             *.tgz)       tar xvzf $1     ;;
             *.zip)       unzip $1        ;;
             *.Z)         uncompress $1   ;;
             *.7z)        7z x $1         ;;
             *)           echo "'$1' cannot be extracted via >extra  ct<" ;;
         esac
  else
    echo "'$1' is not a valid file"
  fi
}
# zeigt alle Dateien in dem akuellen Verzeichnis an (rekursiev)
ff()
{
  find . -type f -iname '*'$*'*' -ls ;
}
# Finde Text in Dateien
fstr()
{
  OPTIND=1
  local case=""
  local usage="fstr: find string in files.
  Usage: fstr [-i] "pattern" ["filename pattern"] "
  while getopts :it opt
    do
        case "$opt" in
        i) case="-i " ;;
        *) echo "$usage"; return;;
        esac
  done
  shift $(( $OPTIND - 1 ))
  if [ "$#" -lt 1 ]; then
    echo "$usage"
        return;
  fi
  find . -type f -name "${2:-*}" -print0 |
  xargs -0 egrep --color=always -sn ${case} "$1" 2>&- | more
}
# Infos zu einer Datei ausgeben
file_information()
{
  if [ $1 ]; then
    PLACE=`type -path $1`
    if [ -z $PLACE ]; then echo "$1: not found"; return 1; fi
      echo $PLACE
          ls -l $PLACE
          file $PLACE
        ldd $PLACE
  else
      echo "Missing argument"
  fi
}
alias finfo=file_information
# ein Backup einer Datei anlegen (mit Datum)
file_backup()
{
  for FILE ; do
    [[ -e "$1" ]] && cp "$1" "${1}_$(date +%Y-%m-%d_%H-%M-%S)" || echo ""$1" not found." >&2
  done
}
alias fback=file_backup
# Ein komprimiertes Backup + Datum erstellen
packen()
{
tar czvf "$1-$(date +%y%m%d-%H%M%S).tar.gz" "$1" ;
}
# ssh Verbindung aufbauen + ein Logfile schreiben
logssh()
{
  ssh $1 | tee sshlog ;
}
# farblichen Bash-Prompt
shell_colored() {
local GRAY="[33[1;30m]"
local LIGHT_GRAY="[33[0;37m]"
local CYAN="[33[0;36m]"
local LIGHT_CYAN="[33[1;36m]"
local NO_COLOUR="[33[0m]"
local BLUE="[33[0;34m]"
local LIGHT_BLUE="[33[1;34m]"
local RED="[33[0;31m]"
local LIGHT_RED="[33[1;31m]"
local GREEN="[33[0;32m]"
local LIGHT_GREEN="[33[1;32m]"
local PURPLE="[33[0;35m]"
local LIGHT_PURPLE="[33[1;35m]"
local BROWN="[33[0;33m]"
local YELLOW="[33[1;33m]"
local BLACK="[33[0;30m]"
local WHITE="[33[1;37m]"

PS1="n${debian_chroot:+($debian_chroot)}$LIGHT_GREENu$LIGHT_BLUE@$LIGHT_GREENh$LIGHT_GRAY:$LIGHT_BLUEw$LIGHT_RED->$NO_COLOUR "
}
shell_colored

Free Android-App Sammlung

Nachdem ich mein neues Android-Handy nun schon einige Zeit nutze, wollte ich hier einmal meine Apps vorstellen welche ich nutzte. :-)

1.) AdFree (benötigt Root-Rechte)

Mit diesem nützlichem App verbannst du sehr viel Werbung, sowohl aus dem Browser aus auch aus anderen Apps.

AdFree-App

2.) Advanced Task Killer (Free)

Advanced Task Killer ist auch als ATK bekannt. Dieses App kann andere Applikationen beenden – mit einem klick ausgewählte Applikationen beenden – Automatisches beenden von bestimmten Applikationen (Auto Task Killer)

Advanced Task Killer

3.) android-vnc-viewer

androidVNC ist ein Open Source (GPL) Remote-Desktop-Programm für Android.  Damit kannst du dich an den meisten VNC Servern anmelden und deinen PC vom Handy aus versteuern: TightVNC, RealVNC, x11vnc und Apple Remote Desktop

android-vnc-viewer

4.) aTrackDog & aTrackDog(SD)

aTrackDog findet die neuste Version aller Anwendungen, selbst wenn sie nicht im Market gelistet sind, z.B. auf Entwickerseiten etc…

aTrackDog

5.) Autorun Killer

Es gibt viele Programme die automatisch gestartet werden, aber nicht um-begingt müssen.

killer

6.) Backup

Mithilfe dieses Apps kannst du dein Handy auf deine SD-Karte sichern und wieder herstellen.

Backup

7.) Barcode Scanner

Mit dieses nützliche App kannst du Barcodes einscannen und bekommst mit ein wenig Glück, das passende Produkt etc. angezeigt und nähere Infos dazu.

barcodecanner

8.) Bubble

Eine Wasserwaage, nicht mehr nicht weniger…

bubbler

9.) Calculator

Ein Taschenrechner mit vielen Funktionen…

Calculator

10.) Chess

Eines der wenigen Spiele, die bei mir länger als eine Woche auf dem Handy geblieben sind.

Chess

11.) Compass

Einfach nur ein Kompass…

compass

12.) Drocap2

Screenshot von deinem Android-System. Damit habe ich auch diese ganzen Bilder hier gemacht. :-)

drocap

13.) Droid Wall

Eine Firewall für Android-Systeme welche auf iptables aufbaut…

firewall

14.) Dropbox

Dropbox ist ein Dienst, bei dem du kostenlos Dateien hochladen kannst und diese z.B. mit diesem App abrufen kannst… kann ich nur empfehlen…

dropbox

15.) DynDNS

Mit diesem Client, kannst du eine Domain auf dein Handy legen, indem deine Dynamische IP-Adresse zu einer Domain zugeordnet wird… kann sehr hilfreich sein, wenn man sein Handy z.B. immer per ssh erreichbar machen möchte :-)

DynDNS

16.) ES File Explorer

Nachdem ich gefühlt alle Datei-Manager ausprobiert hatte, kann ich diesen nur währmstens empfehlen.

FileManager

17.) Facebook Client

Den Client habe ich direkt beim Einrichten meines Android-Systems integriert. (SamdroidMod)

facebook_client

18.) Gallery3D

Forum

Die 3D-Gallery Client habe ich ebenfalls direkt beim Einrichten meines Android-Systems integriert. (SamdroidMod)

Gallery3D

19.) Gesture Search

Dieses App habe ich wieder über den Market installiert, damit kannst du sehr schnell Kontakte, Apps u.s.w. wiederfinden…

gesture_search

20.) G-Mon

G-MoN ist ein WarDriving Scanner. Es wird nach W-Lan (WiFi) Netzwerken in deiner Reichweite gescannt und in einer Datei auf deiner SD-Karte abgespeichert (mit den passenden GPS Koordinationen). Außerdem kannst du eine kml Datei erstellen, welche du dir dann in Google Earth anschauen kannst.

G-Mon

21.) Goggles

Bilderkennungssoftware, mit der sich unter anderem Bücher, Visitenkarten, Gebäude, Logos, Barcodes und Kunstwerke fotografieren und identifizieren lassen. Funktioniert erschenkend gut.

Goggles

22.) Google Übersetzer

Wie der Name des Apps schon vermuten lässt, kann man damit Übersetzen…

Google Übersetzer

23.) gReader

gReader ist ein un-offizieller Google-Reader Client für Android. Damit kannst du deine mit deinem Google-Account gespeicherten RSS-Feed auf deinem Handy abrufen, sehr praktisch. :-)

gReader

24.) Handcent SMS

Meiner Meinung nach das beste App um SMS/MMS zu verschicken und zu empfangen… muss man haben!

Handcent SMS

25.) ICQLive

Einfach ein ICQ-Client, wenn jemand einen besseren kennt, bitte melden… Leider nur ICQ, dafür bisher ohne Probleme.

ICQLive

26.) IMDb Movies & TV

Wer die Webseite dazu noch nicht kennt, sollte sich diese einmal ansehen… www.imdb.com -> Film Bewertungen, können dich vor so manchen schlechten Film bewahren ;-)

imdb

27.) Irssi ConnectBot

Irssi ConnectBot ist eine modifizierte Version von dem bekannten ConnectBot. -> SSH Client

Irssi ConnectBot

28.) K-9 Mail

Download

K-9 Mail ist ein Open-source E-Mail Client mit Such-Funktion, Push-Mail, Multi-Folder Sync, Flagging, Refiling, Signaturen, BCC-Self und vielem mehr… mal wieder ein muss.

K-9 Mail

29.) Kindle for Android

Read more than 620,000* Kindle books on your Android phone including thousands of free books. No Kindle required. Naja an das Englisch muss man sich schon gewöhnen, denn Deutsche Bücher gibt es kaum (gar nicht?)

Kindle for Android

30.) Labyrinth Lite

Ein kleines Spiel (Lite = nur 10 Level), auch eines der Spiele welches nicht gleich wieder von meinem Android geflogen ist.

Labyrinth Lite

31.) Last.fm – Personal Radio

Als erstes auf der Webseite registrieren dann deine Lieblings-Musik oder Ähnliche Musik hören… wirklich zu empfehlen…

lastfm

32.) Licht

Licht, heller Hintergrund (verschiedene Farben + blinken)

Licht

33.) Linpack for Android

Speed-Test für Android. Millions of floating point operations per second (MFLOPS).

Linpack for Android

34.) LPI & Linux Trainer

Die Fragen wurden aus folgender Quelle importiert: LPISim (http://lpi-buch.linupfront.de/lpisim/)

LPIC & Linux Trainer

35.) (Google) Maps

Google Maps App enthält mehrere Applikationen, auch wenn man diese nicht alle benötigt, so ist der 3D-“Navigation”, die “In der Nähe”-Funktion und auch die Standard “Maps”-Funktion sehr hilfreich.

– In der Nähe

– Navigation (Beta)

– Sprachsuche

– Mein Standort

– Brancheneinträge

– Routenplaner

– Latitude

– Google Buzz

Google Maps

36.) Metal Detector

Zum Erstaunen musste ich feststellen das es funktioniert… naja Spielerei, aber dafür hab ich ja mein Android-Handy…

Metal Detector

37.) MP3-Player

Der MP3-Player wurde ebenfalls direkt beim Einrichten meines Android-Systems integriert, daher ist dieses App wahrscheinlich so auch nicht im Market zu finden. (SamdroidMod)

MP3-Player

38.) My Tracks

My Tracks zeichnet GPS Koordinaten auf und zeigt dazu Live-Statistiken an: Zeit, Geschwindigkeit´, Distanz – Gedacht ist dies für Sportliche Aktivitäten (Laufen, Fahrrad fahren…). Außerdem kann man seine z.B. gelaufenen Strecken auf der Google Map Karte anschauen. Viel Spaß beim ausprobieren…

My Tracks

39.) NetTools

– Ping (ICMP / TCP)
– UDP Port Scan
– Network Info

NetTools

40.) Network Info II

Zeit Informationen zur aktuellen Netzwerkverbindung an…

Network Info II

41.) News und Wetter (+GenieWidget)

Diese “News und Wetter”-Funktion habe ich ebenfalls direkt beim Einrichten meines Android-Systems integriert. (SamdroidMod)

GenieWidget
WetterWetter2

42.) Opera Mini

Ein sehr schneller Browser für Android, was besonders an dem vorgeschaltetem Proxy liegen dürfe, welche die Dateien bis zu 90% verkleinert bevor diese zu deinem Android-Handy geschickt werden. :-) Kann man natürlich so einstellen, wie man es benötigt.

Opera Mini

43.) Pkt Auctions eBay

Pocket Auctions für eBay ist ein Verwaltungs-App für eBay… und kann, falls man eBay nutzt auch sehr hilfreich sein…

Pkt Auctions eBay

43.) Programm Manger

Zeigt an, was momentan im TV läuft…

Programm Manger

44.) Qype

“Qype ist eine Online-Community, deren vorrangiger Inhalt nutzergenerierte, standortbezogene Bewertungen auf lokaler Basis sind. Der Name leitet sich aus dem Slogan „Quality or Hype?“ ab.” – Wiki

Qype

45.) Railnavigator

Ein App der Deutsche Bahn AG, womit du Zugverspätungen sehen kannst und dir die optimale Zugverbindung automatisch heraussuchen lassen kannst…

Railnavigator

46.) Shazam

Das App kann Musik erkennen und zuordnen funktioniert auch besser als ich gedacht hätte… einfach mal ausprobieren :-)

Shazam

47.) Stoppuhr

Einfach nur eine Stoppuhr, kann man bestimmt auch mal gebrauchen ^^

Stoppuhr

48.) Subnet Calculator

Ein einfaches App, womit du Netzmasken (IPv4) berechnen kannst.

Subnet Calculator

49.) Sudoku Free

Nur eines der Spiele die man öfter spielen kann…

Sudoku Free

50.) Superuser Genehmigungen

Auch diese App habe ich direkt beim Einrichten meines Android-Systems integriert. (SamdroidMod). Damit verhindert man, dass nicht jedes App direkt “root”-Rechte bekommen kann…

Superuser Genehmigungen

51.) Swapper2

Dieses App soll die Geschwindigkeit noch einmal hochschrauben, indem eine “Auslagerungsdatei” auf die SD-Karte erstellt und genutzt wird… ob dies wirklich etwas bringt, bin ich noch nicht überzeugt von, da kann man besser die bereits vorgestellten Apps “Advanced Task Killer (Free)” + “Autorun Killer” nutze…

Swapper2

52.) Terminal Emulator

Mithilfe dieses Apps hast du Zugriff auf die Android-Shell und kannst z.B. direkt im System Änderungen vornehmen… ein muss.

Terminal Emulator

53.) Toss It

Ein weiteres kostenloses Spiel, was echt ein wenig Süchtig macht… Ziel ist es den Papierkorb zu treffen, hört sich einfacher an als es ist… einfach mal ausprobieren.

Toss It

54.) Twidroyd

Da mir der offizielle Twitter-Client auf dem Android-System nicht zusagt, nutze ich diesen Twitter-Client. Wer einen besseren kennt, kann sich gerne bei mir melden…

twidroyd

55.) Uhr (DeskClock)

Dies ist mein Wecker, der mich morgens weckt, ich könnte ich jeden Morgen deinstallieren ^^

DeskClock
DeskClock1

56.) Uninstaller

Ein sehr übersichtliches und einfaches App zum deinstallieren von Apps…

Uninstaller

57.) Video-Player

Und auch diese App habe ich direkt beim Einrichten meines Android-Systems integriert. (SamdroidMod). Daher leider nicht viele weitere Infos dazu…

Video-Player

58.) VZ-Netzwerk

Der Plauderkasten als VZ-Chat nutzen und egal ob schülerVZ, studiVZ oder meinVZ mit diese App bist du immer Online.

VZ-Netzwerk

59.) Wifi Analyser

Zeigt an auf welcher Frequenz sich sein W-Lan und des seiner Nachbarn befindet, so dass du dein W-Lan optimal einstellen kannst und keine Störungen im Netzwerk hast. Das nächste Bild habe ich mitten in Mönchengladbach gemacht, daher sehr viele W-Lans… :-)

Wifi Analyser

60.) WiFi Tether

Und auch diese App habe ich direkt beim Einrichten meines Android-Systems integriert. (SamdroidMod). Damit kannst du dein Handy zu einem Access-Point umwandel und schon kannst du mit deinem Notebook unterwegs online gehen… ein muss.

WiFi Tether

61.) WordPress

Mit diesem App kannst du unterwegs Blog-Einträge verfassen, editieren u.s.w….

WordPress

62.) YouTube

Und auch diese App habe ich direkt beim Einrichten meines Android-Systems integriert. (SamdroidMod). Damit kannst dir YouTube Videos auf deinem Handy anschauen, klappt auf meinem Samsung i5700 sehr gut…

YouTube

PHP 5.3.3

Auf Dotdeb.org gibt es PHP in Version 5.3.3 im .deb-Format. Das nachfolgende kleine HowTo zeigt wie du dies auf Debian installieren kannst. Es gibt Pakete für Debian (Lenny), sowohl für amd64 als auch i386 Architekturen.

Install:

1.) als erstes benötigen wir eine Root-Shell

sudo bash

2.) nun können wir die zusätzlichen Quellen einfügen

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

3.) diese einmal aktualisieren

apt-get update

4.) und schon können wir PHP 5.3 installieren

aptitude safe-upgrade

Migration von PHP 5.2.x zu PHP 5.3.x:
de.php.net/migration53

Falls man bereits mit Debian (Squeeze) arbeitet oder die Lenny-Backports in den Quellen eingefügt hat und daher das Paket libtool > 2.2 installiert hat, muss man eine ältere Version per dpkg installieren, da man ansonsten php5-dev (5.3.1) nicht installieren kann, damit man selber Erweiterungen für PHP kompilieren kann (z.B. eaccelerator). Es folgt ein kleines HowTo:

wget http://ftp.de.debian.org/debian/pool/main/libt/libtool/libtool_1.5.26-4_i386.deb
dpkg --force-all -i libtool_1.5.26-4_i386.deb
aptitude install build-essential php5-dev

JavaScript richtig im HTML-Code platzieren

Zurück zur “Webseiten beschleunigen” – Übersicht

3.) JavaScript richtig im HTML-Code platzieren

Zudem sollte man sich überlegen wo man seinen JavaScript Code im HTML-Code platziert, da irgendwelche Effekte für das Menü usw. auch später geladen werden können, so dass erst-einmal die Webseite (Bilder… ) geladen werden kann, sollte jedoch vor dem  </body> platziert werden.


Im allgemeinen kann man jedoch sagen, dass CSS- sowie Javascript-Daten zusammen-gefasst werden können, um HTTP-Requests an dem Server zu verringern. So sollte man also seine CSS- und Javascript-Daten, welche gemeinsam jedoch in verschiedenen Dateien auf einer Webseite genutzt werden, jeweils zu einer einzigen Datei zusammengefasst werden.


Beispiel (ganz schlecht):

<head>
<link rel="stylesheet" type="text/css" href="stylesheet1.css" />
<script type="text/javascript" src="scriptfile1.js" />< script type="text/javascript" src="scriptfile2.js" />
<link rel="stylesheet" type="text/css" href="stylesheet2.css" />
<link rel="stylesheet" type="text/css" href="stylesheet3.css" />
</head>

Hier wird der Download der Dateien stylesheet2.css und stylesheet3.css blockiert, weil die JS-Dateien dazwischen den HTML-Baum verändern könnten.



Beispiel (besser aber noch immer schlecht):

<head>
<link rel="stylesheet" type="text/css" href="stylesheet1.css" />
<link rel="stylesheet" type="text/css" href="stylesheet2.css" />
<link rel="stylesheet" type="text/css" href="stylesheet3.css" />
<script type="text/javascript" src="scriptfile1.js" />
<script type="text/javascript" src="scriptfile2.js" />
</head>

In diesem Beispiel kann man schon mal 100ms einsparen, jedoch können Javascript-Daten nicht parallel heruntergeladen werden…



Beispiel (auch schlecht):

<head>
<link rel="stylesheet" type="text/css" href="stylesheet1.css" />
<script type="text/javascript" > document.write("Hello world!");</script>
<link rel="stylesheet" type="text/css" href="stylesheet2.css" />
<link rel="stylesheet" type="text/css" href="stylesheet3.css" />
</head>

Zuerst wird die Ausführung des Inline-Style-Befehls durch stylesheet1.css verzögert. Anschließend verhindert die Inline-Anweisung wiederum, dass die Stylesheets parallel heruntergeladen werden können.


Beispiel (gut):

<head>
<link rel="stylesheet" type="text/css" href="stylesheet1.css" />
<link rel="stylesheet" type="text/css" href="stylesheet2.css" />
<link rel="stylesheet" type="text/css" href="stylesheet3.css" />
<script type="text/javascript" > document.write("Hello world!");</script>
</head>


Zuerst alle externen Ressourcen einbinden. Alle werden parallel heruntergeladen. Anschließend das Inline-Script. Natürlich sollte das JavaScript möglichst weit unten in den Body stehen, da es genauso das laden von Bildern verzögert.


weitere derartige Beispiele:
code.google.com


Mit folgendem Code können auch JavaScript-Daten parallel geladen werden. Einfach das Array anpassen und fertig…

<script type="text/javascript"> (function() {
var s = [
"/javascripts/script1.js",
"/javascripts/script2.js",
"/javascripts/script3.js",
"/javascripts/script4.js",
"/javascripts/script5.js"
];
var sc = "script", tp = "text/javascript", sa = "setAttribute", doc = document, ua = window.navigator.userAgent;
for(var i=0, l=s.length; i<l; ++i) {
if(ua.indexOf("MSIE")!==-1 || ua.indexOf("WebKit")!==-1) {
doc.writeln("<" + sc + " type="" + tp + "" src="" + s[i] + "" defer></" + sc + "<");
t[sa]("src", s[i]);
t[sa]("type", tp);
doc.getElementsByTagName("head")[0].appendChild(t);
} else {
var t=doc.createElement(sc);
t.setAttribute("src", s[i]);
t.setAttribute("type", tp);
doc.getElementsByTagName("head")[0].appendChild(t);
}
}
})();
</script>


Außerdem könnte man JavaScript Dateien dynamisch nachladen, so dass diese nur geladen werden wenn man diese auch braucht.

Include ("com.iskitz.ajile.examples.IncludeExample");
function testInclude()
{
if("undefined" != typeof com.iskitz.ajile.examples)
if("undefined" != typeof com.iskitz.ajile.examples.IncludeExample)
com.iskitz.ajile.examples.IncludeExample();
else alert( "Include test was unsuccessful :(nn"
+ "Failed to Include [ com.iskitz.ajile.examples.IncludeExample.js ]");
}
/** InludeExample.js: **********************************************************/
Namespace ("com.iskitz.ajile.examples");
com.iskitz.ajile.examples.IncludeExample = function()
{
var wasImported = typeof window["IncludeExample"] != "undefined";
alert( "[ com.iskitz.ajile.examples.IncludeExample ] was "
+ (wasImported ? "Included *and* Imported." : "successfully Included!"));
};

weitere derartige Beispiele:
ajile.iskitz.com


Tipps:

  • alle CSS-Datei per link-tag im Header-Bereich direkt hintereinander schreiben
  • alle Script-Tags direkt vor Body-Bereich (wenn möglich)
  • möglichst keine JS-Anweisungen (inline oder extern) zwischen CSS-Dateien setzen
  • keine JS-Inline-Anweisungen zwischen mehreren Referenzierungen auf JS-Dateien
  • JS-Inline-Anweisungen vermeiden, da diese vom Browser nicht als Datei zwischengespeichert werden können

Webseiten Analyse

Zurück zur “Webseiten beschleunigen” – Übersicht

1.) Webseiten Analyse

Dies ist der Erste Teil von meiner Blog-Reihe “Webseiten beschleunigen”. Um die ursprüngliche Ladegeschwindigkeit deiner Webseite zu prüfen, installieren wir uns zwei Erweiterungen für Firefox.

Firebug +
YSlow

ggf. kann man sich auch nach die nachfolgenden Links anschauen, jedoch habe ich mit der Kombination „ Firebug + YSlow“ sehr gute Erfahrungen gemacht, daher folgt nun diesbezüglich ein kleines Video.

 

 

Alternative von Google:

Firebug +
Page-Speed

 

Alternative Online-Analyse:

Bisher habe ich nur zwei Online-Analyse-Dienste gefunden, welche mir wirklich geholfen haben.

a.) Auf Pingdom.com kannst du die Ladezeit deiner Webseite und dessen Inhalt sehr schön in einem Graphen sehen und Schwachstellen somit sehr einfach erkennen, z.B. wenn eine externe Datei nicht erreichbar ist.

tools.pingdom.com

 

pingdom
pingdom

 

b.) Die nächste Webseite ist AOL’s WebPageTest ist ein wenig umfangreicher, so zeigt diese Webseite wie bereits beim vorherigen Link einen Graphen mit den geladen Dateien an, jedoch führt diese Webseite den Test zweimal durch, so dass die Auswirkung vom Browser-Cache simuliert wird. Außerdem gibt es eine Checkliste, wo alle Dateien noch einmal einzeln geprüft werden.

AOL’s WebPageTest

 

aol_webpagetest
aol_webpagetest

 

1.1) Webseiten Benchmark

Außerdem könnte kann die Abfragen auch direkt von der Shell aus starten z.B. mit “httperf”. Es folgt ein kleines HowTo für Debian:

sudo bash
aptitude install httperf
httperf --hog --server voku-online.de --num-conn 20 --ra 10 --timeout 5

jedoch kann ich zumindest mit der Ausgabe nicht viel anfangen, da mir diese vielen Zahlen auf Anhieb nicht viel sagen, daher folgt eine kleine Anleitung, wie man aus diesen Werten einen Graphen zeichnet

cd /usr/src/
wget http://www.xenoclast.org/autobench/downloads/debian/autobench_2.1.2_i386.deb
dpkg -i autobench_2.1.2_i386.deb
autobench --single_host --host1  www.test.de --uri1 /10K --quiet
--low_rate 20  --high_rate 200 --rate_step 20 --num_call 10
--num_conn  5000 --timeout 5 --file results.tsv
aptitude install gnuplot
bench2graph results.tsv result.ps

so nun laden wir die Datei „result.ps“ z.B. per WinSCP auf unsern Windows Rechner und öffnen die Datei mit Ghostscript

Hier mein Beispiel:

 

webserver_bench
webserver_bench

 

(1) req_rate: request rate, requests per second
(2) con_rate: connection rate, connections per second
(3) min_rep_rate: minimum reply rate, replies per second
(4) avg_rep_rate: average reply rate, replies per second
(5) max_rep_rate: maximum reply rate, replies per second
(6) stddev_rep_rate: standard deviation for reply rate
(7) resp_time
(8) net_io: Net I/O, KB per second
(9) error

Link:
autobench

 

Anstatt diesen Vorgang komplett per Hand zu bewerkstelligen, kann man auch folgende Webseite dazu nutzen:

-> loadimpact.com

So kannst du herausfinden, wie sich deine Webseite verhält, wenn sehr viele Besucher diese besuchen. Anbei das Ergebnis von diesem Blog. (Nach meiner Optimierung per “PHP XCache” + “Nginx” + “W3 Total Cache

 

loadimpact

 

Hier ist ein schneller Überblick darüber, was diese Kurve nun aussagt. -> loadimpact.com/forum/

SpeedUp – Android GPS

Habe vor einiger Zeit einen Forum-Eintrag gelesen, wie man sein GPS auf seinem Android-System optimieren kann. Diesen Tipp wollte ich hier kurz vorstellen.

Forum:
1.) Erstelle eine Datei mit folgendem Inhalt (gps.conf)

NTP_SERVER=de.pool.ntp.org
XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin
XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin
SUPL_HOST=supl.google.com
SUPL_PORT=7276

2.) Die erstellte Datei auf die SD-Karte kopieren.

3.) “Terminal Emulator” aus dem Market installieren und das Programm starten …

Terminal Emulator

4.) … und folgende Befehle ausführen …

su
remount rw
cd /sdcard
ls

Nun solltest du unter anderem die Datei sehen, welche du gerade auf die SD-Karte kopiert hast. Als nächstes bitte folgenden Befehl ausführen …

cat gps.conf > /system/etc/gps.conf

… und neustarten …

reboot

Webserver beschleunigen

Zurück zur “Webseiten beschleunigen” – Übersicht

5.) Webserver beschleunigen

5.1) Apache-Module deaktivieren


Ggf. kann man auch einige Module (Erweiterungen) von Apache abschaltet, wer z.B. auf seiner Webseite gar keine SSL-Verschlüsselung verwendet, könnte das entsprechende Modul deaktivieren.

a2dismod  ssl
/etc/init.d/apache2 restart

Die momentan aktiven Erweiterungen kann man unter “/etc/apache2/mods-enabled/” einsehen, die installierten Erweiterungen sind unter “/etc/apache2/mods-available/” zu finden.

Dynamische Seiten:
mod_log_config erlaubt die access_log-Dateien in div. Formaten.
mod_cgi braucht man, wenn man CGI zulassen will.
mod_suexec erlaubt CGIs als ein bestimmter User zu laufen.
mod_perl braucht man nicht um Perl als CGI auszuführen!
mod_php5 ist schneller als suphp (aber nicht so sicher).
mod_suphp führt php Skript mit den Rechten des entsprechenden webs aus.
mod_include erlaubt die Verwendung von SSI.

URL-Manipulationen:
mod_alias braucht man zum Einblenden von virtuellen Verzeichnissen.
mod_rewrite erlaubt URL-Manipulationen, kostet aber Performance.
mod_autoindex & mod_dir erlauben eine Navigation ohne index.html
mod_userdir erlaub User-URLs mit z.B.: www.huschi.net/~huschi/
mod_negotiation analysiert Accept-Anfragen.
mod_vhost_alias erlaubt das Anlegen von virtuellen Hosts.

Environment- & Header-Manipulation:
mod_mime setzt automatisch den richtigen Header anhand der Dateiendung.
mod_env & mod_setenvif erlauben die modifizierung von ENV-Variablen.
mod_expires erlaubt die HTTP-Header Manipulation des Expires-Date (Verfall-Zeit).
mod_ssl erlaubt die Verwendung von SSL (https).

Zudem kann man folgende Option in der Apache-Konfiguration ändern, so dass man DNS-Lookups reduziert.

vim /etc/apache2/apache2.conf

HostNameLookups off

5.2) Reverse Proxy (Nginx)

nginx_logo
Wir wollen unsere Webseite mal wieder ein wenig beschleunigen, dies können wir auf verschiedenen Wegen bewerkstelligen, heute beschäftigen wir uns mit dem Reverse-Proxy vor einem Webserver, in diesem Beispiel nutzen wir für diesen Zweck Nginx + apache2. Der große Vorteil von einen Proxy vor dem Webserver ist, dass mehrere Anfragen gleichzeitig gestellt werden könne, um die Performance von statischen Daten zu steigern. Die Anfragen an dynamische Inhalte werden dann noch immer an einen zweiten bzw. an mehrere Webserver, hinter dem Proxy weitergereicht.

Wer sich jetzt fragt, warum man nicht komplett auf Nginx umsteigen sollte, da die Benchmarks zeigen, dass dieser schneller ist als der Apache Webserver, derjenige hat nicht bedacht, dass bei diesen Tests nur die Reaktionen des Webservers auf eine gewisse Anzahl von Anfragen geprüft wird, wenn man jedoch mit “nginx + fcgi” viele php-Dateien verarbeiten möchte, ist ein “apache + mod_php” schneller, zudem kann man diese Daten z.B. mittels eAccelerator zusätzlich cachen, was die Geschwindigkeit von php-Daten noch einmal positiv beeinflusst.

Update: Inzwischen konnte ich die ganzer Sache ausgiebig testen und setzte momentan eine Kombination aus “Varnish” + “Nginx” + “php5-fpm” (+ xcache) ein, so werden die Seiten von Varnish zwischengespeichert alle neue Anfragen von Nginx entgegengenommen, Bilder etc. sofort ausgeliefert und PHP-Anfragen an einen laufendem PHP-Daemon weitergereicht, jedoch erst-einmal zurück zum Beispiel mit Nginx als Reverse-Proxy…

Als Lösung für diese Problem habe ich mir einen Nginx-Proxy gebastelt, der statische Daten (Bilder…) ausliefert und diese zusätzlich für 24 Stunden zwischenspeichert, alle andern dynamischen Inhalte (php,cgi…) werden sofort an apache durch-gereicht. In diesem Beispiel laufen sowohl der Proxy als auch Apache auf einem Server.
reverse_proxy

5.2.1.) Apache auf einem neuen Port laufen lassen

Folgende Datei öffnen…

vim /etc/apache2/ports.conf

…Port “80” durch z.B. “127.0.0.1:8080” ersetzen.

[stextbox id=”warning”]!!! Wichtig ist hier, darauf zu achten, dass der Apache selber nicht mehr über eine Öffentliche IP-Adresse erreichbar ist. !!![/stextbox]

Ggf. helfen dir die folgenden Zeilen weiter, um alle Einträge in einer Datei zu Ändern (mit vi / vim).

:%s/^80/127.0.0.1:8080/g

:%s/SERVER_IP_ADRESSE:80/127.0.0.1:8080/g

SERVER_IP_ADRESSE muss nun noch mit der IP-Adresse des Servers ersetzte werden und anschließend musst du den Apache Webserver noch neu-starten. Ggf. müssen noch weitere Dateien von Apache angepasst werden.

Mit dem folgendem Befehl kannst du prüfen, ob noch weitere Einträge (Port 80) in der Apache Konfiguration sind.

/bin/grep -wr 80 /etc/apache2/


5.2.2) Ggf. ISPConfig anpassen

Falls du z.B. ISPConfig installiert hat, werden wie Änderungen am Apache Webserver, bei der nächsten Änderung über die Admin-Oberfläche wieder verworfen, daher müssen wir das Template von ISPConfig dementsprechend anpassen.

vim ~/ispconfig/isp/conf/vhost.conf.master

NameVirtualHost 127.0.0.1:8080


5.2.3.) Reverse-Proxy: nginx installieren & konfigurieren

aptitude install nginx
vim /etc/nginx/nginx.conf
user www-data;
worker_processes 4;
worker_rlimit_nofile 3000;
pid /var/run/nginx.pid;

# [ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log;

#google_perftools_profiles /tmp/profile/;

events {
        worker_connections 2048;
        # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ;
        use epoll;
        multi_accept on;
}

http {
        server_names_hash_bucket_size 64;

        ## Size Limits
        client_max_body_size        10M;
        client_header_buffer_size   32k;
        client_body_buffer_size     128k;
        large_client_header_buffers 64 8k;

        ## Timeouts
        client_body_timeout   3m;
        client_header_timeout 3m;
        send_timeout          3m;
        #expires              24h;
        keepalive_timeout     120 120;

        ## General Options
        ignore_invalid_headers   on;
        keepalive_requests       100;
        limit_zone normal $binary_remote_addr 5m;
        recursive_error_pages    on;
        sendfile                 on;
        server_name_in_redirect  off;
        server_names_hash_max_size 512;
        server_tokens            off;
        set_real_ip_from 127.0.0.1;
        real_ip_header X-Forwarded-For;

        ## TCP options
        #tcp_nopush on;
        tcp_nodelay off;
        #send_lowat 12000;

        include mime.types;
        default_type application/octet-stream;

        access_log /var/log/nginx/access.log;

        log_format main '$remote_addr - $remote_user [$time_local] $status '
        '\"$request\" $body_bytes_sent \"$http_referer\" '
        '\"$http_user_agent\" \"http_x_forwarded_for\"';

        ## Cache
        open_file_cache max=1000 inactive=24h;
        open_file_cache_valid    24h;
        open_file_cache_min_uses 2;
        open_file_cache_errors   on;

        ## Compression
        gzip              on;
        gzip_static       on;
        gzip_disable      "MSIE [1-6]\.";
        gzip_buffers      32 8k;
        gzip_comp_level   5;
        gzip_http_version 1.0;
        gzip_min_length   0;
        gzip_proxied      any;
        gzip_types text/plain text/css text/xml text/javascript application/json application/xml application/xml+rss application/x-javascript image/x-icon application/x-perl application/x-httpd-cgi;
        gzip_vary         on;

        output_buffers   10 128k;
        postpone_output  1500;

        # Beispiel: Loadbalance
        #upstream webbackend  {
                #ip_hash;
                #server web1.domain.lan weight=10 max_fails=3 fail_timeout=30s;
                #server web2.domain.lan weight=1 backup;
        #}
        # Beispiel: Reverse-Proxy
        #server {
                #access_log  /var/log/nginx/access.proxy.log main;
                #error_log   /var/log/nginx/error.proxy.log;
                #listen      80;
                #server_name _;

                ## PROXY - Web
                #location ~ \.php$ {
                        #proxy_cache            cache;
                        #proxy_pass  http://127.0.0.1:8080;
                #}
        #}

        # Beispiel: HTTP Server (sollte jedoch besser unter /etc/nginx/sites-available/ angelegt werden)
        #server {
                #listen       8000;
                #listen       somename:8080;
                #server_name  somename  alias  another.alias;

                #location / {
                        #root   html;
                        #index  index.html index.htm;
                        #}
                #}

        # Beispiel: HTTPS Server (sollte jedoch besser unter /etc/nginx/sites-available/ angelegt werden)
        #server {
                #listen       443;
                #server_name  localhost;

                #ssl                  on;
                #ssl_certificate      cert.pem;
                #ssl_certificate_key  cert.key;

                #ssl_session_timeout  5m;

                #ssl_protocols  SSLv2 SSLv3 TLSv1;
                #ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
                #ssl_prefer_server_ciphers   on;

                #location / {
                #root   html;
                #index  index.html index.htm;
                #}
        #}

include /etc/nginx/proxy.conf;
include /etc/nginx/sites-enabled/*.conf;
}
vim /etc/nginx/proxy.conf
proxy_buffering            on;
proxy_cache_min_uses       3;
proxy_cache_path           /usr/local/nginx/proxy_cache/ levels=1:2 keys_zone=cache:10m inactive=24h max_size=1000M;
proxy_cache                cache;
proxy_cache_valid          200 24h;
proxy_cache_use_stale      error timeout invalid_header updating http_500 http_502 http_503 http_504;
proxy_ignore_client_abort  off;
proxy_intercept_errors     on;
proxy_next_upstream        error timeout invalid_header;
proxy_redirect             off;
proxy_set_header           Host            $host;
proxy_set_header           X-Real-IP       $remote_addr;
proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffers              32 1M;
proxy_busy_buffers_size    31M;
proxy_temp_file_write_size 30M;
proxy_buffer_size          30M;
proxy_connect_timeout      90;
proxy_send_timeout         90;
proxy_read_timeout         90;
proxy_ignore_headers       Expires Cache-Control;
mkdir /usr/local/nginx/proxy_cache/
chown -R www-data:www-data /usr/local/nginx/proxy_cache/

Link:
wiki.nginx.org/NginxHttpProxyModule

/etc/init.d/apache2 restart
/etc/init.d/nginx restart

Nginx läuft nun auf Port 80 und nimmt die Anfragen von Client an und der Apache wartet auf die weitergeleiteten Anfragen von Reverse-Proxy.

[stextbox id=”info”]Bei mir hat der cache (Zwischenspeicherung) jedoch Probleme verursacht, so dass Captcha’s nicht mehr funktioniert haben, daher habe ich diesen im Nachhinein abgeschaltet.[/stextbox]


Links:
www.joeandmotorboat.com/2008/02/28/apache-vs-nginx


5.2.4.) Logfiles korrigieren

Nun stehen wir noch vor dem Problem, dass im Logfile von apache die IP-Adresse vom Reverse-Proxy auftauscht und zwar nur noch diese, um dies zu umgehen installieren wir nun noch folgendes…

aptitude install libapache2-mod-rpaf

Nun noch folgendes in den Vhost-Einträgen bzw. in dem ISPConfig Template ergänzen.


RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1

/etc/init.d/apache2 reload

…und schon haben wir einen Reverse-Proxy (“Apache” + “Nginx”) installiert. Unter Punkt 5.3 zeige ich wie du ganz auf Nginx setzten kannst und somit nicht zwei Webserver, betreiben & konfigurieren musst.

APC + eAccelerator + XCache

PHP besitzt selbst keinen Cache, was dazu führt, dass ein Skript bei jedem Aufruf neu übersetzt werden muss. Um dem entgegenzuwirken, gibt es einige Erweiterungen, die diese Funktionalität nachrüsten, wie beispielsweise den eAccelerator den alternativen PHP Cache.

Da PHP selber noch keinen Cache besitzt, was zur Folge hat das die Skript immer und immer wieder neu übersetzt werden müssen, gibt es ein paar Erweiterungen, welche diese Funktion nachrüsten. Und schon sind wir beim Thema.

 

1.) APC (Alternative PHP Cache)

APC ist ein Open-Source-Zusatzmodul für PHP, das eine beschleunigte Ausführung von PHP-Programmen ermöglicht. Die Beschleunigung wird dadurch erreicht, dass der kompilierte PHP-Quelltext zwischengespeichert wird und bei wiederholter Ausführung das zeitaufwändige Kompilieren nahezu vollständig vermieden werden kann. – Wiki

Als erstes schauen wir uns unsere aktuelle php-Config an…

vim /var/www/info.php
< ?php
phpinfo();
?>
w3m deine_webseite.abc/info.php

Zudem prüfen wir eben noch die momentane Geschwindigkeit unserer Webseite… z.B. auf www.linkvendor.com und internetsupervision.com

Nun installieren wir APC:

aptitude install php-pear
aptitude install php5-dev apache2-prefork-dev build-essential
pecl install apc
vim /etc/php5/conf.d/apc.ini
extension="apc.so"
apc.enabled=1
apc.file_update_protection=2
apc.optimization=0
apc.shm_size=32
apc.shm_segments=1
apc.gc_ttl=7200
apc.ttl=7200
apc.num_files_hint=1024
apc.enable_cli=0

Die Größe an Dateien welche im Speicher (apc.shm_size) gehalten wird, kann man ganz nach Auslastung des Servers anpassen. Um sich anzeigen zu lassen, wie viel der momentane maximal Wert ist, kannst du folgenden Befehl ausführen. (max seg size (kbytes) = 32768 -> 32MB) Wer einen Root-Server hat kann unter (/etc/sysctl.conf) die folgenden Werte entsprechend anpassen: kernel.shmall, kernel.shmmax

ipcs -lm 
/etc/init.d/apache2 restart

[stextbox id=”info”]Die komplette Dokumentation kann im PHP Manual gefunden werden: http://de2.php.net/manual/de/ref.apc.php[/stextbox]

 

2.) eAccelerator

eAccelerator ist eine Open Source Software zum Einsatz auf Webservern, die als Beschleuniger, Optimierer und Cache für PHP-Seiten dient. – Wiki

Wir schauen uns wieder unsere aktuelle php-Config an…

vim /var/www/info.php
<?php phpinfo(); ?>
w3m deine_webseite.abc/info.php

Geschwindigkeit unserer Webseite prüfen… z.B. auf www.linkvendor.com und internetsupervision.com

Nun installieren wir eAccelerator:

aptitude install build-essential php5-dev git
cd /usr/src/
git clone https://github.com/eaccelerator/eaccelerator
cd eaccelerator/
phpize
./configure
make
make install
vim /etc/php5/conf.d/eaccelerator.ini
;[eaccelerator]
extension = "eaccelerator.so"

eaccelerator.enable = "1"
eaccelerator.shm_size = "0"
eaccelerator.optimizer = "1"
eaccelerator.debug = "0"
eaccelerator.cache_dir = "/tmp/eaccelerator"
eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"
eaccelerator.check_mtime = "1"
eaccelerator.filter = ""
eaccelerator.shm_max = "0"
eaccelerator.shm_ttl = "0"
eaccelerator.shm_prune_period = "0"
eaccelerator.shm_only = "0"
;eaccelerator.compress = "1"
;eaccelerator.compress_level = "6"
;eaccelerator.keys = "shm"
;eaccelerator.sessions = "shm"
;eaccelerator.content = "shm"
;eaccelerator.allowed_admin_path = ""
mkdir -p /var/cache/eaccelerator
chmod 0777 /var/cache/eaccelerator
/etc/init.d/apache2  restart

Und noch einmal die Geschwindigkeit deiner Webseite prüfen… z.B. auf www.octagate.com und internetsupervision.com

Konfiguration von eAccelerator:
—————————————

eaccelerator.shm_size
Die Menge an Arbeitsspeicher (in Megabytes) welche eAccelerator verwenden darf.
Der Standard Wert ist “0”.

eaccelerator.cache_dir
Gibt das Verzeichnis an, wo eAccelerator die vorkompilierten Daten auf der Festplatte speichern darf. Die gleichen Daten können auch im Speicher oder auch nur im Speicher untergebracht werden, was einen schnelleren Zugriff zu folge hätte.
Der Standard Wert ist “/tmp/eaccelerator”.

eaccelerator.enable
Ein- / Ausschalten von eAccelerator. Wobei “1” gleich “an” bedeutet.
Der Standard Wert ist “1”.

eaccelerator.optimizer
Hier kannst du Ein- / Ausschalten ob der PHP-Code noch optimiert werden soll. Wobei “1” gleich “an” bedeutet.
Der Standard Wert ist “1”.

eaccelerator.debug
Hier kannst du das Debug-Logging Ein- / Ausschalten.
Der Standard Wert ist “0”.

eaccelerator.check_mtime
Ein- / Ausschalten für die Prüfung, ob der PHP-Code geändert wurde und somit doch noch mal neu übersetzt werden sollte. Wobei “1” gleich “an” bedeutet.
Der Standard Wert ist “1”.

eaccelerator.filter
Hier kannst du angeben welche Daten gecacht werden sollen. (z.B. “*.php *.phtml”) Wenn der Eintrag mit einem “!” beginnt, bedeutet dies, das diese Daten nicht gecacht werden. Der Standard Wert ist “”. -> was bedeutet, dass alles gecacht wird.

eaccelerator.shm_max
Wenn sehr große Daten nicht in den Arbeitsspeicher wandern sollen, dann mann man diesen Wert setzten. (z.B. 10240, 10K, 1M).
Der Standard Wert ist “0”.

eaccelerator.shm_ttl
Wenn eaccelerator keinen Arbeitsspeicher mehr zur Verfügung hat, werden alle Daten gelöscht, welche älter sind als z.B. “9000” Sekunden (Webseiten welche die letzten 2 1/2 Stunden nicht besucht wurden)
Der Standard Wert ist “0”.

eaccelerator.shm_prune_period
Wenn eaccelerator keinen Arbeitsspeicher mehr zur Verfügung hat, werden die Daten welche vor z.B. 9000 Sekunden gecacht wurden gelöscht.
Der Standard Wert ist “0”.

eaccelerator.shm_only
Ein- / Ausschalten vom Cache auf der Festplatte.
Der Standard Wert ist “0”. -> Was bedeutet das sowohl im Arbeitsspeicher als auch auf der Festplatte gecacht wird.

eaccelerator.compress
Ein- / Ausschalten der Komprimierung der Daten.
Der Standard Wert ist “1”.

eaccelerator.compress_level
Stellt den Grad der Komprimierung ein.
Der Standard Wert ist “9”. -> Max. Komprimierung

 

3.) XCache

Opcode-Cacher zum PHP-Beschleunigen auf Servern, beschleunigt den Prozess des Kompilierens von PHP-Skripten, indem er den kompilierten Zustand von PHP-Skripten im RAM zwischenspeichert und die kompilierte Version direkt aus dem Hauptspeicher nutzt.

aptitude install php5-xcache

Hier noch meine Konfiguration für das WordPress Plugin “W3 Total Cache” …

vim /etc/php5/conf.d/xcache.ini
; configuration for php xcache module
[xcache-common]
extension=xcache.so

[xcache.admin]
xcache.admin.enable_auth = Off
;xcache.admin.user = "admin"
;xcache.admin.pass = ""

[xcache]
; select low level shm/allocator scheme implemenation
xcache.shm_scheme = "mmap"
; to disable: xcache.size=0 (Standard)
; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows
xcache.size = 64M
; set to cpu count (cat /proc/cpuinfo |grep -c processor)
xcache.count = 1
; just a hash hints, you can always store count(items) > slots
xcache.slots = 8K
; ttl of the cache item, 0=forever
xcache.ttl = 0
; interval of gc scanning expired items, 0=no scan, other values is in seconds
xcache.gc_interval = 0

; same as aboves but for variable cache
xcache.var_size  = 64M
xcache.var_count = 1
xcache.var_slots = 8K
; default ttl
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 900

xcache.test = Off
; N/A for /dev/zero
xcache.readonly_protection = Off
; for *nix, xcache.mmap_path is a file path, not directory.
; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection
; 2 group of php won't share the same /tmp/xcache
; for win32, xcache.mmap_path=anonymous map name, not file path
;
; xcache.mmap_path = "/dev/zero"

; leave it blank(disabled) or "/tmp/phpcore/"
; make sure it's writable by php (without checking open_basedir)
;
; xcache.coredump_directory = ""

; per request settings
xcache.cacher = On
xcache.stat = Off
xcache.optimizer = On

[xcache.coverager]
; per request settings
; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance)
;
;xcache.coverager = Off

; ini only settings
; make sure it's readable (care open_basedir) by coverage viewer script
; requires xcache.coverager=On
;
;xcache.coveragedump_directory = ""

weiter Infos zu xCache: xcache.lighttpd.net/wiki/XcacheIni

 

Test-Ergebnisse:

Mit folgendem Befehl habe ich die Geschwindigkeit meiner Webseite getestet, wobei ich in der Zwischenzeit, vom apache2 als Webserver Abstand genommen habe und voll auf “nginx” setzte. :-)

ab -n500 -c20 -dS "http://suckup.de/"
Somit wurden 500 Seitenaufrufe, davon 20 parallel ausgeführt, um einen Durchschnittswert zu erhalten habe ich den Befehl 3x ausgeführt und xCache war ein wenig schneller!!! :-)