Archiv für die Kategorie ‘Linux & Server’

Plesk & das “LOAD DATA LOCAL INFILE” – Problem mit PHP

Montag, 06. Juni 2011

Ich hasse Plesk, das ist der letzte Kinderkram -klickibunti und mit Null Funktionen – aber egal. Ein Kunde von uns ist endlich auf einen eigene Server umgestiegen, so dass wir dringend eine benötigte Höheneinheit bei Keyweb in Erfurt frei bekamen. Allerdings versprachen wir in geistiger Umnachtung, sein System auf einen 1&1 Dedicated Server zu migrieren. Dort läuft das tolle Plesk in der buntesten Version 9.0.1 – aber na gut.

Die Domain war bereits drüben und es mussten nur die Daten per SSH rumkopiert werden, dank der superflotten 1&1 Anbindung ja kein Problem, schließlich pegelt sich ja der Transfer irgendwann bei sagenhaften 4 Mbit / sec ein … also Bilder in Tar.gz Archive gepackt und los ….

Dann legten wir eine neue Datenbank via Plesk an sowie den dazugehörigen Benutzer, auch erstmal kein Problem. Die Anwendung bekam die DB Logins mitgeteilt und es sollte gehen, denkste. Wir transferieren Stammdaten aus Warenwirtschaftssystemen üblicherweise in die Anwendungen via gezippten und verschlüsselten CSV Dateien, so also auch hier – und wollten einfach per “LOAD DATA INFILE” den Krempel wieder in die neue Datenbank einlesen, was aber netterweise auf Anhieb aus der PHP Anwendung heraus per Programmcode nicht klappte. Also loggte ich mich auf dem MYSQL DB SERVER dieser Maschine per “mysql -uBenutzer -pPasswort” ein, machte ein connect auf die betreffende frisch angelegte Datenbank und probierte den ganzen Kram händisch per “LOAD DATA INFILE ‘/srv/www/vhosts/DOMAINVERZEICHNIS/httpdocs/importdatei.csv’ INTO TABLE irgendwas FIELDS TERMINATED BY ‘;’ (Feld1, Feld2);” … was zu dem lustigen Error 13 (HY00) führte – “Can’t get stat of DeinebekloppteImportdatei”. Ok, Google meinte, Plesk kennt kein LOAD DATA INFILE, hier muss ein LOAD DATA LOCAL INFILE denselben Zweck erfüllen. OK, aber nun wurde es ganz interessant,denn nach Eingabe von “LOAD DATA LOCAL INFILE ‘/srv/www/vhosts/DOMAINVERZEICHNIS/httpdocs/importdatei.csv’ INTO TABLE irgendwas FIELDS TERMINATED BY ‘;’ (Feld1, Feld2);” verweigerte der DB SERver mir vollends die Zusammenarbeit und meinte nur trocken: ERROR 1148 (42000): The used command is not allowed with this MySQL version!

Na gut, irgendwo las ich dann was von “mysql -uBenutzer -pPasswort –local-infile=1″, was schonmal in die richtige Richtung ging, aber da wir nicht wissen, ob der DB Server oder der Client betroffen ist, kann das zwar auf der Shell funktionieren, aber nicht unbedingt in der Anwendung.

Na Super, und nun? Eine komplett neuen MYSQL Server auf die Kiste zu kompilieren, darauf hatte ich keine Lust, da sind locker 3 Stunden weg. Aber da wir keine Angst vor der Shell haben, nahm ich mir die my.cnf vor, welche in /etc/ liegt und änderte kurzerhand die Konfiguration, damit die gesamte Ausgangssituation des Servers geändert wird, kann ja nix passieren . Aus set-variable=local-infile=0 in der Abteilung des MYSQL SERVERS ( [mysqld] ) wurde ein set-variable=local-infile=1 und denselben Eintrag legte ich zusätzlich im MYSQL-CLIENT Konfigurationsbereich an ( [mysql] )!

# The MySQL server
[mysqld]
set-variable=local-infile=1

[mysql]
set-variable=local-infile=1

