Archiv podle kategorií: Linux howto

Odmazání mailu z mail fronty po určitém čase

Když rozesíláte velké newslettery, zůstávají Vám v mail frontě nedoručitelné maily. Například můžete narazit na zaplněnou schránku, případně může být mailserver dočasně nedostupný. Pokud má akce z  newsletteru časový limit, nemá smysl tyto maily po jeho uplynutí doručovat.

Mailserver postfix umí nastavit maximální dobu pro maily ve frontě, ale umí to jenom s granularitou dní. Promazávání fronty si proto musíte zajistit sami. Například timto skriptem:

#!/bin/bash

# setup mail queue time to live
DATE=$(date '+%s-600' | bc)

# iterate thru mail queue, delete mails older than DATE
# get only rows with mail id
mailq | grep '^[0-9A-Z]' | awk '{printf $1" "$3" "$4" "$5" "$6"\n"}' | \
        while read MSG_ID DOW M D T; do
                THIS=$(date -d "$DOW $M $D $T" '+%s')
                # delete mail older than DATE
                if (( DATE > THIS )) ; then
                        # uncomment to log deleted mail ids
                        #echo "postsuper -d $MSG_ID" >> /var/log/email_cleaner.log
                        /usr/sbin/postsuper -d $MSG_ID
                fi
        done

Dlouhodobě je výhodné si takto odmazané maily ukládat a vyhodnocovat jejich dostupnost. Pokud je schránka zaplněna trvale, nejspíše už není využívána a nemá smysl na ni newsletter posílat. Ulehčíte tím jak sobě (budete posílat méně mailů, jen na funkční email adresy), tak i cílovým mail serverům.

Jak poslat mail s přílohou z terminálu

Poslání mailu z terminálu je snadné, například s utilitou mailx:

~# echo  "Obsah testovaciho mailu" | \
 mailx -s "Predmet testovaciho mailu" david@karban.eu

S přílohama je to složitější. SMTP protokol dokáže v příloze přenést pouze 7bitové znaky (jen základní abecedu, bez háčků a čárek). Abychom dokázali cokoliv poslat, musíme to nejprve překódovat. To pro nás udělá utilita uuencode. Ta používá 2 parametry, samotný soubor k překódování a jméno, které půjde vidět v mail klientu. Název souboru a jméno pro mail klienta jsou navzájem nezávislé, příkaz:

~# uuencode /var/log/apache2/access.log log_apache.txt

pošle v příloze log webserveru apache „access.log“, ale příjemce v mailu uvidí přílohu „log_apache.txt“. Je-li  příjemce na platformě windows, otevře pak soubor jednodušeji.

Když spojíme obě části dohromady, vznikne nám:

~#(
 echo "Obsah testovaciho mailu"
 uuencode /var/log/apache2/access.log log_apache.txt
 ) | mailx -s "Predmet testovaciho mailu s prilohou" david@karban.eu;

A mail je na cestě i s přiloženým log souborem.

Chyba APC cache: Unable to allocate memory for pool

Symptomy

Problém se ukazuje na náhodných místech, někdy v obsluze sessions, někdy při include/require. Chyby se objevují náhodně, někdy častěji, někdy méně často. Dočasně pomáhá restart webserveru. V logu najdete hlášení typu:

include_once(): Unable to allocate memory for pool.

Obvyklý zdroj problému

Zaplnění paměti APC Cache, způsobené buď její nedostatečnou velikostí, nebo příliš dlouhou dobou expirace položek z cache.

Kontrola

APC cache umožňuje zobrazit statistiky své efektivity pomocí skriptu apc.php. Jeho umístění se liší podle toho, jakým způsobem jste APC nainstalovali a na jakém jste systému. Pro Debian a Ubuntu zkuste:

/usr/share/doc/php-apc/apc.php.gz

Pro RHEL, CentOS, Scientific Linux:

/usr/share/pear/apc.php

Soubor překopírujte do document rootu webserveru (u Debianu/Ubuntu rozbalte) a prohlídněte si jej v prohlížeči. Uvidíte přehled stavu cache, včetně zabrané paměti. Problém bývá, máte-li téměř všechnu paměť zabranou. Po ukončení prohlížení nezapomeňte soubor zase smazat, případně si jej schovejte do zaheslované části webu.

Možná řešení

  • navýšení velikosti paměti – Můžete jednoduše navýšit paměť pro cache, navyšte parametr apc.shm_size tak, aby jste měli rezervu.
  • snížení doby expirace záznamu v cache – Tímto nastavením zajistíte rychlejší uvolňování záznamů z cache a paměť nedojde tak lehce. Zmenšete nastavení doby v parametru apc.ttl.

Konfiguraci apc najdete obvykle v /etc/php5/conf.d/apc.ini pro Debian/Ubuntu a v /etc/php.d/apc.ini pro RHEL/CentOS/Scientific Linux. Po změně nastavení v souboru restartujte webserver.

Použité zdroje