해결된 질문
작성
·
19
·
수정됨
0
제가 아래의 사이트를 자체 서버를 만들어 구동을 해보았습니다. 물론 테스트 및 학습용으로....
사용한 것들
App서버: FastAPI로 백엔드 api와 간단한 프론트 엔드
DB 서버: MySQL
Redis 서버
Nginx 서버
Portainer.io를 이용해, Dockerfile로 이미지 생성하고 4개의 컨테이너를 만들어, 구동시켰습니다. 서버는 제가 쓰던 오래된 개인 PC(아마도 족히 15년가까이된 구닥다리 컴퓨터)에 우분투 22.04.5 LTS를 설치해서 서버 구동을 시켰습니다.
제가 전공자는 아니고, 완전히 다른 직업군에 있는 사람이라... 몇년전에 장고, 플라스크로 웹어플리케이션 공부를 한적이 있는데 그때 웹프레임워크만 제외하고 똑같은 방식으로 서버구동을 시켜본 적이 있는데... 이번에 FastAPI로 한번 더 공부하면서 구축해보았습니다.
아직, docker-compose.yml로 docker swarm 구축을 해보지는 못했구요... 그런데 여기까지 오면서 궁금해진것이 바로 직전에 질문하신 분처럼 nginx서버 설정을 하다보면, FastAPI코드에서 굳이 없어도 될 부분의 설정부분이 있을 것 같은데.... 그게 어떤것인지 궁금해지더라구요... 예를 들면,
정적파일 처리를 nginx에서 처리하는 경우 app.mount()가 필요없을 것 같은데... 답변이 그렇게 되어 있어, 예상했던 데로 였습니다. app.mount()가 설정이 있어도 무방한 것인지 궁금합니다. 또한 저는 정적파일 css. js 파일들은 nginx에서 처리하지 않도록 했는데... 바뀔수가 있을 것 같아서... 여기서 궁금한것: 이렇게 해도 무방한 것인지 궁금합니다. (참고로,
저는 static/media폴더 안에 user_images, user_videos폴더를 만들어 user가 업로드하는 파일들을 그 폴더안에 저장하게 로직을 작성했습니다. nginx에서 이 디렉토리를 찾아갈 수 있게 해 놓았고, volume mount를 해서 컨테이너가 삭제되더라도 사용자가 올린 실제 이미지들이 삭제되지 않게 했놨습니다. )
MySQL서버와 Redis 서버를 찾아가는 FastAPI코드가 있고, yml파일로 컨테이너를 만드는 코드를 작성할 때, network로 서로를 연결하게 될텐데.... 이때 MySQL서버와 Redis 서버를 찾아가는 FastAPI코드가 없어야만 되는지, 아니면, 있더라도 상관이 없는 것인지... 그것도 궁금합니다.
이 두가지 말고도 yml작성시에 들어가는 내용때문에 FastAPI코드에서 굳이 없어도 부분이 있는지 궁금합니다.
감사합니다.
답변 2
0
안녕하십니까,
오 대단하시군요. 전공자도 아닌데, 이렇게 시스템을 스스로 구축하시다니요
정적파일 처리를 nginx에서 처리하는 경우 app.mount()가 필요없을 것 같은데...
=> nginx를 안쓰신다면 모르겠지만, 쓰실거면 일반적으로 nginx에서 정적 파일 처리를 하는게 더 좋습니다.
MySQL서버와 Redis 서버를 찾아가는 FastAPI코드가 있고, yml파일로 컨테이너를 만드는 코드를 작성할 때, network로 서로를 연결하게 될텐데.... 이때 MySQL서버와 Redis 서버를 찾아가는 FastAPI코드가 없어야만 되는지, 아니면, 있더라도 상관이 없는 것인지... 그것도 궁금합니다.
=> 해당 질문을 제가 잘 이해하지 못했습니다. FastAPI에서 MySQL나 Redis 서버를 접속하려면 FastAPI 코드가 있어야 합니다. 즉 DB나 Redis Connection정보를 이용해서 접속합니다. 이걸 질문하신 건지 아니면 다른 사항을 질문하신거라면 좀 더 자세히 기재 부탁드립니다.
전체 시스템 구성을 어떻게 하신건지 잘 몰라서 확실하게 답변을 드리기가 어렵지만, FastAPI에서 더 빠질것은 없어 보입니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. moljin님!
FastAPI로 구성한 서버에서 사용하지 않아도 되는 부분이나 설정을 최적화하는 방법에 대한 좋은 질문을 주셨습니다. 아래에서 더 자세히 설명해 드리겠습니다.
정적 파일 처리와 app.mount: FastAPI에서 정적 파일을 처리하는 경우 app.mount()를 사용하지만, Nginx가 정적 파일을 처리하도록 설정한 경우 이 부분은 생략할 수 있습니다. 이미 Nginx가 정적 파일을 처리하도록 설정하셨다면, FastAPI의 app.mount()는 불필요합니다. 이 방식은 성능 최적화에 유리합니다. 예를 들어, CSS나 JavaScript 같은 파일들은 Nginx가 빠르고 효율적으로 관리할 수 있습니다.
MySQL 서버와 Redis 서버 연결: FastAPI 코드에서 데이터베이스와 캐시 서버(Redis)에 연결하는 코드는 여전히 필요합니다. 그러나 Docker의 네트워크 설정을 통해 서로 연결이 되어 있는 경우, FastAPI 애플리케이션이 MySQL 및 Redis에 직접적인 네트워크 주소로 접근할 수 있습니다. 이때 Docker Compose에서 네트워크를 설정해 주면 FastAPI 코드에서는 서비스 이름을 통해 접근할 수 있게 됩니다. FastAPI 코드에서 환경 변수나 설정 파일을 통해 서비스 호스트와 포트를 관리하는 방법을 고려해 보세요.
기타 최적화: docker-compose.yml 파일에서 정의한 네트워크 설정이나 볼륨 마운트 설정이 FastAPI 코드에 영향을 주지 않습니다. 다만, FastAPI 코드 내에서 직접 네트워크 설정을 하거나 불필요하게 하드코딩된 부분이 있다면, 이를 docker-compose 설정에서 관리하도록 개선할 수 있습니다. 예를 들어, 환경 변수를 통해 접근 설정을 관리하도록 하면 배포와 유지 관리가 수월해집니다.
관련해서 유용한 정보를 얻을 수 있는 질문을 추천해 드립니다:
- nginx를 사용하고 static 설정을 하는 경우도 app.mount 설정을 해야 하나요?
이 답변이 moljin님의 프로젝트에 도움이 되기를 바랍니다. FastAPI와 Docker 설정을 더욱 최적화하여 배포 환경에서 성능을 극대화하시길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다. 충분한 답변이 된듯합니다.