@alexsmirnovdotcom

Почему nginx возвращает ответ вместе с телом запроса?

Есть такой 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 такого нет, все ответы возвращаются корректно.
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 2
emekhanikov
@emekhanikov
Разработчик и архитектор программного обеспечения
А данные в запросе всегда одинаковые?
Могу предположить когда авторизация проходит успешно - получаем статус 200, а если логин или пароль не верные - 422
Ответ написан
@AlexNpro
Удалось ли разобраться с этой проблемой?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы