Добавление нового настраиваемого типа записи с помощью редактора вызывает ошибку 502 Bad Gateway.

Вопрос или проблема

У меня на сайте настроены два типа пользовательских записей. Когда я перехожу в Типы пользовательских записей > Добавить новый тип записи в панели управления WordPress, через Cloudflare отображается следующая ошибка: Код ошибки 502 Bad Gateway. При создании новых записей с использованием стандартного редактора записей этой ошибки не возникает.

Я включил код регистрации типа пользовательской записи ниже для справки. За исключением создания нового типа записи, функциональность, кажется, не вызывает ошибок. Оба затронутых типа пользовательских записей используют один и тот же код для регистрации.

function theme_name_register_notice_post_type() {
  $labels = array(
    'name'                     => __( 'Notices', 'theme_name' ),
    'singular_name'            => __( 'Notice', 'theme_name' ),
    'add_new'                  => __( 'Add New Notice', 'theme_name' ),
    'add_new_item'             => __( 'Add New Notice', 'theme_name' ),
    'edit_item'                => __( 'Edit Notice', 'theme_name' ),
    'new_item'                 => __( 'New Notice', 'theme_name' ),
    'view_item'                => __( 'View Notice', 'theme_name' ),
    'view_items'               => __( 'View Notices', 'theme_name' ),
    'search_items'             => __( 'Search Notices', 'theme_name' ),
    'not_found'                => __( 'No notices found.', 'theme_name' ),
    'not_found_in_trash'       => __( 'No notices found in trash.', 'theme_name' ),
    'parent_item_colon'        => __( 'Parent Notices:', 'theme_name' ),
    'all_items'                => __( 'All Notices', 'theme_name' ),
    'archives'                 => __( 'Notice Archives', 'theme_name' ),
    'attributes'               => __( 'Notice Attributes', 'theme_name' ),
    'insert_into_item'         => __( 'Insert into notice', 'theme_name' ),
    'uploaded_to_this_item'    => __( 'Uploaded to this notice', 'theme_name' ),
    'featured_image'           => __( 'Featured Image', 'theme_name' ),
    'set_featured_image'       => __( 'Set featured image', 'theme_name' ),
    'remove_featured_image'    => __( 'Remove featured image', 'theme_name' ),
    'use_featured_image'       => __( 'Use as featured image', 'theme_name' ),
    'menu_name'                => __( 'Notices', 'theme_name' ),
    'filter_items_list'        => __( 'Filter document list', 'theme_name' ),
    'filter_by_date'           => __( 'Filter by date', 'theme_name' ),
    'items_list_navigation'    => __( 'Notices list navigation', 'theme_name' ),
    'items_list'               => __( 'Notices list', 'theme_name' ),
    'item_published'           => __( 'Notice published.', 'theme_name' ),
    'item_published_privately' => __( 'Notice published privately.', 'theme_name' ),
    'item_reverted_to_draft'   => __( 'Notice reverted to draft.', 'theme_name' ),
    'item_scheduled'           => __( 'Notice scheduled.', 'theme_name' ),
    'item_updated'             => __( 'Notice updated.', 'theme_name' ),
    'item_link'                => __( 'Notice Link', 'theme_name' ),
    'item_link_description'    => __( 'A link to an notice.', 'theme_name' ),
  );
  $args = array(
    'labels'                => $labels,
    'description'           => __( 'Current and past notices from your RM, Sask Alert, and other sources.', 'theme_name' ),
    'public'                => true,
    'exclude_from_search'   => false,
    'publicly_queryable'    => true,
    'show_ui'               => true,
    'show_in_menu'          => true,
    'show_in_nav_menus'     => true,
    'show_in_admin_bar'     => false,
    'show_in_rest'          => true,
    'menu_position'         => 5,
    'menu_icon'             => 'dashicons-megaphone',
    'capability_type'       => 'post',
    'capabilities'          => array(),
    'supports'              => array( 'title', 'editor', 'revisions', 'custom-fields', 'author', 'thumbnail' ),
    'taxonomies'            => array( 'notice-type' ),
    'has_archive'           => true,
    'rewrite'               => array( 'slug' => 'notices', 'with_front' => false, ),
    'can_export'            => true,
    'delete_with_user'      => false,
    'template'              => array(),
    'template_lock'         => false,
  );
  register_post_type( 'notice', $args );
}
add_action( 'init', 'theme_name_register_notice_post_type' );

Каждый тип пользовательской записи также имеет свою собственную пользовательскую таксономию. Код таксономии приведен ниже для справки.

function theme_name_register_taxonomy_notice_type() {
  $labels = array(
    'name' => _x( 'Notice Type', 'taxonomy general name' ),
    'singular_name' => _x( 'Notice Type', 'taxonomy singular name' ),
    'search_items' => __( 'Search Notice Types' ),
    'all_items' => __( 'All Notice Types' ),
    'parent_item' => __( 'Parent Notice Type' ),
    'parent_item_colon' => __( 'Parent Notice Type:' ),
    'edit_item' => __( 'Edit Notice Type' ),
    'update_item' => __( 'Update Notice Type' ),
    'add_new_item' => __( 'Add New Notice Type' ),
    'new_item_name' => __( 'New Notice Type Name' ),
    'menu_name' => __( 'Notice Types' ),
  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'show_ui' => true,
    'show_admin_column' => true,
    'show_in_rest' => true,
    'show_tagcloud' => false,
    'hierarchical' => true,
    'rewrite' => array( 'slug' => 'notice-type', 'hierarchical' => true, ),
  );
  register_taxonomy( 'notice-type', [ 'notice' ], $args );
}

