如何设置一个 apache mod-proxy 服务器来从一个单独的指定服务器提供内容,这样我就可以在不重新启动 apache 的情况下更改从哪个服务器提供内容?
内容服务器会定期更改,要么是为了维护,要么是因为故障。
我有一个不需要在集群中的应用程序,但我希望在主应用程序服务器崩溃时显示静态版本的网页。
我还想要更新服务器上的代码库的选项,测试它,然后切换旧的实时服务器。
我已经设置了 mod_proxy 使用
ProxyPass / http://appserver.com
ProxyPassReverse / http://appserver.com
Run Code Online (Sandbox Code Playgroud)
这有效,但接缝需要使用不同的设置重新启动以改变方向。这违背了在实时服务器上使用它的目的。
我也尝试过 mod_balencer,它非常适合故障转移,但需要重新启动 apache 才能在备份时将其设置回为主应用程序服务器提供服务。
ProxyPass / balancer://hotcluster/
<Proxy balancer://hotcluster>
BalancerMember http://dyn:80 loadfactor=1
BalancerMember http://basic:80 status=+H
ProxySet lbmethod=bytraffic
</Proxy>
Run Code Online (Sandbox Code Playgroud)
有没有办法可以在不重新启动 apache 的情况下设置当前的应用程序服务器?
我正在尝试使用以下规则(基于“使用 Apache 安装 Plone ”)将传入的网络流量转发到我的 Ubuntu 设置上的 Plone 服务器:
<VirtualHost *:80>
ServerAlias www.mydomain.com
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPreserveHost On
ProxyPass / http://localhost:7373/VirtualHostBase/http/mydomain.com:80/plonesite/VirtualHostRoot/
ProxyPassReverse / http://localhost:7373/VirtualHostBase/http/mydomain.com:80/plonesite/VirtualHostRoot/
#ProxyPass / http://localhost:7373/ukpa/
#ProxyPassReverse / http://localhost:7373/ukpa/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
然而,这两种变体都会产生内部服务器错误,在日志中显示为:
[警告] 代理:没有协议处理程序对 URL / 有效。如果您使用的是 mod_proxy 的 DSO 版本,请确保使用 LoadModule 将代理子模块包含在配置中。
我可以通过 lynx 使用地址http://localhost:7373/ukpa/在本地浏览到该站点(因此注释掉的尝试只是转发到底部的那个)。
我哪里错了?
我有一个文件夹用于反向代理的 apache:
<VirtualHost *:80>
...
ProxyPass /site http://server.local:8989/site
ProxyPassReverse /site http://server.local:8989/site
</VirtualHost *:80>
Run Code Online (Sandbox Code Playgroud)
如何禁用 url 的 /site/IMAGES/* 代理?
我在让 proxypass 在 apache 中工作时遇到问题。
我的配置文件如下:
<VirtualHost 1.2.3.4:443>
ServerName example.com
ServerAlias www.example.org
ServerAdmin info@example.org
DocumentRoot /home/admin/web/knyz.org/public_html
ScriptAlias /cgi-bin/ /home/admin/web/knyz.org/cgi-bin/
Alias /vstats/ /home/admin/web/knyz.org/stats/
Alias /error/ /home/admin/web/knyz.org/document_errors/
#SuexecUserGroup admin admin
CustomLog /var/log/apache2/domains/knyz.org.bytes bytes
CustomLog /var/log/apache2/domains/knyz.org.log combined
ErrorLog /var/log/apache2/domains/knyz.org.error.log
<Directory /home/admin/web/knyz.org/public_html>
AllowOverride All
SSLRequireSSL
Options +Includes -Indexes +ExecCGI
</Directory>
<Directory /home/admin/web/knyz.org/stats>
AllowOverride All
</Directory>
SSLEngine on
SSLVerifyClient none
SSLCertificateFile /home/admin/conf/web/ssl.knyz.org.crt
SSLCertificateKeyFile /home/admin/conf/web/ssl.knyz.org.key
SSLCertificateChainFile /home/admin/conf/web/ssl.knyz.org.ca
<IfModule mod_ruid2.c>
RMode config
RUidGid admin admin
RGroups www-data
</IfModule>
<IfModule itk.c>
AssignUserID admin admin
</IfModule>
IncludeOptional /home/admin/conf/web/sapache2.knyz.org.conf*
##ISSUE …Run Code Online (Sandbox Code Playgroud) 是否可以mod_proxy在带有 http2 协议的 Apache Tomcat 8.5 前面使用?如果是,很高兴看到示例配置。
编辑
具体做法是:是否可能,建议使用http2的客户端和服务器之间(Apache httpd),并继续与数据流ajp之间Apache httpd和Apache Tomcat?
编辑 2
此答案提供了有关该主题的一些详细信息:
我在 Ubuntu 14.04 LTS 上运行 Apache 2.4.7 作为反向代理。这个 Apache 服务器充当许多不同后端应用程序的入口点,这些应用程序通过<Location>块中不同的 mod_proxy 配置进行访问
我需要提供对使用 WebSocket 的应用程序的反向代理访问。该应用程序是一个 Java Spring 应用程序,它通过 HTTP 提供 HTML 和其他静态文件,然后在页面加载后使用 WebSocket 获取动态数据。
我已经Nginx使用以下配置运行了应用程序:
location /newapp/ {
proxy_pass http://newapp.example.com:8080/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,由于需要一个在 Nginx 上不可用的 Apache 身份验证模块,我无法在生产中使用它。
我想要做的是,在伪 Apache-config 中:
<Location /newapp/>
if not WebSockets:
ProxyPass http://newapp.example.com:8080/
ProxyPassReverse /
else
ProxyPass ws://newapp.example.com:8080/
ProxyPassReverse /
</Location>
Run Code Online (Sandbox Code Playgroud)
Apachemod_proxy_wstunnel模块让我觉得这应该是可能的。WebSocket 是在 URL 上访问的/api/socket/...,因此我尝试将ProxyPass使用单独<Location>块的两种类型分开:
<Location /newapp/> …Run Code Online (Sandbox Code Playgroud) 我有mod_proxy将请求传递给 Tomcat 的Apache 。问题是,当我在 Tomcat 上托管的 Web 应用程序中获取与请求关联的客户端 IP 地址时,它总是返回 127.0.0.1。
是否可以让 Apache 将原始 IP 地址传递给 Tomcat?
我们在几个 tomcat 前面运行一个 apache 反向代理。有时我们想知道请求被转发到哪个服务器。因为我们使用 mod_proxy_balancer。
我试过
\"%{X-Forwarded-Server}i\"
Run Code Online (Sandbox Code Playgroud)
但这不起作用。它显示了我的负载均衡器 (apache) 的名称
我如何记录选择了哪个工人?
最近我注意到我的服务器通过netstat -na.
为了找出它发送的内容,我尝试了:
tcpdump -i eth0 host 121.11.76.48 -nnvvXSs 1514
Run Code Online (Sandbox Code Playgroud)
并发现它不断向此位置发送 HTTP 请求:
22:55:21.179353 IP (tos 0x0, ttl 64, id 26103, offset 0, flags [DF], proto: TCP (6), length: 296) 192.168.1.13.58155 > 121.11.76.48.80: P, cksum 0x880b (incorrect (-> 0xd884), 1904784743:1904784999(256) ack 915059568 win 46
0x0000: 4500 0128 65f7 4000 4006 4ce8 c0a8 010d E..(e.@.@.L.....
0x0010: 790b 4c30 e32b 0050 7188 b567 368a b370 y.L0.+.Pq..g6..p
0x0020: 5018 002e 880b 0000 4745 5420 2f20 4854 P.......GET./.HT
0x0030: 5450 2f31 2e31 …Run Code Online (Sandbox Code Playgroud) 我有一台运行 mod_proxy 的服务器,我需要重命名请求标头。更接近原点的代理正在剥离 X-Forwarded-For 标头,但我们需要保留该数据,因此我想将该值添加到不同的标头以允许原点拾取它。
从我对 doco 的阅读来看,无法重命名标头,而且我看不到如何将值传递到 RequestHeader add in mod_headers 中。
我在 httpd.conf 中添加了以下内容(在 VirtualHost 之后):
<VirtualHost *:80>
ServerName XXX.XXX.XXX
<Directory proxy:>
Order allow,deny
Allow from 10.52.208.221
Allow from 10.52.208.223
Deny from all
</Directory>
ProxyPass / http://XXX.XXX.XXX/
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/admin/$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
但是,我可以从其他 IP 访问我的 VirtualHost:
# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
# uname -a
Linux XXXXX.XXXXX.XXX 2.6.32-358.18.1.el6.x86_64 #1 SMP Fri Aug 2 17:04:38 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux
# httpd -V
Server version: Apache/2.2.15 (Unix)
Server built: Aug 2 …Run Code Online (Sandbox Code Playgroud) 我有几个 servlet 侦听无法从外部访问的内部端口。我使用 ApacheProxyPass和ProxyPassReverse指令从端口 443 安全地为它们提供服务:
ProxyPass /media http://localhost:9002/
ProxyPassReverse /media http://localhost:9002/
Run Code Online (Sandbox Code Playgroud)
这工作正常 -https://example.com/media从http://localhost:9002/.
当 URL 具有不同部分时会出现问题。例如:
https://example.com/image/IMAGE_NAME_1应该从http://localhost:9002/image/IMAGE_NAME_1.
并且https://example.com/image/IMAGE_NAME_2应该从http://localhost:9002/image/IMAGE_NAME_1.
我尝试了一些变化,包括:
RewriteEngine on
RewriteRule ^/image/(.*)$ http://localhost:9002/image/$1 [L,PT]
ProxyPass /image/ http://localhost:9002/image
ProxyPassReverse /image/ http://localhost:9002/image
Run Code Online (Sandbox Code Playgroud)
但是这种配置会导致Bad Request浏览器和
Invalid URI in request GET /image/1 HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
在日志中。
如何代理 URL 具有不同部分的内部 servlet?
我正在尝试在 Ubuntu 机器上设置一个 Moodle 服务器,该机器已经通过 Apache 为 Plone & Trac 提供服务。
在我的 Moodle 配置中,我有 $CFG->wwwroot = ' http://www.server-name.org/moodle '
下面的(复杂但有效的)配置适用于前两个,但是当我访问 www.server-name.com/moodle 时,我得到:
检测到访问错误,此服务器只能通过“ http://xxx.xxx.xxx.xxx:8888/moodle ”地址访问,抱歉
然后它转发到 IP 地址,在那里 Moodle 可以正常工作。
我缺少什么才能使服务器名称方法正常工作?
Apache 配置如下:
LoadModule transform_module /usr/lib/apache2/modules/mod_transform.so
Listen 8080
Listen 8888
Include /etc/phpmyadmin/apache.conf
<VirtualHost xxx.xxx.xxx.xxx:8080>
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPreserveHost On
<Location />
ProxyPass http://127.0.0.1:8082/
ProxyPassReverse http://127.0.0.1:8082/
</Location>
</VirtualHost>
<VirtualHost xxx.xxx.xxx.xxx:80>
ServerName www.server-name.org
ServerAlias server-name.org
ProxyRequests Off
FilterDeclare MyStyle RESOURCE
FilterProvider MyStyle XSLT resp=Content-Type $text/html
TransformOptions +ApacheFS …Run Code Online (Sandbox Code Playgroud) mod-proxy ×13
apache-2.2 ×10
apache-2.4 ×3
mod-rewrite ×2
tomcat ×2
http2 ×1
https ×1
logging ×1
mod-ssl ×1
moodle ×1
proxy ×1
rewritecond ×1
security ×1
ssl ×1
websocket ×1