postfix隊列管理


隊列管理單元的服務器程序--qmgr,是整個postfix系統的中心樞紐。所有郵件,包括等待送出與從外界收進來的,都必須通過隊列。了解隊列的運行原理以及postfix如何處理隊列,有助於你解決問題。
  隊列管理器總共設置了五個做不同用途的隊列,包括:輸入、活動、等待、故障、保留。每個隊列在queue_directory參數指定的路徑下各有一個專屬的子目錄。默認的隊列目錄是/var/spool/postfix/。
  於后台運作的qmgr daemon能自動處理大部分的隊列管理工作,必要時,管理員可使用postsuper和postqueue自己動手管理。本章介紹qmgr於相關命令行工具的運行原理,以及能影響隊列的postfix參數。

  qmgr的運行原理
  郵件進入postfix系統的第一站是“輸入隊列”。postfix以queue_minfree參數來保護隊列文件系統,此參數的默認值為0,表示qmgr可以無限制地使用隊列磁盤空間。如果你不想隊列耗盡服務器地磁盤空間,建議你設定一個合理地上限值。
  每當有新信進入收件隊列,qmgr便會將郵件移到活動隊列,並調用適當地MDA來處理。只要投遞過程沒遇到意外,這段流程通常是相當迅速地,快到你沒機會 見到郵件停留在活動隊列里,除非postfix正在將郵件送到一台非常慢地遠程smtp server。如果無法在30秒內連接到遠程系統,postfix便會認為該系統目前無法到達。
  暫時無法送出去地郵件會被放在等待隊列。可能發生了臨時性意外包括:DNS系統暫時離線、遠程服務器主機臨時故障、網絡不穩定、收件人地郵箱爆滿等。如果遇到永久性地問題或是被遠程拒收,則郵件會連同錯誤報告立刻被退回給原寄件人,不會留在隊列里。

  等待郵件
  留在等待隊列里地郵件,會待到它們被成功投遞出去,或因為超時而被退回給原寄件人為止。退信通知函與遭退郵件地總和大小不得超過bounce_size_limit,如果超過此限制,則原寄件人只會收到退信通知函,而不會收到遭退郵件本身。
  如果郵件一時無法投遞,postfix會給郵件標上一個時間,這個時間代表下次嘗試投遞得時刻。對於一時無法聯系得遠程主機,postfix會將它們另外 記錄在自己內部得一份有時效性得名單上,借此避免不必要的遞送嘗試。如果有任何等待郵件要被安排重新投遞,而且活動隊列里有足夠空間,則qmgr會交替在 等待隊列與收件隊列之間取信。如此一來,新進郵件不至於因為postfix正在忙着處理大量等待郵件而等待太久。

  隊列調度
  postfix會定期掃描隊列,檢查每一封等待郵件的時間,看看是否有任何等待郵件已經到了下一回合應該嘗試投遞的時間。每一次投遞失敗,都會導致延遲間 隔時間加長,所以,失敗次數越多,就必須等待更長的時間才有再次被投遞的機會。延遲時間上限由maximal_queue_lifetime參數決定。如 果郵件在等待隊列里的時間超過此上線,postfix便會放棄投遞,並退信給原寄件人。maximal_queue_lifetime的默認值為5天,你 可以將它改成任何時間長度;如果你希望postfix在第一次遞送失敗時就立刻退信,你可將此參數的值該為0。
  postfix內部的隊列掃描間隔決定於queue_run_delay參數,其默認值為1000秒。也就是說,大約每隔1000秒,postfix就會檢查一次等待隊列,看看是否有任何應該再次嘗試投體的郵件。
  postfix重新投體等待郵件的頻繁程度的上下限,分別由minimal_backoff_time與maximal_backoff_time這兩個 參數決定。每次郵件被延遲,qmgr便會加長下次投遞機會的時間間隔,但是累增后的間隔時間不的超過上線,也不得低於下限。如果你發現經常有寄不出去的等 待郵件,或許你應該考慮適度加大上線,讓postfix不要浪費太多資源於等待郵件。

  投遞操作
  每當需要投遞郵件時,qmgr便會調用適當的MDA來運行投遞程序。postfix會很謹慎地避免干擾收信系統,並提供幾個參數來控制外寄郵件地可用資 源。這些參數地默認值應該足以應付大部分地情況,但是如果你地操作環境特殊,需要調整資源分配或是想要改善投遞操作,你應要實際的測試qmgr或MDA的 操作參數,並依據實測效果來嫁衣調整列在master.cf配置文件里的各個MDA,都有可能被用來投遞外寄郵件。master.cf配置文件的maxproc字段限定了MDA的進程數上限。如果該字段沒有明確的設定值,則postfix使用default_process_limit參數的值為默認值。
  大部分的MDA都有能力同時投遞多封郵件到同一個目的地,但是並非所有收信系統都時時刻刻有能力同時收下許多郵件。為了兼顧投遞效率於接收系統的工作負 荷,postfix使用一種特殊的投遞調度算法:如果有多封郵件要送到同一個目的地,MDA第一次最多只能同時送出 initial_destination_concurrency封郵件,如果能成功完成初次投遞,則postfix會嘗試同時送出更多郵件,知道發現目 的地系統不能承當當前的工作負荷,或是同時投遞的郵件數即將超過default_destination_concurrency_limit。
  里可以適度提升initial_destination_concurrency參數的值,但是不能超過該MDA在master.cf配置文件的 maxproc字段值。一般而言,你不應該提升default_destination_concurrency_limit,因為這有使收信系統癱瘓的 風險。
  postfix隨附的每一個MDA,都有一個對應的mad_destination_concurrency_limit參數,它們的效力高於 default_destination_concurrency_limit參數。因此,如果想提升本地郵件的同時投遞量,而不想影響其他MDA,你可 以修改local_destination_concurrency_limit參數的值。同理,如果只想降低遠程郵件的同時投遞量,而不影響其他 MAD,也可借由修改smtp_destination_concurrency_limit參數來達成目的。
  同理,postfix內置的所有MDA都有自己的mad_destination_concurrency_limit參數,它們限制postfix將郵 件交給MDA時,每次最多可以指定多少位收件人。如果同一封郵件的郵件人數超過MDA每次能夠承受的人數,postfix會將收件人分成多個小組,分批投 遞。

  損毀郵件
  故障隊列純粹用於存放受損或無法解讀的郵件。如果郵件已經損壞到無法進行任何處理的程度,postfix便將它們放在此處,供你調查故障原因。管理員可使 用“隊列管理工具”提到的工具來檢查故障郵件。一般而言,故障郵件非常少見,如果不幸遇到,通常是操作系統或硬件故障的征兆。

  錯誤通知函
  postfix可發出“錯誤通知函”給管理員,讓管理員知道發生了什么類型的錯誤。postfix將錯誤通知分成七大類,管理員可設定main.cf里的 notify_classes參數來決定要收哪些類型的錯誤通知。在默認情況下,管理員只會收到resource與software兩種錯誤類型的通知 函。
  對於每一種類型的錯誤通知函,都有一個對應的class_notice_recipient參數,這些參數代表該類通知函的收件人地址,它們的默認值都是postmaster。
  bounce      遭退郵件本身的標頭
  2bounce      無法投遞的退信通知函
  delay         被延遲郵件的標頭
  policy      smtp對話過程(因違反垃圾郵件過濾條件而予以拒收的郵件)
  protocol      smtp對話過程(曾經在smtp對話過程出現錯誤者)
  resource  因為系統資源問題而投遞失敗的通知
  software    因為軟件問題而投遞失敗的通知
  如果想收到所有問題的通知函,請照下面這樣設定notify_classes參數
  notify_classes = bounce, 2bounce, delay, policy, protocol, resource, software
  如果你的站點有專人研究垃圾郵件,你可以這樣設定:
  policy_notice_recipient = antispamexpert@example.com

  隊列管理工具
  postfix提供了一組命令行工具來檢查、控制、管理隊列里的郵件,其中以postsuper和postqucuc這兩個工具最為重要。你可以對隊列中的郵件進行下列操作:
     顯示郵件列表
     刪除郵件
     重新排隊
     保留郵件
     顯示郵件內容
     清空郵件
