SchlagwortLow Memory

tar auf einen remote Server per ssh

Wie kann man per tar direkt auf einen remote Server schreiben? Warum möchte man direkt per tar auf einen remote Server sichern? Diese Fragestellung tritt speziell dann auf, wenn man auf den zu sichernden Server nur wenig verbleibende Disk-Kapazität hat. Typischerweise sind das dann Datenbankserver, oder wie in meinem Fall Webserver, die eine OwnCloud Instanz hosten. Da auch im Web der Festplattenspeicher teuer ist, nutze ich mein NAS zu Hause zu die Daten zu sichern. Hier steht ja in gewissem Maße unbegrenzter Speicherplatz zur Verfügung.

Also gut, dann erzeugen wir ein Archiv und pipen die Ausgabe direkt per SSH auf den Remote Speicher um.

tar zcvf - /var/www/ | ssh -p 22 root@nas.tschoerner.eu "cat > /media/backup/WebServer.tar.gz"

Nun wird das erzeugte Archiv direkt auf den SSH Server umgeleitet.

Müsst Ihr nun ein Backup wieder herstellen, so könnt Ihr das auch, ohne das Archiv kopieren zu müssen:

cd /
ssh -p 22 root@nas.tschoerner.eu "cat /media/backup/WebServer.tar.gz" | tar zxvf -

 

[HowTo] WordPress auf Hiawantha hosten

Kürzlich habe ich meinen WebServer umgestellt und betreibe einen Hiawantha Server. Um WordPress zu betreiben, setze ich mal voraus, dass der Server installiert ist (vergleiche hier), und ihr eine Datenbank angelegt habt.

Nun müsst ihr in der Datei /etc/hiawantha/hiawantha.conf die Rewrite-Rule einfügen:

