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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,微信登陆

搜索

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

[复制链接]
发表于 11-30-2011 06:16 | 显示全部楼层 |阅读模式
  • 现 象' ?2 S5 }& V3 I& u# j

    2 {( M( x( V) G" ~' g
    . H9 t+ B! ^/ \. d; U4 ^! cgoseas网站注册时,在创建用户账号的时候非常慢,会引起nginx服务器的错误(504,Gateway Timeout),

    ( N4 C6 Y! j" S. S1 ]3 T" W6 d3 j5 S* K+ h' a0 @, Q2 u
    查看日志,发现nginx从客户端取Post的数据时出现Timeout!错误信息如下:
    1 k/ k( ~- o/ _( x7 X
    " S) o4 }5 a" t5 O, ^7 Y
    (upstream timed out (110: Connection timed out) while
    8 o% D% v* Y! N% Y  T; \

    : w5 W- Q' c: v( w9 ~* H% Lreading response header from upstream)

$ l/ {/ p6 ^, ]# O2 x" H

; |0 q  Z+ I. p) Q. A2 M' |
# P6 V" S; o$ V' ]4 q% d3 Q
8 \. a, r# A% d$ b& s5 M
  • 解决过程
    : n9 p0 P; V# r& K4 {
    9 O2 F  H0 {7 {. n9 U8 @9 u' G
    . [) ?, B( I) I' ^- |( [( _
    + s4 T8 b% E. z' r
    重新配置nginx服务器,加到fast_cgi_buffers等的设置,问题依然存在,我只好重新安装Drupal7,
    ) q: w' D& \3 Z
    9 G4 X1 q/ O# ?" r# ?
    在没有使用任何第三方模块(Module)的情况下注册,一样非常慢,这时,我把注意力放到MySQL上,

    / g8 B3 n% ]1 b% F- \7 E
    * A8 t# B5 _( f+ }9 p/ P' \! b, p1 [曾经在游戏项目的经验,MySQL的死锁会引起另一个Insert操作非常慢,但在这样的网站上,

    % f" J1 p( q9 @: B0 L" R/ q8 j3 H9 K2 v
    数据的Insert是相当少的,不大可能引起这样的问题,不过我还是试试打开InnoDB,手工Insert也

    1 Q2 }# J4 l+ A( H+ y# O9 a' Y$ t- r* y- N' S. z0 C2 ]- ]
    没有问题,那问题在哪呢?

    * s) ~  W' T3 \" v. \$ B5 f, D; b" d
    5 e  \3 R' W2 l2 f& s! W我另外配置了Apache,在Apache下使用全新的Drupal7,问题一样存在!
    0 S: A' c( @0 M8 S. u1 Y; g
    : n7 R3 ?/ Q% e0 E
    这时我把注意力放到邮件上,注册会发送邮件给用户以及管理员!找到一个发邮件的php代码,

    4 d5 Z% F6 e! G! a1 t" Y6 v6 H6 M% F$ v: k
    mail.php:

    ) v5 S) k: F7 E" |+ a
    * u% f& W" U3 L0 [  H" q% j% f
    #!/usr/bin/php
    6 E! l$ `/ u1 Q* Q; L% ?<?php, D1 T8 K  d. m  h6 J8 w
    $to = 'thegosea@gmail.com';3 K- ?. f( Z) }7 N* t5 g2 p
    $subject = 'Test email';/ `8 S/ q+ F# v4 W
    $message = "Hello Worldaa!\n\nThis is my first mail.";# V( @" a) m* A4 ^! W
    $headers = "From: webmaster@goseas.com\r\nReply-To: webmaster@example.com";$ T' W0 ?1 h" x3 w
    $mail_sent = @mail( $to, $subject, $message, $headers );
    " w. `6 K! Q  |6 k8 `) q  U" Recho $mail_sent ? "Mail sent" : "Mail failed";$ S0 Q$ O, u" l1 r* O
    ?>
    9 F; L) p0 H- j: K. R* X+ Z
    ) Y+ W/ R, x/ E6 l3 a' H+ _4 U, v
    这段代码在开发环境中,发送很快,立即返回Mail send消息,但在服务器上,却一直卡住不动,有时
    ' w& b% P2 X4 u& N# `; T& k
    7 e" c2 j; ]  S+ i1 r3 Z; b
    会发送成功,但差不多要40-60秒,有时没有Mail send消息输出,总算找到问题所在了!
    1 n. @  N6 j) T* V5 n

    ) a1 _/ D: r0 Z0 ]root@goseas:~# sendmail -d8.7

    # k: ^: K( Z+ Z3 i: p. F& [* \
    ) p( Q. r# s; w
       getmxrr([goseas], droplocalhost=1)% ^/ z4 _; S' g" L  s
       dns_getcanonname(goseas, trymx=0)
    # k0 i/ A+ S$ b% _9 v- q   NO: errno=0, h_errno=1
    * t) F+ Z  ~8 H* t

    / {' p, j4 M, S. h: b) gsendmail -d8.7输出dns_getcanonname,请求goseas的ip地址,goseas在本机的地址,为会sendmail会向

    7 `6 x( G& s, F# F8 X8 H2 w. w" w* y. z! a# M6 D* u3 P0 V
    DNS服务器请求呢?而我设置的DNS是正常的,如果需要发送请求,也应该是发送goseas.com才行,问题
    ; N- Z4 ~( p4 w* }3 h- M5 s
    6 w7 T0 g. c/ }) j1 }
    就出在这里了,先查看到sendmail手册,说是FQDN问题,按FQDN问题解决办法,配置好Sendmail的FQDN,

    ' L1 q2 J5 c1 O6 c- Z9 D) f( ?/ i" M! A3 s( ~* n( W/ F* Y. g
    问题却依然存在!

    1 c- @" Q0 _8 i9 @8 Q2 B  @8 z# V# l% i6 i
    .(define(`confDOMAIN_NAME', `goseas.com')dnl
    , Z$ R* Z3 n6 K" s. K/ ?! _0 h
    ( ~) w, }. j1 r
    这个配置一定要留意引号,一个是反引号,一个是正引号,相当邪恶的用法

    & k1 t% m2 O& M' x: g! l) M2 \' e  ^& L9 p2 Z
    root@goseas:~# sendmail -d 21.2

    4 j$ ~1 i; _; N- w# V9 T# g4 r1 O! T. J) G/ v. O" s& D, z9 x
    (short domain name) $w = goseas" u* h( r+ D. S2 `
    (canonical domain name) $j = goseas
    $ Q3 p) l; a& g$ n3 Q& _2 J/ R(subdomain name) $m = goseas
    ( w, D5 z9 W: G" |(node name) $k = goseas

    8 K- Z& b0 _1 w1 ^8 |+ J, M( Y5 f7 ]& ]) ~! m
    sendmail -d 21.2的输出一样证实了问题所在,对比开发环境,开发环境上的输出是
    + O4 H- q4 f7 V( H0 N7 P# W

    0 P# r% ^( c8 s, o6 J0 W9 z
    (short domain name) $w = localhost6
      r1 r' S/ l7 X. P- i(canonical domain name) $j = localhost6.localdomain6
    ' h1 j1 ~+ R. w4 m2 V(subdomain name) $m = localdomain69 N3 N/ ^' H8 W0 j7 i' B
    (node name) $k = goseas
    ! ~  T1 k1 n8 N3 c

    1 b" x5 q0 a. N1 ]这时我把注意力放到localhost6上了,服务器与开发环境都没有开通IPv6,但网卡现在都有对IPv6的支持,

    4 V) u5 ]% \- [. p+ I0 y
    2 {/ [, B* {, y& v5 V5 j* z打开服务器的/etc/hosts,发现没有ipv6 localhost6的设置,也难怪sendmail去请求DNS,它是依domain name
    0 s- C' r) X8 l! ^' Y$ ~( K: O
    $ p; ~- F9 R! Z7 m( @' f
    去找地址的,如果有ipv6的本机默认地址的设置,就直接请求到本机的地址了,localhost6的本机地址是

    " c2 T+ K3 Q* G) b/ o! G$ N6 @+ f" y& d+ ^1 |. d) q
    ::1,将/etc/hosts加上一行:

    . p9 K1 d5 }; ?: U" t1 j
    / t2 k" Q. q0 C# z) v0 ^9 p
    ::1 goseas localhost6.localdomain6 localhost6
    + L; n+ Z' ^2 y& t9 @

    : B7 _5 }/ N' v9 jsendmail -d8.7输出:
    1 I: @& f" I5 T6 b  {: }

    / n2 K" G" q$ j/ F! y6 Y5 j$ m7 l) l
    _res.options = 812c1, HasWildcardMX = 0" R8 b9 {9 R" P
    Recipient names must be specified
    $ u8 |0 s3 `( f, h. Y6 u
    9 \# D' [, K! v* u- ]7 w& N, S# j
    这就是正常的输出了!再调用mail.php,邮件发送正常!测试网站的注册,10秒左右,就返回注册成功的消息!
8 t3 o+ O8 G9 d7 U! v8 f

& i" N# A5 K/ L' r6 U7 Y: W
* e- A- V( g% x7 i/ T/ M/ t! y

9 L0 Z5 I4 r! J# l  Q
% R. R: @. K7 ~

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

GMT+8, 12-18-2025 19:32 , Processed in 0.066360 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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