In letzter Zeit lerne ich immer mehr das Programm Screen schätzen. Es macht die Verwaltung von Server-Systemen wesentlich angenehmer, da es mehrere virtuelle Terminals bzw. “Fenster” über einen Login erlaubt.
Eine sehr praktische Eigenschaft an Screen ist, dass die Screen-Sessions unabhängig von der bestehenden Server-Verbindung erhalten bleiben. Das heisst, man kann ein Script gefahrlos innerhalb einer Screen-Session starten, ohne Angst haben zu müssen, dass es durch einen Verbindungsabbruch gestoppt wird.
Im folgenden die wichtigsten Kommandozeilen-Parameter und Tastenkürzel nach dem Aufruf von Screen.
Eine neue Screen-Session startet man mit dem Kommando “screen”.
screen
Optional kann man der Session mit dem Parameter -S einen Namen geben.
screen -S SessionName
Wenn man mehrere Screen-Sessions mit verschiedenen Namen gestartet hat, kann man sich mit dem Parameter -ls eine Liste der bestehenden Screen-Sessions anzeigen lassen.
screen -ls
Wie gesagt, bleibt eine Screen-Session nach Beendigung des Terminals erhalten, vorausgesetzt, auf dem Server wurde kein Reboot durchgeführt.
Eine früher gestartet Screen-Session lässt sich mit dem Parameter -r wieder reaktivieren. Der SessionName ist nur dann notwendig, wenn mehrere screen-Sessions gestartet wurden.
screen -r SessionName
Im Folgenden, die Kürzel zur Steuerung innerhalb der Screen-Session. Screen-Kommandos werden im Allgemeinen mit ctrl-a und einer weiteren Taste ausgeführt.
ctrl-a d Screen Session in den Hintergrund setzen (detach)
ctrl-a ? Hilfe anzeigen
ctrl-a c Eine neues Fenster erstellen
ctrl-a 1-n Auf Fenster Nr. 1-n schalten
ctrl-a " Liste der Fenster anzeigen
ctrl-a A Das aktuelle Fenster umbenennen
exit Das aktuelle Fenster schliessen
Screen-Fenster lassen sich teilen um so mehr Informationen gleichzeitig im Terminal anzuzeigen.
ctrl-a S Das aktuelle Fenster horizontal teilen
ctrl-a | Das aktuelle Fenster vertikal teilen
ctrl-a tab Zur nächsten Fensterregion springen
ctrl-a X Die aktuelle Fensterregion entfernen
ctrl-a Q Alle Regionen ausser der aktiven entfernen
Mit zwei einfachen Zeilen in der .htaccess lässt sich der Inhalt von PHP-Seiten bei der Auslieferung automatisch gzippen, was zu einer Reduzierung der Seitengröße um bis zu 90% führen kann.
php_value output_buffering On
php_value output_handler ob_gzhandler
Diese Konfiguration lässt sich auch mit folgenden Zeilen in der php.ini durchführen.
output_buffering = On;
output_handler = ob_gzhandler;
…oder direkt im PHP-Sourcecode, durch Hinzufügen von
<?php
ob_start("ob_gzhandler");
?>
Notwendig für die Funktionsfähigkeit dieser Komprimierung ist die zlib-Erweiterung von PHP. Diese Erweiterung ist aber allgemeiner Standard bei PHP-Hosting-Anbietern.
Dokumentation zu ob_gzhandler auf php.net
Wenn man mit beispielsweise
cp -r * /zu/diesem/verzeichnis/
den Inhalt eines Verzeichnisses in ein anderes kopieren will, so werden keine versteckten Dateien kopiert. Der bash-Wildcard ‘*’ gilt nämlich nicht für versteckte Dateien, also Dateien, die mit einem Punkt anfangen, wie z.B. “.htaccess”. Mit
cp -r * .[!.]* /zu/diesem/verzeichnis/
kopiert man auch die versteckten Dateien.
- * kopiert “normale” Dateien
- .[!.]* kopiert Dateien, die mit einem ‘.’ beginnen, ohne das übergeordnete Verzeichnis ’..’ zu kopieren
Siehe hierzu auch: Bash Wildcards
In Linux und Unix (also auch in OS-X) kann man mit dem Kommandozeilen-Tool ssh-keygen ein Schlüsselpaar mir Public- und Private-Key anlegen, welches zur Authentifizierung über ssh genutzt werden kann.
Über die Console bzw. das Terminal geben wir hierzu den Befehl ssh-keygen -t dsa ein
1 | Sylvester:~ lisa$ ssh-keygen -t dsa
2 | Generating public/private dsa key pair.
3 | Enter file in which to save the key (/Users/lisa/.ssh/id_dsa): ↵
4 | Created directory '/Users/lisa/.ssh'.
5 | Enter passphrase (empty for no passphrase): ↵
6 | Enter same passphrase again: ↵
7 | Your identification has been saved in /Users/lisa/.ssh/id_dsa.
8 | Your public key has been saved in /Users/lisa/.ssh/id_dsa.pub.
9 | The key fingerprint is: [...]
10 | Sylvester:~ lisa$ cd ~/.ssh
11 | Sylvester:~ lisa$ ls
12 | id_dsa id_dsa.pub
In Zeile 3 wird gefragt, wo man die Keys abspeichern möchte, als Antwort einfach Return drücken. Falls das Verzeichnis .ssh noch nicht existiert, wird es nun erstellt. Zur Passwortlosen Authentifizierung bei der Frage nach dem passphrase in Zeile 5 und 6 auch nur Return drücken (empty for no passphrase).
Im Verzeichnis ~/.ssh werden von dem Programm nun die zwei Dateien id_dsa und id_dsa.pub erstellt. id_dsa ist der Private-Key, id_dsa.pub der Public-Key. Der Private-Key sollte möglichst nicht in fremde Hände geraten.
Der Public-Key, also der Inhalt von id_das.pub muss nun auf dem Server in die Datei ~/.ssh/authorized_keys kopiert werden. Wenn der Ordner ~/.ssh oder die Datei noch nicht existiert kann man sie einfach erstellen.
Nachdem das alles erledigt ist sollte beim Login auf dem Server nicht mehr nach dem Passwort gefragt werden, da sich der Computer automatisch über die hinterlegten Keys authentifiziert.
Sylvester:~ lisa$ ssh techblog.7d0.de -l techlisa
Last login: Sat Jan 24 13:25:45 2009 from p0815ea9d.dip.t-dialin.net
Have a lot of fun...
techlisa@techblog.7d0.de:~>
Ich find´s praktisch und es soll ja auch sicherer sein, als die Authentifizierung mit Login und Passwort.
Zum Schluss noch die Manpage von ssh-keygen.
In einer bestimmten Datei nach einem Suchwort suchen:
grep suchwort datei.txt
Alle Dateien im aktuellen Ordner und Unterordnern finden, die einen bestimmten Text enthalten:
grep -R "suchwort" *
Alle Dateien im aktuellen Ordner finden, die wort1 oder wort2 im Inhalt haben
grep -E "(wort1|wort2)" *
Dateien im aktuellen Ordner und Unterordnern finden, deren Namen einem bestimmen Muster entsprechen:
find . -name "*.jpg"
Dateien finden, deren Namen nicht einem bestimmten Muster entsprechen:
find . \! -name "*.jpg"
Dateien finden, deren Namen einem bestimmten Muster entsprechen und die einen bestimmten Text enthalten:
find . -name "*.php" -exec grep -il "suchtext" {} \;
Dateien finden, die bestimmte Datei-Endungen haben (Mit Regular-Expressions finden):
find . -regex ".*(php|html|tpl)$"
Große Dateien finden (Dateien finden, die größer als ca. 500 MB sind):
find . -type f -size +500000k -exec ls -lh {} \;
Dateien finden, deren Pfade einem bestimmten Pattern entsprechen:
find . -path "*/.svn*"
Dateien finden, deren Pfade nicht einem bestimmten Pattern entsprechen:
find . \! -path "*/.svn*"
Dateien finden, die nicht einem bestimmten User (nicht root) gehören:
find . \! -user root
Dateien finden, die “oo” oder “ee” im Namen haben:
find . \( -name "*oo*" -or -name "*ee*" \)
Dateien finden, die nicht “oo” oder “ee” im Namen haben:
find . \! \( -name "*oo*" -or -name "*ee*" \)
Hier noch die Manpages zu grep und find.
Mit MySQL lassen sich über das Terminal einfach Datenbank-Dumps (Kopien der Datenbank) erzeugen und einlesen. Zum Erzeugen nutzt man den Befehl mysqldump und zum Einlesen eines Dumps den Befehl mysql.
Erzeugen
/pfad/zu/mysqldump -u$DBUSER -p$DBPASSWD -h$DBHOST $DATABASE > $FILENAME
Einlesen
/pfad/zu/mysql -u $DBUSER -p$DBPASSWD --database=$DATABASE < $FILENAME
Ist die zu importierende Datei in UTF-8 kodiert, kann es notwendig sein, das Characterset “–default_character_set utf8″ zu setzen.
/pfad/zu/mysql -u $DBUSER -p$DBPASSWD --default_character_set utf8 --database=$DATABASE < $FILENAME
Das Programm mysql befindet sich unter OS-X in MAMP und XAMPP an folgenden Stellen:
MAMP OS-X: /Applications/MAMP/Library/bin/mysql
XAMPP OS-X: /Applications/xampp/xamppfiles/bin/mysql
Schnellerer Dump für MyISAM-Tabellen mit mysqlhotcopy
Falls die Datenbank nur aus MyISAM-Tabellen besteht, kann man Backups auch wesentlich schneller mit dem Programm mysqlhotcopy erstellen. mysqlhotcopy sperrt lediglich alle Tabellen und kopiert dann das Dateiverzeichnis, welches sich üblicherweise in /var/lib/mysql befindet. Dieser Backup ist dann nicht besonders kompatibel aber eben so schnell, wie es grade braucht, die Daten auf der Festplatte zu kopieren.
Wenn vom apache-Webserver der Fehler “RewriteEngine not allowed here” kommt, kann das daran liegen, dass, wie in meiner aktuellen XAMPP-Installation unter OS-X, “AllowOverride” in der httpd.conf auf “AuthConfig” oder “None” gesetzt wurde.
“AllowOverride” definiert, welche Einstellungen der httpd.conf in einer .htaccess überschrieben oder geändert werden dürfen. Wenn man “AllowOverride” auf “All” setzt, lassen sich alle gewünschten Einstellungen in der .htaccess tätigen.
Hier der Ausschnitt aus meiner httpd.conf, der das Problem behoben hat:
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride All
Siehe hierzu auch: Konfigurationsdirektive: AllowOverride
Seit der Version 4.0 besitzt MySQL einen Query-Cache. Dieser Cache speichert Ergebnisse von SQL-Abfragen im Speicher und antwortet, wenn die exakt gleiche Daten-Abfrage erneut kommt, mit dem gecachten Ergebnis.
Jede Tabelle hat ihren eigenen Cache. Bei schreibendem Zugriff (Daten Manipulation) auf die Tabelle muss deren Cache gelöscht werden. Die Aktivierung des Caches ist daher vor allem dann sinnvoll, wenn die Anwendung mehr aus der Datenbank liest, als schreibt.
In den meisten Web-Anwendungen, wie beispielsweise Foren oder Datenbank-Archive werden Daten wesentlich öfter abgefragt als geschrieben, so dass die Aktivierung des Query-Cache in MySQL einen hohen Performance-Gewinn bringen kann.
Aktiviert werden kann dieser Cache per Konfiguration im Abschnitt [mysqld] der my.cnf Konfigurationsdatei von MySQL. Eine Beispiel-Konfiguration könnte so aussehen:
# Maximale Groesse eines Abfrage Ergebnisses, damit es gecached wird
query_cache_limit = 1M
# Gesamtgroesse des Cache
query_cache_size = 16M
Der Status des Cache, also wie viele Anfragen sich beispielsweise im Cache befinden und wie gut der zur Verfügung stehende Cache-Speicher genutzt wird, kann man sich mit folgendem Statement anzeigen lassen:
SHOW STATUS LIKE 'Qcache%';
Wichtig ist, dass die Zahl “Qcache_lowmem_prunes” möglichst gering bleibt, da sie steigt, wenn aufgrund fehlenden Speichers Anfragen aus dem Cache entfernt wurden. In diesem Fall ist es sinnvoll die “query_cache_size” zu erhöhen.
Dokumentation des MySQL Query-Cache auf den Seiten von MySQL
Ein neuer Blog für Techniker.