Директива местоположения Nginx, похоже, не работает. Я что-то пропустил?
-
06-07-2019 - |
Вопрос
Я настроил Nginx в качестве основного веб-сервера и за ним стоят два сервера на базе Mochiweb. Некоторые запросы переадресовываются на эти два сервера. Теперь я хочу получить доступ к phpmyadmin (расположен в / var / www / nginx-default / phpMyAdmin), используя nginx, но он постоянно говорит, что ошибка 404 не найдена. Я что-то упускаю здесь очевидное?
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;
}
}
Решение
Проблема здесь в том, что только «лучший» Директива location
берется в следующем порядке:
location = <path> (longest match wins)
location ^~ <path> (longest match wins)
location ~ <path> (first defined match wins)
location <path> (longest match wins)
При использовании этого набора правил ваша директива / phpmyadmin
location
отбивается регулярным выражением " .php $
" директива location
, поэтому первая полностью игнорируется. Кроме того, ваша директива php fastcgi жестко привязана к вашему каталогу / home / me / dev
, что означает, что phpMyAdmin полностью недоступен. Вы можете использовать перезапись, чтобы получить правильный корень для ваших скриптов 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;
}
Другие советы
Установите «корень» напрямую. Меньше директив, меньше вычислений, необходимых для установки большего числа переменных. Есть и другие вещи (например, fastcgi_param DOCUMENT_ROOT), которые не будут правильно установлены в текущем принятом ответе. Этот метод будет обрабатывать все это, однако:
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;
}
Я боролся с этим уже несколько часов, и ни одно из обсуждавшихся выше решений не сработало в моем случае (поскольку мне нужно было запустить index.php, index.php с аргументами и другие сценарии php, кроме index.php), но в конце концов я достиг рабочие конфигурации следующие:
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;
}
Возможно, он ищет index.html? Попробуйте перейти на
location /phpmyadmin {
root /var/www/nginx-default/phpMyAdmin;
index index.php;
}
и добавьте раздел ниже, чтобы избежать проблем, связанных со случаем
location /phpMyAdmin {
rewrite ^/* /phpmyadmin last;
}