Как запустить Docker WordPress через php-fpm на nginx?

#wordpress #docker #nginx

#wordpress #docker #nginx

Вопрос:

Привет, я пробовал разные вещи, но они приводят меня к начальной странице nginx, ошибка 403 или ошибка 404. В настоящее время я запускаю WordPress без php-fpm, но он работает не так хорошо, поэтому я хочу его изменить, но при этом у меня возникли проблемы.

Мой WordPress Docker-compose (без db):

   wordpress:
    container_name: wordpress
    links:
      - wordpress-db
    depends_on:
      - wordpress-db
    image: wordpress:php7.4-fpm
    ports: 
      - 9000:9000
    restart: always
    volumes:
      - /media/storage/wordpress:/var/www/html
      - .secrets/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
    networks:
      - wordpress
    environment:
      - TZ=Europe/Berlin
    env_file:
      - .secrets/wordpress.env
  

Мой файл nginx compose:

 services:
  nginx:
    restart: always
    container_name: nginx
    image: cptdaydreamer/nginx:latest
    ports:
      - 80:80
      - 443:443
      - 4443:4443
    volumes:
      - /media/storage/log:/var/log/nginx
      - /etc/ssl:/etc/ssl
    external_links:
      - wordpress
    environment:
      - TZ=Europe/Berlin
    build:
      context: /media/storage/nginx
      dockerfile: Dockerfile
    networks:
      - nextcloudpi
      - wordpress
      - matomo
      - php
  

А теперь важная часть. Моя конфигурация nginx:

 http {

  server_names_hash_bucket_size 64;

  access_log off;
  error_log /var/log/nginx/error.log;
  
  autoindex_localtime on;
  #more_clear_headers Server;

  ssl_certificate           /etc/ssl/tld.pem;
  ssl_certificate_key       /etc/ssl/tld.key;
  
  gzip            on;
  gzip_min_length 1000;
  gzip_proxied    expired no-cache no-store private auth;
  gzip_types      text/plain text/css text/xml application/javascript application/json application/xml application/rss xml image/svg xml;
  gzip_disable    "MSIE [1-6].";
  
  proxy_send_timeout 180s;
  proxy_read_timeout 180s;
  fastcgi_send_timeout 180s;
  fastcgi_read_timeout 180s;

  server {
    listen 80 default_server;
    server_name _;
    server_name_in_redirect off;
    
    location / {
        return 404;
    }
  }

  server {
    listen 80;
    listen [::]:80;
    server_name tld.de cloud.tld.de www.tld.de stats.tld.de;
    return 301 https://$host$request_uri;
  }
  
  # WordPress
  
  server {
    server_name tld.de www.tld.de ts.tld.de;
    
    #access_log /var/log/nginx/wordpress-access.log;
    error_log /var/log/nginx/wordpress-error.log;
    
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    
    client_max_body_size 500m;
    underscores_in_headers on;
    
    root /var/www/html; 
    index index.php;

    location / {
       try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ .php$ {
       try_files $uri =404;
       fastcgi_split_path_info ^(. .php)(/. )$;
       fastcgi_pass wordpress:9000;
       fastcgi_index index.php;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       fastcgi_param PATH_INFO $fastcgi_path_info;
    }
  }
  

Ошибки, которые я получаю, например, такие: индекс каталога /var/www/html запрещен.

Если я удалю $uri/ , например, я получу ошибку 404. Что мне нужно сделать, чтобы запустить мой экземпляр? Но я прав, что я могу использовать свой существующий экземпляр WordPress, и меняется только способ доступа к нему или нет?

Ответ №1:

вы прослушиваете ssl, но не указали путь к сертификатам?

вы случайно не используете какого-либо внешнего поставщика ssl, такого как Cloudflare? если да, то вам нужно либо прослушать порт 80 (который используется по умолчанию в Cloudflare), либо настроить в Cloudflare, чтобы получить https-сайт, в этом случае вам также необходимо указать свой собственный путь к сертификату.

Во-вторых, в вашем location / блоке у меня есть это try_files $uri $uri/ /index.php?url=$uri; и несколько других настроек

     location / {
      try_files $uri $uri/ /index.php?url=$uri;
    }
    location ~ .(php)$ {
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
      include fastcgi_params;
      fastcgi_read_timeout 3000;
      proxy_connect_timeout 3000s;
      proxy_send_timeout   3000;
      proxy_read_timeout   3000;
    }
  

fastcgi_pass 127.0.0.1:9000 будет по-другому, в вашем случае это wordpress:9000

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

1. Я использую SSL-сертификат Cloudflare, это верно. Я определил это в части http. Другие мои контейнеры, такие как matomo, nextcloud и прочее, хорошо работают с конфигурацией для прослушивания на 443. Итак, что именно вы имеете в виду под прослушиванием на порту 80? Где и что тогда нужно прослушивать на порту 80? Я добавлю http-часть к вопросу.

2. Если я удалил индекс и root, я получаю только добро пожаловать в nginx!. В противном случае я получаю запрещенный индекс каталога «/ usr/ share/nginx / html/», что также неверно.

3. Я вижу, что такое uid www-data пользователя каталога /var/www/html ? вы можете попробовать создать ссылку на эту папку root /usr/share/nginx/html/ , которая должна принадлежать www-data с uid 82

4. Вы на неправильном пути. Я что-то пропустил в учебнике, и теперь я перехожу на начальную страницу, но 13: Разрешение отказано для каждого изображения и содержимого wp-контента.