- 现 象
$ `" j1 K* w+ s r: A0 F
! h. R% ]8 r0 d
W0 O' u j) b" @& ~0 [goseas网站注册时,在创建用户账号的时候非常慢,会引起nginx服务器的错误(504,Gateway Timeout),
% r( H1 Z, ?0 u+ I/ M* v( i8 r: v. K m! A3 ?
查看日志,发现nginx从客户端取Post的数据时出现Timeout!错误信息如下:
! Y8 @8 F& }. |/ A3 B w4 a# M4 p% Z; ~7 I- t9 `6 y; m
(upstream timed out (110: Connection timed out) while
! s* r" g7 T! y: B
2 ?" L' B2 E4 }' y: k4 creading response header from upstream) 8 y- ?) ?; D3 S, t# s
. v" I% D" l: m& o7 x, P
8 C. t6 O0 t1 a+ K% ^
/ g- i8 K8 A6 f5 d( C& p
- 解决过程
- V. D! J! A; [8 i' ~' U7 ]) D
& N! _* P' A# |! k
5 f1 p2 l, V3 Y& d
' N% i# M/ J% m g7 ~+ v7 n重新配置nginx服务器,加到fast_cgi_buffers等的设置,问题依然存在,我只好重新安装Drupal7,
6 C9 A- u/ B/ c! G2 [/ z6 ^' w8 w7 S
8 f) O) q* Q9 k0 X \& u在没有使用任何第三方模块(Module)的情况下注册,一样非常慢,这时,我把注意力放到MySQL上,
* a ~, m' @; g/ s
) {$ Q6 w/ K4 Q! W+ w2 n4 j7 x* r& f曾经在游戏项目的经验,MySQL的死锁会引起另一个Insert操作非常慢,但在这样的网站上,
4 y9 L: M4 T/ }. y% \1 `& L; I& {
数据的Insert是相当少的,不大可能引起这样的问题,不过我还是试试打开InnoDB,手工Insert也
i. @9 w8 c8 }" N5 n% v6 E9 K) T* h
: G& c; U) c# L" s3 {没有问题,那问题在哪呢? 7 [' h: p5 D, L3 O8 D
9 n' }$ ]" v2 T" G9 l我另外配置了Apache,在Apache下使用全新的Drupal7,问题一样存在! ! D6 h5 \, C% F# V7 o* @7 p
7 |5 j* K3 c# ^
这时我把注意力放到邮件上,注册会发送邮件给用户以及管理员!找到一个发邮件的php代码,
/ N& d x7 M2 d4 m$ p& ]
9 H: W" w: N1 o) I- @# a omail.php:
) M9 E$ ~, Q' _# S$ `+ ]& l
) W! E9 a& @% k9 V#!/usr/bin/php
2 A3 H' t- j1 Q4 S7 l- e<?php
. f# a8 t& x2 N' }8 H$to = 'thegosea@gmail.com';
3 f1 \8 h0 u# z7 T6 l8 P& u$subject = 'Test email';
( N- x( K- G4 a2 b$message = "Hello Worldaa!\n\nThis is my first mail.";4 V9 b! e; m+ V/ h% J% a" m9 D
$headers = "From: webmaster@goseas.com\r\nReply-To: webmaster@example.com";
k% Q: E ^7 v( v6 T+ S" a/ d! A$mail_sent = @mail( $to, $subject, $message, $headers );, O! s! u# y: I1 _
echo $mail_sent ? "Mail sent" : "Mail failed";
! c; z$ k* R+ N% {?> 2 D: w5 |, S, M! M1 K
. D7 K7 ^7 Y d7 ^$ X _) `5 q. Z
这段代码在开发环境中,发送很快,立即返回Mail send消息,但在服务器上,却一直卡住不动,有时
4 ?; h( I7 ]$ g) r2 Q$ O, U- { B3 ~3 U5 ` r$ G6 ]
会发送成功,但差不多要40-60秒,有时没有Mail send消息输出,总算找到问题所在了!
- A$ W0 L- I; c$ k. O( I
' U! S) ~% X: a9 f/ uroot@goseas:~# sendmail -d8.7 9 l% C7 V; I9 ^" n" D3 `
; Q) {. R/ J, G7 [9 R5 Y
getmxrr([goseas], droplocalhost=1)
; p$ [* j+ J! k* y. U; @, ] dns_getcanonname(goseas, trymx=0)
r% X4 |0 D0 d/ M3 W2 X9 k NO: errno=0, h_errno=1
2 Y/ }* P& C* n: B% A* L
; D6 v6 }- S9 j& H# Q6 B1 Ksendmail -d8.7输出dns_getcanonname,请求goseas的ip地址,goseas在本机的地址,为会sendmail会向
3 W3 ^0 N5 H! }/ i" Y7 |. e
) g; {- F* `2 n) a2 i% XDNS服务器请求呢?而我设置的DNS是正常的,如果需要发送请求,也应该是发送goseas.com才行,问题
# M/ c% D% m+ L
! |1 y* _1 |9 J0 v
就出在这里了,先查看到sendmail手册,说是FQDN问题,按FQDN问题解决办法,配置好Sendmail的FQDN, " _5 M: H% _* X a; b
/ d, R, Y) S$ _ V0 b" X2 C问题却依然存在!
+ |1 ]; x# S4 ]4 e' W8 x' E! B% K
.(define(`confDOMAIN_NAME', `goseas.com')dnl
[; p2 o& P8 l" C1 U/ T/ p& P
0 v3 n" h) q4 ?8 T. ?# T4 q这个配置一定要留意引号,一个是反引号,一个是正引号,相当邪恶的用法
) N( r3 o$ f3 G4 r. M
2 k5 k0 @$ B6 lroot@goseas:~# sendmail -d 21.2
# K! m+ f/ r7 o! Z2 `0 Z& H- \5 \/ a, Z; o1 h: C
(short domain name) $w = goseas4 R7 B% c3 P& L+ G- M O0 F+ e
(canonical domain name) $j = goseas4 V" Q$ e% X" a4 j! K- R9 R$ W
(subdomain name) $m = goseas
5 l5 x9 a' o1 v(node name) $k = goseas
# \) f4 ]- p2 _8 o0 ?
( q9 R) w' t/ _5 r7 t. S$ tsendmail -d 21.2的输出一样证实了问题所在,对比开发环境,开发环境上的输出是:
K$ i' y, C$ V+ t K
! k! ]$ d5 @6 M! T/ U(short domain name) $w = localhost6+ q2 y8 {4 U G+ a6 {" O
(canonical domain name) $j = localhost6.localdomain6, K6 `0 z; g) I0 u
(subdomain name) $m = localdomain60 ^% U1 I0 \; F- s
(node name) $k = goseas
D3 p9 U, t2 `' _- V( G0 g7 U
7 i: ?7 v2 {$ l; `
这时我把注意力放到localhost6上了,服务器与开发环境都没有开通IPv6,但网卡现在都有对IPv6的支持, 8 `/ l# Z' i3 h* l
! L; O4 k3 N' _* @4 R5 P$ X1 X
打开服务器的/etc/hosts,发现没有ipv6 localhost6的设置,也难怪sendmail去请求DNS,它是依domain name
5 _; K6 U( d0 Q9 r
, v9 g1 {! @. u0 ^去找地址的,如果有ipv6的本机默认地址的设置,就直接请求到本机的地址了,localhost6的本机地址是
9 Q+ C6 @2 t. C1 f6 F# `
( e1 T) u4 A5 k0 H3 u9 G8 f
::1,将/etc/hosts加上一行:
1 z7 P7 N' J0 j
: T! h @, m: r) o# l. bsendmail -d8.7输出:
7 P2 z0 A) f4 @1 C
' U( f; ~2 Q& Y1 j8 T' n" A! _3 ^ l_res.options = 812c1, HasWildcardMX = 0 P( L) ~1 M" D- p1 g; Y& G
Recipient names must be specified 3 D5 A a8 _- {# ?5 P, I
" C" C% D& W ^8 q2 }& C6 K1 P' V
这就是正常的输出了!再调用mail.php,邮件发送正常!测试网站的注册,10秒左右,就返回注册成功的消息!
4 j, w, z% K- ^% E) Q2 G( F4 {
7 k; z- r$ t5 b5 L, z( H4 l+ @5 G: {: h0 y, r: t
6 W$ ]" |8 L7 d/ Q- j# I
3 c* F! T% {+ ~- X9 ] |
|