[关闭]
@42withyou 2015-04-13T05:52:43.000000Z 字数 4485 阅读 540

new mail server doc

未分类


系统流程图

https://www.processon.com/diagraming/550aa08de4b010f33c91913f

配置

/Common/Conf/prod.php

  1. /**
  2. * 消息队列配置
  3. */
  4. 'MQ_CONFIG' => array(
  5. // 消息队列驱动类型 /common/Service/Mq
  6. 'TYPE' => 'Mqs',
  7. // 消息队列前缀
  8. 'PRIFIX' => 'test-',
  9. // receive message 默认等待时长
  10. 'POLLING_WAIT_SECONDS' => 3,
  11. 'ACCESS_KEY_ID' => 'xxx',
  12. 'ACCESS_KEY_SECRET' => 'xxx',
  13. 'ACCESS_OWNER_ID' => 'xxx',
  14. // Mqs 地域,测试用 cn-beijing,线上用 cn-hangzhou
  15. 'ACCESS_REGION' => 'cn-beijing'
  16. ),
  17. /**
  18. * 队列类型配置
  19. */
  20. 'MQ_TYPES' => array(
  21. // 批量邮件
  22. 'batch' => array(
  23. // 最大队列数
  24. 'MAX_QUEUE_NUM' => '50',
  25. // 最小队列数
  26. 'MIN_QUEUE_NUM' => '10',
  27. // 空闲队列数
  28. 'SPARE_QUEUE_NUM' => '10',
  29. // 启动队列数
  30. 'START_QUEUE_NUM' => '15',
  31. // receive message 等待时长,覆盖 POLLING_WAIT_SECONDS
  32. 'RECEIVE_WAIT_SECONDS' => 5,
  33. ),
  34. // 系统触发邮件
  35. 'tran' => array(
  36. 'MAX_QUEUE_NUM' => '10',
  37. 'MIN_QUEUE_NUM' => '3',
  38. 'SPARE_QUEUE_NUM' => '9',
  39. 'START_QUEUE_NUM' => '5',
  40. 'RECEIVE_WAIT_SECONDS' => 5,
  41. ),
  42. ),
  43. /**
  44. * sender 守护进程,发送控制
  45. */
  46. 'SENDER_DAEMON' => array(
  47. // 驱动类型 /common/Service/Process
  48. 'TYPE' => 'Shell',
  49. // 检查队列是否为空休眠时长
  50. 'CHECK_QUEUE_INTERVAL' => 1000000,
  51. // 检查 sender 进程是否完成退出休眠时长
  52. 'CHECK_SENDER_INTERVAL' => 1000000,
  53. // pid 文件保存路径
  54. 'PID_FILE_PATH' => '/var/run/mailserver/',
  55. // 日志路径
  56. 'LOG_FILE' => '/var/log/wwwlogs/mailserver/manager.log',
  57. ),
  58. /**
  59. * 发送进程,由 sender_daemon 启动
  60. */
  61. 'SENDER_WORKER' => array(
  62. // 驱动类型
  63. 'TYPE' => 'Shell',
  64. // 单个队列最大发送进程数
  65. 'MAX_PROCESSS_NUM' => 5,
  66. 'PID_FILE_PATH' => '/var/run/mailserver/sender/',
  67. 'LOG_FILE' => '/var/log/wwwlogs/mailserver/sender.log',
  68. ),
  69. // 发送成功 sender 缓存
  70. 'SENDER_CHOOSER_CACHE_TIME' => 2592000, // 60 * 60 * 24 * 30,
  71. // 邮件自定义 header
  72. 'SENDER_DEFAULT_HEADERS' => array(
  73. 'X-Sent-Using' => 'Lingxi',
  74. ),
  75. // gearman 配置
  76. 'GEARMAN_HOST' => '127.0.0.1',
  77. 'GEARMAN_PORT' => 4730,
  78. /**
  79. * crypt 驱动类型,为了兼容旧的数据,增加了 lingxi 加密驱动
  80. */
  81. 'DATA_CRYPT_TYPE' => 'Lingxi',
  82. /**
  83. * D()->cache()... 缓存时长
  84. * 需要主动调用
  85. */
  86. 'MYSQL_QUERY_CACHE_TIME' => 1,
  87. /**
  88. * 邮件日志记录方式
  89. * gearman - 通过 gearman 中转写入数据库
  90. * * - 直接写入
  91. */
  92. 'SEND_LOG_SAVE' => true,
  93. 'SEND_LOG_SAVE_METHOD' => 'gearman',
  94. /**
  95. * tran 邮件在所有 sender 都失败后是否使用 smtp 帐号
  96. * outbound_email_senders 配置 type=tran 的帐号
  97. */
  98. 'TRAN_USE_SMTP' => 1,
  99. /**
  100. * 黑名单有效期
  101. */
  102. 'BLACKLIST_PERIOD' => '-1 month',
  103. /**
  104. * mailapi 地址,用于构建邮件底部的灵析信息
  105. */
  106. 'WEB_ROOT' => 'http://baidu.com',
  107. 'LINGXI_LOGO' => 'http://img.lingxi360.com/styles/css/images/logo_grey.png',
  108. // 错误邮件通知
  109. '_ERROR_REPORT_TO_EMAIL' => 'yekezhong@justering.com',
  110. '_ERROR_REPORT_EMAIL' => 'yekezhong@justering.com',
  111. '_ERROR_REPORT_EMAIL_PASS' => 'xxx',