UrlToolkit {
    ToolkitID = wp-multi
    Match ^/index\.php$ Return
    Match ^/([_0-9a-zA-Z-]+/)?wp-admin$ Redirect /$1wp-admin/
    RequestURI exists Return
    Match ^/([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) Rewrite /$2
    Match ^/([_0-9a-zA-Z-]+/)?(.*\.php)$ Rewrite /$2
    Match .* Rewrite /index.php?$1
}

Jetzt legt Ihr noch ein vHost in der gleichen Konfig an:

VirtualHost {
        Hostname = XXX.tschoerner.eu,*.XXX.tschoerner.eu
        WebsiteRoot = /var/www/XXX.tschoerner.eu/public
        AccessLogfile = /var/www/XXX.tschoerner.eu/log/access.log
        ErrorLogfile = /var/www/XXX.tschoerner.eu/log/error.log
        StartFile = index.php
        TimeForCGI = 60
        UseFastCGI = PHP7 # --> PHP Version
        CustomHeader = X-Frame-Options: sameorigin
        CustomHeader = Vary: Accept-Encoding
        RandomHeader = 64
        UseToolkit = wp-multi # --> This loads the Rewrite Rule
        EnforceFirstHostname = yes
        PreventXSS = yes
        PreventCSRF = yes
        PreventSQLi = yes
}

Nun noch folgende Verzeichnisse anlegen:

mkdir -p /var/www/XXX.tschoerner.eu/log/
mkdir -p /var/www/XXX.tschoerner.eu/public
chown -R www-data:www-data /var/www/XXX.tschoerner.eu

Jetzt WordPress herunterladen:

cd 
wget https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
cd wordpress
mv * ../
cd ..
rm -rf wordpress
rm -rf latest.tar.gz
chown -R www-data:www-data /var/www/XXX.tschoerner.eu

Jetzt Hiawantha einmal neustarten, damit unser vHost erkannt wird.

/etc/init.d/hiawatha restart

Nun kann WordPress installiert werden. Hierzu könnt Ihr einfach eure URL aufrufen, in meinem Fall ist es http://XXX.tschoerner.eu

Wenn ihr WordPress von einem anderen Server umgezogen habt, vergleicht auf den fix der Permalinks.

Limit CPU usage on Linux

Kürzlich stand ich vor dem Problem, dass einer meiner VPS Server immer vom Hoster gestoppt wurde. Dieses Problem tritt häufig auf, wenn bei einem 1 vCPU Server der CPU-load länger als 10 Minuten über 1.00 liegt.

Zur Lösung des Problems habe ich das Tool CPULIMIT entdeckt. Es gibt es auf Ubuntu & Centos / bereits als pre-kompiliertes Paket un kann einfach via apt-get oder yum installiert werden.

yum install cpulimit gawk

Im Anschluss habe ich ein Skript zu start eines Daemon hier /usr/bin/cpulimit_daemon.sh angelegt, mit diesem Inhalt:

#!/bin/bash
# ==============================================================
# CPU limit daemon - set PID's max. percentage CPU consumptions
# ==============================================================

# Variables
CPU_LIMIT=20       	# Maximum percentage CPU consumption by each PID
DAEMON_INTERVAL=3  	# Daemon check interval in seconds
BLACK_PROCESSES_LIST=   # Limit only processes defined in this variable. If variable is empty (default) all violating processes are limited.
WHITE_PROCESSES_LIST=   # Limit all processes except processes defined in this variable. If variable is empty (default) all violating processes are limited.

# Check if one of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST is defined.
if [[ -n "$BLACK_PROCESSES_LIST" &&  -n "$WHITE_PROCESSES_LIST" ]] ; then    # If both variables are defined then error is produced.
   echo "At least one or both of the variables BLACK_PROCESSES_LIST or WHITE_PROCESSES_LIST must be empty."
   exit 1
elif [[ -n "$BLACK_PROCESSES_LIST" ]] ; then                                 # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
   NEW_PIDS_COMMAND="top -b -n1 -c | grep -E '$BLACK_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
elif [[ -n "$WHITE_PROCESSES_LIST" ]] ; then                                 # If this variable is non-empty then set NEW_PIDS_COMMAND variable to bellow command
   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6' | grep -E -v '$WHITE_PROCESSES_LIST' | gawk '\$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
else
   NEW_PIDS_COMMAND="top -b -n1 -c | gawk 'NR>6 && \$9>CPU_LIMIT {print \$1}' CPU_LIMIT=$CPU_LIMIT"
fi

# Search and limit violating PIDs
while sleep $DAEMON_INTERVAL
do
   NEW_PIDS=$(eval "$NEW_PIDS_COMMAND")                                                                    # Violating PIDs
   LIMITED_PIDS=$(ps -eo args | gawk '$1=="cpulimit" {print $3}')                                          # Already limited PIDs
   QUEUE_PIDS=$(comm -23 <(echo "$NEW_PIDS" | sort -u) <(echo "$LIMITED_PIDS" | sort -u) | grep -v '^$')   # PIDs in queue

   for i in $QUEUE_PIDS
   do
       cpulimit -p $i -l $CPU_LIMIT -z &   # Limit new violating processes
   done
done

Um das Skript ausführen zu können müssen noch die Berechtigungen geändert werden:

chmod 755 /usr/bin/cpulimit_daemon.sh

Um nun den Job zu starten einfach ein Skript wie folgt unter /etc/init.d/cpulimit anlegen:

#!/bin/sh
#
# Script to start CPU limit daemon
#
set -e

case "$1" in
start)
if [ $(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print $1}' | wc -l) -eq 0 ]; then
    nohup /usr/bin/cpulimit_daemon.sh >/dev/null 2>&1 &
    ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon started successfully"; else print " * cpulimit daemon can not be started" }'
else
    echo " * cpulimit daemon can't be started, because it is already running"
fi
;;
stop)
CPULIMIT_DAEMON=$(ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print $1}' | wc -l)
CPULIMIT_INSTANCE=$(ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | wc -l)
CPULIMIT_ALL=$((CPULIMIT_DAEMON + CPULIMIT_INSTANCE))
if [ $CPULIMIT_ALL -gt 0 ]; then
    if [ $CPULIMIT_DAEMON -gt 0 ]; then
        ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print $1}' | xargs kill -9   # kill cpulimit daemon
    fi

    if [ $CPULIMIT_INSTANCE -gt 0 ]; then
        ps -eo pid,args | gawk '$2=="cpulimit" {print $1}' | xargs kill -9                    # release cpulimited process to normal priority
    fi
    ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon can not be stopped"; else print " * cpulimit daemon stopped successfully" }'
else
    echo " * cpulimit daemon can't be stopped, because it is not running"
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
status)
ps -eo pid,args | gawk '$3=="/usr/bin/cpulimit_daemon.sh"  {print}' | wc -l | gawk '{ if ($1 == 1) print " * cpulimit daemon is running"; else print " * cpulimit daemon is not running" }'
;;
esac
exit 0

Nun noch die Berechtigungen ändern:

chown root:root /etc/init.d/cpulimit

