La directive sur l'emplacement de Nginx ne semble pas fonctionner. Est-ce que je manque quelque chose?

StackOverflow https://stackoverflow.com/questions/1011101

  •  06-07-2019
  •  | 
  •  

Question

J'ai configuré Nginx en tant que serveur Web principal et possède deux serveurs basés sur Mochiweb. Certaines demandes sont inversées par proxy vers ces deux serveurs. Maintenant, je veux accéder à phpmyadmin (situé dans / var / www / nginx-default / phpMyAdmin) à l’aide de nginx, mais le message Erreur 404 n’a pas été trouvé. Est-ce que je manque 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;
    }
}
Était-ce utile?

La solution

Le problème ici est que seul le "meilleur" La 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 ce jeu de règles, votre directive / phpmyadmin emplacement est neutralisée par l'expression régulière "quot < .php $ ". directive location , la première est donc ignorée. De plus, votre directive php fastcgi est câblée dans votre répertoire / home / me / dev , 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;
}

Autres conseils

Définissez directement la 'racine'. Moins de directives, moins d’informatique nécessaire 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;
}

Je me débattais avec cela depuis des heures et aucune des solutions décrites ci-dessus ne fonctionnait dans mon cas (car j’avais besoin d’exécuter index.php, index.php avec arguments, et d’autres scripts php que index.php), mais a 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;
    }

Peut-être qu'il recherche index.html? Essayez de changer pour

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

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

location /phpMyAdmin {
   rewrite ^/* /phpmyadmin last;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top