私は毎日、約 2 万人の受信者にニュースレターを送信しています。他のサーバーに移動した後、同じ PHP スクリプトを使用してこれを行うには、約 6 倍の時間が必要です。さまざまな設定を試しましたが、うまくいきませんでした (この投稿を参照してください)。電子メール サーバーは (スパム、リレー、ウイルスに関して) 適切に構成されているようで、サーバーは Plesk 11.5.30 で実行されます。
多くの実験を行い、PHP スクリプトと Postfix 設定を変更して、次の方法で最高のパフォーマンスを達成することができました。
- SwiftMailer を使用して PHP からメールを送信します。
- トランスポートとして SMTP (ローカル アカウント) を使用します。
- 受信者リストを 4 つの部分に分割し、それぞれに対して個別の PHP-CLI プロセスを開始します。
1 つのプロセスのみを開始すると、PHP は 1 秒あたり約 5 通のメールを送信します (これは、mail() 関数を使用してメールを送信する場合とほぼ同じです)。Postfix はそれらを「オンザフライ」で送信することに問題がないため、キューはほとんどありません。
4 つのプロセスを開始すると、PHP は毎秒約 10 通のメールを送信しますが、postfix はそれらを「オンザフライ」で送信できなくなり (毎秒約 5 通のメールしか送信できません)、キューがどんどん大きくなります。PHP プロセスが終了すると、約 4500 通のメールがキューに入っています。ここで興味深い点があります。電子メールを送信するアクティブな PHP プロセスがなくなると、Postfix は「加速」して、毎秒約 20 通の電子メールを送信します。PHP が新しい電子メールを配信している間、Postfix はこのレートで電子メールを送信できますか? キューがなくなり、問題が解決します。
ニュースレターを送信するスクリプトとサーバーのパフォーマンスを向上させるために何ができるかを考えていただければ幸いです。
Postfix の設定は次のとおりです。
root@hostname:~# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases, hash:/var/spool/postfix/plesk/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
disable_vrfy_command = yes
inet_interfaces = all
inet_protocols = ipv4
mailbox_size_limit = 0
mailman_destination_recipient_limit = 1
message_size_limit = 51200000
mydestination = (none), localhost, localhost.localdomain, localhost
mydomain = domain.com
myhostname = myhostname.com
mynetworks = 127.0.0.0/8 [::1]/128 my.ip.add.ress
plesk_virtual_destination_recipient_limit = 1
readme_directory = no
recipient_delimiter = +
relayhost =
sender_dependent_default_transport_maps = hash:/var/spool/postfix/plesk/sdd_transport_maps
smtp_connect_timeout = 10s
smtp_helo_timeout = 100s
smtp_send_xforward_command = yes
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_use_tls = no
smtpd_authorized_xforward_hosts = 127.0.0.0/8 [::1]/128
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_rbl_client zen.spamhaus.org
smtpd_proxy_timeout = 3600s
smtpd_recipient_restrictions = permit_mynetworks, check_client_access pcre:/var/spool/postfix/plesk/no_relay.re, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sender_restrictions = check_sender_access hash:/var/spool/postfix/plesk/blacklists, permit_sasl_authenticated, check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
smtpd_timeout = 3600s
smtpd_tls_cert_file = /etc/postfix/postfix_default.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
transport_maps = , hash:/var/spool/postfix/plesk/transport
virtual_alias_maps = $virtual_maps, hash:/var/spool/postfix/plesk/virtual
virtual_gid_maps = static:31
virtual_mailbox_base = /var/qmail/mailnames
virtual_mailbox_domains = $virtual_mailbox_maps, hash:/var/spool/postfix/plesk/virtual_domains
virtual_mailbox_limit = 0
virtual_mailbox_maps = , hash:/var/spool/postfix/plesk/vmailbox
virtual_transport = plesk_virtual
virtual_uid_maps = static:110