NGINX y php-cgi en Windows "No se especifica ningún archivo de entrada"

NGINX y php-cgi en Windows "No se especifica ningún archivo de entrada"

Estoy ejecutando php-cgi y NGINX. Se están ejecutando en una carpeta, sin embargo, su directorio raíz está a 2 directorios de distancia y 2 de entrada desde allí. Cuando la raíz era html (predeterminada), funcionaban perfectamente; sin embargo, ahora php informa el error "No se especificó ningún archivo de entrada". Intenté configurar el directorio para dar control total a todos los programas, ya tengo control total, intenté ver si php está buscando en un directorio diferente, intenté cambiar los directorios, codificar la variable php, etc. He seguido unos 5 tutoriales diferentes sobre cómo solucionar este problema, pero ninguno lo ha resuelto. No hay errores en la consola y mi fastcgi.conf no ha cambiado. Definitivamente, php y NGINX se están ejecutando y comunicando, sin embargo, php no puede obtener el archivo por algún motivo. Al acceder a cualquier archivo que no sea php, NGINX recupera con éxito el archivo y mi navegador lo muestra. He verificado, usando netstat, que lo único que escucha en el puerto 9100 es mi php-cgi. Y lo único que escucha en el puerto 8080 es NGINX. Tanto php como NGINX están configurados para comunicarse correctamente y php-cgi se ejecuta a través de RunHiddenConsole.exe que se encuentra en el directorio php.

Aquí está el árbol de directorios, en un formato similar a YAML:

EclipsePHP
    - Code
        - Blog
            - Source (NGINX/php root Location/Website Source Files)
    - NGINX
        - 1.9.11 (NGINX Executable Location)
            - php (php Executable Location)

Y mi nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    client_max_body_size 5G;
    include       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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        root   ../../Code/Blog/Source;
        client_max_body_size 5G;
        listen       8080;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            index  index.php;
            try_files $uri $uri.html $uri/ @extensionless-php;
            index index.html index.htm index.php;
            client_max_body_size 5G;
        }

        error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #

        recursive_error_pages off;

        # 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$ {
            client_max_body_size 5G;
            try_files      $uri =404;
            include        fastcgi.conf;
            include        fastcgi_params;
            fastcgi_pass   127.0.0.1:9100;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }

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

        location @extensionless-php {
             rewrite ^(.*)$ $1.php last;
        }
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

¿Cuál podría ser la causa de este error y cómo puedo resolverlo para poder ver los archivos php correctamente en mi navegador? (Estoy usando Eclipse PHP para editar el código fuente y el error se produce con y sin ejecución de Eclipse).

Respuesta1

Como a php no le gustan los directorios relativos, mi solución fue usar lotes para establecer un directorio absoluto en cada inicio. Inserté lo siguiente en mi script de inicio por lotes antes de iniciar NGINX.

set TEXT_FILE=conf\phploc.conf
set REL_PATH=..\..\Code\Blog\Source
set ABS_PATH=
pushd %REL_PATH%
set ABS_PATH=%CD%
popd
echo fastcgi_param  SCRIPT_FILENAME  %ABS_PATH%$fastcgi_script_name; > %TEXT_FILE%

Luego, en el archivo de configuración de NGINX, inserté lo siguiente en el bloque de ubicación de php para cargar la configuración del directorio.

include phploc.conf;

Respuesta2

Usted define su raíz como una ruta relativa, que es relativa al nginxdirectorio de configuración.

Esto luego se pasa a php-cgi, a quien probablemente no le importe dónde nginxguarda sus archivos. Entonces no se puede resolver ../../.

Debes especificar una raíz absoluta.

información relacionada