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