Установите wordpress в подкаталог с помощью docker-compose и nginx

#wordpress #docker #nginx #docker-compose

Вопрос:

Я собираюсь создать веб-сайт с помощью docker-compose.

Когда пользователь входит в корневой каталог, он переходит в веб-приложение. Когда пользователь вводит http://example.com/blog, он должен перенаправить на wordpress.

Для этого я настроил докер-составьте так

 version: "3"

services:

  nginx:
    image: nginx:latest
    depends_on:
      - web-app
      - wordpress
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 80:80

  mysql:
    image: mysql:5.7.29
    container_name: mysql
    restart: always
    volumes:
      - ./data/mysql/data:/var/lib/mysql

  wordpress:
    depends_on:
      - mysql
    image: wordpress:latest
    ports:
      - 8000:80
    restart: always
    volumes:
     - ./data/blog:/var/www/html/wp-content
     - ./blog/wp-config.php:/var/www/html/wp-config.php

  web-app:
    build: ./app
    depends_on:
      - mysql
    restart: always
    command: npm start
    environment:
      - TZ=UTC
      - NODE_ENV=production

networks:
  default:
    external:
      name: common
 

И это моя конфигурация nginx

 worker_processes auto;
events {
    worker_connections 1024;
}
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    log_format main '[$time_local] $remote_addr - $request request_time: $request_time';
    access_log /var/log/nginx/access.log main;

    gzip on;
    gzip_http_version 1.1;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_types text/plain text/html text/css application/json application/javascript application/x$
    #                        make sure gzip does not lose large gzipped js or css files
    #                        see http://blog.leetsoft.com/2007/07/25/nginx-gzip-ssl.html
    gzip_buffers 16 8k;

    server {
        listen 80;
        charset utf-8;

        location /blog/ {
            proxy_set_header  Host               $host;
            proxy_set_header  X-Real-IP          $remote_addr;
            proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;

            proxy_pass http://wordpress;
        }

        location / {
            proxy_http_version 1.1;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_redirect off;
            proxy_pass http://web-app:3000;
        }

    }
} 
 

И я обновил wp-config.php и установите URL-адрес веб-сайта.

 define('WP_SITE_URL', 'https://example.com/blog');
define('WP_SITEURL', 'https://example.com/blog');
define('WP_HOME', 'https://example.com/blog');
 

Однако, когда я войду в https://example.com/blog, он возвращает ERR_TOO_MANY_REDIRECTS ответ.

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

Комментарии:

1. Это не очень хорошее решение, но оно может помочь на некоторое время, пока вы не найдете причину: remove_action( 'template_redirect', 'redirect_canonical' ); Добавьте эту строку в functions.php файл.

Ответ №1:

В вашем config.php ты сделаешь это :

 // Define the website URL
define('WP_SITEURL', getenv_docker('WORDPRESS_SITEURL', 'https://example.com/blog'));

// Define the website Home page
define('WP_HOME',    getenv_docker('WORDPRESS_HOME', 'https://example.com/blog'));

// Rewrite your access URL to the admin page
$_SERVER['REQUEST_URI'] = str_replace("/wp-admin/", "/blog/wp-admin/",  $_SERVER['REQUEST_URI']);
 

Если вы не версируете свои ресурсы wordpress, используйте напрямую переменные docker compose, подобные этому, вместо использования config.php файл :

 WORDPRESS_CONFIG_EXTRA: |
   define('WP_HOME','https://example.com/blog');
   define('WP_SITEURL','https://example.com/blog');
   $_SERVER['REQUEST_URI'] = str_replace("/wp-admin/", "/blog/wp-admin/",  $_SERVER['REQUEST_URI']);
 

И в окне настройки файлов-составьте.yml вы помещаете следующие переменные среды :

 environment:
  ...
  - WORDPRESS_SITEURL="https://example.com/blog"
  - WORDPRESS_HOME="https://example.com/blog"