PHP and CGI on UserDir

Hello. I am new here.

I try to enable PHP and CGI(Perl) on UserDir (/home/user/public_html)
with
nginx.
But on my Chrome, PHP script is downloaded and CGI script shows me “404
Not
Found” page.
Here’s my configurations. What is wrong with my configurations?

OS: Linux 3.10.0 / CentOS 7 64bit
nginx version: 1.8.0


/etc/nginx/conf.d/default.conf:
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;

location / {
    root   /var/www/html;
    index  index.html index.htm;
}

location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
    index  index.html index.htm;
    autoindex on;
}

#error_page  404              /404.html;

# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /var/www/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
#    root           html;
#    fastcgi_pass   127.0.0.1:9000;
#    fastcgi_index  index.php;
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#    include        fastcgi_params;
#}

location ~ (^~)*\.php$ {
    root           /var/www/html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME 

$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location ~ (^~)*.pl|cgi$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:8999;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

location ~ .*~.*\.php$ {
    alias /home/$1/public_html$2;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME 

$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location ~ .~..pl|cgi$ {
alias /home/$1/public_html$2;
fastcgi_pass 127.0.0.1:8999;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#    deny  all;
#}

}


/etc/nginx/nginx.conf:

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] 

“$request”

'$status $body_bytes_sent “$http_referer” ’
‘"$http_user_agent" “$http_x_forwarded_for”’;

access_log  /var/log/nginx/access.log;
error_log   /var/log/nginx/error.log;

sendfile        on;
#tcp_nopush     on;

keepalive_timeout  65;

#gzip  on;

include /etc/nginx/conf.d/*.conf;

}

Hi Smart Goldman.

Am 29-11-2015 09:04, schrieb Smart Goldman:

Hello. I am new here.

I try to enable PHP and CGI(Perl) on UserDir (/home/user/public_html)
with nginx.
But on my Chrome, PHP script is downloaded and CGI script shows me “404
Not Found” page.
Here’s my configurations. What is wrong with my configurations?

Try to use nested locations.

http://nginx.org/en/docs/http/ngx_http_core_module.html#location

    index  index.html index.htm;
    autoindex on;

include my_php_config.conf;

include my_cgi_config.conf;

#location ~ \.php$ {
    fastcgi_index  index.php;
    include        /etc/nginx/fastcgi_params;
}

This block into “my_php_config.conf”

location ~ .*~.*\.php$ {
    alias /home/$1/public_html$2;
    fastcgi_pass   127.0.0.1:9000 [2];
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME

$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
END

This block into “my_cgi_config.conf”

location ~ .*~.*\.pl|cgi$ {
    alias /home/$1/public_html$2;
    fastcgi_pass   127.0.0.1:8999 [3];
    fastcgi_index  index.cgi;
    fastcgi_param  SCRIPT_FILENAME

$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

END

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one

BR Aleks

On Sun, Nov 29, 2015 at 05:04:50PM +0900, Smart Goldman wrote:

Hi there,

I try to enable PHP and CGI(Perl) on UserDir (/home/user/public_html) with
nginx.
But on my Chrome, PHP script is downloaded and CGI script shows me “404 Not
Found” page.

In nginx, one requests is handled in one location.

Module ngx_http_core_module describes how the one location is chosen
for a particular request.

You have:

location / {
location ~ ^/~(.+?)(/.*)?$ {
location = /50x.html {
location ~ (^~)*\.php$ {
location ~ (^~)*\.pl|cgi$ {
location ~ .*~.*\.php$ {
location ~ .*~.*\.pl|cgi$ {

According to the description, the requests /~user/index.cgi and
/~user/index.php are both handled in the second location there,
which says:

location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
    index  index.html index.htm;
    autoindex on;

which says “serve the file /home/user/public_html/index.cgi (or
index.php)
from the filesystem, with no further processing”. And that is what you
see – one file does not exist, do you get 404; the other file does
exist,
so you get it.

To make things work, you will need to arrange your location{} blocks
so that the one that you want nginx to use to process a request, is the
one that nginx does choose to process a request.

And then make sure that you know what mapping you want nginx to use for
this request should be handled by processing this file through
that
fastcgi server (or whatever is appropriate).

Good luck with it,

f

Francis D. [email protected]

Hi, thank you for great help, Aleksandar L…
I tried it.

PHP script shows me “File not found.” and outputs the following log:
2015/11/29 05:50:15 [error] 5048#0: *6 FastCGI sent in stderr: “Primary
script unknown” while reading response header from upstream, client:
119.105.136.26, server: localhost, request: “GET /~user/index.php
HTTP/1.1”, upstream: “fastcgi://127.0.0.1:9000”, host: “host.domain.com

  • I do not know how to fix it…

CGI script shows me “Error: No such CGI app -
/home//public_html/~user/index.cgi may not exist or is not executable by
this process.” and outputs nothing to error.log.

  • /home//public_html/~user/… I think this path is wrong and I tried to
    fix this path but I could not. /home/user/public_html/ should be correct
    path…

2015-11-29 18:41 GMT+09:00 Aleksandar L. [email protected]:

Hi Francis D. and Aleksandar L.,
I am sorry I am late.

2015-11-29 20:10 GMT+09:00 Francis D. [email protected]:

On Sun, Nov 29, 2015 at 05:04:50PM +0900, Smart Goldman wrote:

Hi there,

I try to enable PHP and CGI(Perl) on UserDir (/home/user/public_html)
with
nginx.
But on my Chrome, PHP script is downloaded and CGI script shows me "404
Not
location ~ ^/~(.+?)(/.)?$ {
location ~ ^/~(.+?)(/.
)?$ {
so that the one that you want nginx to use to process a request, is the
one that nginx does choose to process a request.

And then make sure that you know what mapping you want nginx to use for
this request should be handled by processing this file through that
fastcgi server (or whatever is appropriate).

Good luck with it,

Thank you for great help!
I did not understand /~user/index.cgi and /~user/index.php are handled
on
“location ~ ^/~(.+?)(/.*)?$ {”.
I remade /etc/nginx/conf.d/default.conf as the following:

server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;

location / {
    root   /var/www/html;
    index  index.html index.htm;
}

location ~ ^/~(.+?)(/.*)?\.(php)$ {
    alias /home/$1/public_html$2.$3;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME 

$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

location ~ ^/~(.+?)(/.*)?\.(pl|cgi)$ {
    alias /home/$1/public_html$2.$3;
    fastcgi_pass   127.0.0.1:8999;
    fastcgi_index  index.cgi;
    fastcgi_param  SCRIPT_FILENAME 

$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
    index  index.html index.htm;
    autoindex on;
}

#error_page  404              /404.html;

# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /var/www/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
#    root           html;
#    fastcgi_pass   127.0.0.1:9000;
#    fastcgi_index  index.php;
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
#    include        fastcgi_params;
#}

location ~ \.php$ {
    root           /var/www/html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME 

$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location ~ .pl|cgi$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:8999;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
#    deny  all;
#}

}

After that, I restarted nginx. Looks like PHP (/~user/index.php) finally
works!
But CGI (/~user/index.cgi) says “Error: No such CGI app -
/home/user/public_html/index.cgi/~user/index.cgi may not exist or is not
executable by this process.” though I don’t know why.

2015-12-01 1:47 GMT+09:00 Aleksandar L. [email protected]:

Hi.

Am 29-11-2015 12:02, schrieb Smart Goldman:

Hi, thank you for great help, Aleksandar L…
I tried it.

How looks now your config?

I remade as above config.

/home//public_html/~user/index.cgi may not exist or is not executable by

Due to the fact that I don’t know if you use the centos packes or the
nginx
package I suggest to install the following packages

nginx: Linux packages

and the nginx-debug and run the debug instance with the suggested settings
in

A debugging log

I installed nginx with rpm -Uvh
http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
and yum -y install nginx.
Do I need to reinstall nginx for the debug?

What does the nginx error log ( /var/log/nginx/error.log) say when you
access a php page?

On Wed, Dec 02, 2015 at 01:52:06AM +0900, Smart Goldman wrote:

2015-11-29 20:10 GMT+09:00 Francis D. [email protected]:

On Sun, Nov 29, 2015 at 05:04:50PM +0900, Smart Goldman wrote:

Hi there,

location ~ ^/~(.+?)(/.*)?\.(php)$ {
    alias /home/$1/public_html$2.$3;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;

Delete that line - it does nothing useful here. (It does no harm, other
than being a distraction.)

    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

Change that line to be just

fastcgi_param  SCRIPT_FILENAME $document_root;

“alias” is a bit funny. In this context, it means that $document_root
corresponds to the file on the filesystem that you want the fastcgi
server to process.

I’m a bit surprised that the current version works – perhaps your php
config does not have

cgi.fix_pathinfo=0

and so takes more than one guess at the file to process.

    include        /etc/nginx/fastcgi_params;
}

location ~ ^/~(.+?)(/.*)?\.(pl|cgi)$ {
    alias /home/$1/public_html$2.$3;
    fastcgi_pass   127.0.0.1:8999;
    fastcgi_index  index.cgi;

Delete.

    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

Change to remove $fastcgi_script_name, just like the previous case.

Here, most likely php is not involved, and your fastcgi server just
tries
to process SCRIPT_FILENAME, which does not name a real file right now.

    include        /etc/nginx/fastcgi_params;
}

After that, I restarted nginx. Looks like PHP (/~user/index.php) finally
works!
But CGI (/~user/index.cgi) says “Error: No such CGI app -
/home/user/public_html/index.cgi/~user/index.cgi may not exist or is not
executable by this process.” though I don’t know why.

I think that the explanations are above, along with the one necessary
fix
(for cgi/pl) and the one strongly suggested fix (for php).

Good luck with it,

f

Francis D. [email protected]

Sorry I forgot error log.

CGI outputs 2015/11/29 04:01:07 [error] 2618#0: *6 open()
“/home/user/public_html/index.cgi” failed (2: No such file or
directory),
client: 119.105.136.26, server: localhost, request: “GET
/~user/index.cgi
HTTP/1.1”, host: “host.domain.com

PHP outputs nothing to error.log.

access.log says:
119.105.136.26 - - [29/Nov/2015:04:01:07 -0500] “GET /~user/index.cgi
HTTP/1.1” 404 570 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86
Safari/537.36”
119.105.136.26 - - [29/Nov/2015:04:08:23 -0500] “GET /~user/index.php
HTTP/1.1” 200 20 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0;
rv:11.0) like Gecko”

2015-11-29 17:28 GMT+09:00 Anoop A. [email protected]:

Hi.

Am 29-11-2015 12:02, schrieb Smart Goldman:

Hi, thank you for great help, Aleksandar L…
I tried it.

How looks now your config?

/home//public_html/~user/index.cgi may not exist or is not executable
by
this process." and outputs nothing to error.log.

  • /home//public_html/~user/… I think this path is wrong and I tried
    to
    fix this path but I could not. /home/user/public_html/ should be
    correct
    path…

Please run the debug log to see more.

http://nginx.org/en/docs/debugging_log.html

Due to the fact that I don’t know if you use the centos packes or the
nginx package I suggest to install the following packages

http://nginx.org/en/linux_packages.html#mainline

and the nginx-debug and run the debug instance with the suggested
settings in

http://nginx.org/en/docs/debugging_log.html

BR Aleks

Hi Francis,

2015-12-02 5:50 GMT+09:00 Francis D. [email protected]:

Delete that line - it does nothing useful here. (It does no harm, other
than being a distraction.)

    fastcgi_param  SCRIPT_FILENAME

$document_root$fastcgi_script_name;

config does not have

cgi.fix_pathinfo=0

This value is commented out.
$ grep cgi.fix_pathinfo php.ini
; cgi.fix_pathinfo provides real PATH_INFO/PATH_TRANSLATED support for
CGI. PHP’s
;cgi.fix_pathinfo=1
I’ve never edited php.ini.

Delete.

    fastcgi_param  SCRIPT_FILENAME

$document_root$fastcgi_script_name;

works!
But CGI (/~user/index.cgi) says “Error: No such CGI app -
/home/user/public_html/index.cgi/~user/index.cgi may not exist or is not
executable by this process.” though I don’t know why.

I think that the explanations are above, along with the one necessary fix
(for cgi/pl) and the one strongly suggested fix (for php).

Good luck with it,

Great!! Both of CGI and PHP finally works!!
I made configuration file by copying from configuration file which I
found
from somewhere and I did not understand what fastcgi_param means.
Thanks so much for your help!

I put successful configuration here again for future use.

/etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log debug;

#charset koi8-r;
#access_log  /var/log/nginx/log/host.access.log  main;

location / {
    root   /var/www/html;
    index  index.html index.htm;
}

location ~ ^/~(.+?)(/.*)?\.(php)$ {
    alias /home/$1/public_html$2.$3;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root;
    include        /etc/nginx/fastcgi_params;
}

location ~ ^/~(.+?)(/.*)?\.(pl|cgi)$ {
    alias /home/$1/public_html$2.$3;
    fastcgi_pass   127.0.0.1:8999;
    fastcgi_index  index.cgi;
    fastcgi_param  SCRIPT_FILENAME $document_root;
    include        /etc/nginx/fastcgi_params;
}

location ~ ^/~(.+?)(/.*)?$ {
    alias /home/$1/public_html$2;
    index  index.html index.htm;
    autoindex on;
}

#error_page  404              /404.html;

# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /var/www/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}

location ~ \.php$ {
    root           /var/www/html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME 

$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location ~ .pl|cgi$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:8999;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}