apache Proxy 4秒连接延迟

apache Proxy 4秒连接延迟

我有一个大数据网站(wordpress 二次开发)一个域名 www.example.com。我已将其存储到 3 台服务器中。

In DNS setteing 
IP address (IN A / AAAA) 46.192.22.01
IP address (IN A / AAAA) 46.192.22.02
IP address (IN A / AAAA) 46.192.22.03
  • 服务器 1 46.192.22.01 /var/www/html -> /音乐 & /视频
  • server2 46.192.22.02 /var/www/html -> /article & /photo
  • 服务器3 46.192.22.03 /var/www/html -> /products & /showroom

httpd.conf 文件:

Timeout 45
KeepAlive Off
MaxKeepAliveRequests 256
KeepAliveTimeout 3
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      192
MaxClients       192
MaxRequestsPerChild  2500
</IfModule>

LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
#LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
#LoadModule dav_module modules/mod_dav.so
#LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule info_module modules/mod_info.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
#LoadModule substitute_module modules/mod_substitute.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule cgi_module modules/mod_cgi.so
#LoadModule version_module modules/mod_version.so

ExpiresActive On
<FilesMatch "\.(jpg|jpeg)$">
 ExpiresDefault "access plus 1 year"
</FilesMatch>
<FilesMatch "\.(css|png|js|gif)$">
 ExpiresDefault "access plus 1 month"
</FilesMatch>

<ifmodule mod_deflate.c>
DeflateCompressionLevel 6
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
</ifmodule>

服务器 1

ServerName www.example.com:80
<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html
    <directory "/var/www/html">
        Options Indexes FollowSymLinks
        AllowOverride all
        Order Deny,Allow
        Deny from all
        Allow from all
    </directory>
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyRequests Off
    ProxyPass /article http://46.192.22.02/article retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /article http://46.192.22.02/article
    ProxyPass /photo http://46.192.22.02/photo retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /photo http://46.192.22.02/photo
    ProxyPass /products http://46.192.22.03/products retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /products http://46.192.22.03/products
    ProxyPass /showroom http://46.192.22.03/showroom retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /showroom http://46.192.22.03/showroom
</VirtualHost>

服务器2

ServerName www.example.com:80
<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html
    <directory "/var/www/html">
        Options Indexes FollowSymLinks
        AllowOverride all
        Order Deny,Allow
        Deny from all
        Allow from all
    </directory>
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyRequests Off
    ProxyPass /music http://46.192.22.01/music retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /music http://46.192.22.01/music
    ProxyPass /video http://46.192.22.01/video retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /video http://46.192.22.01/video
    ProxyPass /products http://46.192.22.03/products retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /products http://46.192.22.03/products
    ProxyPass /showroom http://46.192.22.03/showroom retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /showroom http://46.192.22.03/showroom
</VirtualHost>

服务器3

ServerName www.example.com:80
<VirtualHost *:80>
    ServerName www.example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html
    <directory "/var/www/html">
        Options Indexes FollowSymLinks
        AllowOverride all
        Order Deny,Allow
        Deny from all
        Allow from all
    </directory>
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyRequests Off
    ProxyPass /music http://46.192.22.01/music retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /music http://46.192.22.01/music
    ProxyPass /video http://46.192.22.01/video retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /video http://46.192.22.01/video
    ProxyPass /products http://46.192.22.03/products retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /products http://46.192.22.03/products
    ProxyPass /showroom http://46.192.22.03/showroom retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse /showroom http://46.192.22.03/showroom
</VirtualHost>

所有 /etc/hosts 都是

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

然后是 .htaccess 文件

服务器 1

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^music/track/(\d+)?$ music/track.php?number=$1
RewriteRule ^video/introduce/(\d+)?$ video/introduce.php?number=$1

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

服务器2

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^article/introduce/(\d+)?$ article/introduce.php?number=$1
RewriteRule ^photo/products/(\d+)?$ photo/products.php?number=$1

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

服务器 3

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^products/smartphone/(\d+)?$ products/smartphone.php?number=$1
RewriteRule ^showroom/smartphone/(\d+)?$ showroom/smartphone.php?number=$1

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

但是我打开的时候http://www.example.com/products/smartphone/102034很慢(3-5秒延迟),但是http://46.192.22.03/products/smartphone/102034很快(大约0.2秒)

tail -50 /var/log/messages返回类似日志

Nov 18 11:46:20 dhclient[857]: DHCPACK from 46.192.22.01 (xid=0x6caa5cd9)
Nov 18 11:46:21 dhclient[857]: bound to 46.192.22.02 -- renewal in 1481 seconds.

我不擅长服务器部分技术。有哪位教授能帮我找出并修复导致 DNS 非常慢的问题吗?谢谢。

更新 1 (2014/11/23)

在谷歌搜索了两天后,仍然没有找到答案。每次加载页面需要大约 4 秒的连接时间,这是在 chrome 控制台中看到的。如果输入 ip 而不是 domainn,则只需 0.2-0.4 秒的连接时间。我已在所有 3 个服务器中禁用了 ipv6,retry=1 acquire=3000 timeout=600 Keepalive=On之后我添加了ProxyPass...

#dig example.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63728
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;example.com.               IN      A

;; ANSWER SECTION:
example.com.        7199    IN      A       46.192.22.01
example.com.        7199    IN      A       46.192.22.02
example.com.        7199    IN      A       46.192.22.03

;; Query time: 121 msec
;; SERVER: 46.61.167.22#53(46.61.167.22)
;; WHEN: Sun Nov 23 20:51:03 2014
;; MSG SIZE  rcvd: 81

