KategorieWorpress

[HowTo] MySQL/MariaDB User und Datenbank erzeugen

Wenn Ihr einen PHP-Skript (WordPress, Drupal …) auf eurem Server hostet und keine Webhosting Interface nutzt, dann könnt Ihr mit diesen Schritten schnell eine Datenbank & DB-User erstellen. Mit diesen Schritten erzeugt Ihr eine Datenbank & DB-User mit gleichen Namen.

Folgendes nacheinander ausführen und USER_blog und geheim ersetzten.

# mysql

CREATE USER 'USER_blog'@'%' IDENTIFIED BY 'geheim';
GRANT USAGE ON *.* TO 'USER_blog'@'%' IDENTIFIED BY 'geheim' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;
CREATE DATABASE IF NOT EXISTS `USER_blog`;
GRANT ALL PRIVILEGES ON `USER_blog`.* TO 'USER_blog'@'%';
QUIT;

 

[HowTo] Hiawatha auf Debian Jessie (8.x)

Kürzlich habe ich wieder auffällige Http Attacken auf meine WebServer gesehen. Es kam hierbei zu keinem großen Problem, jedoch hab ich mir die Frage gestellt, ob es sicherere WebServer Konfigurationen als der üblichen LAMP (Linux, Apache, MySQL/MaraDB, PHP) , LNMP (…,Nginx,…) oder LLMP (…Lighttpd…) gibt. Hierbei bin ich dann auf einen interessanten Vergleich gestoßen. Natürlich muss man bei der Quelle etwas vorsichtiger sein (ist die Hiawatha projekt page), aber durchaus sehr interessamt.

Link: Performance testing while under attack

Typischerweise sind Webserver, welche seltenere verbreitet sind weniger im Punkt der Angreifer. Zudem ist Hiawatha ein WebServer, welcher auf Sicherheit ausgelegt ist. Hiawatha stammt vom Entwickler Hugo Leisink und wurde wie bereits erwähnt auf Sicherheit getrimmt. Out of the box ist er bereits gegen Denial-of-Service-Attacken gewappnet.

Nachfolgen beschreibe ich die Konfiguration von Hiawatha auf Debian Jessie mit Php5 & Php7.

System Vorbereiten, neue PHP Quellen hinzufügen & PHP5/7 installieren:

echo "deb http://packages.dotdeb.org jessie all" | tee -a /etc/apt/sources.list.d/dotdeb.list
wget -qO - http://www.dotdeb.org/dotdeb.gpg | apt-key add -
apt-get update
apt-get remove apache*
apt-get install php5 php-pear php5-curl php5-mysql php5-fpm  php5-gd mariadb-server libxslt1.1 cron logrotate libpopt0 htop nano
apt-get install php7.0-cli php7.0-curl php7.0-dev php7.0-fpm php7.0-gd php7.0-mysql php7.0-mcrypt php7.0-opcache php7.0-mbstring php7.0-zip

Nun den Webserver herunterladen:

cd ~
wget https://files.tuxhelp.org/hiawatha/hiawatha_10.2_amd64.deb
dpkg -i hiawatha*

Im Großen und Ganzen war es das auch schon, nun geht es an die Konfiguration. Hierbei werde ich die “Standard” Konfiguration von Php-fpm für Version 5 & 7 nutzen. Beide Versionen stellen nach der Installation einen Unix-Socket bereit. Ich trenne die PHP Konfig hier nicht nach Web/User.

PHP5 Default Socket

/var/run/php5-fpm.sock

PHP7 Default Socket

/run/php/php7.0-fpm.sock

Nun den PHP Interpreter in der Hiawatha Konfig bekannt machen:

FastCGIserver {
FastCGIid = PHP5
ConnectTo = /var/run/php5-fpm.sock
Extension = php
}

FastCGIserver {
FastCGIid = PHP7
ConnectTo = /run/php/php7.0-fpm.sock
Extension = php
}

Und im Standard Webserver bekannt machen, unterhalb von:

# DEFAULT WEBSITE
# It is wise to use your IP address as the hostname of the default website
# and give it a blank webpage. By doing so, automated webscanners won't find
# your possible vulnerable website.
#

folgendes einfügen:

UseFastCGI = PHP7 # --> für PHP7

oder 

UseFastCGI = PHP5 # --> für Php 5.6

Anschließend alle Services einmal neustarten:

/etc/init.d/php7.0-fpm restart
/etc/init.d/php5-fpm restart
/etc/init.d/hiawatha restart

