我正在尝试让 ProxyPass 在我的 OpenSUSE 13.1 安装上工作。
我试过了:
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_connect
systemctl restart apache2
systemctl reload apache2
Run Code Online (Sandbox Code Playgroud)
(所有组合语句都无济于事)。
我一遍又一遍地得到同样的错误:
SERVER:/etc/apache2 # apache2ctl start -f /etc/apache2/httpd-proxy.conf
AH00526: Syntax error on line 4 of /etc/apache2/httpd-proxy.conf:
Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration
Run Code Online (Sandbox Code Playgroud)
httpd-proxy.conf 看起来像:
<VirtualHost *:80>
DocumentRoot /srv/www/subsite
ServerName www.site.com/subsite
ProxyPass /subsite/ http://localhost:81
ProxyPassReverse /subsite/ http://localhost:81
</Virtualhost>
Run Code Online (Sandbox Code Playgroud)
有谁知道如何让这个 ProxyPass 语句起作用?
我们使用 mod_proxy 模块作为负载均衡器配置了两个 Apache 服务器作为前端和 4 个 tomcat 服务器作为后端。现在,我们想从 mod_proxy 负载均衡器中排除单个 tomcat url。有什么办法或规则可以排除吗?
代理平衡器设置:
<Proxy balancer://backend-cluster1>
BalancerMember http://10.0.0.1:8080 loadfactor=1 route=test1 retry=10
BalancerMember http://10.0.0.2:8080 loadfactor=1 route=test2 retry=10
</Proxy>
Run Code Online (Sandbox Code Playgroud) 我有 Apache2 与 PHP + PHP-FPM 配置根据:
http://wiki.apache.org/httpd/PHP-FPM
我正在编写一个脚本,需要很长时间才能在内部 Vhost 上执行,但一直超时,如果脚本在 30 秒内执行,一切都会完美运行。
我的 apache 日志告诉我:
[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:
Run Code Online (Sandbox Code Playgroud)
尝试运行脚本时,我在503 Service Unavailable执行时间刚好 30 秒后得到了一个。从逻辑上讲,这意味着我有一个超时指令或设置为 30 秒,但我在 Vhost 的配置中有这些:
Timeout 600
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
ProxyTimeout 600
</IfModule>
Run Code Online (Sandbox Code Playgroud)
(php-fpm 对我来说在端口 9001 上运行)
我也试过把Timeout和ProxyTimeout放在httpd.conf没有区别的地方。
似乎有另一个特定于 的超时设置mod_proxy_fcgi,但我找不到它。我从官方 tarball 安装了 Apache2 httpd,似乎没有一个 …
使用 mod_proxy 作为 SOAP Web 服务的反向代理时,我每隔几分钟就会收到此错误。每秒可能有 3 或 4 个请求,所以我们谈论的是每千个有此错误的请求中的 1 或 2 个。
[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] (20014)Internal error: proxy: error reading status line from remote server soap1.server:8888
[Tue Nov 23 11:44:14 2010] [error] [client 172.16.1.31] proxy: Error reading from remote server returned by /someapp/path/to/web/service
Run Code Online (Sandbox Code Playgroud)
这会导致请求失败。如果我让客户端在不使用代理的情况下直接连接到soap服务器,则成功率为100%,因此问题似乎出在代理上
配置看起来像这样。目的是在主服务器不可用时切换到备份服务器:
<Proxy balancer://apicluster>
BalancerMember http://soap1.server:8888 lbset=0
BalancerMember http://soap2.server:8888 lbset=1
</Proxy>
ProxyPass /someapp balancer://apicluster/someapp
ProxyPassReverse / balancer://apicluster/someapp
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过这个问题并找到了解决方法?错误报告中有一些提及,但没有解决方案。唯一可能不寻常的是客户端请求可能为 100MB 或更大,因此该请求可能比您预期的 SOAP 调用花费的时间长一点。
是否所有 ProxyPass 指令都需要 ProxyPassReverse 指令?
ProxyPass / http://foo.example.com:8080/
ProxyPassReverse / http://www.example.com/
Run Code Online (Sandbox Code Playgroud)
我看到了这个片段,并了解到所有流量都foo.example.com被代理到 foo.example.com:8080。第二行有什么作用?
我在端口 80 上运行 Apache 2.2.15,并希望在本地主机端口 8983 上代理 servlet 引擎。我在另一台服务器上运行设置,但已转移到 CentOS 6 机器。它不适用于新机器。我的虚拟主机配置:
代理请求关闭 <代理*> 订单拒绝,允许 所有人都允许 </代理> ProxyPass / http://localhost:8983/ ProxyPassReverse / http://localhost:8983/
如果我使用浏览器并直接访问它(并且不通过 Apache 代理),我可以访问端口 8983,但如果我访问/通过 Apache 服务器,则无法连接到它。
我可以将代理的内容更改为http://slashdot.org并且 Slashdot 成功代理(所以我知道它通常能够代理)。
我在 Apache 中打开调试登录,这是事务:
[Sun Apr 22 16:47:04 2012] [debug] mod_proxy_http.c(56): proxy: HTTP: canonicalising URL //localhost:8983/ [Sun Apr 22 16:47:04 2012] [debug] proxy_util.c(1506): [client 184.39.79.7] 代理:http: found worker http://localhost:8983/ for http://localhost:8983/ [Sun Apr 22 16:47:04 2012] [debug] mod_proxy.c(998):运行方案 http 处理程序(尝试 0) [Sun Apr 22 16:47:04 2012] [debug] …
有没有办法记录通过 mod 代理的请求?我需要一种方法来调试我的配置,因为我似乎没有到达我应该去的地方。我需要以下信息:
也许是一个相关的问题:有没有办法去除一些标题?我尝试了以下方法:
ProxyPass /proxy/other http://not.under.my.control/
<Location /proxy/other>
ProxyPassReverse /
RequestHeader unset Authorization
</Location>
Run Code Online (Sandbox Code Playgroud)
我真的不知道这是否可以,因为我什么也没看到。
我在 Karaf 托管的应用程序前部署 Apache(Apache 和 Karaf 在不同的服务器上)。我希望 Apache 作为反向代理运行并隐藏部分 URL。
直接从应用服务器获取应用登录页面的 URL 是http://app-server:8181/jellyfish. 页面由在 Karaf 中运行的 Jetty 实例提供服务。当然,这种行为通常会被防火墙阻止,除了反向代理服务器。
在关闭防火墙的情况下,如果您点击此 URL,则 Jetty 会加载登录页面。浏览器的地址栏正确更改为http://app-server:8181/jellyfish/login?0,一切正常。
我想要的是http://web-server(即从根)映射到应用程序服务器上的 Jetty,应用程序的名称 ( jellyfish) 被抑制。例如,浏览器将更改为显示http://web-server/login?0在地址栏中,并且所有后续 URL 和内容都将使用网络服务器的域提供服务,而不会出现jellyfish混乱。
我可以使用以下配置(代码段)让 Apache 作为简单的反向代理运行:-
ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/
Run Code Online (Sandbox Code Playgroud)
...但这需要浏览器的 URL 包含jellyfish并转到根 URL ( http://web-server) 会给出 404 Not Found。
我花了很多时间尝试使用mod_rewrite和不使用它的[P]标志来解决这个问题,但没有成功。然后我尝试了该ProxyPassMatch指令,但我似乎也无法完全正确。
这是当前配置,已加载到/etc/apache2/sites-available/Web 服务器上。请注意,有一个本地托管的图像目录。我还保留了mod_rewrite 代理漏洞利用保护,并抑制了一些mod_security会产生误报的规则。
<VirtualHost *:80> …Run Code Online (Sandbox Code Playgroud) 我的 httpd.conf 中有以下内容
<VirtualHost *:80>
ServerName foo.org
ServerAlias www.foo.org
<Proxy *>
Options FollowSymLinks MultiViews
Order allow,deny
Allow from all
AllowOverride All
</Proxy>
ProxyPass / http://127.0.0.1:5012/
ProxyPassReverse / http://127.0.0.1:5012/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这适用于所有对http://foo.org 的请求都使用不同的 Web 服务器从端口 5012 提供服务。但是,我只想通过 Apache 从端口 80提供http://foo.org/lib服务。我该怎么做?将以下行添加到 conf 没有帮助
Alias /lib /path/to/lib
<Directory "/path/to/lib">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud) 更新:在玩弄下面的两个答案后,我添加了一个修改后的问题。
你好呀,
如果您正在阅读本文,您可能熟悉 Apache 的 mod_proxy 及其 ProxyPass 功能。像许多其他人一样,我有一个可以从内部网络外部访问的应用程序的问题,但该应用程序本身可以访问不同机器上的其他内部应用程序,当您通过此设置进行远程访问时,事情变得不稳定。
所以,我的设置非常简单,我有:
机器 #1 启用了远程访问,我通过主机名访问它,它会吐出运行在它上面的 PHP 应用程序。
Machine #2 是一个运行 Django 的新应用程序,它使用完全不同的后端(甚至是 auth),它托管在单独的机器上。在我们的 Intranet 中,我们通过一个简单的命名主机名访问它,该主机名基本上链接到内部 192.168.0.101 ip。
我尝试使用 ProxyPass 来设置它,例如,传递到 /new 会将其发送到新应用程序:
ProxyPass /new http://192.168.0.101/
这种工作方式,它将请求发送到另一个应用程序,但它中断了,因为我的 Django 应用程序想要重定向到 /auth/login/,它立即无法识别。如果我自己将 url 修改为 foo.net/new/auth/login,我会得到我的登录页面,但正如您所猜测的那样,在整个浏览过程中这样做并不方便。
那么我怎样才能让 ProxyPass 像我想要的那样工作呢?我是否需要对 Apache 做一些事情,以便它总是在另一个应用程序中的 url 之前写入 /new ,或者这是我应该在我的 Django 应用程序中修改的内容吗?
任何提示和指针也将不胜感激。谢谢你的时间
apache-2.2 ×10
mod-proxy ×10
mod-rewrite ×2
proxy ×2
proxypass ×2
debug ×1
django ×1
httpd.conf ×1
linux ×1
logging ×1
php ×1
php-fpm ×1
tomcat ×1
web-server ×1