본문 바로가기

Linux

nginx + uWSGI = Django

  1. sudo apt-get -y install openssh-server
  2. sudo apt-get update
  3. sudo apt-get -y upgrade
  4. sudo apt-get -y install python-virtualenv
  5. install python 3.4.2 => setuptools 및 pip는 자동 설치. (python 3.4에 포함.)
      sudo apt-get install libssl-dev openssl
      wget https://www.python.org/ftp/python/3.4.2/Python-3.4.2.tgz
      tar -xvf Python-3.4.2.tgz
      cd Python-3.4.2
      ./configure
      make
      sudo make install
      ./python
    
  6. sudo apt-get install nginx
  7. Python2 => python3 변경
    python -V
    python3 -V
    which python
    which python3
    sudo mv /usr/bin/python /usr/bin/python -2.7.x
    sudo ln -s /usr/bin/python3 /usr/bin/python
    python -V
    python3 -V
    
  8. sudo pip3 install uwsgi python2.x 버전을 사용하려면 pip install uwsgi
  9. sudo mkdir /www/func.dev func = 내 폴더 이름
  10. sudo chown func:func /www/django/func
  11. cd /www/django/func
  12. mkdir conf extras
  13. virtualenv -p python3 venv
  14. cd venv
  15. source bin/activate
  16. cd /www/django/func
  17. pip3 install django
  18. django-admin.py startprojcet mysite mysite = django 프로젝트 이름
  19. sudo chown func:func /www/func/django/mysite
  20. sudo chmod 755 /www/func/django/mysite
  21. cd mysite
  22. mkdir db
  23. deactivate
  24. sudo nano /etc/init/uwsgi.conf pip3 install uwsgi를 할 경우 sudo service uwsgi start|stop|restart|reload 를 가능하게 하기 위한 작업
    description "uWSGI Emperor"
    start on runlevel [2345]
    stop on runlevel [!2345]
    respawn
    exec /usr/local/bin/uwsgi --master --die-on-term --emperor /etc/uwsgi/vassals/
    
  25. nano /www/func/django/conf/mysite.ini mysite = django 프로젝트 이름 sudo service uwsgi start|stop|restart|reload 하기위한 작업 %n는 ini 파일이름을 자동으로 불러옴
    https://uwsgi-docs.readthedocs.org/en/latest/Configuration.html
    py-autoload는 개발 후 주석처리 할것!
    [uwsgi]
    #variables
    base = /www/django/func
    
    #config
    uid = www-data
    gid = www-data
    chmod-socket = 664
    chown-socket = www-data
    ;die-on-term = true
    ;emperor = true
    ;no-site = true
    ;protocol = uwsgi
    ;master = true
    py-autoreload = 10
    enable-threads = true
    limit-as = 512
    processes = 5
    vacuum = true
    chdir = %(base)/%n
    module = %n.wsgi:application
    virtualenv = %(base)/venv
    socket = /dev/shm/%n.sock
    pidfile = %(base)/extras/%.pid
    touch-reload = %(base)/extras/%n.pid
    logto = %(base)/extras/uwsgi.log
    
    
  26. sudo mkdir /etc/uwsgi
  27. sudo mkdir /etc/uwsgi/vassals
  28. sudo ln -s /www/func/django/conf/mysite.ini /etc/uwsgi/vassals/ emperor = /etc/uwsgi/vassals/mysite.ini 처럼 symlink 해주면 다수의 프로젝트를 로드할 수 있음
  29. nano /www/func/django/conf/mysite.conf mysite = django 프로젝트 이름
    server {
      listen  80;
      server_name 127.0.0.1;
      charset utf-8;
    
      gzip on;
      gzip_disable "msie6";
      gzip_vary on;
      gzip_proxied any;
      gzip_comp_level 6;
      gzip_buffers 16 8k;
      gzip_http_version 1.1;
      gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
      access_log /www/func/django/extras/access.log;
      error_log /www/func/django/extras/error.log;
    
      location  /static {
        alias  /www/func/django/mysite/static;
      }
    
      location / {
        try_files $uri @django;
      }
    
      location @django {
        uwsgi_pass unix:/dev/shm/mysite.sock;
        include uwsgi_params;
      }
    }
    

  30. sudo ln -s /www/func/django/conf/mysite.conf /etc/nginx/sites-enabled/mysite.conf
  31. sudo service nginx restart
  32. sudo service uwsgi restart
  33. mkdir /www/func/django/mysite/db
  34. sudo chown www-data:func db
  35. sudo chmod 755 db
  36. virtualenv에서 python manage.py startapp 이름
  37. settings.py db/ 경로추가
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db/db.sqlite3'),
        }
    }
    
    TEMPLATE_DIRS = (
    	os.path.join(BASE_DIR, 'templates'),
    )
    
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    STATICFILES_DIRS = (
        ('css', os.path.join(BASE_DIR, 'static', 'css')),
        ('js', os.path.join(BASE_DIR, 'static', 'js')),
        ('img', os.path.join(BASE_DIR, 'static', 'img')),
    )
    
  38. templates 폴더 생성
    base.html
    <!DOCTYPE html>
    {% load staticfiles %}
    <html>
    <head>
    	<meta charset="UTF-8">
    	<title>{{ title }}</title>
    	<link rel="stylesheet" href="{% static 'css/base.css' %}" />
    </head>
    <body>
    	{% block content %}{% endblock %}
    </body>
    </html>
    
    home.html
    {% extends 'base.html' %}
    {% load staticfiles %}
    {% block content %}
    <h1>{{ title }}</h1>
    <img src="{% static 'img/bomi.gif'%}" alt="보미" />
    {% endblock %}
    
  39. settings.py 에 있는 static 폴더와 같게 업로드
  40. python manage.py collectstatic
  41. python manage.py syncdb
  42. models.py 작업, views.py작업
  43. python manage.py makemigrations 앱이름
  44. python manage.py migrate
  45. sudo chown www-data:func /www/func/django/mysite/db/db.sqlite3
  46. sudo chmod 664 /www/func/django/mysite/db/db.sqlite3
  47. python manage.py createsuperuser => 관리자계정 만들 경우...