💥문제 상황
크롤링을 하는 api에 요청했을 때 아래와 같은 에러가 뜬다. 크롤링 데이터는 약 10만건정도 된다.

데이터베이스 연결 문제인가 해서 단건 삽입을 테스트해봤더니 단건 삽입은 잘 된다..!
그렇다면 디비 연결은 잘 되었다는 뜻..
💊해결 방법
결론부터 말하자면 nginx timeout 문제였다.
nginx timeout이 기본 1분인데, 이를 2000s로 늘려서 해결했다.
nginx 문제일거라고는 상상하지 못해서 며칠 내내 고생한 에러였다ㅜㅜ

[Web/Error] Nginx 504, Nginx 502 에러 해결(Feat. Gunicorn)
제가 이번에 마주한 에러는Nginx 504 Gateway Timeout 과,Nginx 502 Bad Gateway 에러였습니다.일단 5자로 시작하는 에러만 봐도 무섭습니다..월요일인가 프론트 팀원에게 연락이 왔었는데,백 서버로 요청이
velog.io
⚒️삽질 기록
아래는 에러 해결을 위해 시도했지만 실패한 방법들이다.
첫 번째 시도 - mysql wait_timeout 설정
`docker-compose.yml`
version: '3.1'
services: # container setting info
mysql-docker:
container_name: mysql-container
image: mysql:8.0
volumes:
- db-mysql:/var/lib/mysql
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=****
- MYSQL_DATABASE=****
- MYSQL_USER=****
- MYSQL_PASSWORD=****
command: [
'--wait_timeout=28800', // 이 부분 수정
'--interactive_timeout=28800'// 이 부분 수정
]
networks:
- shared-network
ports:
- "3306:3306"


늘어났음에도 여전히 실패..ㅜ
두 번째 시도 - 데이터베이스 connection을 close
코드 내에서 데이터베이스에 commit 하고 커넥션을 닫지 않았다.
혹시 이게 문제인가 싶어 커밋 후 connection을 close 하도록 코드를 변경했다.
그랬더니 이번엔 pymysql.err.Error: Already close 에러가 발생한다…
세 번째 시도 - sql alchemy로 커넥션풀 사용
매번 커넥션을 맺고 끊는게 과부하가 심할 것이라고 생각했다.
그래서 sql alchemy를 사용해서 커넥션풀을 사용하고 반환하기로 했다. (원래는 pymysql을 사용했다.)
-> 그래도 에러가 난다..
그래서 카카오에서 받아오는 데이터의 양을 줄여봤다. 기존 반경 1000미터에서 반경 100미터로
-> 그랬더니 데이터를 성공적으로 받아온다..!
-> 반경 1000미터 기준으로 받아오는 데이터가 약 10만건인데, 그럼 데이터가 너무 많아서 생기는 문제인가?
이쯤에서 예상한 문제
- cpu과부하
- db 커넥션 시점 문제
- 너무 오래 물고 있는다?
- 쿼리 실행 시간이 너무 오래 걸려서 timeout?
- db timeout은 늘렸음
- 근데 ec2에서 요청 1~2분만에 끊어버림..?
네 번째 시도 - EC2 실시간 cpu 사용량 확인
$ apt install sysstat
$ mpstat # 현재 시간 cpu 사용량 확인
$ mpstat 1 200 # 1초 간격으로 200번 확인

EC2의 cpu 사용량은 굉장히 여유있음을 알 수 있다.
다섯번째 시도 - 카카오에서 막아버리는 문제?
컨설턴트님께 여쭤보니, 몇만건씩 요청을 많이하면 카카오에서 막을수도 있다는 이야기를 들었다. (크롤링 할 때 10만건)그럼 로컬에서 크롤링 할 때는 왜 안막혔나? 라고 할 수 있지만, 로컬호스트는 카카오 테스트 계정이 로컬호스트라 막지 않는다고 한다..
하지만!! 요청 건수를 줄여서 80건정도 요청했을 때는 잘 됐다.
-> 카카오에서 한 번 막았으면, 그 이후로 해당 IP를 계속 막아버릴텐데.. 요청 건수를 줄여서 된다는건, 카카오에서 막는건 아닐 것 같다.
여섯번째 시도 - bulk insert
현재는 데이터베이스에 단건 insert를 하고 있었는데, 이를 bulk insert로 바꿔보았다.
bulk insert 했을 때
로컬에서 약 10만건의 데이터 삽입 → 역시 잘 된다..

하지만 여전히 같은 에러..

받아오는 데이터의 양을 줄여보니 역시 정상 동작하는 모습… (로컬 아니고 EC2)


일곱번째 시도 - docker 컨테이너의 cpu, 메모리 사용량 확인
$ docker stats
요청 전

요청 중 (크롤링 중)

flask-container를 확인하면 된다.
요청 후 (마찬가지 에러로 끊긴 후)


'✍️ 개발 기록' 카테고리의 다른 글
| [👀 Owing] S3에 파일을 업로드하는 세 가지 방법 (MultipartFile, Stream, PresignedURL) (0) | 2024.10.31 |
|---|---|
| [👀 Owing] Framer motion 애니메이션 적용기 (0) | 2024.09.27 |
| [👻 잼잼, 어디가] 비동기로 성능 개선하기 (asyncio + aiohttp) (0) | 2024.08.05 |
| Access Token과 Refresh Token을 어떻게 전달하고 클라이언트는 어디에 저장할까? (0) | 2024.06.21 |
| authenticate에서 발생하는 '자격 증명에 실패하였습니다' 문제 해결 (0) | 2024.06.19 |