无法设置 Nginx 来处理 PHP 和 proxy_pass

无法设置 Nginx 来处理 PHP 和 proxy_pass

我对 Nginx 设置有三个要求:

  1. 将全部请求转发到运行在端口 9001 上的 Java 服务器
  2. 拦截所有静态文件 URL 并通过 Nginx 本身提供服务。
  3. 从包含 PHP 脚本的文件夹提供特定的基本 URL。

其中,前两个我可以实现,但是当我http://localhost/ecwid_fu_scripts/通过 Web 浏览器访问时,请求会被运行在端口 9001 上的 Java 服务器拦截,并且不会被路由到index.php/home/ankush/ecwid_fu_scripts/这是我的 Nginx 配置:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;

    location /assets/images/ {
        root /home/ankush/fu_main_files/;
        autoindex off;
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
        keepalive_timeout 100;
    }   

    location /ecwid_fu_scripts/ {
        index index.php;
        root /home/ankush/ecwid_fu_scripts/;
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }   

    location / { 
        proxy_pass http://localhost:9001;
    }   

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

答案1

您的问题与该root指令以及该指令的范围有关root

location /ecwid_fu_scripts/ {
    root /home/ankush/ecwid_fu_scripts/;

在这种情况下,当有人请求 example.com/ecwid_fu_scripts/ 时,nginx 会查找定义的 中的文件root以及位置。这变成了 /home/ankush/ecwid_fu_scripts/ecwid_fu_scripts/,而这不是 index.php 所在的位置。

为了解决这个问题,你有两个选择(如果你对项目有自由,那么#2 是首选):

  1. 将该位置块更改root为 /home/ankush/。
  2. 或者重新构建项目结构,使所有内容都位于一个相对项目文件夹中。现在,将全局root(任何位置块之外的指令)设置为新的项目文件夹名称(假设在指令root /home/ankush/ecwid_files/;之后server_name)。

location ~ \.php$现在,我们仍然需要在块内添加块的内容location /ecwid_fu_scripts/,因为当root更改时,与这个新根相关的内容需要在同一个块中使用。这是因为这种陷阱:ecwid_fu_scripts 的位置块表示它是一个 .php 文件,它执行 try_files,然后它以这个块结束,并发送到下一个相关块:全局location ~ \.php$。问题是,它不知道 是什么root了,因为它不是全局定义的。因此,此块中的 fastcgi_pass 没有获取完整路径。

因此最后,您的配置将如下所示,其中选项 #1:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;

    location /assets/images/ {
        root /home/ankush/fu_main_files/;
        autoindex off;
        sendfile on; 
        tcp_nopush on; 
        tcp_nodelay on; 
        keepalive_timeout 100;
    }   

    location /ecwid_fu_scripts/ {
        index index.php;
        root /home/ankush/;

        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }   

    location / { 
        proxy_pass http://localhost:9001;
    }   

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }
}

相关内容