- 现 象
& Z0 O9 N2 _* R% c. X2 S
( o% {5 H9 e2 u7 p$ l, q
P$ q$ M. H6 J" ggoseas网站注册时,在创建用户账号的时候非常慢,会引起nginx服务器的错误(504,Gateway Timeout),
2 F/ G/ ~. k. J" X2 `/ r2 R8 d; x1 t
3 [! ~7 O% A+ C8 ]+ Z$ x6 |查看日志,发现nginx从客户端取Post的数据时出现Timeout!错误信息如下:
0 i, u/ V9 v7 c5 T) J8 c
+ T9 ~, X' O9 ~& O3 w9 {: e% \(upstream timed out (110: Connection timed out) while
+ B' V" x- _ K* q
2 Y$ D; A$ x3 ereading response header from upstream) , i; k8 `6 T& ^' b0 X, _
9 D1 n u @7 q# Y3 B" _1 q. w+ }) w) |# R
3 B. }+ O4 M% f
- 解决过程8 e9 R7 X7 {1 T- y i" w4 b: w
3 A% A$ G S& f" l( I! s2 G
6 F9 x( O) _9 O8 ^5 r0 p9 D1 y, d
7 J& V" G5 y6 _% P: n
重新配置nginx服务器,加到fast_cgi_buffers等的设置,问题依然存在,我只好重新安装Drupal7,
3 {/ [3 x4 A3 U! P" q8 l4 z( o9 a3 r
在没有使用任何第三方模块(Module)的情况下注册,一样非常慢,这时,我把注意力放到MySQL上,
3 y* I3 F8 K4 w- {" Q0 }
" A: ?# }8 J8 ]% g- B0 A$ n, X曾经在游戏项目的经验,MySQL的死锁会引起另一个Insert操作非常慢,但在这样的网站上,
9 z) E2 S# C4 ?8 m9 v' m
2 l8 A% ^$ s$ B) n
数据的Insert是相当少的,不大可能引起这样的问题,不过我还是试试打开InnoDB,手工Insert也 V; z [1 T& k" `2 w/ o
+ t8 ]: R9 ?8 x: i ~# B, j没有问题,那问题在哪呢? ( c1 l! Z1 m" ^7 @
' G! ?1 k# C# D4 J* C2 x- l
我另外配置了Apache,在Apache下使用全新的Drupal7,问题一样存在!
. V# W- R8 z- D3 J) t
$ N) ?0 G) x6 d! q这时我把注意力放到邮件上,注册会发送邮件给用户以及管理员!找到一个发邮件的php代码,
- V& L, ~1 E2 }
' d9 b5 z* _4 m9 x( T. [7 qmail.php:
& K* }# t$ `/ ?3 ]* _ Z
- u% U6 b& l: @" q' d
#!/usr/bin/php
% p; B0 m' i5 X! O, t7 c0 v<?php7 |1 C$ `3 R( G% E+ y+ F, F
$to = 'thegosea@gmail.com';
: n. z4 Y& X# y/ h$subject = 'Test email';9 C1 [7 c& n' \5 \, R
$message = "Hello Worldaa!\n\nThis is my first mail.";
% m) V. P4 \/ _$headers = "From: webmaster@goseas.com\r\nReply-To: webmaster@example.com";
# \: s: P- `- r% U( n8 ?$mail_sent = @mail( $to, $subject, $message, $headers );3 n7 G! p1 \/ V/ ~
echo $mail_sent ? "Mail sent" : "Mail failed";
4 m3 u I1 j* t0 t?>
. v$ ?: W) A; U4 Z
: `3 |' P& v1 n3 x: \% U这段代码在开发环境中,发送很快,立即返回Mail send消息,但在服务器上,却一直卡住不动,有时
2 A% N+ A% j$ [+ ^" H. V( h0 E; h* Y/ K: P
会发送成功,但差不多要40-60秒,有时没有Mail send消息输出,总算找到问题所在了!
* D5 u: p C- c- J k, E4 o0 n0 i& _% I3 u4 k: y U
root@goseas:~# sendmail -d8.7
$ x3 ~* ~" q3 x# I. f) p/ t8 g Y* c, A: i
getmxrr([goseas], droplocalhost=1)$ V! B6 ]9 P3 r6 k# ^, T1 ^
dns_getcanonname(goseas, trymx=0)5 Q; o$ D0 o) ~; p9 Z/ M
NO: errno=0, h_errno=1
. o' Y: ~" z# z% e* f
: \9 @, h3 j3 O& L- ]" Rsendmail -d8.7输出dns_getcanonname,请求goseas的ip地址,goseas在本机的地址,为会sendmail会向
+ {: N I, {1 D6 O: }8 Q# X
1 ^4 O& B. {, A, I2 ^" ?DNS服务器请求呢?而我设置的DNS是正常的,如果需要发送请求,也应该是发送goseas.com才行,问题
) p' D( W2 k# D2 {, ]8 h0 z3 u+ U, b4 t
就出在这里了,先查看到sendmail手册,说是FQDN问题,按FQDN问题解决办法,配置好Sendmail的FQDN,
+ a$ ?" D& o: l2 O$ }
7 F! ^8 ~& L* H/ d问题却依然存在!
5 j# E' F M$ z" z
) }+ T$ o/ ?: e8 W3 w.(define(`confDOMAIN_NAME', `goseas.com')dnl
* _1 K) q/ T, C$ l* o
% w) \. A& r: [. f. e这个配置一定要留意引号,一个是反引号,一个是正引号,相当邪恶的用法
: K+ ^) Q7 C% r0 R1 d# ^. T K$ t9 S5 I( M% O5 v0 X
root@goseas:~# sendmail -d 21.2
) w" F5 x. `4 Z" r
) e) v. c2 E1 O; V- F3 u(short domain name) $w = goseas
- x" u" K9 _( Q A6 }$ |7 v( Y( j(canonical domain name) $j = goseas
' e4 V5 N/ s& e4 l/ C- J: \/ R" [(subdomain name) $m = goseas
' S `+ m/ l0 Y! p# Q$ h0 C) r(node name) $k = goseas
0 H, Z! a3 `; r! j# `* r3 m" O
9 F+ K+ k7 ^- C1 esendmail -d 21.2的输出一样证实了问题所在,对比开发环境,开发环境上的输出是:
+ a0 z! ?1 d1 i! m q! V) w
* N8 N3 u& |. S* r6 N3 B7 J
(short domain name) $w = localhost6# t# w" p4 D" v O1 D- W
(canonical domain name) $j = localhost6.localdomain6; T0 D# T! s' t5 N
(subdomain name) $m = localdomain6& k w: W3 j& c, G2 I! p4 T
(node name) $k = goseas
3 S$ U7 ?- @9 U O' F; N$ Q4 `2 f2 h O+ W6 X: i# @, ~: l- f
这时我把注意力放到localhost6上了,服务器与开发环境都没有开通IPv6,但网卡现在都有对IPv6的支持,
/ R# a3 x7 R$ {- q9 O+ y- [
1 H' ^5 N. J2 a# a3 F7 F/ n/ t打开服务器的/etc/hosts,发现没有ipv6 localhost6的设置,也难怪sendmail去请求DNS,它是依domain name
( z" P0 q; Q8 s# ^0 {% T/ S+ X
1 Q% y; R- V% r9 z去找地址的,如果有ipv6的本机默认地址的设置,就直接请求到本机的地址了,localhost6的本机地址是 ) \' k' j1 |, @
8 `1 Z' }) O' o# L0 I% R3 A, A @; D::1,将/etc/hosts加上一行:
) l8 i0 P2 _" C( @3 W# K& r Z O3 i; }& N+ T8 K' [
sendmail -d8.7输出:
0 X+ I7 V6 ?, i( M* M
# l. ]& x" K9 h/ {_res.options = 812c1, HasWildcardMX = 0
* E3 _8 p% H+ g9 y6 a R. v, k& BRecipient names must be specified 9 x( g2 |6 I% p. ?$ z7 V! S0 p
0 n2 B0 ~* t9 m R; x+ H7 r0 D( s' [
这就是正常的输出了!再调用mail.php,邮件发送正常!测试网站的注册,10秒左右,就返回注册成功的消息! 6 r7 F# B; w- z# Z) t4 n( |/ U
8 {- S1 i& j4 ]. Q; m9 l3 c0 W" B) M# e% t% j6 u
0 L- h; Z2 m* H& t% ]. X+ Z; P2 h5 w% Q
|
|