- 现 象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加上一行: 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 |
|