Назад | Перейти на главную страницу

Использование nginx с dockerized fast cgi - корневой путь

У меня есть контейнер докеров, который запускает приложение 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
  }

  (...)

}

Почему так странно себя ведет? А безопасен ли второй подход?

Таким образом, ваш апстрим имеет другой корневой путь к одним и тем же файлам. Что вы делаете, так это устанавливаете корень на /var/www/my_app/ для статических файлов (обслуживаемых nginx экземпляр) и установка $document_root к /var/www/html для экземпляра FastCGI.

Вы говорите, что он работает, поэтому ваши статические файлы должны быть доступны в /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.