Jetzt noch schnell checken ob Hiawatha auch lauscht:

root@server:~# netstat -anp |grep hiawatha
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      9397/hiawatha
tcp6       0      0 :::443                  :::*                    LISTEN      9397/hiawatha
tcp6       0      0 :::80                   :::*                    LISTEN      9397/hiawatha

Wenn Ihr nun im Browser folgendes aufruft http://<serverip> sollte sicher Hiawatha wie folgt melden.

2016-06-13 09_40_51-Hiawatha webserver

Um nun zu testen ob auch PHP funktioniert einfach folgendes ausführen:

echo "<?php phpinfo(); ?>" > /var/www/hiawatha/info.php

Anschließend folgendes im Browser aufrufen: http://<serverip>/info.php

Im besten Fall sieht das Ergebnis wie folgt aus:

2016-06-13 09_55_55-phpinfo()

WordPress – Seiten weiterleiten nach Permalink change

Häufig steht man vor dem Problem wenn man seinen Blog umzieht, dass womöglich die Permalinks nicht mehr passen. Ganz Speziell tritt das Problem auf, wenn man dazu noch seinen Webserver-Software ändert. In meinem Fall bin ich von NGINX zu hiawatha umgezogen. Problem ist hier, dass ich es nicht geschafft habe die gleiche Permalinkstruktur wie bei NGINX zu erzeugen.

Der Unterschied lag darin, dass ich bei hiawatha immer ein index.php mitgeben musste.

NGINX

https://blog.tschoerner.eu/author/admin/

Hiawatha

https://blog.tschoerner.eu/index.php/author/admin/

Wenn man nun auf einen “alten” Link klick würde der Webserver mit Error 404 antworten. Mit folgendem Snippet wird nun geprüft ob die URL index.php enthält. Wenn nicht wird mittels PHP die Location umgesetzt. Der Code muss ganz am Anfang der 404.php in WordPress eingefügt werden. Eventuell muss man noch <?php … ?> einfügen.

$string   = "index.php";
$meinString = $_SERVER["REQUEST_URI"];

$pos = strpos($meinString, $string);

if ($pos == "") 
    { 
	header("Location: https://blog.tschoerner.eu/index.php/".$_SERVER["REQUEST_URI"]); 
    }

 

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

Apache für LOW Memory VPS/Raspberry Pi optimieren

Apache und LOW Memory vertragen sich ja nicht so wirklich, deshalb eines Vorweg, man sollte wenn man nich unbedingt Apache braucht, auf Alternative wie nginx oder Lighttpd setzen. Ich betreibe eigentlich nur auf allen meinen kleineren Systemen (<2GB Ram) nur nginx und (<256MB Ram) lighttpd. Hier haben ich auch einen Link zu einer Low Memory LLMP Konfiguration.

Nichts desto trotz benötigt man manchmal unbedingt einen Indianer, und so kann man ihn auch auf einem Low Mem Server betreiben.

Also wie gesagt ist das größte Problem der Speicher den der Apache braucht. In der Konfigurationsdatei
/etc/apache2/apache2.conf kann man die Einstellungen tunen.

nano /etc/apache2/apache2.conf

In der Konfigurationsdatei dann folgende Konfiguration vornehmen:

<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers       3
    MaxClients           10
    MaxRequestsPerChild 3000
</IfModule>
 
<IfModule mpm_worker_module>
    StartServers          1
    MinSpareThreads       5
    MaxSpareThreads      15 
    ThreadLimit          25
    ThreadsPerChild       5
    MaxClients           25
    MaxRequestsPerChild 200
</IfModule>

Des weiteren empfiehlt sich das Timeout zu reduzieren. KeepAliveTimeout sollte nicht mehr als 15 (Sekunden) betragen.

Nach diesen Einstellungen ist Apache schon wesentlich genügsamen. Jetzt sollte man noch nicht benötigte Module deaktivieren. Mit diesem Befehl seht Ihr alle Apache Module.

apache2ctl -M

Bildschirmfoto 2015-11-15 um 12.21.51

Um beispielsweise einen WordPress Blog zu hosten brauch man folgende Module (wie gesagt, WordPress läuft auch unter nginx & Lighttpd).

LoadModule dir_module modules/mod_dir.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule alias_module modules/mod_alias.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule rewrite_module modules/mod_rewrite.so

Um ein Modul zu deaktivieren kann man entweder die Konfigurationsdatei oder aber folgenden Befehl ausführen:

# Modul aktivieren
a2enmod module_name
#Modul deaktivieren
a2dismod module_name

