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

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект