본문 바로가기
코딩 연습/코딩배우기

파이썬 웹 호스팅(가비아) 운영 준비(소스파일 업로드), 서버 구동하기, 에러 메시지 조치...

by good4me 2021. 8. 2.

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]$

 

good4me.co.kr

 

■ 소스파일 업로드 후 서버 구동(서비스)을 위한 환경 설정

## 파일 업로드 완료 후

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 가 있는 프로젝트 폴더에서 명령을 내려야 함 

 

 

댓글