nginx location匹配后proxy_pass给后端server后404 一探

我们先来看如下一段nginx配置

location /zentaopms {
    proxy_pass http://127.0.0.1:8282;
}

location /zentaopms {
    proxy_pass http://127.0.0.1:8282/;
}

server {
   listen 8282;
    root /home/www/zentaopms/www/;
   location ~ \.php {
       fastcgi_pass 127.0.0.1:9000;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include fastcgi_params;
   }
}

如上代码中location节点proxy_pass 后相差一个/

我们来看一个具体demo

  • step1-我们要访问一个URL http://somehost/zentaopms/index.php 这其实是禅道的首页

  • step2-如我们使用这个配置节

    location /zentaopms {
         proxy_pass http://127.0.0.1:8282;
    }

那么nginx的错误日志里面记录的都是404的错误

  • step3-为什么会发生404

首先location匹配到后将请求代理到后端8282端口的server,代理到8282 server还是原先的url,此时到了8282 的server,8282server去/home/www/zentaopms/www/zentaopms/下找index.php并由fastcgi协议传送至php中执行,但index.php是在www目录下,因此nginx就直接报404错误

  • step4- / ‘斜杠’
    使用了proxy_pass http://127.0.0.1:8282/;,在最后多了一个/,代表绝对根目录,nginx不会将location中匹配到的路径代理走。因此代理到8282 server时,路径变成了 http://somehost/index.php,这样子交由server 8282去执行,可以找到php文件。

author:tomato
qq:385817098
tel:********
job:php程序员

tomato
309 声望19 粉丝

1个在coding路上越走越迷茫的coder