BeingZepp
@BeingZepp
Лучший друг добрых хоббитов

Что делать, если код показывает 500 ошибку (в частности: Okay-CMS)?

По долгу службы столкнулся с 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 и стараюсь отдельно запихнуть в Докер (я так и делаю, взял все файлы сайта и пихаю в Докер).

Однако возникают вопросы. Прав ли он? Если он прав, тогда как правильно сделать разделение на разработку и продакшн? Как обычно рекомендуется делать тогда?
  • Вопрос задан
  • 212 просмотров
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Это просто невероятно, сколько мусора может произвести одна голова за единицу времени из-за незнания самых базовых принципов.
Если сервер показывает 500 ошибку, то надо найти и прочитать конкретное сообщение об ошибке, а не заниматься гаданием на кофейной гуще.

Вот же у вас написано:
if ($config->get('debug_mode') == true) {
        print $message;

Значит надо найти конфиг и поменять значение этого параметра.

Если не поможет, то хотя бы тупо временно добавить echo $e; под } catch (\Exception $e) {
Оно не будет рассусоливать про конфиги, композеры, протоколы и прочие умные идеи, а просто напишет какая конкретно произошла ошибка, чтобы её можно было исправить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы