我正在尝试将子目录代理到另一个服务器。我的httpd . conf:
RewriteEngine On
ProxyPreserveHost On
RewriteRule .*subdir/ https://anotherserver/subdir/ [P]
问题是Apache总是记录这个:
AH01144: No protocol handler was valid for the URL /subdir/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., referer: http://localhost/
所以在网上搜索后,我激活了这些模块:
LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule rewrite_module modules/mod_rewrite.so
(我知道我不需要所有的,但我只是激活它们,以确保我没有错过一个)
但是这个错误仍然出现,客户端得到一个HTTP 500。
我该如何解决这个问题?
如果您没有启用mod_proxy_http
,则会发生这种情况
sudo a2enmod proxy_http
为了让我的基于https的负载平衡器工作,我必须启用以下内容:
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
要使我的Apache2.4 + php5-fpm安装开始工作,我需要激活以下Apache模块:
sudo a2enmod proxy
sudo a2enmod proxy_fcgi
不需要proxy_http
,这是将所有.php
文件直接发送到php5-fpm:
<FilesMatch .php$>
SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
</FilesMatch>
在我的情况下,我需要proxy_ajp
模块。
a2enmod proxy proxy_http proxy_ajp
在我的Apache/2.4.18 (Ubuntu)设置中发生了这种情况。在我的例子中,我看到的错误是:
... AH01144: No protocol handler was valid for the URL /~socket.io/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
与此相关的配置是:
ProxyPass /~socket.io/ ws://127.0.0.1:8090/~socket.io/
ProxyPassReverse /~socket.io/ ws://127.0.0.1:8090/~socket.io/
" No protocol handler was valid for the URL /~socket.io/
"意味着Apache无法处理发送到" ws://127.0.0.1:8090/~socket.io/
"的请求
我加载了proxy_http
,但也需要proxy_wstunnel
。
为将来参考澄清一下,a2enmod,正如上面几个答案所建议的那样,是Debian/Ubuntu的。Red Hat不使用这个来启用Apache模块,而是在httpd.conf中使用LoadModule语句。
更多:https://serverfault.com/questions/56394/how-do-i-enable-apache-modules-from-the-command-line-in-redhat
解决方案/正确答案在OP的评论中:
我认为你需要mod_ssl和SSLProxyEngine与ProxyPass - Deadooshka May 29 '14 at 11:35
@Deadooshka是的,这是工作。如果你把这个作为一个答案,我可以接受它- das_j May 29 '14 at 12:04
我在这里张贴一个答案,因为我有相同的错误消息,但不同的原因。
这个错误信息可能会发生,例如,如果您使用apache httpd从协议a上的源请求代理到协议b上的目标请求。
下面是我的情况的例子:
AH01144:没有协议处理程序对URL/sockjs-node/info有效(计划"ws")。
在上面的例子中,发生的事情简单如下:我已经启用了mod proxy代理websocket请求到基于path/sockjs-node的nodejs。
问题是节点不使用路径/sockjs-node的websocket请求独占。它也使用这个路径来承载REST入口点,这些入口点传递关于websockets的信息。
以这种方式,当应用程序尝试打开http://localhost:7001/sockjs-node/info时,apache httpd将尝试将其余调用从HTTP协议路由到Webscoket端点调用。
这会导致上面的异常。
所以要注意,即使你启用了正确的模块,如果你尝试做错误的转发,这将以apache httpd通知你,你试图在目标服务器上使用的协议是无效的结束。
在我的情况下,所有模块都正确设置(https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension是一个很好的初学者)&我有一个重定向工作的基础url,让我们说/mysite/
但我得到了任何子ULR的错误,比如/mysite/login/
http://reverse-proxy.dns.com/mysite/
被正确地重定向到远程服务器,而http://reverse-proxy.dns.com/mysite/login/
在Apache2反向代理中失败,并出现OP的错误消息。
问题是proxypass指令"/mysite/"中的结尾/
字符。子URL的工作配置是:
<Proxy balancer://mysite_cluster>
BalancerMember http://192.x.x.10:8080/mysite
BalancerMember http://192.x.x.11:8080/mysite
</Proxy>
<VirtualHost *:80>
[...]
ProxyRequests Off
ProxyPreserveHost On
ProxyPass "/mysite" "balancer://mysite_cluster"
ProxyPassReverse "/mysite" "balancer://mysite_cluster"
</VirtualHost>
尾随/
确实很棘手。
我试图让uwsgi://
工作,但不知何故,手册认为我很清楚,我实际上需要mod_proxy_uwsgi
。事实并非如此。如何编译mod_proxy_uwsgi或mod_uwsgi?
对于我来说,上述所有答案都在xampp上启用了,但仍然不起作用。启用下面的模块使虚拟主机再次工作
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so