django 장고에서 배포한후 실개발환경에서 urls.py 수정후 라우팅적용반영안될때가 있었다
예를들어 www,abc.com/poll
이런 걸 추가해주고 싶은데
아무리 해도 안되는 것이었다
알고보니
개발환경에서는 서버를 껐다 재시작 해줘야 적용이 되었다
서버 껐다 키려면 (예를들어 urls.py 수정 후에 적용해주려면 서버를 재시작해야함)
sudo service uwsgi start / stop 으로 명령어를 실행할 수 있다
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;
해쉬버킷사이즈를 증가시켜 주니까 에러가 없어졌다