Я создал два виджета в панели инструментов, которые имеют быстрые ссылки для создания новых пользовательских типов записей. Код генерирует кнопки быстрых ссылок, которые предустанавливают категорию из таксономии пользовательского типа записей. Эти ссылки загружают редактор без ошибок. Ниже я привел код быстрых ссылок для справки.

function theme_name_post_notices( $post ) {
  $post_type="notice";
  $taxonomy_name="notice-type"; // Notices taxonomy name
  $terms = theme_name_get_terms_by_taxonomy_name( $taxonomy_name );
?>
<div class="os-dashboard-widget">
  <p>
    <?php esc_html_e( 'Use these links to post notices.', 'theme_name' ); ?>
  </p>
  <?php if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) : ?>
    <ul class="os-content-grid">
      <?php foreach ( $terms as $term ) : ?>
      <li>
        <a href="<?php echo esc_url( admin_url( 'post-new.php?post_type=" . $post_type . "&preset_term=' . $term->term_id ) ); ?>" class="button button--os-primary">
          <?php echo esc_html( $term->name ); ?>
        </a>
      </li>
      <?php endforeach; ?>
    </ul>
    <?php endif; ?>
  </div>
<?php
}

Сервер — nginx с установленным PHP 8.2.26/FPM. Предел памяти PHP установлен на 512 мегабайт. Предел времени PHP и максимальное время ввода установлены на 60.

На другие области панели администратора не влияют ошибки 502 bad gateway.

Эти ошибки возникают только тогда, когда пользовательские типы записей имеют созданные и используемые пользовательские таксономии. Я могу это проверить, потому что сайт является мультисайтом, и на некоторых из сайтов пользовательские таксономии не заполнены.

Есть идеи, почему это происходит?

Я провел дополнительные исследования и тестирование и обнаружил, что проблема связана с nginx, а не с WordPress. Следующий пост на Stack Overflow включал некоторые настройки конфигурации для конфигурационного файла сайта, которые разрешили проблемы 502 bad gateway. Параметр client_max_body_size в моем конфигурационном файле уже был установлен на 64M.

Вот настройки nginx, которые я изменил для решения проблемы:

fastcgi_temp_file_write_size 10m;
fastcgi_busy_buffers_size 512k;
fastcgi_buffer_size 512k;
fastcgi_buffers 16 512k;

Ответ или решение

Когда пользователь сталкивается с ошибкой 502 Bad Gateway при добавлении нового кастомного типа записи через панель администратора WordPress, это может стать значительным препятствием. Проблема, описанная в вопросе, связана с двумя кастомными типами записей, которые имеются на сайте и используют одинаковый код для регистрации. Ошибка возникает только при создании нового типа записи через редактор, в то время как стандартные посты создаются без проблем.

Теория

502 Bad Gateway — это ошибка, которую сервер получает от вышестоящего сервера, указывающая на то, что проблема кроется в передаче данных между серверами. Обычно это может быть связано с неправильными настройками сервера (в данном случае nginx) или перегрузкой ресурсов. Эта ошибка может сигнализировать о том, что сервер не смог получить ответ от вышестоящего сервера, возможно, из-за неправильно настроенных параметров кэширования или буферизации.

Пример

В данном случае код регистрации кастомного типа записи и сопутствующей таксономии выставлен корректно. Мы видим, что кастомные типы записей и таксономии правильно регистрируются и показываются в WordPress. Однако ошибка 502 возникает именно в процессе добавления новых записей кастомного типа, причём только тогда, когда используются кастомные таксономии. Это указывает на возможную проблему с серверными настройками, в частности с буферами fastcgi.

Проблема могла быть в недостаточном размере буферов fastcgi, которые используются для обработки запроса к серверу PHP. Нехватка памяти для выполнения задач PHP может привести к перегрузке, в результате чего и возникает описанная ошибка.

Применение

Для решения этой проблемы были выполнены конкретные корректировки в конфигурационном файле nginx, что позволило устранить ошибку 502. Были изменены параметры:

  • fastcgi_temp_file_write_size 10m; — увеличен размер временных файлов.
  • fastcgi_busy_buffers_size 512k; — увеличен размер буферов для занятых файлов.
  • fastcgi_buffer_size 512k; — увеличен размер основного буфера.
  • fastcgi_buffers 16 512k; — изменено количество и размер буферов.

Эти параметры управляют тем, как nginx взаимодействует с fastcgi серверсайд, что обеспечивает более плавное и эффективное распределение ресурсов. Изменение этих параметров позволило сгладить обработку запросов сервером, обеспечив необходимую память и временные ресурсы для выполнения PHP-кода без перегрузок.

Рекомендации

Чтобы избежать подобных проблем в будущем, рекомендуется:

  1. Мониторинг ресурсов сервера: регулярно следите за загруженностью сервера и используемыми ресурсами, чтобы вовремя выявлять потенциальные проблемы.

  2. Оптимизация кода: убедитесь, что ваш код оптимизирован, и нет избыточных вызовов или операций, которые могли бы нагружать сервер.

  3. Контроль конфигурации сервера: своевременно обновляйте и корректируйте настройки вашего веб-сервера в зависимости от нагрузки и специфических требований вашего сайта.

  4. Тестирование окружения: перед внесением изменений в продакшн-среду проводите тестирование на тестовом сервере, чтобы удостовериться в правильности и эффективности настроек.

Таким образом, понимая, как nginx обрабатывает fastcgi-запросы и корректируя эти параметры, вы можете существенно улучшить стабильность и производительность вашего WordPress сайта, особенно при работе с кастомными типами записей и таксономиями.

Оцените материал
Добавить комментарий

Капча загружается...