国外设计欣赏网站 - DOOOOR.com

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

[Drupal问题] Sendmail引起Drupal 7网站注册慢的解决办法

[复制链接]
发表于 11-30-2011 06:16 | 显示全部楼层 |阅读模式
  • 现 象3 v" V, V7 j! R4 _  L( r: {

    9 O6 t  e8 ]& O% M) E5 W9 M# H7 L' Y% N/ Z
    goseas网站注册时,在创建用户账号的时候非常慢,会引起nginx服务器的错误(504,Gateway Timeout),

    7 d* v1 e! o. F% Q- m) c& ]( A; a
    查看日志,发现nginx从客户端取Post的数据时出现Timeout!错误信息如下:

    / s0 d9 _7 t7 Z4 s
    - n# p# C$ t% f0 g(upstream timed out (110: Connection timed out) while
    * s+ J! H6 E2 @& y. g$ y. A

    3 `* S) U$ O( |: r2 }  c+ F! q4 ureading response header from upstream)
" I/ J2 u+ c6 s& m& S! L5 W7 ~
+ `: r0 S6 u2 V' |+ a

- v9 d! g4 [3 k$ U8 i( m

/ |$ q3 h. g4 k( U; ~
  • 解决过程" S' D4 @' @3 m0 u, V

    . c7 W6 b; b. p9 p! D1 u1 m

    + s+ \/ v- V/ r8 |2 i
    * [- [+ F. C/ k$ O3 w& t* o/ A6 |重新配置nginx服务器,加到fast_cgi_buffers等的设置,问题依然存在,我只好重新安装Drupal7,
    ! B% w6 W+ \' Y  S( l
    7 }" y* d8 X5 O9 y* b# m
    在没有使用任何第三方模块(Module)的情况下注册,一样非常慢,这时,我把注意力放到MySQL上,
    * a& S) M" h& i
    1 H- t" z2 P1 b% i5 W$ v
    曾经在游戏项目的经验,MySQL的死锁会引起另一个Insert操作非常慢,但在这样的网站上,
    : ]% m/ \; N! l3 Y
    0 Q4 o/ w+ A- i" x
    数据的Insert是相当少的,不大可能引起这样的问题,不过我还是试试打开InnoDB,手工Insert也

    . b( f( H' ^# Y8 k' B4 O$ }8 @' X  g
    2 D# A! V) `) m) a6 [没有问题,那问题在哪呢?

    ( X- G3 V$ K' z7 R8 t4 `0 E$ n( i( V3 R4 Q) W
    我另外配置了Apache,在Apache下使用全新的Drupal7,问题一样存在!

    8 |* J) K4 s& g
    # J9 S" X3 Q. D/ F- V这时我把注意力放到邮件上,注册会发送邮件给用户以及管理员!找到一个发邮件的php代码,
    + Z) K1 {! y  S

    4 k  G- y$ f+ n& q# W. Hmail.php:
    - G  {/ h; T# A# Q, q/ b$ m

    " t* s' s2 ?; f% U% y
    #!/usr/bin/php: W1 w0 Z4 k2 m6 }/ i' T
    <?php7 g* z4 ]8 b7 I, T& n  P. H9 r3 H! Q0 {
    $to = 'thegosea@gmail.com';
    ( u; ^# ^% b. r( W3 s7 o" ~$subject = 'Test email';
    5 n  c3 G5 a" v$message = "Hello Worldaa!\n\nThis is my first mail.";
    4 ]! j! d5 y6 V& g: L8 L& Z$headers = "From: webmaster@goseas.com\r\nReply-To: webmaster@example.com";& t! L6 p4 Z. r8 e: K
    $mail_sent = @mail( $to, $subject, $message, $headers );' L! S2 c. a4 ?. ?
    echo $mail_sent ? "Mail sent" : "Mail failed";
    , F* p7 D1 n& P& ^2 S?>

    - z* z7 j* n- o9 T* f$ ]8 b: r7 I$ z# ?; I& l8 Y  O
    这段代码在开发环境中,发送很快,立即返回Mail send消息,但在服务器上,却一直卡住不动,有时
    ' T4 Z3 [9 d: K
    2 E; o8 d* C* E. d# @
    会发送成功,但差不多要40-60秒,有时没有Mail send消息输出,总算找到问题所在了!
    . O0 p2 B+ s% |, P. X8 q8 t

    8 f0 [% q2 X4 h) Qroot@goseas:~# sendmail -d8.7

    7 C: ^& |6 `- V" g$ ^/ n" v
    * |; p! M( B( K3 O4 ^) {4 C( `+ \# l
       getmxrr([goseas], droplocalhost=1)6 W" g4 a4 \) |* {3 b
       dns_getcanonname(goseas, trymx=0)
    : F  Q; V3 P2 ]; o! d/ o/ g   NO: errno=0, h_errno=1
    ' ~6 m& U2 H9 y  f7 U8 R

    4 Z. W' m+ u+ f& }( N/ t3 Q) T+ M2 y( Xsendmail -d8.7输出dns_getcanonname,请求goseas的ip地址,goseas在本机的地址,为会sendmail会向

    8 b: K/ w, x, ]) _0 O
    . }: V( C7 V- V/ I, P. {+ `# C% ]# w' XDNS服务器请求呢?而我设置的DNS是正常的,如果需要发送请求,也应该是发送goseas.com才行,问题
    $ B* N8 p) K8 r2 w( o8 I

    " U" ^3 F5 \5 c3 ]5 D就出在这里了,先查看到sendmail手册,说是FQDN问题,按FQDN问题解决办法,配置好Sendmail的FQDN,
    - X( I% R6 Z2 j9 R. U

    ( Q, o7 _, {, s% }6 a5 |问题却依然存在!

    / K! c: J5 |! k% u: w: j, {# Y$ t* l# r2 \
    .(define(`confDOMAIN_NAME', `goseas.com')dnl

    % H! v! J0 Q4 [, Y" |3 b2 w5 f
    $ ?7 r6 q& i' q  E这个配置一定要留意引号,一个是反引号,一个是正引号,相当邪恶的用法
    * z1 e; K1 A- F0 s" ^
    : M& \( n  s( n* p/ {7 h( X4 h+ @
    root@goseas:~# sendmail -d 21.2
    " d: M' i, Y/ n4 n( i
    0 T8 `1 ^2 z* O& ?6 H7 q8 g. t
    (short domain name) $w = goseas) ^1 r8 E5 z# H' c" P
    (canonical domain name) $j = goseas8 |" y# b  B' x* n$ a& Z  d
    (subdomain name) $m = goseas
    0 M  y: {" T$ H(node name) $k = goseas

    3 f( r1 H, J/ d: ^0 V' D' v
    $ `. _  b4 k8 F6 K/ y# \& ^5 ^7 xsendmail -d 21.2的输出一样证实了问题所在,对比开发环境,开发环境上的输出是
    , s7 [# F4 M$ u" K+ h" a7 |9 c% B

    $ K6 V7 a, J4 u0 c+ \8 e9 K) O
    (short domain name) $w = localhost6* d* `1 y! O  f; p, p- v, {
    (canonical domain name) $j = localhost6.localdomain6
    , t! g. x0 X8 o0 s$ J6 n(subdomain name) $m = localdomain63 q( T+ ~% e0 j4 y7 b5 I$ j
    (node name) $k = goseas

    % v8 l1 R2 `8 l) o; ^0 `* q  g/ k! |' P+ C
    3 ]( ^! P# R1 z& I- C- D, y这时我把注意力放到localhost6上了,服务器与开发环境都没有开通IPv6,但网卡现在都有对IPv6的支持,

    ( e! H" `! a" I3 H& n0 V, u3 p& w) j
    打开服务器的/etc/hosts,发现没有ipv6 localhost6的设置,也难怪sendmail去请求DNS,它是依domain name
    $ C' D/ d' A+ J8 ?; Z" q( S% _5 w
    1 u1 |% b2 g( _
    去找地址的,如果有ipv6的本机默认地址的设置,就直接请求到本机的地址了,localhost6的本机地址是
    6 j9 l- l9 W. |/ ^  a* v

    5 E8 W( s4 q: s+ Y7 B::1,将/etc/hosts加上一行:
    3 C+ c0 H! J# H7 i0 ?$ X2 p; o* i
    , J/ Y/ I$ h4 ]! Y" L5 j
    ::1 goseas localhost6.localdomain6 localhost6
    6 Q, ]/ _. c  K! l

    ; T9 u4 O! x8 @0 R* f2 E, B$ Esendmail -d8.7输出:
    5 d# }. V( w( H/ t! ~& G. C: E
    $ |* b* G. P& A8 K! [% N
    _res.options = 812c1, HasWildcardMX = 0  _7 F# K' P6 `0 b" ]4 I: b
    Recipient names must be specified
    ) C' s4 `% ^  f& A4 o; }
    9 [2 M  o: r  ]6 z, [( x
    这就是正常的输出了!再调用mail.php,邮件发送正常!测试网站的注册,10秒左右,就返回注册成功的消息!
, E) E' X  o" o# I1 _

$ L; |8 n  B5 X( n# ?8 @! L, \3 i2 _" O/ h( s
  @, `. A5 v5 k' E$ v

- y* ^+ X9 l% Y; ?5 \7 @5 Z

|2011-2026-版权声明|平台(网站)公约|手机版|手机版|DOOOOR 设计网 ( 吉ICP备2022003869号 )

GMT+8, 11-12-2025 17:08 , Processed in 0.206489 second(s), 67 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表