Docker + jwilder/nginx-proxy + jwilder/docker-gen + jrcs/letsencrypt-nginx-proxy-companion + php:7-fpm + wordpress:fpm

Я знаю, что я очень близок к этому, но я не могу заставить работать последнюю часть. Я почти уверен, что это связано с тем, что контейнер WordPress и контейнер PHP должны быть в одном и том же каталоге? Итак, PHP может обрабатывать файлы в этом каталоге? Я работаю над этим уже полторы недели, и я ломаюсь, прошу помощи.

Я могу большинство из этого работает и в разных комбинациях - но не в этой конкретной комбинации.

Что я пытаюсь сделать, так это иметь отдельные контейнеры для MySQL (и совместно использовать базу данных) nginx-proxy WordPress с использованием Nginx (каждый сайт со своим собственным контейнером WordPress) PHP 7

У меня получилось работать с WordPress с помощью Apache, но это не то, чего я хочу.

Я много читал и много тестировал и обнаружил, что изначально мне не хватало VIRTUAL_PROTO=fastcgi. Я вижу конфиги, которые заполняются в контейнере nginx-proxy... они кажутся правильными, но я думаю, что моя путаница связана с путями и виртуальными средами.

Я создаю сеть докеров, создаю nginx-proxy

Это файлы и каталоги, которые у меня есть... /home/tj/db/docker-compose.yml /home/tj/mysite.com /home/tj/mysite.com/.env /home/tj/nginx-proxy /докер-compose.yml

/home/tj/db/docker-compose.yml

version: "3"

services:
   db:
     image: mysql:5.7
     volumes:
        - ../_shared/db:/var/lib/mysql
     restart: always
     environment:
        MYSQL_ROOT_PASSWORD: somewordpress
        MYSQL_DATABASE: wordpress
        MYSQL_USER: wordpress
        MYSQL_PASSWORD: wordpress
     container_name: db
     networks:
       - nginx-proxy

networks:
  nginx-proxy:
    external:
      name: nginx-proxy

/home/tj/mysite.com/.env

MYSQL_SERVER_CONTAINER=db
VIRTUAL_HOST=mysite.com
DBIP="$(docker inspect ${MYSQL_SERVER_CONTAINER} | grep -i 'ipaddress' | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])')"
[email protected]
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wordpress

/home/tj/mysite.com/docker-compose.yml

version: "3"

services:
   wordpress:
     image: wordpress:fpm
     expose:
        - 80
     restart: always
     environment:
        VIRTUAL_HOST: ${VIRTUAL_HOST}
        LETSENCRYPT_HOST: ${VIRTUAL_HOST}
        LETSENCRYPT_EMAIL: ${EMAIL_ADDRESS}
        WORDPRESS_DB_HOST: db:3306
        WORDPRESS_DB_USER: ${WORDPRESS_DB_USER}
        WORDPRESS_DB_PASSWORD: ${WORDPRESS_DB_USER}
        WORDPRESS_DB_NAME: ${WORDPRESS_DB_NAME}
        VIRTUAL_PROTO: fastcgi
        VIRTUAL_PORT: 3030
        VIRTUAL_ROOT: /usr/share/nginx/html
     container_name: ${VIRTUAL_HOST}
     volumes:
        - ../nginx-proxy/html:/usr/share/nginx/html:rw

networks:
  default:
    external:
      name: nginx-proxy

/home/tj/nginx-proxy/docker-compose.yml

version: '3'

services:
  nginx:
    image: nginx:1.17.7
    container_name: nginx-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - conf:/etc/nginx/conf.d:ro
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
    labels:
      - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true
    restart: always

  dockergen:
    image: jwilder/docker-gen:0.7.3
    container_name: nginx-proxy-gen
    depends_on:
      - nginx
    command: -notify-sighup nginx-proxy -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
    restart: always

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nginx-proxy-le
    depends_on:
      - nginx
      - dockergen
    environment:
      NGINX_PROXY_CONTAINER: nginx-proxy
      NGINX_DOCKER_GEN_CONTAINER: nginx-proxy-gen
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: always

  php-fpm:
    image: php:7-fpm
    container_name: php
    environment:
      - VIRTUAL_HOST=docker.nevistechnology.com
      - VIRTUAL_ROOT=/usr/share/nginx/html
      - VIRTUAL_PORT=9000
      - VIRTUAL_PROTO=fastcgi
    restart: always
    ports:
      - 9000
    volumes:
      - ./html:/usr/share/nginx/html