Um das Skript auf CentOs zu starten habe ich es einfach am ende von /etc/rc.config eingefügt. somit wird es nach dem Booten automatisch gestartet und limitiert dann die CPU intensiven Jobs.

Quelle: http://ubuntuforums.org/showthread.php?t=992706

Low Memory LLMP auf VPS oder Raspberry

Günstige kleine virtuelle Server gibt es für schmales Geld. Bereits für 1,29€ gibts hier das Einsteiger Model.

Mit diesem kleinem HowTo könnt Ihr auf der Raspberry PI oder einem VPS einen voll funktionsfähigen LLMP (Linux, Lighttpd, MySQL, PHP) installieren.

Dieses HowTo basiert auf Raspian bzw. Debian Wheezy.
Zuerst bringen wird das System auf einen akutellen Stand:

# apt-get update && apt-get upgrade

Nachdem jetzt das System up2date ist, fangen wir mit dem Web-Server an:

# apt-get install lighttpd

Wenn wir nun mehrere Webseiten hosten möchten machen wir e uns einfach und nutzen das module simple_vhost. Dieser Mod ermöglicht uns, indem wir eine gewisses Fromat bei der Ordnerstruktur einhalten, dass wir ohne weiter konfiguration mehrere vHosts betreiben können.

 

# lighttpd-enable-mod simple-vhost

Nachdem nun das Modul aktiviert ist, müssen wir die Konfiguration noch anpassen:

# nano /etc/lighttpd/conf-enabled/10-simple-vhost.conf

Hier ändern wir die Datei wie folgt:

# /usr/share/doc/lighttpd/simple-vhost.txt

server.modules += ( "mod_simple_vhost" )

## The document root of a virtual host is document-root =
##   simple-vhost.server-root + $HTTP["host"] + simple-vhost.document-root
simple-vhost.server-root         = "/var/www/"
simple-vhost.document-root       = "html"

## the default host if no host is sent
simple-vhost.default-host        = "server2.tschoerner.eu"

Jetzt legen wir einen vHost an, und zwar im folder /var/www

# mkdir -p /var/www/test.server2.tschoerner.eu/html
# echo '<h1>Lighttpd on Linux Rocks!</h1>' > /var/www/test.server2.tschoerner.eu/html/index.html

/etc/init.d/lighttpd force-reload

Wenn Ihr jetzt auf den Server zugreift, wird euch “Lighttpd on Linux Rocks!” präsentiert.

WordPress installieren

Zuerst brauchen wir php und mysql, dann können wir weitermachen.

# apt-get install bsdutils
# apt-get install mysql-server php5-cgi php5-mysql

Jetzt aktivieren wir php für alle unsere vHosts

# nano /etc/lighttpd/conf-enabled/10-cgi-php.conf

und fügen folgendes ein

server.modules += ("mod_cgi")
cgi.assign = (".php" => "/usr/bin/php5-cgi")

Lighttpd neu starten, so dass die Config geladen wird

# /etc/init.d/lighttpd force-reload

Wir testen ob php geparst wird:

echo '<?php phpinfo(); ?>' > /var/www/test.server2.tschoerner.eu/html/phpinfo.php

MySql Stuff (User anlegen & Datenbank)

# mysqladmin -uroot -p create blog
# wget http://wordpress.org/latest.tar.gz
# tar xvzf latest.tar.gz -C /var/www/test.server2.tschoerner.eu/html
# cd /var/www/test.server2.tschoerner.eu/html
# mv wordpress/wp-config-sample.php wordpress/wp-config.php
# nano wordpress/wp-config.php

Jetzt noch Lighttpd die Permalink struktur beibringen

# cat > /etc/lighttpd/conf-enabled/my.conf
$HTTP["host"] == "test.lowendbox.com" {
    $HTTP["url"] =~ "^/blog/" {
        server.error-handler-404 = "/blog/index.php"
    }
}

# /etc/init.d/lighttpd force-reload

Und jetzt noch einige optionale Tweaks um Speicher zu sparen

# apt-get install dash
# dpkg-reconfigure dash
# /etc/init.d/mysql restart

# apt-get install syslog-ng && dpkg --purge rsyslog

# apt-get remove --purge portmap

Das was schon. Nach 10 Minuten zum Low Memory LLMP

MySQL 5.6 LOW Memory VPS configuration

Nachdem ich spontan meine Cloud umziehen musste … Nein, nicht weil er kaputt gegangen ist, die Performance war sehr schlecht und der Apache auf dem Shared Hoster lief äußerst inperformant und instabil.

