[6주차-3] Django 가상환경, nginx + gunicon + Djaongo : 1 Tier 구성하기(chap8)

ka02·2023년 10월 29일

cloudcamp

목록 보기
15/15

*참고 사항: /home/song 은 내 디렉토리 위치다!

<가상환경을 만들어보자!>

django-admin startproject mysite
→ django 프로젝트 만들기: /home/song에서

python3 -m venv .venv

→ .을 찍으면 숨김파일이라 우리 프로젝트에서 영향을 안받으니까 .venv 가상환경 만들기

→ mysite에서 가상환경 만들기

  • ls -al로 .venv 확인 가능
  • 가상환경으로 접속
    source ./.venv/bin/activate
    (가상환경 내에서 django 설치하여 가상환경 내에서 진행하기)
  • 가상환경 종료
    deactivate : 원래 나의 환경으로 돌아오는 명령어

nginx + gunicon + Djaongo : 1 Tier 구성하기

<Django 설정 작업 (교재)>

  1. settings 수정 vi mysite/settings.py

    DEBUG=False
    
    ALLOWED_HOSTS = ["192.168.21.137", "localhost", "127.0.0.1"]
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': BASE_DIR / 'db' / 'db.sqlite3',
        }
    } #DATABASES 경로 변경
    
    STATIC_URL = '/static/'
    STATIC_ROOT = BASE_DIR / 'www_dir' / 'static' #추가
    
    CSRF_TRUSTED_ORIGINS = [
            'http://127.0.0.1:8080', 'http://127.0.0.1',
            'http://localhost:8080', 'http://localhost',
            **'http://192.168.11.132:9090', 'http://192.168.11.132',**
    ] #내용 추가
  1. 설정파일 변경 후 정적 파일을 모으기 위한 collectstatic 진행
    cd /home/song/mysite로 이동(가상환경이나 혹은 root에서 실행, django project를 만든 경로에서 진행해야 한다.)
    python manage.py collectstatic

  1. 시크릿키가 노출되지 않도록 별도의 파일에 저장 (안해도 된다)
    sudo mkdir /etc/django vi /etc/django/secret_key.txt
    → 시크릿키는 settings.py 에서 확인 가능함
    ```python
    SECRET_KEY = 'django-insecure-3nso(+#*o=h)9t535e^31c4p#+%x22+tq-)63qyz_op&ly5gyd'
    # 이중에서 '' 안에 시크릿키만 복사해서 secret_key.txt 에 저장함 
    ```
    
    이후에 vi settings.py에서 시크릿키 삭제 후 아래 내용 변경해줌
    
    ```python
    # SECURITY WARNING: keep the secret key used in production secret!
    with open('/etc/django/secret_key.txt') as f:
       SECRET_KEY = f.read().strip()
    
    #아래 키는 삭제 
    SECRET_KEY = 'django-insecure-3nso(+#*o=h)9t535e^31c4p#+%x22+tq-)63qyz_op&ly5gyd'
    ```
  2. 디렉토리 및 파일의 액세스 권한을 수정하기 (위치: /home/song/mysite)
  • 위에 db.sqlite3이 생성된 디렉토리에서 db 폴더를 만들고 db.sqlite3를 여기로 옮겨주기

