Nginx – jak správně na front controller s php-fpm?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Mikeš
Člen | 771
+
0
-

Ahoj, půl dne bojuji s nastavením front controlleru v nginxu a rozběhnutí nette → přesměrování všeho na index.php

Problém je v tom, že pokud jde request na neexistující soubor s příponou .php, nginx ho nepřesměruje správně na index.php.

/ → v pořádku
/index.php → v pořádku
/existujici-url/ → v pořádku
/neexistujici-url/ → v pořádku, zpracovává error presenter
/neexistujici-url.php → chyba, nginx 404

nginx.conf:

worker_processes  auto;

events {
    worker_connections  1024;
}

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

    access_log /dev/null;
    error_log /usr/local/var/log/nginx/error.log;

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;

    server {
        listen 80;
        listen 443 ssl http2;

        ssl_certificate ssl/nginx.crt;
        ssl_certificate_key ssl/nginx.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        server_name  _;
        server_tokens off;

        index  index.php index.html index.htm;

        set $basepath "/Users/janmikes/Sites";
        set $domain $host;

        if ($domain ~* "^([\w\d\-]*)\.dev$") {
            set $domain $1;
        }

        if ($domain ~* "^([\w\d\-]*)\.([\w\d\-]*)\.dev$") {
            set $domain $2;
        }

        set $rootpath "${domain}";

        if (-d $basepath/$domain/www) {
            set $rootpath "${domain}/www";
        }

        root $basepath/$rootpath;

        location ~ /\.|^\. {
            deny all;
        }

        location ~ \.(neon|ini|log|yml)$ {
            deny all;
        }

        location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico|txt|bmp|pdf|doc|docx|ppt|pptx|zip)$ {
            access_log off;
            log_not_found off;
            expires max;
        }

        location = /robots.txt  { access_log off; log_not_found off; }
        location = /humans.txt  { access_log off; log_not_found off; }
        location = /favicon.ico { access_log off; log_not_found off; }


        location ~* [^/]\.php(/|$) {
            include        fastcgi.conf;

            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index $document_root/index.php;
            fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;

            fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
            fastcgi_param PATH_TRANSLATED $document_root/$fastcgi_path_info;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        location / {
            try_files  $uri $uri/ index.php$is_args$args;
        }
    }
}

fastcgi.conf:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Zkoušel jsem už asi triliardu variant, ale stále nechce fungovat. Nejhorší je, že vím přesně jaký je problém, ale řešení, která ostatním fungují mě nefungují :D.

Výstup z error logs:

2017/02/01 02:25:02 [error] 8602#0: *86 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: _, request: "GET /xyz.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "abc.dev"

Tuto chybu chápu tak, že nedokáže najít žádný ze souborů definovaný v try_files

Editoval Jan Mikeš (1. 2. 2017 2:32)