Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nginx location directive doesn't seem to be working. Am I missing something?

Tags:

nginx

I've set up Nginx as my main web server and have two Mochiweb based servers behind it. Certain requests are reverse-proxied to these two servers. now, I want to access phpmyadmin (located at /var/www/nginx-default/phpMyAdmin) using nginx, but it keeps saying Error 404 not found. Am I missing something obvious here?

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;     } } 
like image 664
ErJab Avatar asked Jun 18 '09 06:06

ErJab


People also ask

How does the location directive work in NGINX?

The location directive within NGINX server block allows to route request to correct location within the file system. The directive is used to tell NGINX where to look for a resource by including files and folders while matching a location block against an URL.

What is NGINX location?

Every NGINX configuration file will be found in the /etc/nginx/ directory, with the main configuration file located in /etc/nginx/nginx. conf . NGINX configuration options are known as “directives”: these are arranged into groups, known interchangeably as blocks or contexts .

Where is NGINX location config?

All NGINX configuration files are located in the /etc/nginx/ directory. The primary configuration file is /etc/nginx/nginx. conf .

What is try_files $URI in NGINX?

If you have any recent version of NGINX you should look at try_files which just made life much easier. What we changed is that we try to see if $uri exists without requiring if . Using try_files means that you can test a sequence. If $uri doesn't exist, try $uri/ , if that doesn't exist try a fallback location.


2 Answers

The problem here is that only the "best" location directive gets taken, in this order:

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

Using this ruleset, your /phpmyadmin location directive is beaten out by the regular expression ".php$" location directive, so the former is ignored entirely. Additionally, your php fastcgi directive is hard-wired to your /home/me/dev directory, which means that phpMyAdmin is totally inaccessible. You can use a rewrite to get the correct root for your 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; } 
like image 66
Marcus Griep Avatar answered Sep 30 '22 06:09

Marcus Griep


Set the 'root' directly. Less directives, less computing needed to set more vars. There are also other things (like fastcgi_param DOCUMENT_ROOT) that will not be set correctly in the currently accepted answer. This method will handle all that however:

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; } 
like image 25
rynop Avatar answered Sep 30 '22 06:09

rynop