每一種操作都有對應的命令。

  顯示郵件列表
  郵件列表的顯示項目,包括郵件在隊列里的標識符、大小、到達時間、寄件人地址、收件人地址。對於等待郵件,還會另外顯示等待原因。如果郵件是在活動隊列 里,其標識符欄會加注一個星號(除非你的服務器很慢或是負荷沉重,否則應該沒有機會見到星號)。在保留隊列里的郵件的郵件,其標識符欄會加注一個感嘆號。 等待郵件不加注任何符號。
  使用postqueue -p 命令可列出隊列里的所有郵件,其效果如果sendmail包的mailq。當安裝postfix時,安裝腳步會以postfix版的mailq程序(它其 實只是postqueue -p的符號鏈接而已)取代sendmail包原有的同名程序,借此維持與sendmail包的兼容性。

  刪除郵件
  使用postsuper命令的-d選項,可移除隊列里的郵件。郵件是以它們在隊列里的標識符表示。
  如果要刪除所有郵件,請把標識符換成ALL
  請注意,由於刪除所有郵件是相當危險的操作,所以ALL關鍵字必須全以大寫字母表示才有效,其目的是希望你三思而后行。

  保留郵件
  當你想將郵件無限期留在隊列系統里,保留隊列就成為容納這些郵件的場所。不管郵件目前已經傳到哪一個隊列,你都可以將它們移除原來的隊列,轉移到保留隊列。
  假設你已經知道要保留的郵件的標識符,使用postsuper工具的-h選項,就可將指定的郵件搬到保留隊列:
  postsuper -h DRA3P1A9
  在這之后,如果觀察郵件列表,會發現該郵件的標識符多了一個感嘆號。
  要將郵件移回原來的隊列,繼續其未竟之進程,可使用同一個postsuper工具,只要將原來的-h改成-H。
  在郵件被移回原來的隊列之后,qmgr依照平常的調度原則來決定其下次投遞時間。或者,你也可以執行清空(flush)命令,立刻將郵件遞送出去。

  重新排隊
  如果因為配置問題而耽誤了任何郵件,在問題解決之后,你可能希望被耽擱的郵件重新走一遍隊列處理流程,以便能夠成功完成遞送。因為配置問題可能使得 postfix在郵件里存儲了錯誤的投遞處理信息,或是使用了錯誤的地址改寫法則。重新排隊會使得postfix依據里的新配置來修正錯誤信息。使用 postsuper工具的-r選項,可以重新排隊某一特定郵件,或是要求所有郵件全部都重新排隊。

  顯示郵件內容
  使用postcat工具的-q選項,可以查看一個隊列文件的內容