Anschließend noch den Apache neu starten und Spaß haben.

blog.tschoerner.eu goes IPv6

Heute habe ich die Konfiguration für meinen Blog geupdated.

blog.tschoerner.eu ist nun per IPv4 und IPv6 erreichbar.

IPv6

Ob Eure Webseite via IPv6 erreichbar ist könnt Ihr hier überprüfen:  http://ipv6-test.com/validate.php

Ob Ihr über IPv4 zugreift oder IPv6 seht ihr hier. Wenn Ihr eine “normale” Adresse ohne : seht, ist es v4 anderenfalls v6

Deine IP: [VisitorCountry-IP]

Demnächst blogge ich Euch noch, wie Ihre euren VPS mittels IPv6 Tunnel konfiguriert und es gibt auch noch die Froxlor Konfig dazu.

Stay tuned!

 

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

Simple Captcha für Contact Form 7

Heute stelle ich Euch eine einfache, aber wirkungsvolle Methode vor um vor unerwünschten Mails verschont zu bleiben.

Ich setzte am liebsten Contact Form 7 ein, um dem Nutzer ein Kontaktformular bereitzustellen. Bei Contact Form 7 gibt es “out of the Box” leider keine Captcha Abfrage. Im verlinkten Youtube-Video zeige ich Euch, wie Ihr jedes Kontaktformular pumpen könnt.

Stay tuned!

Webseiten performance Optimieren mit gZip Kompression

Wie ihr wisst (vielleicht) läuft mein WebServer auf Debian Squeeze. Die Konfiguration und Verwaltung mache ich mit froxlor. Für alle diejenigen welche froxlor nicht kennen,  hier der Link zum Projekt.

Da auf meinem Server diverse Projekt, Shops, Seiten etc. gehostet sind, bin ich immer daran mein möglichstes für gute Performance zu tun. Zudem werden mehr als 50% der Anfragen von mobilen Geräten gesandt. Diese Anfragen werden dann wiederum zu 60% aus dem mobilen Netz gesendet.

Setzt man nun die gZip Kompression ein, wird die Antwortzeit minimiert, aufgrund der geringeren Datenmenge welche zu übertragen ist. Und das merkt man natürlich in langsamen mobilen Netzen am meisten.

Man kann die gZip Kompression auf 2 Arten bereitstellen.

  1. php.ini
  2. .htaccess

Option 1

Aktiviren der Kompression in der php.ini. Hierzu muss lediglich der folgende Code eingefügt werden.

zlib.output_compression = on

 

Option 2 (präferiert)

Die 2. Option benötigt lediglich die Veränderung der .htacces Datei. Die Datei wird von modernen PHP-System wie WordPress standard im Wurzel (root) Verzeichnis der Installation erzeugt.

<IfModule mod_deflate.c>
	<IfModule mod_filter.c>
		AddOutputFilterByType DEFLATE text/plain text/html application/x-httpd-php-source
		AddOutputFilterByType DEFLATE text/xml application/xml application/xhtml+xml application/xml-dtd
		AddOutputFilterByType DEFLATE application/rdf+xml application/rss+xml application/atom+xml image/svg+xml
		AddOutputFilterByType DEFLATE text/css text/javascript application/javascript application/x-javascript
		AddOutputFilterByType DEFLATE font/truetype application/x-font-ttf font/opentype application/x-font-otf
	</IfModule>
</IfModule>

Unterstützt der Webserver die Module deflate und filter nicht, können diese für Apache so aktiviert werden.

mod_deflate aktivieren

root@server1:/# a2enmod deflate
Enabling module deflate.
Run '/etc/init.d/apache2 restart' to activate new configuration!

mod_filter aktivieren

root@server1:/# a2enmod filter
Enabling module filter.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Verlinkt habe ich noch ein Video, wie die gZip Kompression funktioniert.

Quelle: How grip compression works

WordPress-Startseite ändern / festlegen

Standardmäßig zeigt WordPress nach der Installation die Blog-Beiträge vom Aktuellsten bis zum Ältesten. Möchte man aber WordPress eher als Content Management System nutzen, hätte man gerne eine eigene statische Startseite. In WordPress gibt es sehr einfach die Möglichkeit eine statische Seite festzulegen.

Zunächst einmal erstellt man sich eine Seite mit dem gewünschten Inhalt.

Seite_erstellen

Im Anschluss muss die Seite nur noch als Startseite festgelegt werden. Einstellungen >> Lesen >> Startseite festlegen

Seite_erstellen_2