Nginx 配置:同一域下的两个应用程序

Nginx 配置:同一域下的两个应用程序

我有两个应用程序:HTML+JS 前端和 PHP 后端。我想设置 Nginx,以便两者都从同一域提供服务。对后端的请求使用以 开头的 URL 发出/api

我的尝试是这样的:

server {
    root /path/to/frontend;
    index index.html;
    server_name example.com;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api {
        alias /path/to/backend;
        index index.php;
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

但是,对于所有对后端的请求,我最终都得到 404:主要脚本未知。

有没有办法实现我在这里尝试做的事情?怎么做?

答案1

你犯了一个常见的错误,人们并不真正了解 nginx 的工作原理。请记住以下内容:

nginx 总是使用单身的 location仅阻止

我建议您(重新)阅读以下内容:nginx 如何处理请求

现在,查看您的配置,后端请求需要由 2 个位置提供服务:

  1. location /api
  2. location ~\.php$

下列的location文档中,第一个被称为字首位置,而第二个是正则表达式(正则表达式)一。nginx 将检查两者,但最终只会选择一个,在您的情况下是正则表达式。

现在,在处理它时,nginx 会将 的请求转发/path/to/frontend/<yourFile>.php给 PHP,从 构建路径root /path/to/frontend,因为这是唯一定义的路径。然后后端失败,无法找到指定的文件。

您可能希望尝试以下操作:

location /api {
    alias /path/to/backend;
    index index.php;
    try_files $uri $uri/ /index.php;

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;

        # Useless? Request always ending up with '.php' here...
        fastcgi_index index.php;

        include fastcgi_params;

        # Try to secure this block, which might lead to arbitrary code execution.
    }
}

至于缺乏安全性,我在 2014 年 10 月底的 nginx.conf 上主持了一场关于 nginx 和 PHP-FPM 的演讲。幻灯片如下:https://rosset.net/LAMP_just_died.pptx. 视频即将发布。

相关内容