goodthings4me.tistory.com
파이썬 웹 호스팅(가비아) 운영 준비(소스파일 업로드), 서버 구동하기, 에러 메시지 조치
■ 파이썬 웹 호스팅 운영 준비
장고 초보자가 수 일에 걸쳐 연습삼아 개발한 파이썬 웹 페이지를 가비아 웹 호스팅(컨테이너)에 업로드하여 시험 운영중이다.
허접하지만 특정한 목적을 가지고 개발한 소스를 올리기 위해...
- 프로젝트 디렉토리를 만들고,
- 장고(django)를 설치하고,
- settings를 수정하고,
- db(sqlite3)를 migrate 하고,
- Filezilla를 통해 필요 파일을 업로드 한 후,
- 웹 서비스를 위한 설정을 하였다.
허나, 완벽한 것은 없는 법!
에러가 나와서 한 참을 고생하고...
서버 구동을 시작했는데,
아니나 다를까... 또 에러가 나왔다. 그런데.... 헐~
▶ VS Code에서 Remote-SSH: Connect to Host...로 접속하여 터미널에서 다음과 같이 작업을 진행함
[guser@python ~]$ pip unistall django
[guser@python ~]$ pip install django==2.2
## 장고 3.1 --> 버전 2.2로 재 설치
[guser@python ~]$ ls
hello
[guser@python ~]$ mkdir doyagi
[guser@python ~]$ cd doyagi/
[guser@python doyagi]$ ls
[guser@python doyagi]$ pip list
Package Version
----------------- --------
asgiref 3.2.10
click 7.1.2
Django 2.2
Flask 1.1.2
gunicorn 20.0.4
itsdangerous 1.1.0
Jinja2 2.11.2
MarkupSafe 1.1.1
pip 21.2.1
pytz 2020.4
setuptools 39.2.0
sqlparse 0.4.1
typing-extensions 3.10.0.0
Werkzeug 1.0.1
whitenoise 5.3.0
[guser@python doyagi]$
[guser@python doyagi]$ django-admin startproject config .
[guser@python doyagi]$ ls
config manage.py
[guser@python doyagi]$ python 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 admin.0003_logentry_add_action_flag_choices... 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 auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying sessions.0001_initial... OK
[guser@python doyagi]$
[guser@python doyagi]$ python manage.py createsuperuser
Username (leave blank to use 'guser'): admincoup
Email address:
Password:
Password (again):
Superuser created successfully.
[guser@python doyagi]$
[guser@python doyagi]$ ls
config db.sqlite3 manage.py
[guser@python doyagi]$ python manage.py startapp atcoup
[guser@python doyagi]$ ls
atcoup config db.sqlite3 manage.py
[guser@python doyagi]$ python manage.py makemigrations
Migrations for 'atcoup':
atcoup/migrations/0001_initial.py
- Create model Coup
[guser@python doyagi]$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, atcoup, auth, contenttypes, sessions
Running migrations:
Applying atcoup.0001_initial... OK
[guser@python doyagi]$
■ 소스파일 업로드 후 서버 구동(서비스)을 위한 환경 설정
## 파일 업로드 완료 후
Gunicorn 정적 파일 서비스를 하기 위해서는 Whitenoise 패키지를 설치하고, 서비스에 사용되는 파일(wsgi.py)을 수정해야 한다고 하여,
[guser@python doyagi]$ pip install whitenoise
## config/wsgi.py 수정
application = WhiteNoise(application, root='/web/[프로젝트명]')
application.add_files('/web/[프로젝트명]/static/', prefix='')
--------------------------------------------------------
import os
from whitenoise import WhiteNoise # 추가
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
application = get_wsgi_application()
application = WhiteNoise(application, root='/web/doyagi')
application.add_files('/web/doyagi/static/', prefix='')
--------------------------------------------------------
## 파이썬 웹 호스팅(가비아) 파일 업로드 후 에러 메시지
python manage.py makemigrations 명령 시 아래와 같이 에러 발생함
TypeError: argument of type 'PosixPath' is not iterable
※ 해결 (구글링 결과)
config/settings.py 내 'DATABASES' 설정 문제라 함
'NAME': BASE_DIR / 'db.sqlite3', --> 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 수정 후 정상화 됨
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# 'NAME': BASE_DIR / 'db.sqlite3',
}
}
■ 서버(웹 애플리케이션) 구동하기, 정지하기
## 서버(웹 애플리케이션) 구동하기
# Django의 경우, 외부에서 서버(웹 애플리케이션)에 정상적으로 접근하기 위해서는
# hello/settings.py 파일에 아래의 내용을 작성
ALLOWED_HOSTS = ['*']
# 그리고, DEBUG = True --> DEBUG = False 로 변경(오류 표시 안함)
# localhost:8000 포그라운드 실행
python manage.py runserver 0.0.0.0:8080
# localhost:8000 백그라운드 실행
python manage.py runserver 0.0.0.0:8080 &
# gunicorn과 함께 포그라운드 실행
gunicorn config.wsgi:application --bind 0.0.0.0:8080
# gunicorn과 함께 백그라운드 실행
gunicorn config.wsgi:application --bind 0.0.0.0:8080 --daemon
## 서버(웹 애플리케이션) 정지
# 포그라운드로 실행시킨 경우, Ctrl + C
# 백그라운드로 실행시킨 경우, kill -9 [pid]
※ 컨테이너호스팅에서 실행중인 프로세스 목록[pid]은 'ps -ef' 명령어 입력하여 확인
## 서버 구동 시 에러 발생
ModuleNotFoundError: No module named 'doyagi'
[2021-08-02 20:28:51 +0900] [5905] [INFO] Reason: Worker failed to boot.
[guser@python doyagi]$ gunicorn --preload doyagi.wsgi:application
Traceback (most recent call last):
File "/web/.local/bin/gunicorn", line 8, in <module>
sys.exit(run())
File "/web/.local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 58, in run
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
File "/web/.local/lib/python3.6/site-packages/gunicorn/app/base.py", line 228, in run
super().run()
File "/web/.local/lib/python3.6/site-packages/gunicorn/app/base.py", line 72, in run
Arbiter(self).run()
File "/web/.local/lib/python3.6/site-packages/gunicorn/arbiter.py", line 58, in __init__
self.setup(app)
File "/web/.local/lib/python3.6/site-packages/gunicorn/arbiter.py", line 118, in setup
self.app.wsgi()
File "/web/.local/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/web/.local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
return self.load_wsgiapp()
File "/web/.local/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
return util.import_app(self.app_uri)
File "/web/.local/lib/python3.6/site-packages/gunicorn/util.py", line 358, in import_app
mod = importlib.import_module(module)
File "/usr/lib64/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'doyagi'
# 오류 원인은, ~ doyagi.wsgi:application ~ 부분
[guser@python doyagi]$ gunicorn doyagi.wsgi:application --bind 0.0.0.0:8080
가 아니라
[guser@python doyagi]$ gunicorn config.wsgi:application --bind 0.0.0.0:8080
가비아(gabia)의 서버 구동 안내에 따라,
gunicorn [프로젝트명].wsgi:application --bind 0.0.0.0:8080 으로 실행했는데,
가비아의 초기 project name와 app name 이 'hello'여서 프로젝트명이 맞는 줄 알았다.
한 참을 고민하다가 생각해보니, config.wsgi 로 수정하여 실행하니 서버(웹서비스) 정상화 되었다.
- "config.wsgi"는 WSGI 서버(Gunicorn)에서 호출하는 장고의 WSGI 애플리케이션 설정(config/wsgi.py 파일),
- ":application"는 WSGI 서버가 호출하는 WSGI 애플리케이션은 config/wsgi.py 파일의 application이라는 의미이고,
- "--bind 0:8000"은 8000번 포트로 WSGI 서버를 수행한다는 의미라고 함
실행 명령은 config 가 있는 프로젝트 폴더에서 명령을 내려야 함
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
네이버 블로그 글과 이미지 가져와서 백업하기(파이썬으로 작업) (2) | 2021.08.18 |
---|---|
티스토리 블로그 포스팅 글 목록 추출, 구글 애널리틱스 검색건수 찾기 (0) | 2021.08.05 |
NoReverseMatch ~ 파이썬 장고(django) 에러 (0) | 2021.08.02 |
가비아 파이썬 웹 호스팅 사이트 운영을 위한 프로젝트 개발용 Anaconda 가상환경 생성과 PyCharm 설정 연습 (0) | 2021.07.30 |
장고(Django) 웹 프레임워크 프로젝트 예제로 알아보는 파이썬 웹 프로그래밍 연습 (0) | 2021.07.29 |
댓글