ABOUT ME

IT와 컴퓨터 관련 팁, 파이썬 등과 아파트 정보, 일상적인 경험 등의 생활 정보를 정리해서 올리는 개인 블로그

  • 파이썬 웹 호스팅(가비아) 운영 준비(소스파일 업로드), 서버 구동하기, 에러 메시지 조치...
    코딩 연습/코딩배우기 2021. 8. 2. 22:06
    반응형

     

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

    ■ 파이썬 웹 호스팅 운영 준비

    장고 초보자가 수 일에 걸쳐 연습삼아 개발한 파이썬 웹 페이지를 가비아 웹 호스팅(컨테이너)에 업로드하여 시험 운영중이다.

    허접하지만 특정한 목적을 가지고 개발한 소스를 올리기 위해...

    • 프로젝트 디렉토리를 만들고, 
    • 장고(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 가 있는 프로젝트 폴더에서 명령을 내려야 함 

     

     

    반응형
Designed by goodthings4me.