Um auf Nummer sicher zu gehen, loggte ich mich auf den DB SERVER per admin und Masterpasswort ein und machte ein Connect auf die Rechte-Datenbank “mysql”. Hier änderte ich per manuellem Update  in der Tabelle “user” für den DB Benutzer, welchen wir zu Beginn mit der neuen Datenbank angelegt hatten, alle Rechte von “N” auf “Y” und erklärte ihm am Ende per FLUSH PRIVILEGES, dass ich es ernst meine.

So, wieder händischer Test per “LOAD DATA LOCAL INFILE ‘/srv/www/vhosts/DOMAINVERZEICHNIS/httpdocs/importdatei.csv’ INTO TABLE irgendwas FIELDS TERMINATED BY ‘;’ (Feld1, Feld2);” und er las mir den Krempel korrekt ein, soweit so gut.

Ok, Anwendung aufgemacht und das ganze per PHP Script versucht – ohne Erfolg, wie sollte es anders sein, also lag hier ein Problem mit dem PHP MYSQL Connect vor, denn der DB SERVER selber und der MYSQL Client auf der Konsole habe ja ihren Job eben korrekt gemacht, also kann es nur noch am PHP liegen. Und da der Connect auf die DB per PHP regulär durch “mysql_connect($db_host, $db_user, $db_password)” erfolgt, war hier anzusetzen … google befragt …. und siehe da, an kann dem mysql_connect noch ein paar mehr Infos mit geben, wie etwa die Fehlerausgabe an Stelle 4 und optionale Parameter an Position 5. Ein erweitertes “mysql_connect($db_host, $db_user, $db_password, FALSE, 128) erlaubt nun auch der PHP Klasse, welche den mysql Client spielt, LOAD DATA LOCAL INFILE zu akzeptieren.  Die Zauberzahl ist die 128 am Ende, welche das benötigte Importrecht zu Verfügung stellt. Gefunden habe ich das unter diesem Link, aber auch unter mysql.com findet man Hinweise und weitere Wunderzahlen.

Ich hoffe, das war etwas hilfreich, ich sitze dafür seit 07:50 Uhr heute früh und kann nun endlich um 13:15 Uhr ohne Mittagessen und mit kaltem Kaffee die Anwendung umschreiben, so dass der Import der CSV Datein auch auf einem 1&1 Server mit Plesk korrekt funktioniert.

SpamAssassin – Spamfiler testen

Mittwoch, 02. Februar 2011

Es gibt eine einfache Lösung, SpamAsssassin zu testen, ohne sich bei unseriösen Seiten für den Newsletter anmelden zu müssen und dann jahrelang Spam zu bekommen.

Es muss lediglich eine Email von einem anderen Account versendet werden mit fogendem Inhalt:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Diese Email muss vom SpamAssassin als Spam erkannt werden, sonst ist der Spamfilter nicht korrekt eingerichtet.

Vielen Dank an dieser Stelle an: ETES Systemhaus für diese Info, hier der Link.

sendmail als Relay Server einrichten

Freitag, 16. Juli 2010

Der sendmail sollte standardmäßig so konfiguriert sein, dass er von keiner fremden IP Mails annimmt, um diese per Relay weiterzuleiten.

Unter /etc/mail sollten sich die sendmail konf-dateien befinden. Uns interessiert in dem Fall eigentlich nur die datei “access”, welche die IP’s beherbergt, welche diesen Server als Relay Server nutzen dürfen.

Mit Relay meine ich hier auch wirkliches Relay, das, was falsch konfigurierte Mailserver üblicherweise auf eine Blacklist bringt, wenn dieser als Spamschleuder mißbraucht wird. Also ist hier Vorsicht geboten.

In die Datei access kommen nun die reinen IP’s der Server rein, welche bei uns als Backendserver ihre Arbeit verrichten. Bitte keine Host- oder Subdomainnamen eintragen.

Die access sollten dann in etwa so aussehen:

Access-300x217 in

Danach den Sendmail per /etc/init.d/sendmail stop + start restarten und dann sollte er auch alle Mail von den IP’s annehmen.

Tip: Wenn man sich bei T-Online einen Businessanschluss holt, kann man über diesen Zugang eine feste IP für seinen DSL Anschluss beantragen, dann kann man auch in die access die IP seines DSL Zuganges eintragen und so Dinge testen, ohne scharfe Maschinen umkonfigurieren zu müssen. Evtl will man ja auch aus PHP, PERL oder anderen Sprachen heraus mailen, so kann man das vorab auf lokalen Testumgebungen simulieren.