volumes:
  conf:
  vhost:
  html:
  certs:

networks:
  default:
    external:
      name: nginx-proxy

Теперь то, что я смог заставить работать, это если я использую «wordpress: последний» вместо «wordpress: fpm», но я не хочу использовать Nginx и Apache... Apache использует много памяти, и у меня есть все моих старых конфигураций и заметок в Nginx, поэтому я хотел бы, чтобы это заработало.

У меня есть кое-какие вещи из Dockerfile, которые я тоже пытаюсь понять — например, запуск команд, но позвольте мне сначала посмотреть, можете ли вы все помочь мне с этим.

Другое дело — это скорее общая проблема Linux, но за многие годы я так и не смог разобраться в этом, и я просто по умолчанию использую root, что, как я знаю, является плохой практикой. Итак, у меня есть пользователь "tj", которого я создал, например:

sudo useradd tj sudo usermod -aG sudo tj sudo usermod -aG docker tj sudo usermod -aG www-data tj sudo g+w /home/tj -R *

Для Docker я начал работать с моим каталогом /home/tj. Когда я пытаюсь отредактировать файл или загрузить его, у меня возникает проблема с разрешением. Но если я меняю каталоги и файлы с www-data:www-data на tj:www-data or tj:tj, это работает для меня в SFTP или терминале, но тогда возникают проблемы с веб-сайтом, например, когда я пытаюсь загрузить - www-data имеет проблемы с разрешениями на стороне WordPress.


person TJ Nevis    schedule 16.01.2020    source источник
comment
улучшенное форматирование   -  person waka    schedule 17.01.2020


Ответы (1)


Итак, я знаю, что опаздываю на вечеринку, но у меня могут быть некоторые ответы, так что здесь ничего не происходит:

В конце концов я запустил это и многое другое, все в рое, но мне пришлось немного настроить прокси: https://github.com/PiTiLeZarD/nginx-proxy

Что-то, что мне пришлось осознать, это то, что изображение fpm работает только с php! любые активы или файлы должны быть связаны как том в nginx-proxy и настроены так, чтобы nginx получал файлы, а не fpm. В моем настроенном nginx-proxy я добавил кое-что об этом в шаблоны:

{{ if (exists (printf "/etc/nginx/static_files/%s" $host)) }}
root {{ printf "/etc/nginx/static_files/%s" $host }};
{{ end }}

vhost.d/default: я добавил раздел:

location / {
    location ~ \.php$ {
        try_files /dev/null @upstream;
    }
    try_files /assets/$uri $uri @upstream;
}

Я настроил все, чтобы иметь переменную среды LOCATION_PATH=@upstream (у меня много сервисов, поэтому некоторые все еще используют значение по умолчанию /)

vhost.d/default_location, я добавил туда конфиг fastcgi:

    index index.php;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Нужно многое настроить и отслеживать, но подождите, это можно заставить работать.

Что касается проблем с root/user, я запускаю свои изображения php-fpm как www-data:www-data (что соответствует 1000:1000). не в конечном итоге с проблемами все время.

www.conf fpm имеет раздел пользователя/группы, где вы можете указать www-data/www-data, и я создаю свои образы с помощью трюка для пользователей:

# add a NOPASSWD to sudo for www-data
RUN printf 'www-data ALL=(ALL:ALL) NOPASSWD: ALL' | tee /etc/sudoers.d/www-data

# bind www-data user and group from 33:33 to 1000:1000
RUN rmdir /var/www/html \
    && userdel -f www-data \
    && if getent group www-data ; then groupdel www-data; fi \
    && groupadd -g 1000 www-data \
    && useradd -l -u 1000 -g www-data -G sudo www-data \
    && install -d -m 0755 -o www-data -g www-data /home/www-data \
    && find / -group 33 -user 33 2>/dev/null || echo "/var/www" | xargs chown -R 1000:1000

Этот шаг позаботится о переключении всего с root:root на www-data:www-data. Я также устанавливаю sudo в свои образы докеров, раньше я этого не делал, но у меня были проблемы, которые было очень трудно исправить без него.

Не уверен, поможет ли что-то из этого, это немного разрозненно, но опять же, для его запуска требуется множество движущихся частей, чтобы они идеально подходили друг к другу;)

person Jonathan Adami    schedule 12.02.2021