qmail-channels patch: Giden Postalar için Domain Bazlı Hız Limiti
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYFnMvDe' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
Bülten, duyuru ya da marketing gönderileri için mailer olarak kullanılan qmail posta sunucularında domain bazlı hız limiti tanımlayabilmek total gönderim hızını efektif olarak kullanmak için gerekli yöntemlerden birisidir. Bildiğiniz üzere Hotmail ve Yahoo gibi büyük e-posta sağlayıcıları, kendilerine gönderilebilecek postalar için hız ve adet bazında filtreleme yapmaktadır. Örnek olarak (özellikle) Yahoo ya da Hotmail, size ait IP'ler için (çeşitli hesaplama yöntemleri kullanarak) belirledikleri limitten daha hızlı bir şekilde gönderim yapmanız halinde gönderdiğiniz postaları belirli bir süreliğine redderek bir nevi gri liste uygulamasında bulunurlar. Böylece sizin için tanımlanan eşiğin üzerine çıkmanızı engelleyerek sistem kaynaklarını tüketmenize engel olurlar.
Böyle bir durum, size limit uygulayan domainler dışında kalan yerlere gidecek maillerin de gecikmesine ve total gönderimin yavaşlamasına neden olur. Çünkü bu tip mailler gönderilemiyor olsalar da qmail kuyruğunda beklemekte ve her bir gönderim denemesi için kendilerine bir thread (dolayısı ile kaynak) ayırılmaktadır.
Bu problemi ortadan kaldırmak üzere qmail-channels isimli güzel bir patch bulunuyor. Bu yama ile qmail'e farklı domainler için farklı kuyruk'lar (queue) ekleyebiliyor ve her bir kuyruk için farklı concurrency değeri (eş zamanlı gönderim adedi) belirleyebiliyorsunuz. Yazının devamında, qmail-channels yamasının bir qmail sunucusuna (netqmail-1.06) geçilmesinden ve belirli domainler için yapılandırılmasından bahsedeceğim.
İçerik İndexi
qmail-channels Yaması
qmail-channels'ın yaptığı işi biraz daha açmak gerekirse, yama qmail'e yeni kuyruklar (channels) ekleyerek bu kuyrukları belirli domainlere atayabilmenize ve her bir kuyruk için ayrı bir concurrency değeri (eş zamanlı gönderim adedi) belirlemenize olanak veriyor. Böylece qmail sunucusuna, hotmail.com'a paralel olarak (concurrency) 30, yahoo.com'a 20, geri kalan diğer tüm domainlere ise 50'şer adet eş zamanlı gönderim yap gibi şeyşer söyleyebiliyorsunuz. Bu şekilde gönderilecek mailler, birbirlerinden farklı eş zamanlı gönderim değeri bulunan farklı kuyruklarda işleniyorlar. Birbirinden bağısız kuyrukların olması ise IP adresinize limit uygulayan herhangi bir domain yüzünden diğer domainlere yapılan gönderimlerde bir darboğaz yaşanmasının önüne geçilmesini sağlıyor.
http://www.thesmbexchange.com/eng/qmail-channels_patch.html adresinden indirilebilen yamanın, qmail-1.03 ve netqmail-1.06 (ve 1.05) olmak üzere iki farklı sürümü bulunuyor, ayrıca ext-todo yaması geçilmiş qmail sunucular için başka bir versiyonu daha mevcut Ben yazıda, patch'in netqmail-1.06 sürümüne geçilmesinden bahsedeceğim. Siz, qmail-1.03 kullanıyorsanız kendinize uygun yamayı indirmelisiniz.
Yamanın Uygulanması
patch'in geçilmesinde herhangi bir püf noktası yok, indirilen yamayı klasik olarak uyguluyor sonrasında da qmail'i yeniden build ediyoruz.
İşlem adımları şu şekilde:
Daha önce de bahsettiğim gibi ben netqmail-1.06 sürümünü kullanıyorum ve kaynak kodlarını sistemimde /usr/local/src/ dizini altında netqmail-1.06 isimli klasorde tutuyorum. Dolayısı /usr/local/src dizinine geçip1.06 sürümü ile uyumlu yamayı bu dizine indiriyorum:
# cd /usr/local/src # fetch http://www.thesmbexchange.com/eng/netqmail-1.06-channels.patch
ve netqmail-1.06 dizinine geçip yamayı uyguluyorum:
# cd /usr/local/src/netqmail-1.06 # patch < ../netqmail-1.06-channels.patch
Bu noktada, yamanan qmail'i sisteme kurmadan önce, kaç adet ayrı kuyruk (channel) tanımlanacağına karar vermemiz gerekiyor.
Ek Kuyruk Adedinin Belirlenmesi
Sistemde kaç adet kuyruk (channel) olacağı yamanın uygulanması sırasında oluşan conf-channels isimli dosyanın içerisinde tanımlanmaktadır. qmail'in local ve remote isimli standart queue'larından dolayı bu dosyadaki minium değer 2 olmalıdır. Bunun üzerindeki değerler ise sisteme eklenecek diğer kuyrukların toplam adedini belirlemektedir ve dosyada öntanımlı değer 22'dir. Bu, qmail'in local ve remote kuyruklarını çıkardıktan sonra sisteme 20 adet ek kuyruk tanımlanacağı anlamına gelmektedir.
İsterseniz bu dosyada herhangi bir değişiklik yapmayabilirsiniz böylece sisteme ek olarak 20 adet kuyruk eklenir. Ancak benim gibi çok fazla dallandırıp budaklandırmak istemiyorsanız bu rakamı düşürebilirsiniz. Örnek olarak ben major sağlayıcılar olan hotmail, yahoo, mynet ve gmail için birer adet yedek olmak üzere de ayrıca 4 adet kuyruk tanımlamayı uygun buluyorum. Bu nedenle -qmail'in standart local ve remote queue'larını da ekleyerek- dosyaya 10 değerini giriyorum.
Yazıda da bu şekilde bir yapılandırmadan bahsedeceğim. Elbette siz de kendi ihtiyaçlarınız için kendi düzenlemenizi yapabilirsiniz. Ancak genel olarak bu dört domain için tanımlama yapmak yeterli olacaktır.
conf-channels dosyasını editleyip dosyanın en tepesindeki 22 rakamını silerek yerine 10 rakamını yazıyoruz.
# vi /usr/local/src/netqmail-1.06/conf-channels
Düzenlemeden sonra dosyanın içeriği şöyle görünmeli.
10 Total number of channels (queues) available for delivery. Must be at least 2, and anything above 2 are considered supplemental channels.
Tanımlama işleminden sonra qmail yeniden build edilebilir.
Build
Bu adımda qmail, channels yaması geçilmiş bir şekilde kurulacak.
UYARI: Yeniden derleme ve kurulum sonrasında, halihazırda çalışan qmail sunucunuzda problem oluşmaması için özellikle kendi özelleştirmeleriniz ve uygulanmış patchleriniz konusunda dikkatli olun. |
Öncelikli olarak qmail'i stop ediyoruz.
# qmailctl stop
qmail'i yeniden derleyip sisteme kuruyoruz.
# cd /usr/local/src/netqmail-1.06 # make setup check
Bu şekilde qmail sisteme yeniden kurulmuş oluyor. Ancak, qmail'i yeniden başlatmadan önce özelleştirilmiş kuyruklar için yapılandırma işlemlerini tamamlamamız gerekiyor.
Yapılandırma
Yapılandırma işlemi, sistemde oluşturulan yeni kuyrukların belirlenen domainlere atanması ve her kuyruk için bir concurrency değeri tanımlamnasından ibaret. Hangi kuyruğun hangi domainlere giden mailleri işleyeceğini belirtmek için /var/qmail/control dizini altında supplsX (x = 0'dan başlayan kuyruğu tanımlayan numara) isimli dosyalar oluşturup, domainleri bu dosyaların içlerine yazıyoruz.
Kendi örneğimizden gidersek biz 10 adet channel açılmasını belirtmiştik. qmail'in local ve remote queue'larını çıkardıktan sonra elimizde kullanılabilir 8 adet kuyruk bulunuyor. İlk kuyruğu hotmail'e ait domainlere giden mailler için kullanacağımızı varsayarsak, /var/qmail/control dizini altında suppls0 isimli bir dosya açmamız ve hotmail domainlerini bu dosya içerisine alt alta yazmamız yeterli olacak.
Bu işlemi şu şekilde yapıyoruz:
# echo \ 'hotmail.com hotmail.com.tr live.com windowslive.com msn.com' \ > /var/qmail/control/suppls0
Böylece, /var/qmail/control/suppls0 dosyası içerisine hotmail'in belli başlı domainleri eklenmiş oluyor. (Domainlerin sayısını alt alta yazmak sureti ile arrtırabilirsiniz.)
Gene örnekten hareket ederek suppls1 dosyasına yahoo domainlerini ekliyoruz:
# echo \ 'yahoo.com yahoo.com.tr yahoo.co.uk' \ > /var/qmail/control/suppls1
suppls2 dosyasında da Mynet domainleri bulunsun:
# echo \ 'mynet.com mynet.com.tr' \ > /var/qmail/control/suppls2
Son major domain olan gmail için de suppls3 dosyasını oluşturuyoruz.
# echo gmail.com > /var/qmail/control/suppls3
Şimdi de yedek olarak bekletilmek üzere ayırdığımız 4 kuyruk için “boş” birer supplsX dosyası oluşturuyoruz.
# touch /var/qmail/control/suppls4 # touch /var/qmail/control/suppls5 # touch /var/qmail/control/suppls6 # touch /var/qmail/control/suppls7
Böylece 0'dan 7'ye kadar olmak üzere 8 adet suppls dosyası oluşturarak, hangi kuyrukların hangi domainleri handle edeceğini belirtmiş oluyoruz. Şimdi de her kuyruk için birer concurrency değeri tanımlayarak paralel olarak ne kadar gönderim yapabileceklerini belirtiyoruz. Bu işlem için supplsX mantığına benzer olmak üzere /var/qmail/control dizini altında concurrencysupplX dosyaları oluşturuyoruz ve içerilerine concurrencyremote dosyasında olduğu biri paralel gönderim için izin verilen değeri giriyoruz.
Hotmail domainlerinden sorumlu kanalın (suppls0) örnek olarak sadece 20 paralel gönderim yapması için concurrencysuppl0 isimli bir dosya açıp içerisine 20 yazıyoruz:
# echo 20 > /var/qmail/control/concurrencysuppl0
Yahoo'ya daha yavaş bir hızla, (mesela eş zamanlı 10 adet) gönderim yapmak üzere bu domainden sorumlu suppls1 isimli kanal için concurrencysuppl1 isimli bir dosya oluşturup içerisine 10 yazalım:
# echo 10 > /var/qmail/control/concurrencysuppl1
Mynet domainleri için de concurrency değerini 10 olarak set edelim :
# echo 10 > /var/qmail/control/concurrencysuppl2
Gmail için de concurrency'i 20 olarak düzenleyelim:
# echo 20 > /var/qmail/control/concurrencysuppl3
Böylece qmail tarafından hotmail/yahoo/mynet ve gmail'e doğru eş zamanlı olarak ne kadar mail iletilebileceğini belirlemiş oluyoruz. Belirtilmeyen diğer tüm domainler (supplsX') ve ya concurrencysupplX dosyası olusturulmamış kanallar için concurrecny değeri ise /var/qmail/control/concurrencyremote dosyası içerisinde belirlenmektedir ve bildiğiniz gibi aksini belirtmediyseniz bu değer default olarak 20'dir. (ve qmail kurulum'u sırasında ya da herhangi bir patch ile özelleştirilmediyse concurrency değeri en çok 120 olabilir.)
Bizim örneğimize göre hotmail 20, yahoo 10, mynet 10, gmail 20 ve diğerleri için 20 (default concurrencyremote = 20 ) olmak üzere toplam toplam concurrency 80 olmaktadır. Yani sunucudan total olarak 80 adet eş zamanlı gönderim yapılabilir.
UYARI: Çok sayıda kuyruk ve bunlara büyük concurrency değerleri atama ihtiyacı olması durumunda, toplam değerin sistemde açılabilecek dosya sayısını (open files / files descriptors limit) aşmamasına dikkat etmek gerekir. Tabii spesifik durumlar hariç open files limitini aşmak pek de olası değildir. Ayrıntılar için patch'in CAVEATS kısmına bakabilirsiniz. |
Bu tanımlamalardan sonra herşey tamamlanmış oluyor. Artık qmail'i başlatabiliriz.
# qmailctl start
Herşey yolunda gittiyse sunucu, belirlediğimiz adreslere belirlediğimiz eş zamanlı gönderim değerlerine göre iletim yapacaktır. Durumu kontrol etmek için qmail-send loglarını kontrol edebilirsiniz. Normal olarak (bizim yapılandırmamıza göre) qmail-send logu şu şekilde görünüyor olmalıdır.
@400000004d668dc83727be4c status: local 0/100 remote 0/20 suppl0 0/20 suppl1 0/10 suppl2 0/10 suppl3 0/20 suppl4 0/20 suppl5 0/20 suppl6 0/20 suppl7 0/20
Görüldüğü gibi local ve remote dışında 8 adet daha queue bulunuyor. Ayrıca bu kanallar /var/qmail/queue altında da görülebilirler.
Özelleştirmeler
Yukarıda anlatılanlar sistemin bahsedildiği şekilde çalışması için yeterlidir. Ancak sonradan eklenen bu kuyrukların durumu ve içeriklerinin görüntülenmesi gibi işlemler için bir iki düzenleme daha yapmak mümkündür. Aşağıda bu özelleştirme işlemleri ile ilgili bilgilere değineceğim.
qmail-qstat
qmail-qstat, kuyrukta ne kadar mail olduğu ve bu maillerin durumları ile ilgili bilgileri gösteren ve kurulum ile birlikte gelen küçük bir shell scriptidir. Bu script sadece standart qmail kuyruğundaki mailleri göstermekte olduğundan dolayı sisteme daha sonradan eklenmiş olan (supplsX) kuyrukları ile alakalı bilgi vermemektedir.
Ben sonradan eklenen kuyruklarla ilgili durum bilgisini görüntülemek üzere qmail-qstat scriptini bu kuyruklarda arama yapacak şekilde değiştiriyorum. Böylece her bir queue için ayrı ayrı durum raporu alabilmek mümkün oluyor.
Bu işlemi yazıda işlediğimiz örneğe göre şu şekilde yapabiliriz:
/var/qmail/bin dizininde qmail-qstat0 isimil bir dosya oluşturun.
# vi /var/qmail/bin/qmail-qstat0
Sonra da dosya içerisine aşağıda görünen ve /var/qmail/queue/suppls0 dizininde find işlemi yapan script kodunu ekleyin:
#!/bin/sh cd /var/qmail messdirs=`echo queue/suppl0/* | wc -w` messfiles=`find queue/suppl0/* -print | wc -w` echo messages in queue: `expr $messfiles - $messdirs`
Dosyayı kaydettikten sonra çalıştırılabilir olması için izin değerini 755 yapın.
# chmod 755 qmail-qstat0
Artık qmail-qstat0 betiği, çalıştırılması durumunda suppls0 (hotmail) kuyruğunda ne kadar email olduğunu görüntüleyecektir.
(Not: Aynı betiği diğer kuyruklar (suppls1, 2, 3 ) için de yukarıdaki örneği kopyalamak ve düzenlemek sureti ile hazırlamayı ve izinlerini 755'e set etmeyi unutmayın.)
Yazının qmailctl başlığında, oluşturulan bu betiklerin qmailctl içerisinden çağırılmasından da bahsedeceğim.
qmail-qread
Bildiğiniz gibi qmail-qread, giden kuyruğunda bulunan mailleri görüntüleyen programcıktır (qmail-qstat'dan farklı olarak shell script değil binary dosyasıdır.) Aynı şekilde qmail-qread de sisteme yeni eklenen kuyrukları kontrol etmemektedir. Bu nedenle özel kuyruklarda bulunan maillerle ilgili bilgi bilgi alınamamaktadır. Ben bu sorunu çözmek için qmail-qread'in işini yaparak belirtilen queue dizini altında arama yapıp, email adreslerini listeyecek betikler kullanıyorum.
Bu işlemi -gene örnek üzerinden gidersek-, hotmail kuyruğu (/var/qmail/queue/suppls0) için şu şekilde yapabilirsiniz:
/var/qmail/bin/ dizini altında qmail-qread0 isimli bir dosya açın:
# vi /var/qmail/bin/qmail-qread0
İçerisine aşağıdaki satırları ekleyin:
#!/bin/sh find /var/qmail/queue/suppl0/ -type f |xargs cut -c 2-
Dosyayı kaydettikten sonra iznini 755'e set edin.
# chmod 755 qmail-qread0
(Not: Aynı betiği diğer kuyruklar (suppls1, 2, 3 ) için de yukarıdaki örneği kopyalamak ve düzenlemek sureti ile hazırlayarak izinlerini 755'e set etmeyi unutmayın.)
Son olarak oluşturulan betikleri qmailctl içerisinden çağırarak qmail stat çıktısına eklenmesini ya da herhangi bir channelda bulunan maillerin listelenmesini sağlayabiliriz.
qmailctl
Normalde qmailctl betiginde stat bölümü şu şekildedir:
stat) svstat /service/qmail-send svstat /service/qmail-send/log svstat /service/qmail-smtpd svstat /service/qmail-smtpd/log qmail-qstat ;;
Görüldüğü gibi qmailctl stat komutu verildiği zaman svstat ile qmail servislerinin durumları görüntüleniyor ve sonrasında qmail-qstat betiği ile standart qmail kuyruğunda kaç adet email olduğu ve ne durumda oldukları görüntüleniyor.
Ayrıca bizim oluşturduğumuz qmail-qstatX betiklerinin çağırılarak özel kuyruklar ile ilgili raporun da qmailctl stat çıktısına eklenmesi için stat bölümüne aşağıda görüldüğü şekilde eklemeler yapabiliriz:
(Not: yazıda anlatıldığı örnekten hareketle 4 adet qmail-qstatX betiği oluşturduğunuzu var sayıyorum.)
stat)
svstat /service/qmail-send
svstat /service/qmail-send/log
svstat /service/qmail-smtpd
svstat /service/qmail-smtpd/log
echo "" && echo "KUYRUK DURUMU"
qmail-qstat
echo "" && echo -n "Hotmail "
qmail-qstat0
echo -n "Yahoo "
qmail-qstat1
echo -n "Mynet "
qmail-qstat2
echo -n "Gmail "
qmail-qstat3
echo ""
;;
Böylece qmailctl stat çıktısı şu şekilde görünecektir.
/service/qmail-send: up (pid 13534) 18085 seconds /service/qmail-send/log: up (pid 13547) 18085 seconds /service/qmail-smtpd: up (pid 13550) 18085 seconds /service/qmail-smtpd/log: up (pid 13555) 18085 seconds KUYRUK DURUMU messages in queue: 0 messages in queue but not yet preprocessed: 0 Hotmail messages in queue: 0 Yahoo messages in queue: 0 Mynet messages in queue: 0 Gmail messages in queue: 0
Özel kuyruklar içerisinde bulunan emaillerin bir listesini almak üzere hazırladığımız qmail-qread0 (ayrıca 1, 2, 3) betiğini qmailctl betiği içinden çağırmak için ise aşağıdaki şekilde bir düzenleme yapılabilir.
Normalde qmail queue dediğiniz zaman qmail'in standart kuyruğu içerisindeki maillerin listesi görüntülenir ve ilgili kısım qmailctl içerisinde şu şekildedir:
queue) qmail-qstat qmail-qread ;;
Görüldüğü gibi scriptin queue kısmında önce qmail-qstat ile kuyruktaki mail adedi çekiliyor daha sonra da qmail-qread çağırılarak maillerin bir listesi görüntüleniyor.
Ben spesifik kuyrukların listesini çekmek için yukarıda hazırladığımız qmail-qread0 (ayrıca 1, 2, 3) betiğini ayrı bir section olarak ekleyip farklı bir isim veriyorum.
Mesela gene yazıda işlediğimiz örnekten giderek, qmail-qread0 betiği Hotmail'e ait kuyruğu, qmail-qread1 Yahoo'ya, qmail-qread2 Mynet'e ve qmail-qread3 de Gmail'e ait kuyruğu listeliyor olduğunu düşünürsek qmailctl betiğinin queue bölümünün hemen altına aşağıda bold ve kırmızı harflerle belirtilen eklemeler yapılabilir.
queue)
qmail-qstat
qmail-qread
;;
queue-hotmail)
qmail-qread0
;;
queue-yahoo)
qmail-qread1
;;
queue-mynet)
qmail-qread2
;;
queue-gmail)
qmail-qread3
;;
Bu şekilde qemailctl queue-hotmail komutu hotmail'e ait kuyruğun içeriği görüntüleyecektir. Ayrıca, qmailctl queue-yahoo, qmailctl queue-mynet ve qmailctl queue-gmail komutları ile ayrı ayrı diğer kuyruklar da listelenir.
Tüm kurulum ve yapılandırma işlemleri bu kadardı.
Patch ile ilgili daha fazla bilgi almak için aşağıdaki adrese göz atabilirsiniz:
http://www.thesmbexchange.com/eng/qmail-channels_patch.html
Bu yazılar da ilginizi çekebilir:
- qmail – Oversize DNS Patch
- Rblsmtpd
- Netqmail
- Qmail Log Dosyalarının Ebatını Arttırmak
- qmail Kurulum Scripti – FreeBSD 9.x
Yorumlar
Trackbacks
Yorumda bulunun.
Cok tesekkuler Cagri , ozellikle mailing yapanlar icin super bir dokuman olmus.
[Cevapla]
Bu güzel döküman için teşekkürler.Emeğinize sağlık.
[Cevapla]
güzel bir çalışma teşekkürler
Gönderilen domainler değilde gönderen domain hatta gönderen mail adresine göre böyle bir darboğaz uygulamak mümkün mü?
Çünkü yukardaki patch ile normal bir mail gönderen kullanıcı da sorun yaşayacak.
Bir mail sunucuda 5000 tane mail hesabı olduğunu düşünelim. Genelde trafiği tıkayan hesap sayısı 10 ‘u geçmez bulten atıyorlardır veya virüs kaynaklıdır.
[Cevapla]