Als alter “Schotte” hab ich mir ein VPS gesucht, der möglichst viel Speicherplatz bietet. Mir war es dabei nicht so wichtig, möglichst viel CPU oder RAM zu haben. Meine Wahl fiel auf den Hoster 1fire.de.

1fire

Der Service-Plan war genau das was ich gesucht habe:

1fire_Plan

Nach der Installation aller nötigen Dienste wie Apache, Postfix und MySql wurde klar, bei der Speichernutzung muss ich etwas aufpassen. MySQL hat sich von dem 1024 MB direkt mal 800MB gekrallt. Das geht natürlich nicht 😉 Also was tun?

Ich habe MySql 5.6 im Einsatz hier sind die Änderungen die ich unter [mysql] eingefügt habe.

# Since 5.5.5, mysql uses innodb as default storage engine,
# but innodb requires more memory than MyIASM.
# So, on my low memory machine, I have to disable it.

# disable innodb and set MyISAM as default storage engine
skip-innodb
default-storage-engine=MyISAM
default-tmp-storage-engine=MEMORY
loose-innodb-trx=0
loose-innodb-locks=0
loose-innodb-lock-waits=0
loose-innodb-cmp=0
loose-innodb-cmp-per-index=0
loose-innodb-cmp-per-index-reset=0
loose-innodb-cmp-reset=0
loose-innodb-cmpmem=0
loose-innodb-cmpmem-reset=0
loose-innodb-buffer-page=0
loose-innodb-buffer-page-lru=0
loose-innodb-buffer-pool-stats=0
loose-innodb-metrics=0
loose-innodb-ft-default-stopword=0
loose-innodb-ft-inserted=0
loose-innodb-ft-deleted=0
loose-innodb-ft-being-deleted=0
loose-innodb-ft-config=0
loose-innodb-ft-index-cache=0
loose-innodb-ft-index-table=0
loose-innodb-sys-tables=0
loose-innodb-sys-tablestats=0
loose-innodb-sys-indexes=0
loose-innodb-sys-columns=0
loose-innodb-sys-fields=0
loose-innodb-sys-foreign=0
loose-innodb-sys-foreign-cols=0

# optimize for low memory
key_buffer=16K
table_open_cache=4
query_cache_limit=256K
query_cache_size=4M
max_allowed_packet=1M
sort_buffer_size=64K
read_buffer_size=256K
thread_stack=64K

# only local - wenn gewünscht :)
skip-networking

Hier noch der vergleich in Munin und htop

memory-day-server4-mysql-optimize server4_mem

An der Aktuellen Messung kann man schön erkennen, dass das System nun kaummehr beginnt zu swapen.

Das wars auch wieder!

Stay tuned!

[HowTo] LNMP – VPS mit wenig Ressourcen Nginx & PHP

LNMP-debianvps-300x257Wollt auch Ihr Eurer eigener Herr über einen Server sein? Scheut Euch aber einen dedizierten Root-Server zu mieten? Die Lösung sind kleine vServer, die Euch vollen Admin Zugriff erlauben. Ihr seid euer Herr.

Hat man ein “Low powered” VPS mit wenig CPU & RAM, muss man genau hinschauen was man installiert. Eine Möglichkeit Ressourcen zu sparen ist, anstatt dem weit verbreiteten Indianer (Apache) auf den schlanken Nginx Webserver zu setzten.

Hier ein kleinen HowTo, wie Ihr Euren VPS mit Nginx & PHP einrichtet.

Als erstes sollte man die “Dotdeb” Quellen zu seinem System hinzufügen.Hierzu bearbeitet man die Sources von apt (/etc/apt/sources.list)

nano /etc/apt/sources.list

und fügt am Ende einfach diese Zeilen ein:

# DotDeb
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy all

Um die Paketquellen nutzen zu können, müsst ihr den “Repository-Key” noch hinzufügen, indem ihr folgende schritte ausführt:

wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add -

Der nächste Schritt ist optional. Ihr könnt dem System eine höhere Priorität für die DetDeb Paketquellen geben, müsst dies aber nicht. Einfach diese Datei anlegen “/etc/apt/preferences.d/dotdeb”

nano /etc/apt/preferences.d/dotdeb

folgenden Inhalt einfügen:

Package: *
Pin: release o=packages.dotdeb.org
Pin-Priority: 990

Um zu checken, aus welchem Repository nun die Pakete installiert werden einfach folgenden Befehl ausführen.

