因此,我们正在运行一个由 2 个以上后端服务器(恰好是 JBoss 服务器)组成的集群,这些服务器由 Apache 2.2 进行负载平衡。有时,后端服务器可能会变得无响应(这意味着它们将等待很长时间才能回复请求,但不会立即关闭连接)。这自然会导致 502“Bad gateway”错误。我对负载均衡器的理解是,它应该进行故障转移并将请求重定向到其余实例。
我已经看到平衡器的节点可以进入错误状态,但永远无法强制将其发送到该状态(即在遇到第一个 502 后执行此操作)。我错过了什么还是这只是我想要的功能?哦,这是我的配置:
<Proxy balancer://s>
Order deny,allow
Allow from all
BalancerMember http://host1:8080/ route=h1 timeout=20 retry=40
BalancerMember http://host2:8080/ route=h2 timeout=20 retry=40
</Proxy>
# Distribute by Round Robin, use Sticky Sessions
ProxyPass / balancer://s/ stickysession=JSESSIONID lbmethod=byrequests nofailover=On
ProxyPassReverse / http://host1:8080/
ProxyPassReverse / http://host2:8080/
Run Code Online (Sandbox Code Playgroud)
最好的,塞巴斯蒂安
我有一个来自我最初的Django 服务问题的后续问题,即如何开发 Django 应用程序并从与我的主要基于 PHP 的站点相同的服务器为它们提供服务(所有这些都是我的网站从静态和 PHP 驱动的网站进行更大迁移的一部分)到一系列 Django 应用程序)。
我不能完全使用我提供的名称服务器解决方案,而是使用 mod_wsgi 将我的 Django 应用程序部署在不同的端口 (8000) 上。但是,现在我需要将 Django 应用程序实际集成到主站点中。在我的 Apache 2.0 配置文件(例如http://www.example.com)中,我添加了以下 ProxyPass 命令(在我的 mod_wsgi 初始化之后):
ProxyPass /app/newsletter http://www.example.com:8000/app/newsletter
ProxyPassReverse /app/newsletter http://www.example.com:8000/app/newsletter
Run Code Online (Sandbox Code Playgroud)
在这里,我希望任何请求:
http://www.example.com/app/newsletter
Run Code Online (Sandbox Code Playgroud)
将成功代理到:
http://www.example.com:8000/app/newsletter
Run Code Online (Sandbox Code Playgroud)
一切都会好起来的。
然而,这种情况并非如此。Apache 挂起 5 分钟左右(制作此问题所需的时间)然后吐出502 代理错误:
Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /app/newsletter/.
Reason: Error reading from remote server
Run Code Online (Sandbox Code Playgroud)
在此响应后查看我的 …
我正在尝试使用 apache2 和 mod_proxy 实现透明代理,但目前它不执行任何操作。只是将流量转发到正确的“主机”。
我不希望它依赖于主机 - 但希望它是动态的,因此它适用于所有主机。我尝试这样做:
RewriteEngine on
RewriteLogLevel 5
RewriteLog "/var/log/apache2/rewrite.log"
RewriteRule ^(.*)$ $1
ProxyPass / http://$1
Run Code Online (Sandbox Code Playgroud)
我还尝试了其他几种方法(没有效果)。有什么方法可以从标头访问“主机”并在 ProxyPass 指令中使用它?
在 nginx 中,我会使用 $host、$remote_addr 等。有什么方法可以在 apache 上替换它吗?
我需要的是能够访问 ProxyPass 命令内的 %{HTTP_HOST}、%{REQUEST_URI} 和 %{SERVER_PORT} 。
我们正在运行 Sonatype 的 Nexus 来存储我们所有的构建、缓存我们的依赖项等。但是,我想远离默认安装的端口8081URL,而是通过 Apache 代理通过 SSL 托管它。我已经设置了 Apachemod_proxy来代理它,这样就可以https://myserver.com/nexus启动 Nexus。我在我的虚拟主机配置中使用了以下配置指令:
# Configure mod_proxy to be used for proxying URLs on this site to other URLs/ports on this server.
ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all
</Proxy>
# Proxy the Sonatype Nexus OSS web application running at http://localhost:8081/nexus
<Location /nexus>
ProxyPass http://localhost:8081/nexus
ProxyPassReverse http://localhost:8081/nexus
</Location>
Run Code Online (Sandbox Code Playgroud)
这似乎与Running Nexus behind a Proxy中的说明相符。但是,我无法清除 Nexus 中的“基本 URL”设置:它不会让我将其留空。
一切 …
我使用 Apache HTTP Server mod_proxy 作为我的客户端和服务器之间的代理服务器。我能够从我的客户端连接到我的代理服务器。然后客户端能够建立连接并将数据发送到服务器。但在中间,某处连接丢失,并给出以下错误:
(OS 10054)An existing connection was forcibly closed by the remote host. : proxy: prefetch request body failed to 10.131.x.x:80 (10.131.x.x) from 10.131.y.y ()
Run Code Online (Sandbox Code Playgroud)
我曾尝试添加 keep alive 和其他属性,但它没有解决我的问题。这是我的 httpd.config 文件更改:
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
<IfModule mod_proxy.c>
ProxyRequests On
ProxyVia On
</IfModule>
<Proxy *>
Order deny,allow
Deny from all
Allow from 10.131.x.x
</Proxy>
Run Code Online (Sandbox Code Playgroud)
还添加了这个变量:
KeepAlive On
MaxKeepAliveRequests 0
KeepAliveTimeout 15
Listen 8080
Run Code Online (Sandbox Code Playgroud)
请需要知道是否有人遇到过同样的问题并解决了它。
谢谢,阿林达姆。
我的问题
我需要有Apache HTTP Server (v2.4.10) 代理对Tomcat 的动态应用请求,这不仅与Tomcat 中的路径不匹配,而且彼此的路径也相似。例如:
/products/<category>/<sub-category>/<sub-sub-category>/<product-id>.html 代理: http://mycluster/pf/<product-id>.html
...并且...
/products/<category>/<sub-category>/<sub-sub-category>/<anything-not-ending-in-html> 代理: http://mycluster/search/<anything-not-ending-in-html>
我的尝试
我正在尝试使用 LocationMatch 正则表达式来处理这个问题,但并没有完全成功。以下 LocationMatch 正则表达式自行工作(将*.html请求代理到<tomcat>/pf/*.html):
<LocationMatch ^/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)/(?<partnum>.+).html>
ProxyPass balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
ProxyPassReverse balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
这使用以下示例路径传递 URL:(/products/aaa/bbb/ccc/ddd3456.html这是正确的)
但是,当我还启用下面的正则表达式时:
<LocationMatch ^(?!.*\.html$)/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)((/?)|(./*))$>
ProxyPass balancer://mycluster/search/
ProxyPassReverse balancer://mycluster/search/
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)
尝试访问/products/aaa/bbb/ccc/404 页面中的结果。在这里,我期待对“/products/aaa/bbb/ccc/”的任何不以 .html 结尾的请求传递给 /search/(包括要包含的任何后续路径信息:例如 .../search/相比 )
我的问题
我无法完全弄清楚出了什么问题。根据Rubular提供的正则表达式是正确的:
我在这里缺少什么?
我很感激任何关于解决这个问题的建议!
如果我有两个代理规则,并且它们“重叠”,有没有办法指定最重要的规则?
示例(虚拟主机定义的一部分。)
ProxyPass /foo http://bar:8180/
ProxyPass / http://bar:8181/
Run Code Online (Sandbox Code Playgroud)
这里所有流量都会被代理到http://bar:8181/,因为它首先匹配url。
有没有办法/foo/index.html去http://bar:8180(代理通行证匹配上的顺序或类似)?
我做了一个很好的准备:Apache 2.4 + PHP7 + WebSocket
访问这个链接查看我的准备
细节:Cannot load modules/mod_proxy_wstunnel.so into server
但是当我运行一个简单的WebSocket演示时,我遇到了一些问题。我不知道如何解决它们。
Websocket 对我来说是一个新概念。我了解到 Apache 2.4 支持带有mod_proxy_wstunnel.so.
我的步骤:
mod_proxy和mod_proxy_wstunnel(当然都在 apachedir/modules 中)LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
Run Code Online (Sandbox Code Playgroud)
ProxyPass /ws ws://10.180.0.123/
ProxyPassReverse /ws ws://10.180.0.123/
Run Code Online (Sandbox Code Playgroud)
cd apachedir/htdocs)客户端.html
<html>
<script>
var socket = new WebSocket("ws://10.180.0.123/server.php");
socket.onopen = function(e){
console.log("open success");
}
socket.onmessage = function(e){
console.log("mes:"+e);
}
//socket.close();
socket.send("Hello World");
</script>
<html>
Run Code Online (Sandbox Code Playgroud)
服务器.php
<?php …Run Code Online (Sandbox Code Playgroud) 我的 Firebase 应用程序的一部分是向用户提供 Firebase 存储上的 PDF 文件。当他们打开这些文件时,所有用户都可以看到存储桶下载网址,例如:
https: //firebasestorage.googleapis.com/v0/b/my-project/o/file.PDF ?alt=media&token=5btfzb29-f3cf-4557- 8741-bfd3f12b1e86I
我想在以下位置提供文件:
https://custumdomain.com/file.PDF
?alt=media&token=5btfzb29-f3cf-4557-8741-bfd3f12b1e86I 因为我在 Firebase 控制台或云存储中找不到任何选项为了实现这一点,所以我尝试设置 .htaccess 重定向。我尝试过:
RewriteEngine On
RewriteRule ^(.*)$ https://firebasestorage.googleapis/$1 [P]
显示了请求的文档,但用户也被明显重定向。所以我的问题分为两个部分:
1. 这是实现我的目标的正确方法吗?云存储是否提供更简单的解决方案?
2. 为什么我的代理标志没有按预期工作?我需要更改什么才能隐藏重定向?
apache mod-rewrite mod-proxy google-cloud-storage firebase-storage
我的环境是,可以通过 访问在 apache 上运行 wordpress 的 docker 容器ip:port。主机环境有一个 apache 实例,它重定向使用 mod 代理的流量http://myurl(localhost:port我与同一主机中的其他 docker 容器进行了相同的设置,工作正常)。但是访问http://myurl(更改 WordPress 配置后)只会将您重定向到 localhost(在 WordPress 容器的 apache 日志中,我可以看到它给出了 301 来重定向您)。
仅当您访问基本网址时才会出现问题。(http://myurl/wp-login.php有效)
主机 Apache 配置:
<VirtualHost *:80>
ServerName my.url.com
<IfModule mod_proxy.c>
ProxyRequests Off
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
</IfModule>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这有效(在wp-config.php):
define('WP_HOME','http://8.8.8.8:8080');
define('WP_SITEURL','http://8.8.8.8:8080');
Run Code Online (Sandbox Code Playgroud)
这不
define('WP_HOME','http://my.url.com');
define('WP_SITEURL','http://my.url.com');
Run Code Online (Sandbox Code Playgroud)
这些是我启用的 WordPress 插件。但请注意,我也相应地更改了他们的配置。
更新:这似乎在一定程度上解决了问题。
define('WP_HOME','http://8.8.8.8:8080');
define('WP_SITEURL','http://my.url.com');
Run Code Online (Sandbox Code Playgroud)
一些组件(主页按钮等)仍然可用,ip:port但系统可以正常工作。