早期版本的postcat並未提供-q選項,而是要求你提供隊列文件的完整路徑。然而,由於郵件可能在各個隊列目錄之間游移不定,而且這些隊列目錄還有自己的子目錄,所以管理員很難一眼看出隊列文件的完整路徑。

  清空郵件
  要求postfix立刻投遞滯留在隊列里的郵件的操作稱為清空(flush),執行清空動作的命令是postqueue -f。不過,除了你有理由確定郵件一定能成功投遞出去,否則,最好還是讓qmgr自己決定重新投遞的時機。不斷的反復要求清空,會嚴重影響郵件服務器的效 率。
使用-s選項可清空寄到特定站點的郵件,而且收件站點必須要有接收快速清空的“資格”才有效。要使得某站點具備此資格,你必須將該站點的主機名稱或網域名 稱列在fast_flush_domains參數中。此參數的默認值只包含relay_domains所列的所有網域,但是你可以視情況增加額外的站點:
  fast_flush_domains = $relay_domains example.com
如果你有一個間歇性的郵件交換機,你可以在該交換器上線的時間內,使用postqueue -s清空先前無法送達到該交換器的所有郵件:
  postqueue -s example.com

 

 

 

 

參數:queue_run_delay
說明:用於設定隊列處理程序對拖延郵件的掃描周期。缺省為1000秒。
例 如:queue_run_delay = 1000

最長隊列生命期
參數:maximal_queue_lifetime
說 明:用於設定隊列處理程序對滯留郵件的最長保存期。缺省為5天。
例如:maximal_queue_lifetime = 5
最小投遞失 敗周期
參數:minimal_backoff_time
說明:用於設定隊列處理程序對無法投遞的郵件的最短巡回時間。缺省為1000秒。
例 如:minimal_backoff_time= 1000

最長投遞失敗周期
參數:maximal_backoff_time
說 明:用於設定隊列處理程序對無法投遞的郵件的最長巡回時間。缺省為4000秒。
例如:maximal_backoff_time= 4000

我的設置如下:
queue_run_delay = 1000s;每1000s會掃描一次delay的郵件    minimal_backoff_time= 1000s; 在1000s內不會重發delay的郵件
maximal_backoff_time= 1200s; 如果超過1200s則一定會重發郵件
maximal_queue_lifetime = 2400s;郵件超過2400s沒有發出去則退信

預期效果為:
每1200s會重發一次,最多重發兩次

以下自己理解:

queue_run_delay = 300s
minimal_backoff_time= 300s
maximal_backoff_time= 400s

bounce_queue_lifetime = 1h
maximal_queue_lifetime = 1h

bounce_queue_lifetime:退信(彈回)在隊列中的保留時間。超過此時間,被認為是無法投遞的。
maximal_queue_lifetime:普通郵件在隊列中的最長保留時間。超過此時間,被認為是無法投遞的。

最后修改成這樣:

queue_run_delay = 200s
minimal_backoff_time = 200s
maximal_backoff_time = 300s

bounce_queue_lifetime = 1800s
maximal_queue_lifetime = 1800s


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM