I'm still trying to figure out what is actually happening here and I have a result that is truly confusing now.
I decided to just route everything to php-fpm, mainly to check that it is actually active, and I used a file that would have been routed there by ProxyPass/ProxyPassMatch anyhow, so I would have expected php-fpm to run and give me an html page as output. Here's what happened: I set the ProxyPass directive to: ProxyPass / "fcgi://127.0.0.1:9000" enablereuse=on and got the response: Proxy Error The proxy server received an invalid response from an upstream server. The proxy server could not handle the request GET /testfcgi.php. Reason: DNS lookup failure for: 127.0.0.1:9000testfcgi.php So, we know two things (I thought) - first that php-fpm is actually working, and second that we need a / after the socket number to separate the php file name. This should have gone to the root directory given in the php-fpm configuration, ( chdir=/httpd/iliffe ) not to the DNS, right? So, I changed the ProxyPass directive ProxyPass / "fcgi://127.0.0.1:9000/" enablereuse=on and I get: File not found. With the Loglevel set to debug in Apache and all incoming requests being proxied to php-fpm, I get: No input file specified. from the browser with a log entry of [Thu Apr 13 13:04:36.552776 2017] [proxy_fcgi:error] [pid 22944:tid 139858336442112] [client 192.168.1.10:48876] AH01071: Got error 'Unable to open primary script: /httpd/iliffe/testfcgi.php (No such file or directory)\n' I didn't paste all the other entries as they are irrelevant to this situation. BUT: [root@prod04 John]# ls -al /proc/22943/root/httpd/iliffe/test* -rw-rw-r--. 1 John John 5740 Apr 12 16:40 /proc/22943/root/httpd/iliffe/testfcgi.php So httpd's path includes the php file that I called. So, tried php-fpm to see if it couldn't find the proper path: [root@prod04 John]# ps -ef | grep php root 22100 1 0 12:16 ? 00:00:00 php-fpm: master process (/usr/php-7.1.3/etc/php-fpm.conf) phpfpm 22101 22100 0 12:16 ? 00:00:00 php-fpm: pool www phpfpm 22102 22100 0 12:16 ? 00:00:00 php-fpm: pool www [root@prod04 John]# ls -al /proc/22100/root/httpd/iliffe/test* -rw-rw-r--. 1 John John 5740 Apr 12 16:40 /proc/22100/root/httpd/iliffe/testfcgi.php So php-fpm can also see the php file. I have no idea why either php-fpm or httpd, whichever is throwing the error, can't find the file. It seems that this problem is fairly common, for example: https://serverfault.com/questions/450628/apache-2-4-php-fpm-proxypassmatch But this is from 2013, and they resolved it with rewrite rules. With all the web sites on the Internet using Apache I'm sure that there is a current solution that actually works! Has anyone got any ideas? Thanks, John ========================================== On Thursday 13 April 2017 11:10:47 you wrote: > On Wednesday 12 April 2017 22:24:03 Frank wrote: > > On 12/04/17 08:36 PM, John Iliffe wrote: > > > See below. > > > > > > On Wednesday 12 April 2017 20:02:10 Frank wrote: > > >> On 12/04/17 05:34 PM, John Iliffe wrote: > > >>> I am converting my web pages from mod_php to php-fpm, following > > >>> the directions found at: https://wiki.apache.org/httpd/PHP-FPM > > >>> Testing to date indicates that on this server all scripts work > > >>> properly under mod_php. > > >>> > > >>> Both of the following were tried within a <VirtualHost> container > > >>> for the default virtual host. > > >>> > > >>> If I use the "simple" approach from the Wiki: > > >>> ProxyPass "/*.php/" "fcgi://127.0.0.1:9000" enablereuse=on > > >>> > > >>> then the page SOURCE is displayed, PHP never executes. Adding a > > >>> first line of #! /path-to-php-executable doesn't accomplish > > >>> anything. Neither way leads to any errors showing in the php-fpm > > >>> log. > > >>> > > >>> > > >>> Using the "more flexible" approach: > > >>> > > >>> ProxyPassMatch ^/(.*\.php(/.*)?)$ > > >>> fcgi://127.0.0.1:9000/httpd/iliffe/$1 > > >>> > > >>> enablereuse=on > > >>> > > >>> Gives me a "No Input File Specified" error. This line was cribbed > > >>> from the Wiki example and the path /httpd/iliffe/ is precisely > > >>> where the php script lives, based on the server root and not the > > >>> document root as noted in the Wiki article. > > >>> > > >>> There is no php-fpm error message issued in either case and the > > >>> Apache error entry for the ProxyPassMatch case is: > > >>> > > >>> [Wed Apr 12 16:50:28.688837 2017] [proxy_fcgi:error] [pid > > >>> 13574:tid 140145512003328] [client 192.168.1.10:45240] AH01071: > > >>> Got error 'Unable to open primary script: > > >>> /httpd/iliffe/testfcgi.php (No such file or directory)\n' > > >>> > > >>> I am using mostly the defaults in the php-fpm config and pool > > >>> config files. The default path to the php executable has been > > >>> updated to point to where it really is. > > >>> > > >>> Can anybody see what I might have missed? > > >>> > > >>> Thanks in advance. > > >>> > > >>> John > > >>> ========================================= > > >>> > > >>> ------------------------------------------------------------------ > > >>> -- - To unsubscribe, e-mail: users-unsubscr...@httpd.apache.org > > >>> For additional commands, e-mail: users-h...@httpd.apache.org > > >> > > >> 1) ProxyPass doesn't use PCRE (the wiki does not use PCRE with > > >> ProxyPass, either). You need to use ProxyPassMatch to parse PCRE. > > > > > > I'm not sure what you are saying here. When I used only ProxyPass > > > using the default configuration in the Wiki, the correct page was > > > displayed, it just didn't execute the PHP script and adding the > > > bang-path didn't change anything. The source code was displayed as > > > the page. > > > > > > While it is possible that the ProxyPath directive didn't match > > > anything and Apache tried to handle the script file as a static > > > page, I have been unable to prove that conjecture. The page IS in > > > Apache's document root for this virtual host, so I suppose that is > > > possible. There is no SetHandler directive to handle the .php > > > extension, and my understanding of the documentation is that one > > > should not be required since Apache is not actually running the > > > script. > > > > > >> 2) /httpd/iliffe/testfcgi.php would need to exist on your > > >> filesystem or php-fpm chroot. The requested URI is literally > > >> appended to the path in the ProxyPassMatch directive. > > > > > > Yes, that's what I had expected to happen. php-fpm does not chroot; > > > the true path /httpd/iliffe/testfcgi.php exists in the file system > > > and is visible to php-fpm, based on the simpler configuration. > > > That's what's so weird, the same path gets completely different > > > results, depending on the way the script is called. In this case > > > the $1 amounts to a null since there is no passed data in the URL. > > > > > > Before you ask, I expect SELinux problems with these files because > > > of the tagging, but at the moment SELinux is in permissive mode. > > > > > > John > > > > ProxyPass *cannot* understand PCRE. ProxyPassMatch *can*. Hence, do > > *not* use PCRE with ProxyPass. That is all. > > > > Step 1) Make sure that mod_proxy_fcgi is loaded. See apachectl -M > > [root@prod04 John]# /usr/apache-2.4.25/bin/apachectl -M > Loaded Modules: > core_module (static) > so_module (static) > .......whole lot of modules skipped here..... > > version_module (shared) > proxy_module (shared) > proxy_connect_module (shared) > proxy_ftp_module (shared) > proxy_http_module (shared) > proxy_fcgi_module (shared) <------ > http2_module (shared) > proxy_http2_module (shared) > > The necesary support modules for mod_proxy_fcgi (mod_proxy and > mod_proxy_http2) are also verified as being loaded. > > > As for the "Primary Script Unknown" error, it always means that you > > mapped the request to a non-existent resource on the file system / > > chroot. Verify again. > > Here is the process root info for php-fpm > > [root@prod04 John]# ps -ef | grep php- > root 15368 1 0 Apr12 ? 00:00:00 php-fpm: master process > (/usr/php-7.1.3/etc/php-fpm.conf) > phpfpm 15369 15368 0 Apr12 ? 00:00:00 php-fpm: pool www > phpfpm 15370 15368 0 Apr12 ? 00:00:00 php-fpm: pool www > > [root@prod04 John]# ls -al /proc/15368/root > lrwxrwxrwx. 1 root root 0 Apr 13 10:34 /proc/15368/root -> / > > Here is the directory for the document root and also the absolute path > that was passed to php-fpm > > [root@prod04 John]# ls -al /httpd/iliffe/t* > -rw-rw-r--. 1 John John 5740 Apr 12 16:40 /httpd/iliffe/testfcgi.php > > I had already done all of these checks before I asked for help on this > list. The commands used to invoke both ProxyPass and ProxyPassMatch > were cut and pasted from the Wiki. The only change I made was to put > in the correct base directory path. > > Also, I did verify that the TCP port (9000) for php-fpm was present and > listening: > > [root@prod04 John]# ss -a -n | grep 9000 > tcp LISTEN 0 128 127.0.0.1:9000 *:* > tcp LISTEN 0 0 127.0.0.1:9000 *:* > > While I don't think it is necessary, since the TCP port is on the > loopback interface, I also opened port 9000 on the internal firewall: > > root@prod04 John]# firewall-cmd --list-ports > ----other open ports not shown-------- > 9000/tcp > > > The various methods listed on the wiki allow httpd to pass the request > > to a fcgi backend, which will process the php file, and return the > > output. You can use the SetHandler approach instead of ProxyPassMatch > > - it's up to you. > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: users-unsubscr...@httpd.apache.org > > For additional commands, e-mail: users-h...@httpd.apache.org