Есть такой docker-compose файл:
version: "3.7"
services:
api:
env_file:
- .env
build:
context: .
dockerfile: ./src/api/Dockerfile
args:
- user=${USER}
- uid=${UID}
container_name: api
restart: unless-stopped
working_dir: /var/www/api
ports:
- "9000:9000"
volumes:
- ./src/api:/var/www/api
networks:
- internal
front:
build:
context: .
target: dev
dockerfile: ./src/front/Dockerfile
ports:
- "3000:3000"
container_name: front
working_dir: /var/www/front
restart: unless-stopped
volumes:
- ./src/front:/var/www/front
networks:
- internal
nginx:
image: nginx:alpine
container_name: nginx
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
networks:
- internal
volumes:
- ./nginx/:/etc/nginx/conf.d/
- ./src/api:/var/www/api
- ./src/front:/var/www/front
depends_on:
- front
- api
db:
image: mariadb
container_name: db
restart: unless-stopped
environment:
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- db:/var/lib/mysql
ports:
- '33006:3306'
networks:
- internal
networks:
internal:
driver: bridge
volumes:
db:
Конфиг nginx:
server {
listen 80;
server_name ########;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
charset utf-8;
location / {
proxy_pass http://front:3000;
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;
proxy_redirect off;
}
# Handle /api and /files requests
location ~ ^/(api|files|sanctum) {
root /var/www/api/public;
index index.php;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
root /var/www/api/public;
index index.php;
fastcgi_pass api:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
}
При отправке POST запроса на api (laravel), неважно откуда через axios или postman 50/50
ошибки возвращаются либо как нужно в json и с правильным кодом ответа (например 422 при ошибках валидации) либо в виде plain text (код 200) и в ответе содержится как сам json ответа, так и json из тела запроса.
Пример кривого ответа:
{"login":"","password":"","is_remember":true}{"message":"The login field is required. (and 1 more error)","errors":{"login":["The login field is required."],"password":["The password field is required."]}}
Из логов nginx:
Это при кривом ответе сервера:
- - [16/Oct/2023:06:16:49 +0000] "POST /api/login HTTP/1.1" 200 216 "
http://######/login" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" "-"
Это при нормальном:
- - [16/Oct/2023:06:17:14 +0000] "POST /api/login HTTP/1.1" 422 171 "
http://######/login" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36" "-"
Никаких ошибок ни в nginx ни в laravel нет...
Что это может быть и как исправить?
Если делать запросы напрямую к api:9000 такого нет, все ответы возвращаются корректно.