ubuntu server 18.04 LTS 에 apache2, django, mod_wsgi 설치

ubuntu server 18.04 LTS 에 apache2, django, mod_wsgi 설치

우분투서버는 최초 설치한 상태.

1. ubuntu 18.04에는 python3.6.5가 설치되어 있다. 이 버전을 그냥 사용하기위해 아래 명령어로 아파치웹서버와 mod_wsgi를 설치한다.

snowfox@fox:~$ sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3 

2. 파이썬 virtual environment를 설정한다.

파이썬 virtual environment를 사용하기 위해 virtualenv를 설치한다.

snowfox@fox:~$ sudo pip3 install virtualenv
Collecting virtualenv
  Downloading https://files.pythonhosted.org/packages/b6/30/96a02b2287098b23b875bc8c2f58071c35d2efe84f747b64d523721dc2b5/virtualenv-16.0.0-py2.py3-none-any.whl (1.9MB)
    100% |████████████████████████████████| 1.9MB 711kB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-16.0.0

파이썬 테스트 프로젝트를 만들기위해 testproject디렉토리를 만든다.

snowfox@fox:~$ mkdir testproject
snowfox@fox:~$ cd testproject
snowfox@fox:~/testproject$

테스트 프로젝트를 위한 파이썬 가상환경을 만든다.

snowfox@fox:~/testproject$ virtualenv testprojectenv
Using base prefix '/usr'
New python executable in /home/snowfox/testproject/testprojectenv/bin/python3
Also creating executable in /home/snowfox/testproject/testprojectenv/bin/python
Installing setuptools, pip, wheel...done.
snowfox@fox:~/testproject$

가상환경을 활성화하면 아래처럼 프롬프트가 바뀐다.

snowfox@fox:~/testproject$ source testprojectenv/bin/activate
(testprojectenv) snowfox@fox:~/testproject$
(testprojectenv) snowfox@fox:~/testproject$

가상환경에서 사용할 Django를 설치한다. 이때, 파이썬3 버전을 사용함에도 불구하고, pip3이 아닌 pip로 설치한다.

(testprojectenv) snowfox@fox:~/testproject$ pip install django
Collecting django
  Downloading https://files.pythonhosted.org/packages/ab/15/cfde97943f0db45e4f999c60b696fbb4df59e82bbccc686770f4e44c9094/Django-2.0.7-py3-none-any.whl (7.1MB)
    100% |████████████████████████████████| 7.1MB 370kB/s
Collecting pytz (from django)
  Downloading https://files.pythonhosted.org/packages/30/4e/27c34b62430286c6d59177a0842ed90dc789ce5d1ed740887653b898779a/pytz-2018.5-py2.py3-none-any.whl (510kB)
    100% |████████████████████████████████| 512kB 180kB/s
Installing collected packages: pytz, django
Successfully installed django-2.0.7 pytz-2018.5

3. 새 장고 프로젝트를 만들고 설정한다.

장고 테스트 프로젝트 만들기

(testprojectenv) snowfox@fox:~/testproject$ django-admin.py startproject testproject .
(testprojectenv) snowfox@fox:~/testproject$

