Nginx位置指令似乎不起作用.我错过了什么吗?

ErJ*_*Jab 37 nginx

我已经将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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*iep 80

这里的问题是只按location顺序获取"最佳" 指令:

location =  <path>  (longest match wins)
location ^~ <path>  (longest match wins)
location ~  <path>  (first defined match wins)
location    <path>  (longest match wins)
Run Code Online (Sandbox Code Playgroud)

使用此规则集,您的/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;
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答!我很长一段时间都尝试了这个,但它从来没有奏效过.我总是遇到HTTP 404错误.直到现在我才发现问题所在.我在/ var/www/nginx-default/phpmyadmin下有phpmyadmin文件.当nginx处理php文件的指令时,它会在/ var/www/nginx-default/phpmyadmin/phpmyadmin内搜索第二个phpmyadmin,它是请求中的一个.那是从根目录,它搜索相对目录,再次是phpmyadmin.所以我必须在phpmyadmin中创建另一个目录并将所有文件放在那里.现在它有效! (5认同)
  • 如果没有`if`指令,有没有办法做到这一点?Nginx文档说尽可能避免"if"(尽管在这种情况下可能没有其他好方法). (5认同)
  • +1我刚刚烧毁了最后2个小时,试图找出我的nginx.conf问题,最终结束了......我是nginx的新手,让事情变得恰到好处令人非常沮丧...... (3认同)

ryn*_*nop 6

直接设置'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;
}
Run Code Online (Sandbox Code Playgroud)