我用Apache 2和mod_proxy设置了一个Tomcat 6.现在我在server.xml中有这个默认值:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Run Code Online (Sandbox Code Playgroud)
netstat看起来像这样:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4703/apache2
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1020/sshd
tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 10517/java
tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 10517/java
tcp 0 0 127.0.0.1:8009 127.0.0.1:48704 ESTABLISHED 10517/java
tcp 0 0 127.0.0.1:48704 127.0.0.1:8009 ESTABLISHED 11696/apache2
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,AJP是否有必要在全球范围内收听8009端口,我不这么认为?!以及如何关闭它?
我在网上看到很多人指的是ProxyPreserveHost On确保代理后端接收原始呼叫者的主机名.我使用它来收紧我的Web应用程序的安全性(Java,Tomcat),如果我的日志显示用户实际所在的位置也会很好.我的Tomcat日志现在显示了这个 - 相当无用:
127.0.0.1 - - [17/Mar/2013:06:32:13 +0100] "GET /webapp/frontend/app/partials/welcome.html HTTP/1.1" 200 54
Run Code Online (Sandbox Code Playgroud)
这是我的配置,显然不能按预期工作:
"/ 000-缺省的/ etc/apache2的/启用的站点 - "
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass /webapp http://localhost:8080/webapp
ProxyPassReverse /webapp http://localhost:8080/webapp
RewriteEngine On
RewriteRule ^/$ /webapp/frontend/app/ [proxy]
RewriteRule ^/webapp/$ /webapp/frontend/app/ [redirect]
RewriteRule ^/webapp/app/$ /webapp/frontend/app/ [redirect]
Run Code Online (Sandbox Code Playgroud)
(从这里开始的默认内容000-default)
启用模块:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod rewrite
Run Code Online (Sandbox Code Playgroud)
这是运行Apache HTTPD 2.2.22的Ubuntu 12.10.
非常感谢您的帮助.
我有一个Web套接字和我的反向代理Apache的问题,我已经在最新版本2.4.5升级并加载了模块mod_proxy_wstunnel.
httpd.conf:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName www.toto.fr
ServerAlias toto.fr
ProxyPass /my_app http://1X.X.X.1:8080/my_app
ProxyPassReverse /web_pmr http://1X.X.X.1:8080/my_app
ProxyPassReverseCookiePath /my_app /
ProxyPassReverseCookieDomain localhost my_app
ProxyRequests off
ProxyTimeout 15
#WEBSOCKETS
ProxyPass /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/my_app/BasicWebsocketServlet retry=0
ProxyPassReverse /my_app/BasicWebsocketServlet ws://1X.X.X.1:8080/web_pmr/BasicWebsocketServlet retry=0
ErrorLog "logs/my_app_error.log"
LogLevel debug
CustomLog "logs/my_app_access.log" combined
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
当我在本地URL中测试时,websockets正在运行,但是使用反向代理Apache,Tomcat日志中没有跟踪.
我现在正在探索使用Apache的mod_proxy指令,例如ProxyPass,作为跨域脚本限制(对于html/ajax/flash代码)的解决方案的一部分.但是,我担心通过启用mod_proxy,我会冒险将服务器作为开放代理.
简而言之,风险是什么,以及如何最大限度地降低风险?
谢谢.
我正在尝试使用apache的代理模块在ubuntu桌面上使用xmpp.为此,我做了以下事情 -
1)通过在mods-enabled目录中的/ etc/apache2/mods-available /创建proxy.conf,proxy.load和proxy_http.load的符号链接来启用mod_proxy.
2)在vhost中添加以下行
<Proxy http://mydomain.com/httpbind>
Order allow,deny
Allow from all
</Proxy>
ProxyPass /httpbind http://mydomain.com:7070/http-bind/
ProxyPassReverse /httpbind http://mydomain.com:7070/http-bind/
Run Code Online (Sandbox Code Playgroud)
我是新手使用代理模块,但我可以从上面的行中做出的是将请求http://mydomain.com/httpbind转发到http://mydomain.com:7070/http-bind/.如果错了,请更正.
3)Allow from .mydomain.com在/mods-available/proxy.conf中添加了规则
现在我尝试访问http://mydomain.com/httpbind它显示403 Forbidden错误..
我在这里失踪了什么?请帮忙.谢谢
编辑:当我在mods_available/proxy.conf中更改以下代码时问题得到解决
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
Allow from mydomain.com
</Proxy>
Run Code Online (Sandbox Code Playgroud)
至
<Proxy *>
AddDefaultCharset off
Order deny,allow
#Deny from all
Allow from all
</Proxy>
Run Code Online (Sandbox Code Playgroud)
虽然没有得到初始代码的错误
他们说Apache的mod_rewrite是URL操纵的瑞士军刀,但它能做到吗?
假设我想在我的Apache网络服务器中添加一个新的应用程序,其中该应用程序唯一可配置的选项是端口号.
我想使用&提供" http://hostname.example.com/app " 形式的网址,而不是" http://hostname.example.com:8080 ".这将确保客户也能通过该机构的防火墙,而且通常更整洁.
我的应用程序包括php,javascript和css中的绝对URI,因此我想将自己的根位置添加到应用程序内部链接中的URI.我无法访问DNS记录,因此无法创建另一个基于名称的虚拟服务器.
使用Apache的mod_rewrite和mod_proxy模块,我可以透明地将客户端重定向到应用程序的正确主页.但该主页中的链接并未将客户端指向相对于新基本URL的链接.
那么,将请求代理到正在侦听特定端口的应用程序的最佳方法是什么?
例如,如果我有一个应用程序侦听端口8080,我可以把它放在我的Apache配置中: -
<VirtualHost *:80>
SSLProxyEngine On
ServerName myhost.example.com
RewriteEngine On
UseCanonicalName On
ProxyVia On
<Location "/application">
RewriteRule ^/application/?(.*) http://localhost:8080/$1 [P,L]
</Location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
如果应用程序不使用绝对URL,这可以正常工作,但确实如此.我需要做的是重写应用程序的css,javascript和php返回的URL.
我查看了ProxyPass和ReverseProxyPass文档,但我认为这些不会起作用..?
我也遇到过Nick Kew的mod_proxy_html,但这并没有包含在标准的Apache发布版中,而且我的机构的网络服务器似乎没有它好多年..除了手动拖网(或使用grep -r | sed)通过应用程序的源代码,或使用此第三方加载项,类型表达式,还有其他方法可以解决这个问题吗?
我可以在mod_rewrite规则中使用一些内部服务器变量吗?例如,基于'HTTP_REFERER'的重写规则?
使用Apache httpd 2.2,可以设置反向代理并使用mod_deflate压缩代理内容,以表达Accept-Encoding: gzip标题.
此配置足以使其工作:
LoadModule deflate_module modules/mod_deflate.so
LoadModule filter_module modules/mod_filter.so
SetOutputFilter DEFLATE
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyRequests Off
ProxyPass /tomcat http://localhost:8880/
ProxyPassReverse /tomcat http://localhost:8880/
ProxyPass /other http://localhost:8001/
ProxyPassReverse /other http://localhost:8001/
Run Code Online (Sandbox Code Playgroud)
现在升级到2.4(Windows上为2.4.29)后,接受相同的配置,它确实压缩了DocumentRoot提供的静态内容.但是,当通过ProxyPass检索时,相同的内容将以未压缩的形式返回.
我知道我可以配置Tomcat来进行压缩,但是还有另一个服务器忽略了Accept-Encoding头.
如何设置反向代理,并压缩代理内容?
编辑:
以下是返回的标头,证明代理内容未被2.4服务器压缩:
----- Retrieving uncompressed from DocumentRoot ---------------------------------
C:\Temp>curl -I http://localhost/test.txt
HTTP/1.1 200 OK
Date: Tue, 09 Jan 2018 17:11:59 GMT
Server: Apache/2.4.29 (Win64) OpenSSL/1.1.0g
Last-Modified: Fri, 05 Jan 2018 12:58:40 GMT
ETag: "75441-5620701eb471c"
Accept-Ranges: bytes
Content-Length: 480321
Vary: Accept-Encoding
Content-Type: text/plain …Run Code Online (Sandbox Code Playgroud) 我的网络服务器上运行了几个webapp:
https://beta.mydomain.tld/svn/reposhttps://beta.mydomain.tld/trachttp://beta.mydomain.tld/端口8080上的本地Apache Tomcat的代理访问请注意,前两个可通过SSL获得,第三个不是(尚未).现在我需要通过https提供我的网络应用程序,但我希望Trac和SVN浏览器仍可在其当前位置访问.
即我想配置的Apache2代理所有请求没有开始svn或trac到Tomcat.
对于现有的SSL Web应用程序,有以下配置
<Location /svn/repos>
DAV svn
SVNParentPath /home/myuser/svn
SVNListParentPath on
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /home/myuser/.htpasswd
Require valid-user
</Location>
<Location /trac>
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /home/myuser/trac
PythonOption TracUriRoot /trac
AuthType Basic
AuthName "Trac"
AuthUserFile /home/myuser/.htpasswd
Require valid-user
</Location>
Run Code Online (Sandbox Code Playgroud)
我试图添加以下位置,但它没有任何帮助...
<Location />
ProxyPass http://localhost:8080
ProxyPassReverse http://localhost:8080/
</Location>
Run Code Online (Sandbox Code Playgroud)
有关更多信息,这里是关于SSL部分的完整apache2配置(没有任何我失败的试验 - 我认为它是默认的trac配置):
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName beta.mydomain.tld:443
DocumentRoot /var/www/
<Directory /var/www/>
Options Indexes …Run Code Online (Sandbox Code Playgroud) 我使用mod_proxy_balancer来管理后端服务器的故障转移.后端服务器可能会返回错误代码,而不是在某些其他后端服务失败时(例如NFS)超时,我们希望此类服务器也被标记为失败的节点.因此我们使用failonstatus指令.
<Proxy balancer://avatar>
ProxySet failonstatus=503
BalancerMember http://active/ retry=30
# the hot standby
BalancerMember http://standby/ status=+H retry=0
</Proxy>
Run Code Online (Sandbox Code Playgroud)
目前,故障转移与一个故障完美配合.当活动节点发生故障时,用户会收到503错误,并且从下一个请求中,备用服务器将接管.
我甚至不希望一个请求失败.无法将mod_proxy故障转移到客户端并返回错误?如果活动节点出现故障,我希望mod_proxy为同一个请求尝试待机,而不仅仅是后续请求!
我在我的Ubuntu 14.04中使用php-fpm 5.5.9配置Apache 2.4.9.我想要的是为php-fpm请求制作一个平衡器,但它会抛出以下错误:
AH01071: Got error 'Primary script unknown\n'
当我尝试访问我的PHP文件.似乎代理平衡器不会抓取ProxyPassMatch传递给它的文档根目录.我正在使用UDS使apache访问php-fpm套接字而不是使用网络tcp.
如果我配置它没有平衡器,一切正常.
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/var/run/php5-fpm.sock1|fcgi://./var/www/html
Run Code Online (Sandbox Code Playgroud)
ProxyPassMatch ^/(.*\.php(/.*)?)$ balancer://localhost/var/www/html
<Proxy balancer://localhost/>
BalancerMember unix:/var/run/php5-fpm.sock1|fcgi://localhost:9001
BalancerMember unix:/var/run/php5-fpm.sock2|fcgi://localhost:9002
BalancerMember unix:/var/run/php5-fpm.sock3|fcgi://localhost:9003
BalancerMember unix:/var/run/php5-fpm.sock4|fcgi://localhost:9004
</Proxy>
Run Code Online (Sandbox Code Playgroud)
这是平衡器的配置日志:
[Sun Jun 15 12:32:30.839726 2014] [authz_core:debug] [pid 12217:tid 140330025703168] mod_authz_core.c(828): [client 10.1.1.2:52526] AH01628: authorization result: granted (no directives)
[Sun Jun 15 12:32:30.839899 2014] [lbmethod_byrequests:debug] [pid 12217:tid 140330025703168] mod_lbmethod_byrequests.c(97): AH01207: proxy: Entering byrequests for BALANCER (balancer://localhost)
[Sun Jun 15 12:32:30.839915 2014] [lbmethod_byrequests:debug] [pid 12217:tid 140330025703168] mod_lbmethod_byrequests.c(144): AH01208: proxy: byrequests …Run Code Online (Sandbox Code Playgroud) mod-proxy ×10
apache ×5
apache2 ×3
ajp ×1
apache2.4 ×1
failover ×1
mod-deflate ×1
mod-rewrite ×1
php ×1
port ×1
tomcat ×1
virtualhost ×1
websocket ×1
xmpp ×1