nginx Compatibility

Делаем WordPress дружелюбнее к nginx

Описание

предназначен для решения двух проблем:

  1. Когда обнаруживает, что используется SAPI, код перенаправления, передаваемый в wp_redirect(), игнорируется. Таким образом, все перенаправления с кодом 301 тихо превращаются в перенаправления с кодом 302, что не очень хорошо для SEO.
    Если WordPress работает под управлением , плагин переопределяет функцию wp_redirect(), что позволяет использовать коды перенаправления.
  2. Если WordPress считает, что (модуль Apache, отвечающий за переписывание URL’ов — используется для красивых постоянных ссылок) не загружен (а nginx не использует модули и API Apache), он предлагает использовать постоянные ссылки в формате PATHINFO (Настройки » Постоянные ссылки). Такие ссылки не очень красивы, но всё же лучше, чем ничего.
    Тем не менее, nginx умеет переписывать URL’ы, но не может об этом сказать WordPress. За него это делает плагин, заставляя WordPress думать, что mod_rewrite всё-таки загружен, и можно использовать красивые пермалинки.

Установка

  1. Загрузите каталог nginx-compatibility в /wp-content/plugins/
  2. Активируйте плагин в панели управления WordPress
  3. Это всё :-) Никакой настройки не требуется, плагин сам обо всём позаботится

Замечания по конфигурации nginx

Хотя данный плагин и позволяет WordPress использовать красивые постоянные ссылки, для этого требуются специальные правила в конфигурации виртуального хоста.

Для nginx версии 0.7.32 и старше могут использоваться такие правила (приведены только релевантные блоки):

[-]
View Code nginx configuration
server {
    server_name mysite.com www.mysite.com;

    root /path/to/blog;

    index index.php;

    location / {
        try_files $uri $uri/ @wordpress;
    }

    location @wordpress {
        fastcgi_pass ...;
        fastcgi_param SCRIPT_FILENAME /path/to/blog/index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_NAME /index.php;
    }

    location ~ \.php$ {
        try_files $uri @wordpress;
        fastcgi_index index.php;
        fastcgi_pass ...;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }
}

Для nginx младших версий конфигурация виртуального хоста будет несколько другой:

[-]
View Code nginx configuration
server {
    server_name mysite.com www.mysite.com;

    root /path/to/blog;

    index index.php;

    location / {
        log_not_found off;
        error_page 404 = @wordpress;
    }

    location @wordpress {
        fastcgi_pass ...;
        fastcgi_param SCRIPT_FILENAME /path/to/blog/index.php;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_NAME /index.php;
    }

    location ~ \.php$ {
        if (!-e $request_filename) {
            rewrite ^(.+)$ /index.php break;
            break;
        }

        fastcgi_index index.php;
        fastcgi_pass ...;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }
}

Замените /path/to/blog путём к блогу, в fastcgi_pass задайте адрес сервера -cgi (обычно это 127.0.0.1:9000).
Для старых версий nginx, возможно, придётся изменить строку rewrite ^(.+)$ /index.php break;, если блог расположен не в корне сайта.

Файл fastcgi_params (в Debian он обычно в /etc/nginx, в других системах он может располагаться в другом месте — используйте правильный путь в директиве include!) выглядит примерно так (скорее всего, он идёт в стандартной поставке nginx):

[-]
View Code nginx configuration
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_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  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

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_buffer_size 32k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

Есть вопросы по конфигурации — пишите.

Часто задаваемые вопросы

Вопросов пока нет, ответов тоже. Задавайте.

Замечания

GoPHP5! Плагину для работы требуется PHP 5. PHP 4 не поддерживается разработчиками, у меня тоже нет желания его поддерживать. Тем более, что шестая версия на носу.

Домашняя страница плагина на wordpress.org.

Автор: ;

RSS Комментарии к статье «nginx Compatibility» (81)  »

  1. Юрий

    Здравствуйте, Владимир.

    Я сейчас использую виртуальный хостинг ru-center. Хостер посоветовал мне ставить Nginx.

    У них есть возможность самостоятельной установки nginx
    в качестве front-end для посетителей сайтов, а Back-end’ом будет выступать Apache.

    Нужно ли дорабатывать Ваш пример конфигурации под такой порядок работы (или вообще применима ли она к данной ситуации) ?

    C уважением, Юрий.

  2. Большое спасибо, действительно помогло.
    Совет: вместо «fastcgi_pass …;» сделай что-то типа «fastcgi_pass параметры_подключения;», или дефолтное 127.0.0.1:9000, сделав приписку, что это нужно поменять, если у вас не ubuntu/debian. И еще выдели «/path/to/blog/» – а index выделять незачем.

  3. [...]        第一个是什么都不用设置的nginx Compatibility (PHP4), 因为我的wordpress是跑在nginx上的,因此需要安装这个插件,地址在这里http://blog.sjinks.pro/wordpress-plugins/nginx-compatibility/; [...]

  4. [...] use nginx+php-fcgi you should install nginx Compatibility. If you use php5 DO NOT activate plugin after installation. Go to plugins list and activate PHP5 [...]

  5. [...] Не берусь рекомендовать этот плагин всем поголовно, но гики найдут его интересным. За подробностями сюда. [...]

  6. Валодя

    А по-хорошему, если Вы используете nginx, зачем Вам нужен Apache? Избавляйтесь от Apache и отдайте память приложениям

    а что поставить вместо него?

  7. [...] с этой и другими проблемами нужно поставить плагин nginx Compatibility. Если у вас стоит PHP5, то не нужно активировать плагин [...]

  8. Petar

    Hi is it possible to run multiple wordpress instances on 1 domain.. example.com/wordpress/ & example.com/wordpress2/ ..? Tnx for plugin works great!

    • Yes, it is.

      The configuration file will look differently though:

      [-]
      View Code nginx configuration
      server {
          server_name mysite.com www.mysite.com;

          root /path/to/docroot;

          index index.php;

          location /wordpress1 {
              try_files $uri $uri/ @wordpress1;
          }

          location /wordpress2 {
              try_files $uri $uri/ @wordpress2;
          }

          location @wordpress1 {
              fastcgi_pass ...;
              fastcgi_param SCRIPT_FILENAME /path/to/docroot/wordpress1/index.php;
              include /etc/nginx/fastcgi_params;
              fastcgi_param SCRIPT_NAME /index.php;
          }

          location @wordpress2 {
              fastcgi_pass ...;
              fastcgi_param SCRIPT_FILENAME /path/to/docroot/wordpress2/index.php;
              include /etc/nginx/fastcgi_params;
              fastcgi_param SCRIPT_NAME /index.php;
          }

          location ~ \.php$ {
              try_files $uri @wordpress;
              fastcgi_index index.php;
              fastcgi_pass ...;
              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              include /etc/nginx/fastcgi_params;
          }

      Basically you will have as many location /wordpressX (do not forget to replace wordpressX with the actual folder name!) as the number of WP installations you have. Then for every location /wordpressX you will need location @wordpressX and do not forget to modify fastcgi_param SCRIPT_FILENAME with the actual path to index.php.

  9. Robert

    Hi Vladimir,

    I can’t get your plugin running. WP doesn’t seem to install it properly. I also run into failures messages when trying to update my plugins.

    Any ideas or suggestions?

    My url rewrite syntax goes like:

    try_files $uri $uri/ /index.php?q=$uri&$args;

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «nginx Compatibility»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा