django 장고에서 배포한후 실개발환경에서 urls.py 수정후 라우팅적용반영안될때가 있었다

예를들어 www,abc.com/poll

이런 걸 추가해주고 싶은데 

아무리 해도 안되는 것이었다

알고보니 

개발환경에서는 서버를 껐다 재시작 해줘야 적용이 되었다


서버 껐다 키려면 (예를들어 urls.py 수정 후에 적용해주려면 서버를 재시작해야함)

sudo service uwsgi start / stop 으로 명령어를 실행할 수 있다

배포환경에서 django debug=false 인데도 여전히 디버그 페이지가 나올때가 있었다. 몇번이고 재저장을 해보고 했는데도...


원래 DEBUG=True 일때 디버그 페이지가 나오고 False 면 지정된 페이지의 404 같은게 나와야 하는데


여전히 DEBUG 페이지가 나오는 것이었다. 


이때 보니 uwsgi 서비스를 종료후 재시작해주면 DEBUG=False 가 적용되는것을 알수가 있었다. 

django favicon.ico 장고 파비콘불러오기


파비콘이 있는 경로는

/home/ubuntu/static/www/favicon.ico


불러올 html 템플릿에 링크를 걸어준다

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="icon" href="/static/www/favicon.ico">


증상: 로컬에서 이미지필드에 있는 파일 로딩 잘되었는데 aws-nginx  배포환경에서 로딩이 안되었다


src

-a app

-b app

-c app

-src

-urls.py

-settings.py

-static

-images

-js

-www

static

-media

-images

-js

-www

manage.py

mysite.nginx.conf

uwsgi.ini


settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR),"static") #개발시 스태틱파일을 모아서 복사해줄 디렉토리

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR),"static", "media")

STATICFILES_DIRS = [
os.path.join(os.path.dirname(BASE_DIR),"static", "static_dirs"),
os.path.join(os.path.dirname(BASE_DIR),"static", "media"),
]

nginx 설정

아래는 잘되는 옵션

location /static {
root /home/ubuntu; # your Django project's static files - amend as required
}

아래는 안됨

location /static {
root /home/ubuntu/static; # your Django project's static files - amend as required
}

ubuntu/static 까지 포함하면 이미지 로딩이 안됨 즉 ubuntu 까지만 경로적어줘야함



스태틱파일 세팅은 

여기서 스태틱파일은 각종 이미지 파일 들인데 (템플릿에서 불러올) 

경로는  /home/ubuntu

/home/ubuntu/static 내에 

static_dirs, static_root, media, media/images, admin, js, www 이런 하위 디렉토리가 있는데 특히

www

-css

-fonts

-js

-images

등이 있는데 여기에 하위에 있는 각종 js를 로딩하거나 이미지를 로딩하려면 nginx 에서 location /static{ }

파트에서 경로를 설정해줘야 한다

앞에 옵션에 root , alias 가 있는데 alias 는 이미지가 안불려지고 root 를 붙여야 이미지 로딩이 된다. 왜 그런지는??

static 경로는 빼고 적어준다 root /home/ubuntu

static경로가 포함되면 로딩이 안된다


이미지가 업로드가 되는 경로는 /home/ubuntu/static/media/images 이다

class Category(models.Model):
title=models.CharField(max_length=120)
description=models.TextField(max_length=5000, null=True, blank=True)
tags=GenericRelation("TaggedItem", null=True, blank=True)
slug=models.SlugField(default='abc', unique=True)
image=models.ImageField(upload_to='images/', null=True, blank=True)

업로드되는 이미지를 로딩하려면  nginx 에서 경로를 잡아줘야 한다??? 이것은 location /media {}

파트에서 경로를 설정해줘야 한다? 그런줄 알았는데...

그런데 이 미디어 경로는 안 정해줘도 잘 로딩되는듯하다

미디어 경로를 주석처리해도 잘 작동하고, 앞에 옵션에 root , alias 둘다 작동됨을 확인

media 경로는 포함하든 안하든 잘 작동한다

아마도 미디어 경로를 설정안해줘도

스태틱경로에서 미디어까지 커버되어 사용자가 업로드한 이미지를 로딩해주는듯 하다


잘된다 아래, 미디어경로를 포함해도 잘되는듯
location /media  {
alias /home/ubuntu/static/media; # your Django project's media files - amend as required, alias
}


아래는 잘안됨. (root옵션 안되는듯)

location /media  {
root /home/ubuntu/static/media; # your Django project's media files - amend as required, alias
}


아래도 잘됨 미디어경로를 포함안해도 잘되는듯

location /media  {
alias /home/ubuntu/static; # your Django project's media files - amend as required, alias
}

그리고 이미지 불러올 템플릿파일에서 이미지로딩을 해준다


<img src="{%if q.image %}{{q.image.url}}{%endif%}" class="img-responsive"></a>

{{q.image.url}} 여기서 q는 오브젝트 . 즉 오브젝트의 이미지필드의 url 을 불러오라는 얘기다

그러면 media/images/이미지경로를 불러온다









python manage.py runserver 할때도 잘되었다

uwsgi 와 nginx 연동도 하고  aws에 배포도 잘되었다

이제 실제 db를 우분투에 설치 mysql을 설치했는데 설치까진 잘되었고 runserver 로 실행시는 사이트가 나오는데

uwsgi nginx 로 서버를 띄우려니 internal server error 500 이 출력되었다 이것으로 이틀을 헤맨결과