Nachster Schritt:

2.)  BackendServer einrichten, DNS + RDNS korrekt konfigurieren (… folgt)

Mailsysteme auf Backend Servern – Anleitung

Freitag, 16. Juli 2010

Unsere Shopsysteme sind mittlerweise so weit gewachsen, dass mehrere performante Server als Backendserver hinter einem Loadbalancer die Stellung halten müssen. Das klappt auch super, allerdings bekommt man irgendwann ein Problem mit der Überwachung der unterschiedlichsten Funktionen – und eine wollen wir uns nun mal genauer anschauen – die Mailfunktion auf den einzelnen Servern.

Für einen Shop existiert eine einzige Domain, logo. Nennen wir diese ab jetzt einkauf.de !

Diese Domain läuft auf einem “kleineren” Server, hier reicht uns ein QC mit 2 gespiegelten 1 TB Platten, dafür aber ordentliche 4GB RAM und !!! eine 1GB Direktanbindung an die Außenwelt. Kleine Kiste, ok, aber mehr brachen wir auch nicht.

Hier liegen auch die Postfächer für die Benutzer der Domain einkauf.de, das Mailing übernimmt sendmail auf einem Linux System, logo.

Da das System sehr umfangreich ist, gehen wir hier Schritt für Schritt vor, also los:

1.) unseren Sendmail als Relay Server einrichten

SLES 11: online update

Dienstag, 02. März 2010

Die Standardinstallation von SLES 11 sollte auf der Kiste sein, ich installiere alle Server ausschließlich über Textkonsole, ich mag den grafischen Kram nicht. Geht schneller und teurer SCSI / SAS Plattenplatz wird gespart.

Heute soll auf einen Server für einen kleineren OnlineShop mit etwa 60.000 Artikeln und angebundener Statistikdatenbank das von Novell empfohlene KernelUpdate gemacht werden.

Die Kiste ist ein Dell Poweredge 1850 mit 2 Xeons, 8 GB Ram und recht flotten 15k SCSI Platten welche über einen nachgerüsteten DELL PERC4 Raid Controller gesteuert werden. Das System ist im Preis / Leistungsverhältnis einfach nicht zu schlagen.

Das System läuft bereits auf dem Standard-SLES-11-Kernel (SMP wegen den 2CPU’s, logo):

Server# cat /proc/version
Linux version 2.6.27.19-5-default (geeko@buildhost) (gcc version 4.3.2 [gcc-4_3-branch revision 141291] (SUSE Linux) ) #1 SMP 2009-02-28 04:40:21 +0100

Ein OnlineUpdate ist hier ein wenig trickreich wegen den Novell Lizenzen, daher hier mal eine Schritt für Schritt Anleitung …

1.) Einen neuen Account bei Novell.com einrichten (am besten eine Dödelmailadresse einrichten, die kann man dann wieder löschen … )

Account erstellen: http://www.novell.de -> Login -> Konto erstellen -> Mail abwarten …

Activation Code bekommen: http://www.novell.de -> “Service und Support” (oben)+Download Produkte-> unter Suche: “SUSE Linux Enterprise Server”+SUSE Linux Enterprise Server 11 + Alle Daten und “suchen” … dann wählte ich die Version “SUSE Linux Enterprise Server 11 for x86, AMD64, Intel64 e-Media Kit”, denn ich brauche  die 64bit Version für XEON Plattformen (AMD Benutzer sollten dann sicher die Itanium Version bevorzugen – aber wer bitte verbaut AMD im Serverbereich??? ), und dann rechts auf den Button “4 Dateien” klicken. Auf der nächsten Seite muss ich nur noch auf  “Get Activation Code” gehen und der Aktivierungscode wird mir per Mail gesendet. Der Aktivierungscode in der Email ist nur in Verbindung mit dem jeweiligen Novell-Account gültig, daher meinen aus Bequemlichkeit bitte nicht nutzen um diesen Schritt zu überspringen.