mkdir db python3 [manage.py](http://manage.py/) migrate
-> mysite/db폴더를 만들고 mysite에서 migrate를 진행하면 자동으로 db 아래에 db.sqlite3가 생겨서 mv 안해줘도 된다.
mv db.sqlite3 ./db

  • 권한 주기
    chmod 777 ./db chmod 666 ./db/db.sqlite3

  • 이외에 로그 파일 폴더 만들기
    mkdir logs && chmod 777 logs && touch logs/mysite.log && chmod 666 logs/mysite.log

  1. django admin 계정 이전에 안만들었을 경우 아래처럼 만들기
    위치: /home/song/mysite
    python manage.py createsuperuser
    admin/1234

<nginx 설치>

sudo apt-get install nginx

  1. nginx 설정하기 (포트번호 잘보기) → nginx.conf 파일을 복사해온 후 만들기
    vi /etc/nginx/sites-available/mysite_nginx.conf
    책에서는 location static이 /home/song
    ```python
    server {
            listen 9090;
            index index.html index.htm index.nginx-debian.html main.html main.htm;
            server_name localhost;
            error_page  500 502 503 504 /50x.html;
            location = /50x.html {
                       root /usr/share/nginx/html;
            }
    
            # Django 관련 설정들 ########
            location /static/ {
                    root /home/song/mysite/www_dir;
            }
    
            location / {
                    proxy_pass http://127.0.0.1:9091;
            }
             #######################
    }
    ```
  1. 서비스 구동시 설정 적용
    ln으로 etc 밑에 conf 파일을 enabled mysite_nginx.conf로 연결하기
    cd /etc/nginx/sites-enabled ln -s /etc/nginx/sites-available/mysite_nginx.conf mysite_nginx.conf
  2. nginx 재시작
    sudo systemctl restart nginx

<gunicorn (WAS) 설치 및 설정>

  1. 설치
    apt-get install gunicorn which gunicorn
    → usr/bin/gunicorn
  2. 실행
    cd /home/song/mysite
    gunicorn -b 127.0.0.1:9091 mysite.wsgi
  3. 브라우저를 통한 확인
    http://vmware_ip_addr:9090/admin
    아래처럼 404 not found 나오면 gunicorn 다시 실행하기

기타 문제 해결 방법

* admin 페이지는 열리지만, 로그인시 CSRF 오류가 날 때

→ 해결방법: CSRF 권한에 vmware IP, vmware IP:포트번호 추가하니까 로그인 가능

* admin 페이지는 열리지만, css가 적용 안될 때

이런 식으로 css가 깨짐..
→ 그래서 /home/song/mysite에서 www_dir에 모든 권한을 줘도 css 적용 안되더라..
→ 다시 www_dir을 삭제하고 collectstatic을 하고 chmod로 권한을 줘도 여전히 css가 깨진다.
→ nginx.conf의 /static/ 경로를 root, alias를 사용해서 다양하게 해봤지만 다 실패

→ 해결방법:

  • 우선 /home/song/mysite/에 있는 manage.py에서 collect static 적용하기
    python [manage.py](http://manage.py/) collectstatic
    그러면 myiste/www_dir 폴더가 생기는데 위에 말한 내용과 같이 권한을 아무리 변경해줘도 css 적용이 안된다..

  • www_dir(static 디렉토리가 있는)의 위치를 변경해주기

    /home/song/mysite/www_dir을 /var/www/ 밑으로 이동해줬다.

    `sudo mv ./www_dir /var/www/

    → 이제 static 위치는 /var/www/www_dir/static/

  • nginx 수정하기
    vi /etc/nginx/sites-available/mysite_nginx.conf

    • root로 정적 파일이 저장되는 곳을 지정할 때
      root일 때는 static이 있는 상위 디렉토리로 경로를 설정해야 함 root /var/www/www_dir;
      참고! 만약 root /var/www/www_dir/; ← 로 하면 안된다 / 경로 주의
      ```
        # Django 관련 설정들
        location /static/ {
                 **root /var/www/www_dir**; #변경
                 #기존 설정: root /home/song/mysite/www_dir/static;
                 #alias /home/song/mysite/www_dir_static_admin;
          }
      
      ```
    • alias로 지정할 때
      static이 있는 디렉토리를 경로로 적용하기
      alias /var/www/www_dir/static/;
      참고! alias는 root처럼 만약 맨 마지막에 /를 빼고 alias /var/www/www_dir/static로 하거나 alias /var/www/www_dir로 static 상위 디렉토리로 설정하면 안된다.
      ```
      # Django 관련 설정들
      location /static/ {
                 **alias /var/www/www_dir/static/; #변경**
                 #기존 설정: root /home/song/mysite/www_dir/static;
                 #alias /home/song/mysite/www_dir_static_admin;
      }
      ```

🎈🎈🎈🎈🎈해냈다ㅠㅠㅠㅠㅠㅠ!!!!


* 모듈이 없는 문제

이외에 mysite 모듈이 존재하지 않거나 불러올 수 없는 경우 → /home/song/mysite로 이동하지 않고 gunicorn을 실행해서 그럴 수도 있으니까 꼭 위치 확인하고 gunicorn 실행하기


6주차 후기: 일단.. 일주일동안 Django 배웠는데 조금 정신이 없었지만 결과가 뭔가 확 보이니까 뿌듯함이 있었다.. 다만, gunicorn까지 연결해서 구성할 때 다 잘 따라했는데, 대체 왜 안돼!!라고 했지만, 다들 안되길래 오히려 되는게 더 큰 문제군 이라고 생각했고ㅋㅋㅋㅋㅋ
css 깨지는 문제때문에 주말에 매달려서 혼자서 해낸거에 스스로 큰 만족감을 느꼈다. 권한이 없어서 열리지 않는 문제들, 그리고 구글링이나 chat GPT에 질문을 많이 찾아다니면서 질문하는 방법을 조금 알아갔달까.. 그래서 난 Djnago를 잘 알고 있냐? 물어보면 그건 아니다. 이거만 3번 만들어봤는데 다음주에 다시 만드려니 또 헤매고 있는 날 보면서 대체 난.. 그치만 그래도 한 번이 어렵지 하면 할수록 늘겠지 라는 생각..
이 7-8주차에는 docker를 했는데..그건 추후 후기 업로드하겠습니다...하 .. 힘내자

0개의 댓글