가상환경에도 mysqlclient 를 설치해줘야 한다


가상환경에 안하면

주의 가상환경에도 설치해줘야 임포트에러가 안난다 안하면

 import MySQLdb as Database

ImportError: No module named 'MySQLdb'

발생


가상환경을 실행해주고 pip3 install mysqlclient

internal server error 가 없어진다

이것때문에 이틀간 삽질함





django 장고 우분투 ubuntu 에 mysql 설치 install


1.

ssh 접속


2.

sudo get-install mysql-server

비번세팅을 물어보면 설정해주자


3.

설치가 다 되면 이제 접속할 수 있다

mysql -uroot -p1234


4. db를 생성하자

데이터베이스 생성

1

CREATE DATABASE xxxx CHARACTER SET utf8 COLLATE utf8_general_ci;


기본적으로

informations_schema

mysql

performance_schema

위 3개 원치 않으면 기본데이터베이스는 삭제해주자

drop database xxx;


5.

sudo pip3 install mysqlclient


6.

(5번 수행시 에러날 경우 수행 ... conf 어쩌구저쩌구...)

sudo apt-get install libmysqlclient-dev


7.

setting.py 파일을 수정


DATABASES = {

'default': {

    'ENGINE': 'django.db.backends.mysql',

    'NAME': '디비이름을적음',

    'USER': '유저이름을적음',

    'PASSWORD': '비번을적음',

    'HOST': 'localhost',   

    'PORT': '3306',

}

}


또는

DATABASES = {

   'default': {

       'ENGINE': 'django.db.backends.mysql',

       'OPTIONS': {

           'read_default_file': os.path.join(BASE_DIR, 'config/my.conf'),

       },

   }

}

my.conf 파일을 만들어

[client]

database = xxxx

user = root

password = 1234

default-character-set = utf8

저장


8.

python manage.py makemigrations

python manage.py migrate


9.

python manage.py runserver


10. 접속 후 확인

django의 우분투 배포 환경에서  pip pip3 install 설치시 디렉토리 directory를 찾고 싶다면


/usr/local/lib/python3.4/dist-packages/

위에 설치된다



nginx , uwsgi 를 연동하고 배포후 (deploy) 나서 장고에러또 발생했다

일전에 장고에러에 대해  404 not found django Server Error (500)

포스팅 했는데 그걸 해결하고 나서



나의 상황은 이랬다

루트페이지나 static file 은 잘불러와졌고

중간에 로그인을 할때나 특정 데이터를 불러오는 페이지가 안된다는 거였는데


nginx , uwsgi 를 연동 후 착오가 있었던게

nginx 실행 후

uwsgi start 후 

ssh 콘솔을 종료했는데 안되는고 자꾸 특정페이지 호출이 안되는 에러를 뿜어냈다

알고보니 콘솔종료하면서 nginx 는 서비스 백단에 떠있는데 uwsgi 는 서비스가 안떠있고 콘솔 종료 되면서 같이 종료되서 일어나는 현상이었다


그래서 uwsgi도 서비스로 백단에 띄워주는 작업을 하였다 서비스화 해서 띄워주는 환경설정 파일을 만들어 주자

Init Service 등록

# /etc/init/[APP_NAME].conf
# simple uWSGI script
description "[APP_NAME] real instance"
start on runlevel [2345]

stop on runlevel [06]

respawn

exec uwsgi --ini /var/product/project_path/uwsgi.ini

다 됐으면 service [APP_NAME] start / service [APP_NAME] stop 으로 켜고 끌 수 있다.

로컬에서 잘되던게 aws에 배포후 특정 템플릿을 부르려고 하면 404 not found 나 django Server Error (500)가 발생하는 현상이 일어났다


한참을 헤매고나서


보니 템플릿 html파일 중 메소드 호출이 안되는거 같았다 로컬에서는 잘 되었으나 


문제가 된 부분은 페이스북과 트위터 공유부분이었는데

<a target='_blank' href="https://twitter.com/home?status={{obj.get_share_message|safe }}">
<i class="fa fa-twitter-square fa-3x" aria-hidden="true"></i>
</a>
<a target='_blank' href="https://www.facebook.com/sharer/sharer.php?u={{obj.get_share_link }}">
<i class="fa fa-facebook-square fa-3x" aria-hidden="true"></i>
</a>

여기에서{{obj.get_share_message|safe }} 와

{{obj.get_share_link }}것이 문제였다 원래 개발서버에서는 잘 호출되던 것이었으나.... ㅠ

시간도 없고 해서 삭제 후에는 모든것이 배포 후 실 서버에서 잘 작동한다

nginx 설정 문법 검사를 하려고 아래 구문을 실행하면

sudo nginx -t

sudo service nginx configtest


django nginx error 에러가 난다

 [emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size: 64


보니까 서버네임이 길어서 그런거 같은데, 이걸 짧게 해주거나 

그 밑에 가보면 디폴드 설정파일이 있더라 그걸 수정해 주면되는데


sudo nano /etc/nginx/nginx.conf 편집기를 열고

http {


        ##

        # Basic Settings

        ##


        sendfile on;

        tcp_nopush on;

        tcp_nodelay on;

        keepalive_timeout 65;

        types_hash_max_size 2048;

        # server_tokens off;


        server_names_hash_bucket_size 128;

        # server_name_in_redirect off;


해쉬버킷사이즈를 증가시켜 주니까 에러가 없어졌다

+ Recent posts