![apache Proxy 4秒连接延迟](https://linux22.com/image/646372/apache%20Proxy%204%E7%A7%92%E8%BF%9E%E6%8E%A5%E5%BB%B6%E8%BF%9F.png)
我有一个大数据网站(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 查找问题。这是使用域名时的一些屏幕截图
然后是同一个页面,带有 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>