/Dispatcher/Conf/config.php

  1. /**
  2. * 一个 batch 最多分发到一个队列上多少,超过这个数,就请求一个新队列继续放
  3. * @todo 还没实现
  4. */
  5. 'DISPATCHE_BATCH_NUM' => 5000,
  6. /**
  7. * 邮箱验证正则
  8. * @todo 通过 max 记录验证域名有效性
  9. */
  10. 'EMAIL_VALID_REG' => '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',

gearman 访问控制

gearman 没有认证协议,使用 iptables 控制

iptables.sh

  1. #!/bin/bash
  2. #
  3. # gearman 没有认证协议,使用 iptables 控制
  4. # http://www.vpser.net/security/linux-iptables.html
  5. #
  6. TEST_IP="61.49.121.80"
  7. # clean all
  8. iptables -F
  9. iptables -X
  10. iptables -Z
  11. # 允许本地回环接口(即运行本机访问本机)
  12. iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
  13. # 允许已建立的或相关连的通行
  14. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  15. # 允许所有本机向外的访问
  16. iptables -A OUTPUT -j ACCEPT
  17. # 允许访问22端口
  18. iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  19. # 允许访问80端口
  20. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  21. # 9000 和 15770
  22. iptables -A INPUT -p tcp --dport 15770 -j ACCEPT
  23. iptables -A INPUT -p tcp --dport 9000 -j ACCEPT
  24. # 开启 gearman 端口
  25. iptables -I INPUT -s 127.0.0.1 -p tcp --dport 4730 -j ACCEPT
  26. iptables -I INPUT -s 10.160.15.54 -p tcp --dport 4730 -j ACCEPT # lingxi
  27. # 测试 local
  28. iptables -I INPUT -s $TEST_IP -p tcp --dport 4730 -j ACCEPT
  29. # 禁止其他未允许的规则访问
  30. iptables -A INPUT -j REJECT #!!!!!!!!!!!!!!!(注意:如果22端口未加入允许规则,SSH链接会直接断开。)
  31. iptables -A FORWARD -j REJECT
  32. # save
  33. service iptables save

启动与管理

start_gearman.sh - 启动 gearman 服务

  1. # 配置 gearman 队列持久化队列地址
  2. gearmand -d \
  3. -L 0.0.0.0 \
  4. --queue-type=MySQL \
  5. --mysql-host=lingximailserver.mysql.rds.aliyuncs.com \
  6. --mysql-port=3306 \
  7. --mysql-user=gearman \
  8. --mysql-password=xxx \
  9. --mysql-db=gearman \
  10. --mysql-table=gearman_queue
  11. ps -ef | grep gearmand | grep -v grep

start_workers.sh - 启动 gearman workers

  1. # 静态分发器数量
  2. staticDispatcheWorkerNum=5
  3. # 动态分发器数量
  4. dynamicDispatcheWorkerNum=5
  5. # 日志记录器数量
  6. sendLogSaveWorkerNum=3
  7. # worker & sender pid 文件保存路径 for mkdir
  8. workerPidFilePath="/var/run/mailserver/"
  9. senderPidFilePath="/var/run/mailserver/sender/"

maintenance.sh - crontab 根据 MQ_TYPES 配置定时维护队列数量

  1. crontab -u root -e
  2. * * * * * /home/wwwroot/mail_server/maintenance.sh maintenance

发送进程管理

  1. # todo 封装成命令安装到 /usr/bin/mailserver start/stop/status...
  2. # start/stop/restart 可接参数 /effect_queue/1 操作会同样作用到队列上,否则只对队列对应的进程执行操作
  3. # 启动守护进程
  4. php index.php manager/manage/start
  5. # 停止
  6. php index.php manager/manage/stop
  7. # 重启
  8. php index.php manager/manage/restart
  9. # 维护
  10. php index.php manager/manage/maintenance

auto_refresh.sh - 开发辅助

  1. # 代码有变动时自动刷新 gearman workers,开发用
  2. # 貌似 fswatch 只支持 mac
  3. ./start_workers.sh
  4. fswatch -0 ./Application | xargs -0 -n 1 ./start_workers.sh
  5. exit 0
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注