테스트 프로젝트 설정
장고 테스트프로젝트 디렉토리아래의 settings.py 에서 아래 항목을 찾아 수정 또는 추가한다.
나는 모든곳에서 접속을 허용하기 위해 ALLOWED_HOSTS에 *을 설정했다. 특정 ip주소에서만 접속을 허용하려면 아이피 주소를 열거해주면 된다.
(예, ALLOWED_HOTS=[‘192.168.0.1’, ‘192.168.0.20’]

(testprojectenv) snowfox@fox:~/testproject$ vi testproject/settings.py

...
ALLOWED_HOSTS = ['*']
...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
...

이제, management 스크립트를 이용하여 SQLite 데이타베이스 스키마를 초기화하고 마이그레이션한다.

(testprojectenv) snowfox@fox:~/testproject$ ./manage.py makemigrations
No changes detected
(testprojectenv) snowfox@fox:~/testproject$ ./manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK
(testprojectenv) snowfox@fox:~/testproject$

관리자를 만든다. 관리자 id, 이메일, 비밀번호를 설정한다.

(testprojectenv) snowfox@fox:~/testproject$ ./manage.py createsuperuser
Username (leave blank to use 'snowfox'):
Email address:
Password:
Password (again):
Superuser created successfully.

아래 명령으로 디렉토리내에 static 콘텐츠를 수집한다. 프로젝트 디렉토리내의 static 디렉토리에 static화일이 복사된다.

(testprojectenv) snowfox@fox:~/testproject$ ./manage.py collectstatic
Copying '/home/snowfox/testproject/testprojectenv/lib/python3.6/site-packages/django/contrib/admin/static/admin/fonts/Roboto-Bold-webfont.woff'
Copying '/home/snowfox/testproject/testprojectenv/lib/python3.6/site-packages/django/contrib/admin/static/admin/fonts/LICENSE.txt'
...
Copying '/home/snowfox/testproject/testprojectenv/lib/python3.6/site-packages/django/contrib/admin/static/admin/css/vendor/select2/LICENSE-SELECT2.md'

118 static files copied to '/home/snowfox/testproject/static'.

방화벽을 사용하는 경우, 아래 명령으로 8000 포트 접근을 가능하도록 해 준다.

(testprojectenv) snowfox@fox:~/testproject$ sudo ufw allow 8000

이제 웹서버를 실행하여 Django 서버를 실행하고 웹브라우저로 접속해 본다.

(testprojectenv) snowfox@fox:~/testproject$ ./manage.py runserver 0.0.0.0:8000
Performing system checks...

System check identified no issues (0 silenced).
July 25, 2018 - 07:58:05
Django version 2.0.7, using settings 'testproject.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.


testproject 가상환경을 끝내기 위해 deactivate 명령을 실행한다.

(testprojectenv) snowfox@fox:~/testproject$ deactivate
snowfox@fox:~/testproject$

4. 아파치 설정(mod_wsgi)

WSGI 를 설정하기 위해 아파치의 default virtual host 화일을 편집해야한다.

000-default.conf 화일에 아래 내용을 추가한다. 여기서 snowfox/testproject는 사용자계정과 이전에 만든 프로젝트 디렉토리이며 사용자에따라 달라지겠지?
static 화일에 접근할수 있도록 앨리어스와 권한을 부여해 준다.

snowfox@fox:~/testproject$ sudo vi /etc/apache2/sites-available/000-default.conf
    
........
        Alias /static /home/snowfox/testproject/static
        <Directory /home/snowfox/testproject/static>
                Require all granted
        </Directory>
</VirtualHost>

다음으로 장고코드가 저장되어 있는 프로젝트디렉토리내의 wsgi.py화일에대한 접근 권한을 부여해 준다.
        Alias /static /home/snowfox/testproject/static
        <Directory /home/snowfox/testproject/static>
                Require all granted
        </Directory>

        <Directory /home/snowfox/testproject/testproject>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>
</VirtualHost>

마지막으로, wsgi가 데몬으로 실행되도록 설정해준다.

        Alias /static /home/snowfox/testproject/static
        <Directory /home/snowfox/testproject/static>
                Require all granted
        </Directory>

        <Directory /home/snowfox/testproject/testproject>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>
        WSGIDaemonProcess testproject python-home=/home/snowfox/testproject/testprojectenv python-path=/home/snowfox/testproject
        WSGIProcessGroup testproject
        WSGIScriptAlias / /home/snowfox/testproject/testproject/wsgi.py
</VirtualHost>

5. 기타 설정
sqlite3을 사용하는 경우, 프로젝트 디렉토리내에 db.sqlite3 화일이 생성되어 있다. 이 화일의 퍼미션을 664로 변경해주고, 아파치 프로세스가 접근 가능하도록 www-data 그룹으로 변경한다.

snowfox@fox:~/testproject$ ls -l db.sqlite3
-rw-r--r-- 1 snowfox snowfox 131072 Jul 25 08:04 db.sqlite3

snowfox@fox:~/testproject$ chmod 664 ~/testproject/db.sqlite3
snowfox@fox:~/testproject$ sudo chown :www-data ~/testproject/db.sqlite3
[sudo] password for snowfox:

snowfox@fox:~/testproject$ ls -l db.sqlite3
-rw-rw-r-- 1 snowfox www-data 131072 Jul 25 08:04 db.sqlite3

또한 아파치 프로세스가 프로젝트 디렉토리에 접근 가능하도록 소유 그룹도 변경한다.

snowfox@fox:~/testproject$ sudo chown :www-data ~/testproject/

방화벽을 사용하는 경우, 아래 명령어로 웹 접근이 가능하도록 해 준다.

snowfox@fox:~/testproject$ sudo ufw delete allow 8000
Rules updated
Rules updated (v6)
snowfox@fox:~/testproject$ sudo ufw allow 'Apache Full'
Rules updated
Rules updated (v6)

6. 아파치 서버 재 실행
설정 이상있는지 확인하고, systemctl 명령으로 아파치 서버를 재기동한다.

snowfox@fox:~/testproject$ cd
snowfox@fox:~$ sudo apache2ctl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.0.11. Set the 'ServerName' directive globally to suppress this message
Syntax OK
snowfox@fox:~$
snowfox@fox:~$ sudo systemctl restart apache2

이제, 80포트로 이전과 동일한 화면이 보일 것이다.


원문:
https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-ubuntu-16-04

답글 남기기

Your email address will not be published.