Drukowana wersja tematu
Forum PHP.pl _ Hydepark _ Docker - dwa nginx
Napisany przez: nospor 3.07.2020, 12:01:05
Cześć,
ma dwie aplikacje, powiedzmy app1, app2
obie aplikacje mają swoje środowiska docker startowane przez docker-compose. Każda ma swój własny php oraz nginx. Ponieważ app1 musi slać żądania do app2, wiec w docker-compose w app2 dodałem
Kod
networks:
default:
external:
name: app1_default
Dzięki czemu app1 widzi kontener nginx z app2. I generalnie nie byłoby problemu gdyby nie fakt, że robiąc żądanie do app2 nawet z zewntarz a nie app1 to od czasu do czasu mam 404 NOT FOUND. Gdy wyłącze app1 to błąd ten się nie pojawia. Problem również znika gdy wywale exteneral network z docker-compose w app2
Ewidentnie więc nginx z app1 przechwytuje żądania które teoretycznie powinien łapać nginx z app2
Każdy konfig strony ma swoj właśny server_name więc teoretycznie powinien łapać tylko swoje a niestety łapie też nie swoje.
Jakieś porady?
Napisany przez: gitbejbe 3.07.2020, 19:05:01
rozdziel na 2 sieci
networks:
app1:
driver: bridge
app2:
driver: bridge
Napisany przez: nospor 5.07.2020, 18:27:04
Nie bardzo rozumiem gdzie mam to wsadzic?
Kazda z aplikacja ma swoj oddzielny docker-compoer.yml. Konterer php z app1 ma widziec konterer nginx z app2
Napisany przez: gitbejbe 6.07.2020, 19:48:48
sorki, umknęło mi że masz 2 compose. W jednym compose działałoby to w ten sposób jak napisałem, w 2 oddzielnych od ręki się nie wypowiem, musiałbym się wdrożyć
Napisany przez: nospor 7.07.2020, 08:55:54
Z jednym compose nie mialbym w ogole tego problemu
Napisany przez: viking 7.07.2020, 09:04:28
A coś takiego https://stackoverflow.com/questions/38088279/communication-between-multiple-docker-compose-projects
Napisany przez: nospor 7.07.2020, 09:26:04
@viking to wlasnie teraz mam. Tylko sek w tym, ze gdy te dwie apllikacje sa wtej samej sieci, to nginx z pierwszej od czasu do czasu lapie requesty z drugiej co skutkuje rzuceniem NOT FOUND.
Napisany przez: Pyton_000 7.07.2020, 19:37:09
Czy obie apki są publiczne? Generalnie wystawiłnbym porty dla obu np. 8080 i 8081 i stukał po portach.
Napisany przez: nospor 8.07.2020, 06:35:40
Obie sa publiczne
stukam po roznych portach
Napisany przez: Pyton_000 8.07.2020, 17:41:42
No to stukaj zew_ip:port1 zew_ip:por2 i po problemie. Nie łąćz tych apek w jednej sieci.
Napisany przez: vokiel 8.07.2020, 21:47:04
Opcją jest też dodanie nginxa jako proxy przed tymi obiema apkami.
Napisany przez: batman 9.07.2020, 03:32:29
Sprawdź czy takie coś zadziała:
Kod
services:
app1:
extra_hosts:
- "app2host:host.docker.internal"
To powinno dodać do pliku hosts w kontenerze app1 wpis:
Kod
<twój adres ip> app2host
Teraz powinieneś byś w stanie wysłać request to app2 bez kombinowania z siecią.
Kilka uwag:
- nie wiem czy host.docker.internal zostanie przetłumaczone na adres ip hosta w takiej postaci. Ja korzystałem z tego wewnątrz kontenera, nigdy z poziomu docker-compose.yml
- będzie musiał pamiętać o porcie (ale podejrzewam, że i tak go używasz)
Napisany przez: nospor 9.07.2020, 09:04:35
Cytat
No to stukaj zew_ip:port1 zew_ip:por2 i po problemie. Nie łąćz tych apek w jednej sieci.
To nei dziala. Niewazne jak sie odwoluje do appek, czy host, czy IP, czy nawet po nazwie z kontenera wewnatrz appek to i tak srednio co drugi call leci lapanka z innego nginx. Oczywiscie porty nadal inne. Nawet godzinke spedzilem z szefem, ekspertem od nginx, to sie zalamal na koniec i stwierdzil ze nie kuma o co chodzi.
Cytat
Teraz powinieneś byś w stanie wysłać request to app2 bez kombinowania z siecią.
Ja to wiem, ze jak odlacze sieci to to dziala. I wiem ze odpowiedni wpis w etc/hosts zalatwi sprawe. ALe to jest tylko tymczasowe obejscie problemu. Najbardziej mnie zastanawia jakim cudem oddzielny nginx lapie moje requesty.
Napisany przez: batman 9.07.2020, 09:24:32
Cytat
Najbardziej mnie zastanawia jakim cudem oddzielny nginx lapie moje requesty.
Może coś jest skaszanione w konfiguracji nginx? Jakaś reguła, która przechwytuje wszystkie nieobsłużone requesty? Albo w apce masz jakiś ukryty błąd, który skutkuje 404.
Napisany przez: nospor 10.07.2020, 17:09:10
Nie ma, sprawdzilem wszystkie virtual hosts, wywalilem wszystkie default ktore nginx instaluje samodzielnie. Nic. Przegladalem to razem z szefem linia po linii i tez nic. Normalnie magia :/
@batman, sprawdzilem jeszcze twoje hosty ale mam problemy pewnie dlatego ze chyba nie rozumiem ten zapis. Dalem tak:
Kod
services:
php:
.... tu masa konfiguracje dla kontenera php.....
extra_hosts:
- "hubsync_nginx:host.docker.internal"
I dostaje blad:
" Cannot create container for service php: b'invalid IP address in add-host: "host.docker.internal"'"
Napisany przez: batman 10.07.2020, 18:18:23
Cytat
" Cannot create container for service php: b'invalid IP address in add-host: "host.docker.internal"'"
Tak jak się obawiałem, docker compose nie wie co to jest
host.docker.internal Rzadko z tego korzystałem, zawsze z poziomu kontenera. Liczyłem, że compose będzie w stanie przetłumaczyć to na standardowy adres ip. Cóż, shit happens. Na chwilę obecną nie mam żadnego innego pomysłu.
Napisany przez: aras785 12.07.2020, 00:43:23
Problem jest banalny, Twoja konfiguracja nginxa jest błędna - łączy się z tym samym FPMem (fpm:9000).
Rozwiązanie może wyglądać tak (dodanie links i podmiane w ngixie):
version: '3'
services:
fpm:
image: my_image/nginx-php:latest
environment:
- DOCKER_ROLE=fpm
restart: always
networks:
- app1_default
volumes:
- ./public:/var/www/public
nginx:
image: my_image/nginx-php:latest
restart: always
ports:
- 72:80
environment:
- DOCKER_ROLE=nginx
- DOCKER_FPM_HOSTNAME=app2_fpm
networks:
- app1_default
links:
- "fpm:app2_fpm"
networks:
app1_default:
external: true
i entrypoint do podmiany konfiguracji w nginxie (dzięki temu ta sama konfiguracja może lecieć na proda):
...
if [ ! -z "$DOCKER_FPM_HOSTNAME" ]; then
sed -i "s/fastcgi_pass 127.0.0.1:9000/fastcgi_pass $DOCKER_FPM_HOSTNAME:9000/g" /etc/nginx/conf.d/default.conf
fi
...
Gdybyś potrzebował obrazu nginx + php 7.4 + cron + nodejs + supervisior to napisz priv to podrzucę Ci moje repo obrazu
Napisany przez: nospor 13.07.2020, 10:58:02
Ustawienie innych wewnetrznych portow w app2 dla php i nginx rozwiazalo sprawe.
Dzieki @Pyton za sugestie na pw oraz @aras za zwrocenie na to uwagi
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)