Zur Vollständigkeit empfehle ich, den Validierungslink in der Account-Anmeldeemail anzuklicken, sonst ist der Account nicht vollständig freigeschaltet und das Update geht dann möglicherweise nicht.

Erfolgreicher Versand des Novell Aktivierungscodes:

14-150x150 in

Email mit Aktivierungscode:

21-150x150 in

 

2.) Jetzt gehts an das SLES 11 Update – zuerst die Online Update Configuration:

31-150x150 in

Per Enter kommt man in die “Novell Custom Center Configuration”, jetzt alle Haken raus, außer bei Registration Code und NEXT ->

4-150x150 in

5-150x150 in

Im “Popup” Fenster auf Continue und dann kommt das Formular zum Eintragen des Activation Code, Achtung, bitte jegliche Firewall & iptables  vorher abschalten, da hier ein direkter Connect zum Novell Server erfolgt und eine Firewall das verhindern könnte.

6-150x150 in

Das Formular wird über den Textbrowser w3m gestartet. Die Felder per Pfeiltaste auswählen und per ENTER bekommt man die Möglichkeit, in die Felder etwas einzutragen und per ENTER schließt man die Texteingabe je Formularfelds ab. Zum Absenden mit den Pfeiltasten zum submit-button hüpfen und per Enter absenden, dann kommt das nächste Infofenster:

7-150x150 in

Hier bitte den unteren Anweisungen folgen, also erst “q”, dann “y” drücken und man wird mit Gratulationen seitens Novell überschüttet:

8-150x150 in

Damit wurden die Software Repositories aktualisiert und einem Online Update steht nichts mehr im Weg und somit kommen wir zum nächsten Schritt.

3.) Das eigentliche Update:

In Yast2 das eigentliche Online Update starten, hier sind bereits die YOU Update Paket ausgewählt und sollten um die 18,1 MB benötigen.

9-150x150 in

Per Accept startet das Update und man kommt dann direkt in das Online Update zurück und jetzt sind alle Updates für die bereits installierten Pakete ausgewählt. Am wichtigsten ist hier sicher der KERNEL Patch Version 1754, welche den Kernel auf die Version  2.6.27.42 auktualisiert. Bei mir waren es etwa 712 MB Updates, aber da die Kiste in einem Rechenzentrum steht und mit 100Mbit angebunden ist, sollte das schnell gehen …

101-150x150 in

11-150x150 in

So, nun sind starke Nerven gefragt. Denn nach einem Kernelpatch muss der Server neu gestartet werden und da ich etwa 1 Stunde im Auto verbringen müsste, sollte die Kiste nicht wieder hochkommen, ist selbst so ein einfaches YOU Update voller Spannung und da SCSI System Controllerbedingt immer sehr lange zum Booten brauchen, steigt die Spannung und steigt … und steigt …

12-150x150 in

Super, die Kiste ist wieder oben, der Kernel wurde gepatcht:

13-150x150 in

Das OnlineUpdate sollte nach nochmaligen Aufruf komplett leer sein, denn alle nötigen Pakete wurden eingespielt.

KEYWEB-AG: NS 84.19.188.171

Dienstag, 02. März 2010

Der DNS Server im RZ der KEYWEB AG-> 84.19.188.171 <- hatte bereits am 25.02.2010 gegen 15:00 mit DNS Anfragen mächtig zu kämpfen, sprich es kam zu erheblichen Verzögerungen. Da eine WebAnwendung bei uns Reverse Mapping erforderte (also die Namensauflösung der aufrufenden IP’s), kam es zu einem Anfragenstau und der vorgeschaltet Loadbalancer machte seine Aufgabe hervorragende – er bekam ein Timeout von allen betroffenen Servern und nahm die betroffenen BackEnd Server automatisch aus seiner Verteilerliste heraus Icon Smile in … bis man auf die Idee mit dem DNS kommt, vergehen ein paar Minuten … aber nmap hat geholfen:

BetroffenerServer# nmap –dns-servers 84.19.188.171 -P0 einedomainimselbenadressbereich.de -p80

