39 votes

Nginx emplacement de la directive ne semble pas fonctionner. Ai-je raté quelque chose?

J'ai mis en place Nginx comme mon serveur web principal et deux Mochiweb les serveurs derrière elle. Certaines demandes sont reverse-proxy pour ces deux serveurs. maintenant, je veux accéder à phpmyadmin (qui se trouve dans /var/www/nginx-par défaut/phpMyAdmin) à l'aide de nginx, mais il continue à dire que l'Erreur 404 not found. Ai-je raté 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;
    }
}

86voto

Marcus Griep Points 3010

Le problème ici est que seuls les "meilleurs" location directive qui a été, dans cet ordre:

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

À l'aide de ce jeu de règles, votre /phpmyadmin location directive est battue par l'expression régulière ".php$" location de la directive, de sorte que le premier est entièrement ignoré. En outre, votre php fastcgi directive est câblé à votre /home/me/dev annuaire, ce qui signifie que phpMyAdmin est totalement inaccessible. Vous pouvez utiliser une réécriture pour obtenir la bonne racine de votre phpMyAdmin scripts:

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;
}

6voto

rynop Points 7818

Définir la "racine" directement. Moins directives, moins de calcul nécessaire pour mettre plus de vars. Il y a aussi d'autres choses (comme fastcgi_param DOCUMENT_ROOT) qui ne seront pas correctement défini dans les actuellement accepté de répondre. Cette méthode permettra de gérer tout ce qui toutefois:

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;
}

4voto

minniux Points 21

J'ai eu du mal avec cela pendant des heures maintenant, et aucune des solutions présentées ci-dessus ont travaillé à mon cas (depuis que je nécessaire à l'exécution de index.php, index.php avec des arguments, et d'autres scripts php que index.php), mais enfin atteint les configurations suivantes:

    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;
    }

0voto

windyjonas Points 1148

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

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

et d'ajouter l'article ci-dessous, pour éviter les cas de problèmes liés à

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X