我怀疑反向代理是否真的是我所需要的?我发现了一种错误的连接服务器的方法?

确实,我有 1 个包含大量数据的网站,现在我将其分成 3 个 centos6.6 64 位服务器(3 个 ips)。每个服务器都有唯一的文件夹

  • 服务器 1 46.192.22.01 /var/www/html -> /音乐 & /视频
  • server2 46.192.22.02 /var/www/html -> /article & /photo
  • 服务器3 46.192.22.03 /var/www/html -> /products & /showroom

所以这不是集群平衡或代理平衡,而是如何设置(或安装其他软件)以让互联网知道是否有人输入“http://www.example.com/music“它将映射到服务器 1;有人输入”http://www.example.com/products“它将映射到服务器 3...抱歉,我的母语不是英语,所以我从来没有找到正确的方法,直到今天,只有反向代理才能满足我的要求。

抱歉,我只懂一点 php、mysql 技能,对 apache centos 技能了解不多,需要详细的解决方案。非常感谢。

更新 2 (2014/11/24)

又工作了一天。似乎不是 DNS 查找问题。这是使用域名时的一些屏幕截图 带域名的 chrome 控制台

然后是同一个页面,带有 ip

带 IP 的镀铬控制台

为了避免浏览器缓存的影响。我清理了所有浏览器缓存,然后尝试先加载 ip,然后加载域。最大的区别在于“停滞”和“初始连接”。

我使用top命令监控内存和 CPU 的使用情况,3 台服务器在速度较慢时看起来很正常。

s1

top - 18:21:57 up 21:44,  1 user,  load average: 1.08, 1.28, 1.10
Tasks: 108 total,   2 running, 106 sleeping,   0 stopped,   0 zombie
Cpu(s):  7.3%us,  2.4%sy,  0.0%ni, 77.8%id, 12.2%wa,  0.0%hi,  0.0%si,  0.2%st
Mem:   1922200k total,  1847432k used,    74768k free,     2224k buffers
Swap:  1048572k total,    81224k used,   967348k free,    84816k cached

s2

top - 18:31:24 up 21:55,  1 user,  load average: 0.15, 0.09, 0.02
Tasks: 119 total,   1 running, 118 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.0%us,  1.0%sy,  0.0%ni, 95.8%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   1922200k total,  1669328k used,   252872k free,    25652k buffers
Swap:  1048572k total,    69256k used,   979316k free,   458528k cached

s3

top - 18:21:21 up 1 day,  5:57,  1 user,  load average: 1.03, 0.88, 0.90
Tasks: 105 total,   2 running, 103 sleeping,   0 stopped,   0 zombie
Cpu(s): 25.7%us, 20.0%sy,  0.0%ni, 53.9%id,  0.0%wa,  0.0%hi,  0.2%si,  0.2%st
Mem:   1922200k total,  1758088k used,   164112k free,    58712k buffers
Swap:  1048572k total,      128k used,  1048444k free,   226396k cached

请查看平均负载。2 台服务器超过了值 1。

确实在DNS中我首先将服务器1设置在A地址位置,但是为什么服务器2会成为主服务器呢?

答案1

如果您通过主机名和 IP 连接到站点时得到不同的结果,则该问题似乎仍然与 DNS 有关。

尝试将所有三台机器添加到所有机器的 /etc/hosts 中,即

46.192.22.01 server1
46.192.22.02 server2
46.192.22.03 server3

顺便说一句,您的 DHCP 租约时间似乎非常短,大​​约为 1500 秒。典型的 DHCP 租约持续一天或更长时间。如果 IP 是静态的(似乎就是这种情况),您可能还会考虑将它们从 DHCP 池中删除,并在这三台机器上将 IP 配置设为静态。

答案2

问题可能是 Apache 后端在解析代理服务器时出现问题。如果是这种情况,您可以通过在每个 /etc/hosts 文件中对代理服务器的详细信息进行硬编码来修复它,即添加如下行

proxy.ip.addr www.example.com example.com

或者使用指令关闭 Apache 中的反向 DNS 查找HostnameLookups 关闭

当然,这确实假设问题与 DNS 有关,而与流量在网络上所采用的路径无关(尽管 DNS 故障很可能是问题所在)。

您还应该检查每个系统上的 /etc/resolv.conf 文件,以确保它们都访问了响应迅速的有效名称服务器 - 您可以通过查看此文件来检查这一点,以确保名称服务器设置为离您“很近”的名称服务器,然后通过域名 ping 几个地方,看看它们需要多长时间才能响应。(如果您执行上述步骤,这一点就变得无关紧要了,但仍值得尝试解决)

答案3

从您的配置来看,应该没有什么问题。也许 3 个服务器之间的速度受到某种限制。我建议尝试将以下参数添加到 ProxyPass 作为测试。

flushpackets=开启 keepalive=开启

例如:

ProxyPass /products http://46.192.22.03/products flushpackets=On keepalive=On

还要确保接收服务器没有尝试执行已达到超时时间的反向 DNS 查找。您列出的 IP(不确定它们是真实 IP 还是虚假 IP)没有反向 DNS 名称。

答案4

我遇到了这个问题,但这不是由于 DNS 造成的,因为我没有使用主机名,而是 MaxClient 和相关设置在 httpd.conf 中修复了这个问题:

<IfModule prefork.c>
StartServers       20
MinSpareServers    15
MaxSpareServers   100
ServerLimit      2000
MaxClients      1000
MaxRequestsPerChild  10000
</IfModule>
<IfModule worker.c>
StartServers         20
MaxClients         1500
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  1000
</IfModule>

相关内容