NGINX und php-cgi unter Windows „Keine Eingabedatei angegeben“

NGINX und php-cgi unter Windows „Keine Eingabedatei angegeben“

Ich verwende php-cgi und NGINX. Sie laufen in einem Ordner, ihr Stammverzeichnis liegt jedoch 2 Verzeichnisse weiter außen und 2 Verzeichnisse weiter innen. Als das Stammverzeichnis html (Standard) war, funktionierten sie einwandfrei, jetzt meldet PHP jedoch den Fehler „Keine Eingabedatei angegeben“. Ich habe versucht, das Verzeichnis so einzustellen, dass alle Programme die volle Kontrolle haben, ich habe bereits die volle Kontrolle, ich habe versucht herauszufinden, ob PHP in einem anderen Verzeichnis sucht, habe versucht, die Verzeichnisse zu ändern, die PHP-Variable hart zu codieren usw. Ich habe ungefähr 5 verschiedene Tutorials zur Behebung dieses Problems befolgt, aber keines hat es gelöst. Es gibt keine Fehler in der Konsole und meine fastcgi.conf ist unverändert. PHP und NGINX laufen definitiv beide und kommunizieren miteinander, PHP kann die Datei jedoch aus irgendeinem Grund nicht abrufen. Beim Zugriff auf eine Nicht-PHP-Datei ruft NGINX die Datei erfolgreich ab und mein Browser zeigt sie an. Ich habe mithilfe von netstat überprüft, dass das einzige, was auf Port 9100 lauscht, mein php-cgi ist. Und das einzige, was auf Port 8080 lauscht, ist NGINX. Sowohl PHP als auch NGINX sind für die korrekte Kommunikation konfiguriert, und php-cgi läuft über RunHiddenConsole.exe, das sich im PHP-Verzeichnis befindet.

Hier ist der Verzeichnisbaum in einem YAML-ähnlichen Format:

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

Und meine 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;
    #    }
    #}

}

Was könnte die Ursache dieses Fehlers sein und wie kann ich ihn beheben, sodass ich die PHP-Dateien ordnungsgemäß in meinem Browser anzeigen kann? (Ich verwende Eclipse PHP zum Bearbeiten der Quelle und der Fehler tritt sowohl mit als auch ohne ausgeführtes Eclipse auf.)

Antwort1

Da PHP keine relativen Verzeichnisse mag, bestand meine Lösung darin, bei jedem Start ein absolutes Verzeichnis per Batch festzulegen. Ich habe vor dem Start von NGINX Folgendes in mein Batch-Startskript eingefügt.

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%

Dann habe ich in der NGINX-Konfigurationsdatei Folgendes in den PHP-Standortblock eingefügt, um die Verzeichniseinstellungen zu laden.

include phploc.conf;

Antwort2

Sie definieren Ihr Stammverzeichnis als relativen Pfad, der relativ zum nginxKonfigurationsverzeichnis ist.

Dies wird dann an weitergegeben php-cgi, dem es wahrscheinlich egal ist, wo nginxseine Dateien gespeichert werden. Kann daher nicht aufgelöst werden ../../.

Sie sollten eine absolute Wurzel angeben.

verwandte Informationen