web-dev-qa-db-fra.com

La directive d'emplacement Nginx ne semble pas fonctionner. Suis-je en train de manquer quelque chose?

J'ai configuré Nginx comme mon serveur Web principal et j'ai deux serveurs basés sur Mochiweb derrière. Certaines demandes sont transmises par procuration inverse à ces deux serveurs. maintenant, je veux accéder à phpmyadmin (situé dans/var/www/nginx-default/phpMyAdmin) en utilisant nginx, mais il continue de dire que l'erreur 404 est introuvable. Suis-je en train de manquer quelque chose d'évident ici?

server {
    ############### General Settings ####################
    listen   80;
    server_name  localhost;
    access_log  /home/me/dev/wwwaccess.log;

    ############## Document Root #######################    
    location / {
        root   /home/me/dev;
        index  index.html index.htm index.php;
    }

    ############## PHPMyAdmin #######################   
    location /phpmyadmin {
        root   /var/www/nginx-default/phpMyAdmin;
        index  index.html index.htm index.php;
    }

    ############## Proxy Settings for FastCGI Server #####
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /home/me/dev$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }


    ############# Proxy Settings for Mochi1 ###############
    location /mochi1 {
            proxy_pass         http://127.0.0.1:8000;
            proxy_redirect     off;

            proxy_set_header   Host             $Host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         3600;

            proxy_buffering off;
        }

    ############# Proxy Settings for Mochi2 ###############
    location /mochi2 {
            proxy_pass         http://127.0.0.1:8001;
            proxy_redirect     off;

            proxy_set_header   Host             $Host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         3600;

            proxy_buffering off;
        }

    ############# Error redirection pages ################
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /home/me/dev;
    }
}
37
ErJab

Le problème ici est que seule la "meilleure" directive location est prise, dans cet ordre:

location =  <path>  (longest match wins)
location ^~ <path>  (longest match wins)
location ~  <path>  (first defined match wins)
location    <path>  (longest match wins)

En utilisant cet ensemble de règles, votre /phpmyadminlocation directive est battue par l'expression régulière ".php$ "location directive, donc la première est complètement ignorée. De plus, votre directive php fastcgi est câblée à votre /home/me/dev répertoire, ce qui signifie que phpMyAdmin est totalement inaccessible. Vous pouvez utiliser une réécriture pour obtenir la racine correcte pour vos scripts phpMyAdmin:

location ~ \.php$ {
    set $php_root /home/me/dev;
    if ($request_uri ~* /phpmyadmin) {
        set $php_root /var/www/nginx-default/phpMyAdmin;
    }

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $php_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
}
80
Marcus Griep

Définissez directement la "racine". Moins de directives, moins de calcul nécessaires pour définir plus de vars. Il y a aussi d'autres choses (comme fastcgi_param DOCUMENT_ROOT) qui ne seront pas définies correctement dans la réponse actuellement acceptée. Cette méthode gérera tout cela cependant:

location ~ \.php$ {
    if ($request_uri ~* /phpmyadmin) {
        root /var/www/nginx-default/phpMyAdmin;
    }

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    include /etc/nginx/fastcgi_params;
}
6
rynop

J'ai lutté avec cela pendant des heures maintenant et aucune des solutions discutées ci-dessus n'a fonctionné dans mon cas (car j'avais besoin d'exécuter index.php, index.php avec des arguments et d'autres scripts php que index.php), mais j'ai finalement atteint les configurations de travail comme suit:

    location /php-app {
    passenger_enabled off;
    alias /path/to/php-app/$1;
    index index.php index.html;
    try_files $uri $uri/ @rewrite;
   }

   location @rewrite {
    rewrite ^/php-app(.*)$ /index.php?q=$1 last;
   }

location ~ \.php$ {
    alias /path/to/php-app/$1;
    rewrite ^/php-app(.*)$ $1 last;
    passenger_enabled off;
    fastcgi_pass unix:/tmp/php-fpm.socket;
    fastcgi_index index.php;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /path/to/php-app$fastcgi_script_name;
    fastcgi_intercept_errors on;
    }
2
minniux

Peut-être qu'il recherche index.html? Essayez de passer à

location /phpmyadmin {
    root   /var/www/nginx-default/phpMyAdmin;
    index index.php;
}

et ajoutez la section ci-dessous, pour éviter les problèmes liés au cas

location /phpMyAdmin {
   rewrite ^/* /phpmyadmin last;
}
0
windyjonas