我们有一个系统,它在多个 tomcat 前面有一个 Apache 实例。这些 tomcat 然后连接到各种数据库。我们使用 mod_proxy_balancer 平衡 tomcat 的负载。
目前我们每秒接收 100 个请求,Apache 服务器上的负载相当低,但由于 tomcats 上的数据库操作繁重,负载大约为 25%(我估计它们可以处理)。
几周后会发生一个事件,我们估计我们的请求会大幅增加,可能会增加 10 倍。
我正在尽我所能减少我们的 tomcat 的负载,但我知道我们将耗尽容量,所以我想优雅地失败。我的意思是,我希望 Apache 以某种方式监视平均响应时间,而不是尝试处理太多所有超时的连接,并且一旦对 Tomcat 的响应时间超过某个阈值,我想要一个错误页面显示。
这意味着幸运的用户仍然可以快速呈现页面,而不幸的用户则快速获得错误页面。而不是每个人都为他们的页面等待太久,最终每个人都超时,并且数据库被从未使用过的查询淹没。
希望这是有道理的,所以我一直在寻找有关如何实现这一目标的建议。
谢谢
我有一个运行 mod_proxy 和 mod_proxy_balancer 的 Apache httpd Web 服务器。整个 /somedir 被发送到 2 台工作机器,这些机器使用循环调度程序为请求提供服务。每台工作机器都在运行 IIS,但我认为这并不重要。
我可以通过重复请求包含机器 IP 地址的单个页面来演示负载平衡器的工作,并且可以看到它以可预测的循环方式从一个页面切换到另一个页面。
如果我关闭其中一台 IIS 服务器并开始请求相同的页面,则每个页面仅包含已启动机器的 IP 地址。但是,如果我启动 IIS 并且不运行我的 IIS 应用程序,那么 /somedir 将返回 500(应该如此)。
我已将 500 添加到故障状态(Apache 2.4)中,因此当它遇到错误时,Apache 会将工作机器置于错误状态。尽管如此,Apache 仍然将代理错误返回给客户端。如何让 Apache 捕获代理故障并以与连接故障相同的方式使用不同的工作器重试。
更新
在 StackOverflow 中提出了几乎相同的问题,因此将它们结合在一起。
我有两个启用了 mod_proxy 的 Apache 服务器。我想知道如何使用相同的端口 (80) 从“Apache Server A”“传递请求”到“Apache Server B”。
在内部 ip 为 192.168.0.5 的“服务器 A”中,我配置了 DNS,并将其用作我的邮件服务器。
在内部 IP 为 192.168.0.10 的“服务器 B”中,我有自己的云服务器。
今天,当我访问 wwww.mydomain.com 或 www.mydomain.com/webmail 时一切正常,因为内容都在“服务器 A”中,我需要的是当有人尝试访问 owncloud.mydomain.com 时,他们可以访问我的服务器 B没有将它们重定向到另一个端口,如 owncloud.mydomain.com:81,我只想使用端口 80。
实际上我得到了一个重定向循环,因为当我尝试重定向时,我猜“服务器 A”自己得到了相同的请求。我已将我的虚拟主机设置为在同一个“服务器 A”中工作,我想要的是使用相同的端口和 URL(owncloud.mydomain.com)“重定向”到另一台服务器。
我不想使用另一个端口重定向。
我有一个使用 mod_proxy 在 Apache 后面提供烧瓶应用程序的 gunicorn。
Gunicorn 上http://localhost:8080/。假设我的服务器已开启http://example.com/
有时,当我向我的服务器发布无效链接时(例如忘记尾随),假设http://example.com/with-no-trailing-slash用户被重定向到无效链接,http://localhost:8080/with-no-trailing-slash因为客户端计算机上没有服务器。
你知道它为什么会这样吗?以及如何解决这种行为?
要启动 gunicorn 我这样做: sudo gunicorn -b localhost:8080 app:app
<VirtualHost *:80>
ServerName example.com
ServerAlias example.com
DocumentRoot /opt/example
<Proxy *>
AuthType basic
AuthBasicAuthoritative Off
SetEnv proxy-chain-auth On
Order allow,deny
Allow from all
</Proxy>
# Let apache serve static files
ProxyPass /robots.txt !
ProxyPass /favicon.ico !
ProxyPass /static/ !
Alias /static/ /opt/example/app/static/
# Gunicorn handle the others
ProxyPass / http://localhost:8080/
# robots.txt et favicon.ico sont dans …Run Code Online (Sandbox Code Playgroud) 尝试通过我的 Apache2 服务器访问 ws://localhost:8080/ 时出现错误 500。该服务器运行 OpenSuse Leap 42.1 和 Apache 2.4.16。
这些 Apache2 模块已启用:mod_proxy、mod_proxy_http、mod_proxy_wstunnel。
当从本地网络调用请求时,一切正常。网址示例:http://<myhost-ip-address>/api/ws/<some-url>. 它返回状态 101 和响应:Upgrade: websocket。没关系。
来自外网的同类请求失败。网址示例:ws://www.mysite.com/api/ws/<some-url>. 它返回错误 500。
Apache 访问日志包含: GET /api/ws/<some-url> HTTP/1.1" 500 ...
Apache 错误日志包含: [proxy:warn] AH01144: No protocol handler was valid for the URL /api/ws/<some-url>. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
我的 httpd.conf:
<VirtualHost *:80>
ServerName mysite.com
ServerAlias mysite.com
# Redirection …Run Code Online (Sandbox Code Playgroud) 我依赖的 websocket 库 ( PHP-Websockets ) 尚不支持安全套接字 ( wss)。不过我的网站已经结束https,所以我不能使用不安全的ws连接。
我正在尝试使用Apachemod_proxy将来自浏览器的安全请求转发到客户端。
Javascript
var ws = new Websocket('wss://example.com/_ws_/');
Run Code Online (Sandbox Code Playgroud)
Apache 虚拟主机
ProxyPass "/_ws_/" "ws://127.0.0.1:8080/"
ProxyPassReverse "/_ws_/" "ws://127.0.0.1:8080/"
# I've also tried "/_ws_/" "ws://example.com:8080/" Same error below
Run Code Online (Sandbox Code Playgroud)
尝试连接时,浏览器会收到一个500 Server Error. 日志显示:
没有协议处理程序对 URL /_ws_/ 有效。如果您使用的是 mod_proxy 的 DSO 版本,请确保使用 LoadModule 将代理子模块包含在配置中。
我已经确认,如果我删除代理规则,停止将用户重定向到https并尝试从浏览器连接到不安全的套接字:new Websocket('ws://example.com/'),一切正常。
我加载的 Apache 模块包括mod_ssl.c,mod_proxy.c和mod_proxy_http.c
Apache 2.4
我尝试使用谷歌搜索,我发现比较这两者的唯一文章是从 2005 年到 2002 年。我刚刚设置了我的第一个 Tomcat 实例来为我正在做的项目运行 Jira。我想通过端口 80 和 apache 代理它。据我所知,我可以使用 mod_proxy 轻松转发流量。使用 mod_jk 有什么区别?这两个模组之间是否有任何性能/安全差异?任何人都有通过 apache 设置转发的任何提示/经验?我正在运行 debian Lenny。
我有一个启用了 mod_proxy 的 Apache 网络服务器和一个 Virtualhost,proxy.domain.com。此代理配置为提示用户提供 AuthType Basic 凭据。然后,通过带有 ProxyPass 和 ProxyReverse 的代理可以访问 web.domain.com 的内容。但是,REMOTE_USER 变量为空。我阅读了不同的东西来使用 mod_rewrite 和 mod_headers 来实现这一点,但我所有的尝试都失败了。有人比我幸运吗?
谢谢。
我使用带有mod_proxy 的Apache 2.2到某些 3rd 方 HTTP 服务器。
由于它不发送任何Cache-Control标头,我想为响应代码 200 添加 1 天,为 404 添加 5 分钟,为任何其他响应代码添加 0。
所以我想:
SetEnvIf HttpResponseCode "200" rc_200
SetEnvIf HttpResponseCode "404" rc_404
Header set "Cache-Control" "private, max-age=0"
Header set "Cache-Control" "public, max-age=86400" env=rc_404
Header set "Cache-Control" "public, max-age=86400" env=rc_200
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 WHM/CPanel CeEntOS Linux 服务器上安装 Mod_Proxy Apache 模块。这是系统信息:
CentOS release 5.6 (Final)
Server version: Apache/2.2.21 (Unix)
Cpanel::Easy::Apache v3.7.2 rev9999
Run Code Online (Sandbox Code Playgroud)
我安装的目的是,当我在 abc.com 站点上单击一个指向 auto.efg.com 站点的链接(假设它的 IP 地址是 192.168.0.101)时,浏览器将在 auto.efg 上加载应用程序。 com 同时在浏览器的地址栏上维护 abc.com。
所以我跟着这个教程:
http://www.hackersgarage.com/install-mod_proxy-apache-module-on-whmcpanel-ceentos-linux-server.html
所以当我完成它时,我能够做到这一点:
root@ip-xxx-xxx-xxx [/tmp/httpd-2.2.21/modules/proxy]# ls -l
/usr/local/apache/modules/mod_proxy*
-rwxr-xr-x 1 root root 88708 Jan 5 08:22 /usr/local/apache/modules/mod_proxy.so*
-rwxr-xr-x 1 root root 49654 Jan 5 08:23 /usr/local/apache/modules/mod_proxy_connect.so*
-rwxr-xr-x 1 root root 73196 Jan 5 08:23 /usr/local/apache/modules/mod_proxy_http.so*
Run Code Online (Sandbox Code Playgroud)
现在,按照这些说明操作并尝试重新启动服务器后,出现以下错误:
/etc/init.d/httpd restart
httpd: Syntax error on line 35 of /usr/local/apache/conf/httpd.conf: module proxy_module …Run Code Online (Sandbox Code Playgroud) mod-proxy ×10
apache-2.2 ×7
apache-2.4 ×4
websocket ×2
500-error ×1
centos5 ×1
debian ×1
gunicorn ×1
linux ×1
mod-jk ×1
mod-rewrite ×1
proxypass ×1
ssl ×1
tomcat ×1