题
我已经将Nginx设置为我的主要Web服务器,并且后面有两个基于Mochiweb的服务器。某些请求被反向代理到这两个服务器。 现在,我想使用nginx访问phpmyadmin(位于/ var / www / nginx-default / phpMyAdmin),但它一直说错误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;
}
其他提示
直接设置'root'。更少的指令,更少的计算需要设置更多的变量。还有其他一些东西(如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,以及除index.php以外的其他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;
}
不隶属于 StackOverflow