使用 nginx 和 dockerized fast cgi - 根路径

使用 nginx 和 dockerized fast cgi - 根路径

我有一个 docker 容器,它在端口上运行一个 php fastcgi 应用程序9000

根路径安装在/var/www/my_app并包含所有资产,如图像和 javascript。

我想使用 nginx 作为反向代理。我当前的 nginx 配置文件如下所示:

server {
  listen 80;
  server_name my_app.example.org;

  root /var/www/my_app;
  index index.php index.html index.htm;

  location / {
    try_files $uri $uri/ =404;
  }

  location ~ \.php$ {
    fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param  SERVER_SOFTWARE    nginx;
    fastcgi_param  QUERY_STRING       $query_string;
    fastcgi_param  REQUEST_METHOD     $request_method;
    fastcgi_param  CONTENT_TYPE       $content_type;
    fastcgi_param  CONTENT_LENGTH     $content_length;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
    fastcgi_param  REQUEST_URI        $request_uri;
    fastcgi_param  DOCUMENT_URI       $document_uri;
    fastcgi_param  DOCUMENT_ROOT      $document_root;
    fastcgi_param  SERVER_PROTOCOL    $server_protocol;
    fastcgi_param  REMOTE_ADDR        $remote_addr;
    fastcgi_param  REMOTE_PORT        $remote_port;
    fastcgi_param  SERVER_ADDR        $server_addr;
    fastcgi_param  SERVER_PORT        $server_port;
    fastcgi_param  SERVER_NAME        $server_name;
    fastcgi_intercept_errors on;
    fastcgi_index index.php;
    fastcgi_pass my_app_upstream; 
    include fastcgi_params;
  }
}

不幸的是,这不起作用。我收到所有网站/资源的 404 错误。

我可以通过将配置文件更改为以下内容来修复此问题:

server {
  (...)

  root /var/www/html;                       #changed
  index index.php index.html index.htm;

  location / {
    root /var/www/my_app/;                  #changed
  }

  (...)

}

为什么它的表现如此奇怪?第二种方法安全吗?

答案1

因此,您的上游对相同文件具有不同的根路径。您所做的是将/var/www/my_app/静态文件(由nginx实例提供服务)的根路径设置为,并将FastCGI 实例的根路径设置$document_root为。/var/www/html

您说它正在运行,因此您的静态文件必须在 下可用/var/www/my_app/,并且您的 PHP 文件必须在 下可用/var/www/html

像这样构造可能更有意义:

server {
    ...
    root /var/www/my_app;

    location / {
        ...
    }
    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;

        fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
        root /var/www/html;
    }
}

FastCGI 的特殊根是硬连线的,但在检查文件是否存在之前不会try_files使用将不受控制的请求传递给 PHP

相关内容