标签: mod-proxy

mod_proxy 超时 (502) 和故障转移

因此,我们正在运行一个由 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)

最好的,塞巴斯蒂安

failover load-balancing apache2 mod-proxy

5
推荐指数
1
解决办法
3479
查看次数

用于 Django 应用程序的 ProxyPass 和 ProxyPassReverse

我有一个来自我最初的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)

在此响应后查看我的 …

apache django mod-wsgi mod-proxy proxypass

5
推荐指数
1
解决办法
4924
查看次数

是否可以在 ProxyPass 中使用“%{HTTP_HOST}”?

我正在尝试使用 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} 。

apache mod-rewrite apache2 mod-proxy proxypass

5
推荐指数
1
解决办法
1万
查看次数

Sonatype Nexus:使用 Apache 从 SSL 代理

我们正在运行 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 mod-proxy nexus

5
推荐指数
1
解决办法
6094
查看次数

Apache HTTP Server mod_proxy 的转发代理上的预取请求正文失败

我使用 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 proxy mod-proxy httpd.conf httpserver

5
推荐指数
0
解决办法
5302
查看次数

Apache LocationMatch 正则表达式

我的问题

我需要有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提供的正则表达式是正确的:

我在这里缺少什么?

我很感激任何关于解决这个问题的建议!

regex apache proxy mod-proxy locationmatch

5
推荐指数
1
解决办法
4万
查看次数

Apache mod_proxy proxyPass匹配顺序

如果我有两个代理规则,并且它们“重叠”,有没有办法指定最重要的规则?

示例(虚拟主机定义的一部分。)

ProxyPass /foo http://bar:8180/
ProxyPass / http://bar:8181/
Run Code Online (Sandbox Code Playgroud)

这里所有流量都会被代理到http://bar:8181/,因为它首先匹配url。

有没有办法/foo/index.htmlhttp://bar:8180(代理通行证匹配上的顺序或类似)?

apache mod-proxy

5
推荐指数
1
解决办法
1233
查看次数

带有 apache mod_proxy_wstunnel 的 Websocket 不起作用

我做了一个很好的准备:Apache 2.4 + PHP7 + WebSocket
访问这个链接查看我的准备
细节:Cannot load modules/mod_proxy_wstunnel.so into server
但是当我运行一个简单的WebSocket演示时,我遇到了一些问题。我不知道如何解决它们。

Websocket 对我来说是一个新概念。我了解到 Apache 2.4 支持带有mod_proxy_wstunnel.so.
我的步骤:

  1. 编辑 httpd.conf,加载mod_proxymod_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)
  1. 添加代理(仍在 httpd 中)
ProxyPass /ws ws://10.180.0.123/
ProxyPassReverse /ws ws://10.180.0.123/
Run Code Online (Sandbox Code Playgroud)
  1. 创建 HTML 客户端和 PHP 服务器 ( 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)

mod-proxy websocket apache2.4

5
推荐指数
1
解决办法
6374
查看次数

Firebase Storage Downloadurl 自定义域

我的 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

5
推荐指数
0
解决办法
1225
查看次数

wordpress+docker+apache mod 代理重定向到 http://localhost

我的环境是,可以通过 访问在 apache 上运行 wordpress 的 docker 容器ip:port。主机环境有一个 apache 实例,它重定向使用 mod 代理的流量http://myurllocalhost: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 插件。但请注意,我也相应地更改了他们的配置。

  1. 可湿性粉剂支持加
  2. 管理员自定义登录

更新:这似乎在一定程度上解决了问题。

define('WP_HOME','http://8.8.8.8:8080');
define('WP_SITEURL','http://my.url.com');
Run Code Online (Sandbox Code Playgroud)

一些组件(主页按钮等)仍然可用,ip:port但系统可以正常工作。

php apache wordpress mod-proxy docker

5
推荐指数
1
解决办法
1177
查看次数