20

I am trying to configure a reverse proxy with apache, but I am getting a No protocol handler was valid for the URL error, which I do not understand.

This is the relevant configuration of apache:

ProxyRequests Off
ProxyPreserveHost On

<Proxy *>
       Order deny,allow
       Allow from all
</Proxy>

ProxyPass        /gonvaled/examples/jsonrpc/output/services/ http://localhost:8000/services/
ProxyPassReverse /gonvaled/examples/jsonrpc/output/services/ http://localhost:8000/services/

The requests is reaching apache as:

POST /gonvaled/examples/jsonrpc/output/services/EchoService.py HTTP/1.1

And they should be forwarded to my internal service, located at:

0.0.0.0:8000/services/EchoService.py

These are the logs:

==> /var/log/apache2/error.log <==
[Wed Jun 20 02:05:20 2012] [debug] proxy_util.c(1506): [client 127.0.0.1] proxy: http: found worker http://localhost:8000/services/ for http://localhost:8000/services/EchoService.py, referer: http://localhost/gonvaled/examples/jsonrpc/output/JSONRPCExample.safari.cache.html
[Wed Jun 20 02:05:20 2012] [debug] mod_proxy.c(998): Running scheme http handler (attempt 0)
[Wed Jun 20 02:05:20 2012] [warn] proxy: No protocol handler was valid for the URL /gonvaled/examples/jsonrpc/output/services/EchoService.py. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
[Wed Jun 20 02:05:20 2012] [debug] mod_deflate.c(615): [client 127.0.0.1] Zlib: Compressed 614 to 373 : URL /gonvaled/examples/jsonrpc/output/services/EchoService.py, referer: http://localhost/gonvaled/examples/jsonrpc/output/JSONRPCExample.safari.cache.html

==> /var/log/apache2/access.log <==
127.0.0.1 - - [20/Jun/2012:02:05:20 +0200] "POST /gonvaled/examples/jsonrpc/output/services/EchoService.py HTTP/1.1" 500 598 "http://localhost/gonvaled/examples/jsonrpc/output/JSONRPCExample.safari.cache.html" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19"
26

I found the problem. The proxy_http module needs to be activated too in Apache (I had only proxy_html and proxy)

23

For me, on apache httpd 2.4, this happened because i was missing the trailing slash:

Did not work:

    <Proxy balancer://mycluster>
        BalancerMember http://192.168.111.7
        BalancerMember http://192.168.111.80
    </Proxy>
    ProxyPass / balancer://mycluster
    ProxyPassReverse / balancer://mycluster

Worked!

    <Proxy balancer://mycluster>
        BalancerMember http://192.168.111.7
        BalancerMember http://192.168.111.80
    </Proxy>
    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/

(added / at the end)

  • For me, apache 2.2.15, <kbd>/</kbd> at the end works. THX! – user580056 Apr 7 '16 at 7:18
  • helped me on Apache/2.4.10 (Debian). This needs to be documented! The error message is extremely obtuse – DeveloperChris Oct 11 '16 at 2:39
2

For those that come looking for answers, another possibility is the URL service name to backend too is missing. With LogLevel Debug, and mod_proxy and mod_proxy_fcgi, I was seeing the following:

[debug] proxy: fgci: found worker fgci://127.0.0.1:9000/var/www/html/.../index.php [debug] mod_proxy.c(1026): Running scheme fgci handler (attempt 0) [debug] mod_proxy_fcgi.c(800): [client ...] AH01076: url: fgci://127.0.0.1:9000/var/www/html/.../index.php proxyname: (null) proxyport: 0 [debug] mod_proxy_fcgi.c(805): [client ...] AH01077: declining URL fgci://127.0.0.1:9000/var/www/html/.../index.php [warn] proxy: No protocol handler was valid for the URL /.../index.php. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Thankfully the code for mod_proxy_fastcgi (I'm using a backport for Apache 2.2 on RHEL6) is available at https://github.com/ceph/mod-proxy-fcgi/blob/master/mod_proxy_fcgi.c#L805, which is this piece of code:

if (strncasecmp(url, "fcgi:", 5) != 0) {
    ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01077) "declining URL %s", url);
    return DECLINED;
}

If you look closely at the logs -- I only noticed it when looking at the code that issues the message -- you'll see that what should be fcgi://... is misspelt as fgci://...

So when you see declining URL it means either:

  • You don't have a handler loaded that accepts the service (eg. fcgi:), or
  • you have misspelt the service name.
  • I upvoted because of the "When you see this error it means..." portion of this answer. I feel that this should lead most searchers in the right direction. – threeve Aug 8 '17 at 19:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.