apt-cache policy nginx

Jetzt geht’s erst richtig los

Mit dem folgenden Befehl installiert Ihr Nginx & PHP

apt-get install nginx php5 php5-fpm php-pear php5-common php5-mcrypt php5-mysql php5-cli php5-gd

Jetzt schnell noch ein Root Verzeichnis für den Webserver anlegen

mkdir /var/www

Seit Nginx 1.4 werden die Seiten ähnlich wie bei Apache im Ordner /etc/nginx/sites-enables konfiguriert. Hier sollten Symlinks zu files im Verzeichnis /etc/nginx/sites-available erzeugt werden.

nano /etc/nginx/sites-available/server2.tschoerner.eu

und folgenden Inhalt einfügen:

server {
	listen 80;	# Der zu lauschende Port
	server_name server2.tschoerner.eu;	# Der Name für den virtuellen Host
	root /var/www;	# Der zu verwendende Ordner

	location / {
		index index.php index.html;	# Zuerst versuchen, bei einem / Aufruf die index.php zu laden, alternativ die index.html
	}

	location ~* \.php$ {	# Ermöglicht die Verarbeitung von php Dateien
		try_files $uri /index.php;
		fastcgi_index index.php;
		fastcgi_pass 127.0.0.1:9000;
		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		fastcgi_param SCRIPT_NAME $fastcgi_script_name;
	}

	autoindex on;	# Funktion, ob der Verzeichnisinhalt angezeigt werden soll, wenn keine index.php oder index.html existiert
}

Jetzt besagten Symlink erzeugen:

ln -s /etc/nginx/sites-available/server2.tschoerner.eu  /etc/nginx/sites-enabled/server2.tschoerner.e

rm -rf /etc/nginx/sites-enabled/default

Und fertig … Neginx neu starten

service nginx restart

Legt nun eine Datei (phpinfo.php) in /var/www an und ruft diese im Browser auf.

Wenn Ihr jetzt einen Fehler bekommt “502 Bad Gateway”, dann müsst Ihr noch folgende Zeile in der Datei (/etc/php5/fpm/pool.d/www.conf) ändern:

#ALT
listen = /var/run/php5-fpm.sock

#Zu:
listen = 127.0.0.1:9000

PHP durchstarten und fertig 🙂

/etc/init.d/php5-fpm restart

Alles zu Thema MySQL blogge ich demnächst.

Natürlich könnt Ihr auch hier die bereits geboggten Performance Enhancements eines PHP Caches nutzen.

 

 

Apache und PHP Performance Tuning in Debian [HowTo]

Heute möchte ich kurz zeigen wie Ihr Eurem Apache/PHP WebServer mehr Power gebt.

Es gibt diverse Möglichkeiten, eine Webseite zu beschleunigen. Zuvor hatte ich schon darüber gebloggt wie Ihre den Datenstrom zwischen Server und Client packt um die Transferzeiten zu minimieren. Auf dem Server müssen die Webseiten aber erst aufbereitet werden, bevor diese transferiert werden können. Ein großen Vorteil haben statische Elemente wie Bilder, Html-Seiten etc. Setzt man jedoch PHP ein, muss die Seite immer geparst und interpretiert werden. Diese Operationen benötigen Zeit, und belasten auch die Leistung des Servers.

Setzt man auf Caching Mechanismen kann man ohne Verlust der Webseitendynamik einfach “statische” Seiten erzeugen. Ein Liste der Verfügbaren PHP-Chaches findet Ihr hier. Ich persönlich habe mich für den Einsatz des APC (Alternative PHP Cache) entschieden.

apcphp

Die Installation auf Debian ist denkbar einfach durchzuführen.

# apt-get update
# apt-get install php5-pear php5-apc

Es werden nun alle notwendigen Pakete installiert. Um die neue Funktionalität nutzen zu können, muss der Apache noch einmal durch gestartet werden.

# /etc/init.d/apache2 restart

Beim Besuch Eurer Seite solltet Ihr nun einen ordentlichen Performance Zuwachs merken. Wenn Ihr Euch nicht sicher seid, ob der APC richtig läuft, dann legt einfach ein Datei (phpinfo.php) mit folgendem Inhalt an und ruft diese im Browser auf:

<?php
phpinfo();
?>

Das Ergebnis sollte in etwas so aussehen:

phpinfo

Sucht einfach nach APC auf der Seite um zu validieren ob der Cache läuft:

phpinfo_apc