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 Q8 \. 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加上一行:
+ 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 ~ |
|