Starting Nmap 4.75 ( http://nmap.org ) at 2010-02-26 06:24 CET
Interesting ports on 84.19.191.91:
PORT STATE SERVICE
80/tcp open http

Nmap done: 1 IP address (1 host up) scanned in 13.10 seconds

Im Vergleich dazu ein anderer NS im RZ der KEyweb AG:
BetroffenerServer# nmap –dns-servers 87.118.124.124 -P0 einedomainimselbenadressbereich.de -p80

Starting Nmap 4.75 ( http://nmap.org ) at 2010-02-26 06:25 CET
Interesting ports on ns2.km33332.keymachine.de (84.19.191.91):
PORT STATE SERVICE
80/tcp open http

Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds

Naja, 13.10 sec für eine dns Abfrage istein wenig langsam!

Diese Infos gab ich dann irgendwann gegen 06:00h an die Technik weiter, welche dann freundlicherweise den 84.19.188.171 mal neu gestartet hat und die Auflösung klappte dann wieder super. Mir wurde noch angeraten, auf den Servern jeweils einen eigenen Nameserver laufen zu lassen! Hallo? Wieso brauche ich dann noch ein Rechenzentrum, ich dachte, das wäre im Housingpreis mit drin?  Naja, dachte ich, kann ja mal vorkommen – Hauptsache die Ursache ist beseitigt, Nokia Telefone muss man auch nach 100 Telefonstunden neu starten und alle 3 Wochen mit neuer Firmware bestücken.

Also ersparte ich mir das Umstellen der DNS Einträge auf allen Servern in diesem RZ  für deren reibungslosen Betrieb wir jeden Tag den Kopf hinhalten. Sicherheitshalber informierte ich die Betreiber großer Anwendungen, welche wir programmiert haben. Am 01.03.2010 allerdings sollten auf einem anderen System nur wenige 10.000 Emails versendet werden und – nix ging, denn auch ein MTA benötigt halt einen funktionierenden primären Nameserver. Und wenn der 84.19.188.171 halt zum Montag wieder keine Lust hat aufzulösen, dann wird EMail halt zu Schneckenpost. Etwas gefrustet telefonierte ich dann einfach mit der Technik und bat wiederum um ein Reset der Kiste. Nachts habe ich dann ALLE betreffenden Server umgestellt und den 84.19.188.171 in der DNS Reihenfolge nach hinten verfrachtet.

SLES 11: phpize + php5-dev

Montag, 01. März 2010

Unter dem Standardsourcen des SuseLinux Enterprise Servers 11 von Novell 8DVD1 + DVD2) befindet sich nirgendwo das Paket php5-devel, mit welchem das Kompilerhilfsprogramm phpize mit installiert werden kann. Somit sind pecl Erweiterungen (irgendwas.so für die PHP Extensions) nicht ganz so einfach zu installieren !

Ich fragte beim Novell Support an und bekam die Lösung: einfach die SDK (Software Developer Kit) runterladen, bereits auf der DVD1 befindet sich das Paket php5-devel-5.2.6-50.17.x86_64.rpm.

Um nicht die ganze DVD auf den Server kopieren zu müssen, empfielt es sich hier, das Paket per Hand nachzuinstallieren. Ich lege immer einen Ordner “Quellen” an und kopiere die benötigten Paket dort rein. Da wir ausschließlich 64bit XEON Server verbauen, liegen die Pakete in /DVD-ROM/suse/x86_64/.

Beim installieren von php5-devel per “rpm -i  php5-devel-5.2.6-50.17.x86_64.rpm” fehlen natürlich einige dependencies. Bei mir waren es libxml2-devel und pcre-devel. Einfach alle benötigten Pakete von der DVD kopieren und per rpm nachinstallieren, es fehlen also noch zlib-devel+readline-devel für das libxml2-devel sowie libstdc++-devel um das pcre-devel installieren zu können. Danach können die libxlm2 und die pcre Entwicklerpakete eingespielt werden und dann endlich auch das php5-devel.

Damit steht unter /usr/bin/phpize endlich das benötigte Tool bereit, um das building environment zu generieren. PHPIZE = ”phpize is a shell script to prepare PHP extension for compiling” – nur so kann der gcc php extensions wie die APC.co für den APC-Cache korrekt compilieren.

Weitere Anleitung:

APC 4.0 Cache – Installation, Test und Serverbetrieb