21.04.28 친구 관계 설정, EC2, RDS, nginx, gunicorn 설정

Junha Kim·2021년 4월 30일
0

FastAPI 채팅 개발기

목록 보기
5/6

최근 자소서와 코테 때문에 많이 진행하지 못했다... 곧 면접도 있어서 cs 공부도 해야되어서 예전만큼 시간을 할애하지 못할 것 같다.. ㅠ

그래도 할때는 열심히!

채팅방이나 인증 등을 직접 테스트 해보려면 프론트가 있으면 좋겠어서 팀원을 구했다. 프론트 갓 시작하는 2명을 영입했다.

회의에서 뭐 더 넣어보고 싶은 기능이 있으면 말해달라고 했었는데, 친구 추가 같은 기능도 있었으면 좋겠다고 해서 친구 관계도 추가했다.

친구 관계 설정, EC2, RDS, nginx, gunicorn 설정

  1. 친구 관계 설정

    유저 N : M 관계로 일반적인 1: N 관계와는 다르게 선언해줬어야 했다. RDS에서 N:M 관계를 중간 관계 테이블을 두어 N:1, 1:M 두는 것처럼, 중간 테이블을 두어 user_id, friend_id 를 담는 테이블을 만들었다.

    그리고 User 모델에서 friends라는 relationship을 만들고, 중간 매핑 테이블을 알려주고, primary join, secondary join을 각각 설정해줌으로써 끝났다.

  2. EC2, RDS, NGINX, gunicorn

    EC2와 RDS 설정은 예전에 해봤지만, 굉장히 오랜만에 해서 시간이 좀 걸렸다.

    1. RDS

      RDS에서는 Postgresql을 처음 써봤는데 처음 DB name을 설정하는 부분을 찾지 못해 인스턴스 생성, 삭제를 얼마나 했는지 모르겠다. 추가 구성 토글에 숨어있었고, psql을 다운받고 직접 db에 접속해서 생성하려던 찰나에 발견해서 연결할 수 있었다.

    2. EC2

      EC2도 인스턴스 포트 여는 것 때문에 시간을 많이 썼다. 예전 Django 배포할때는 80번 포트를 보안그룹에서만 열어도 됐었던거 같은데, 직접 방화벽에서 80번 포트와 8000번 포트를 열어줬어야 했다. 이건 근데 nginx까지 설정하고 나서 생각이 드는 건데, nginx를 처음부터 설치해서 방화벽이 세워진게 아니었나 생각한다.

    nginx와 gunicorn은 처음해보았다. 예전에는 이러한 부분이 너무 어려워서 nohup 명령어로 수동으로 돌리고 8000포트로 직접 접속하게 했었다. 하지만 이번에는 직접 해보면 좋겠다는 생각에 nginx, gunicorn을 설정해보았다.

    1. gunicorn

    찾아보니깐 gunicorn, uWSGI 이 두개가 많이 쓰이는 것 같은데, 정확한 차이는 모르겠다. 사실 저들의 역할을 아직 확실히 모르겠다. 우선 배포를 해보자는 생각에 회사에서 쓰는 gunicorn을 선택했다. 이 부분에 관해서는 나중에 봐야겠다..

    개념 이해 - Nginx, Gunicorn(+ WSGI) 개념 이해 및 활용

    튜토리얼에서 socket으로 연결했었는데, gunicorn service status에서는 잘 돌아가고 있다고 뜨지만, 정작 8000번 포트에 접속하니깐 Connection refused가 떴었다. 그래서 개발 단톡방에 질문을 올렸더니, socket말고 직접 포트 바인딩을 해보라고 했다. 그랬더니 잘됐다...! 하지만 FastAPI이다 보니 wsgi가 아닌 AWSGI로 연결해야 됐고, gunicorn의 워커를 uvicorn 워커로 바꿔서 설정해주었더니 잘 되었다.

    [Unit]
    Description=Gunicorn instance to serve myproject
    After=network.target

    [Service]
    User=ubuntu
    Group=www-data
    WorkingDirectory=/home/ubuntu/myproject
    Environment="PATH=/home/ubuntu/myproject/myprojectenv/bin"
    EnvironmentFile=/home/ubuntu/myproject/dev.env
    ExecStart=/home/ubuntu/myproject/myprojectenv/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 -m 007 main:app

    [Install]
    WantedBy=multi-user.target
4. nginx

지금 생각해보면 별것 아닌데, nginx 설정하는데 꽤 힘들었다. FastAPI를 nginx로 배포하는 글이 있길래 그것을 보고 하고있었다. 하지만 계속 `proxy_pass`가 모듈이 없다고 떠서 무엇이 문제인지 몰랐다. FastAPI 배포 관련한 자료가 많이 없어서, 비슷한 Flask 배포로 찾아보았다. 그래서 해당 자료들을 보면서 하니깐 잘 되었다. 문제는 `include proxy_params;` 가 없어서 그랬던 것이었다...
    server {
        listen 80;
        server_name EC2 탄력 주소 IP;

        location / {
            include proxy_params;
            proxy_pass http://0.0.0.0:8000;
        }
    }
이렇게 했더니 다행히도 잘 되었다!!! 그런데.. nginx 설치를 하면 모든 포트가 닫히는 것 같았고, 따로 설정을 하지 않으면 안되는 것 같았다. 그래서 nginx 설치하고 80번, 8000번은 다 열어줬는데... 정작 인스턴스 터미널 들어오는 ssh 22번 포트를 열어주지 않아서... 다시 들어갈려고 하니 접속을 못했ㄷ....

그래서 결국 인스턴스 삭제하고 처음부터 다시 했다. 그래도 한 번 해보니, 다시 하는 것은 1시간도 안걸려서 끝났다!

이제 나중에는 git action을 통해서 ci/cd를 해보고, 도커까지 사용해봐야겠다!

0개의 댓글