По долгу службы столкнулся с Okay-CMS. У компании, где я тружусь, некоторые сайты используют эту систему. Нужно кое-где переделать вёрстку использующихся шаблонов, возможно, появится необходимость где-то переработать логику и всё такое.
Так вот, с привычной разработкой, мне понятно, есть разделение на development и production. То есть, я делаю подходящую среду со всем необходимым в Докере (кто-то виртуальные машины делает, насколько я знаю), веду там разработку, заканчиваю её и тестирую, это dev. Затем готовый продукт я выкладываю на хостинг, подключаю нужные штуки, он оказывается в интернете, это prod.
А тут получается, что у меня есть FTP доступ на хостинг, где лежат все файлы сайта, в том числе те, которые мне нужно менять. Этот сайт уже есть в сети и прекрасно работает. Я скопировал файлы к себе, положил в Докер с PHP и Nginx, настроил точку входа на нужный index.php. Но ничего не работает, появляется 500'ая ошибка "internal server error".
Возможно это связанно с моим стандартным конфигом для Nginx, который не подходит к данной ситуации.
Конфиг:
конфиг Nginx
server {
index index.php;
server_name station.loc;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Версия PHP, вроде как, подходящая:
Dockerfile
FROM php:7-fpm
RUN apt-get update && apt-get install -y \
curl \
wget \
git \
zip \
unzip \
vim \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
libzip-dev \
&& docker-php-ext-install -j$(nproc) iconv mysqli pdo_mysql zip \
&& docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
USER www-data:www-data
WORKDIR /var/www
CMD ["php-fpm"]
Автозагрузку обновил ("composer dump-autoload").
Причина скрывается где-то в этом направлении:
Где-то тут кроется причина
try {
/** @var Router $router */
$router = $DI->get(Router::class);
phpinfo();
// Редирект с повторяющихся слешей
$uri = str_replace(Request::getDomainWithProtocol(), '', Request::getCurrentUrl());
if (($destination = preg_replace('~//+~', '/', $uri, -1, $countReplace)) && $countReplace > 0) {
Response::redirectTo($destination, 301);
}
$router->resolveCurrentLanguage();
if ($config->get('debug_mode') == true) {
ini_set('display_errors', 'on');
error_reporting(E_ALL);
}
/** @var Response $response */
$response = $DI->get(Response::class);
/** @var Request $request */
$request = $DI->get(Request::class);
// Установим время начала выполнения скрипта
$request->setStartTime($startTime);
if (isset($_GET['logout'])) {
unset($_SESSION['admin']);
unset($_SESSION['last_version_data']);
setcookie('admin_login', '', time()-100, '/');
$response->redirectTo($request->getRootUrl());
}
/** @var Modules $modules */
$modules = $DI->get(Modules::class);
DebugBar::stopMeasure('init');
$modules->startEnabledModules();
$router->run();
if ($response->getContentType() == RESPONSE_HTML) {
// Отладочная информация
print "<!--\r\n";
$timeEnd = microtime(true);
$execTime = $timeEnd - $startTime;
if (function_exists('memory_get_peak_usage')) {
print "memory peak usage: " . memory_get_peak_usage() . " bytes\r\n";
}
print "page generation time: " . $execTime . " seconds\r\n";
print "-->";
}
} catch (\Exception $e) {
/** @var LoggerInterface $logger */
$logger = $DI->get(LoggerInterface::class);
$message = $e->getMessage() . PHP_EOL . $e->getTraceAsString();
if ($config->get('debug_mode') == true) {
print $message;
} else {
$logger->critical($message);
header($_SERVER['SERVER_PROTOCOL'].' 500 Internal Server Error');
}
}
"phpinfo()" до этой строчки: "$router = $DI->get(Router::class);" (она почти в самом начале) работает, после - уже не работает, появляется ошибка 500.
"php index.php" в ПоверШелле говорит:
"PHP Warning: Undefined array key "SERVER_PROTOCOL" in ..." ссылаясь на тот же try-catch блок, на последнюю строчку - "header($_SERVER['SERVER_PROTOCOL'].' 500 Internal Server Error');"
Один мой коллега предположил, что это может происходить из-за того, что я выдернул эти файлы из контекста самой CMS и стараюсь отдельно запихнуть в Докер (я так и делаю, взял все файлы сайта и пихаю в Докер).
Однако возникают вопросы. Прав ли он? Если он прав, тогда как правильно сделать разделение на разработку и продакшн? Как обычно рекомендуется делать тогда?