Единственный способ заставить его работать, если я использую том привязки, который полностью соединяет оба контейнера, когда я его удаляю, он не работает. Без общего тома между интерфейсом и сервером они оба не смогут взаимодействовать. Они также оба находятся в одной сети.
ОБНОВЛЕНО без томов, файлов Docker, конфигурации nginx, примера вызова и сообщения об ошибке (второе обновление добавило прокси-сервер от nginx к php-fpm, который находится на порту). 9000)
Составить:
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
depends_on:
- api
links:
- api
develop:
watch:
- path: .
target: /var/www/html
action: sync
api:
build:
context: ./libs/php
dockerfile: Dockerfile
ports:
- "9000:9000"
Файлы Docker
FROM nginxinc/nginx-unprivileged
WORKDIR /var/www/html
COPY --chown=nginx:nginx ./conf.d/ /etc/nginx/conf.d/
COPY --chown=nginx:nginx . /var/www/html
FROM php:8.2-fpm
WORKDIR /var/www/html
ARG UID=101
ARG GID=101
//just updating user and group to same as nginx user on frontend
RUN groupadd -g "${GID}" php-fpm \
&& useradd --no-log-init -u "${UID}" -g "${GID}" php-fpm \
&& chown php-fpm:php-fpm -R /var/www/html
USER php-fpm
COPY --chown=php-fpm:php-fpm . .
Запрос сделан из сценария jquery:
$("#submit_1").on("click", () => {
const inputVal = $("#input_1").val();
$.ajax({
url: "/api/",
dataType: "json",
data: {
searchTerm: inputVal,
},
method: "POST",
success: (results) => console.log(results),
error: (obj, details) => console.log(obj, details),
});
}
});
Nginx default.conf
server {
index index.php index.html;
server_name api;
error_log /var/log/nginx/error.log debug;
root /usr/share/nginx/html;
index index.html index.htm;
location /api {
proxy_pass http://api:9000/;
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_set_header X-Forwarded-Proto $scheme;
# Enable CORS headers
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods "POST, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type";
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass api:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
├── docker-compose.yaml
├── index.html
└── libs/
├── php/
│ ├── geocodeBackend.php # PHP files served by php-fpm
│ └── other_php_files.php
├── js/
│ └── jquery.js # JS, Css and html served by nginx
└── css/
└── styles.css
Ошибка:
web-1 | 2024/11/03 00:58:59 [ошибка] 30#30: *5 Recv() не удалось (104: Сброс соединения одноранговым узлом) при чтении заголовка ответа из восходящего потока, клиент: 172.18.0.1, сервер: API, запрос: «POST /api HTTP/1.1», восходящий поток: «http://172.18.0.2:9000/», хост: «localhost», реферер: «http://localhost/»
web-1 | 172.18.0.1 - - [03.11.2024:00:58:59 +0000] "POST /api HTTP/1.1" 502 157 "http://localhost/" "Mozilla/5.0 (X11; Linux x86_64; rv: 132.0) Gecko/20100101 Firefox/132.0" "-"
Контейнер PHP-FPM имеет свой файл
root@124743cd5330:/var/www/html# ls
Dockerfile geocodeBackend.php
У NGINX есть
root@b4eba721669f:/usr/share/nginx/html# ls
50x.html compose.dev.yaml favicon.ico libs
README.Docker.md conf.d index.html root
ОБНОВЛЕНИЕ (работает)
Благодаря правильному изменению файлов nginx default.conf и обновлению URL-адреса js-скрипта в /api/ (дополнительная косая черта в конце). Ниже указано все, что я изменил!
default.conf
server {
listen 8080;
index index.php index.html;
server_name api;
root /var/www/html/;
location /api/ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME geocodeBackend.php;
fastcgi_pass api:9000;
}
}
script.js
$.ajax({
url: "/api/",
dataType: "json",
data: {
searchTerm: inputVal,
},
method: "POST",
Подробнее здесь: https://stackoverflow.com/questions/791 ... iles-match
Том Docker работает только в том случае, если все файлы совпадают ⇐ Php
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение