Django는 Python 프로그래밍 언어로 구축된 무료 오픈 소스 웹 애플리케이션 프레임워크입니다. Django는 매우 빠르고 안전하며 확장성이 뛰어납니다. 숙련된 개발자의 손을 거치면 Django는 강력한 웹사이트를 신속하게 구축할 수 있습니다. 또한 대중적인 웹 서버(Apache, Nginx) 및 데이터베이스(MySQL, MariaDB, PostgreSQL, Oracle, 및 SQLite) 등과 원활하게 통합됩니다. Django는 Instagram, Mozilla, NASA 등 세계에서 가장 큰 웹사이트 중 일부를 구동하고 있습니다. 이 가이드는 PostgreSQL, Nginx 및 Gunicorn을 사용하여 Ubuntu 20.04에서 Django로 웹 앱의 기본 환경을 설정하는 방법을 보여줍니다.
사전 요구 사항
이 가이드를 진행하려면 기본 방화벽이 구성되어 있고 sudo 권한이 있는 non-root 사용자가 있는 Ubuntu 20.04 서버가 필요합니다. Ubuntu 서버 설정 방법에 대한 자세한 가이드를 확인해 보세요. 이 튜토리얼을 따라 sudo 권한이 있는 non-root 사용자를 구성할 수 있습니다. 또한 이 가이드의 단계를 따라 Iptables 방화벽을 구성할 수도 있습니다..
우리는 가상 환경 내에 Django를 설치할 것입니다. 프로젝트 전용 환경을 사용하면 동일한 서버에서 여러 프로젝트를 더 쉽게 관리할 수 있습니다. 데이터베이스와 앱이 설정되면 Gunicorn 애플리케이션 서버를 배포할 것입니다. Gunicorn은 클라이언트 요청을 HTTP에서 애플리케이션이 사용할 수 있는 Python 호출로 변환하는 애플리케이션 인터페이스 역할을 합니다. 그런 다음 빠른 성능의 연결 처리와 구현하기 쉬운 보안 기능을 위해 Gunicorn 앞에 Nginx를 배포할 것입니다.
필수 패키지 설치
먼저 필요한 모든 패키지를 설치하는 것부터 시작합니다. 다행히도 이 모든 패키지는 공식 Ubuntu 패키지 저장소에서 직접 제공됩니다. 터미널을 열고 APT 패키지 캐시를 업데이트합니다.
|
1 |
sudo apt update |
패키지 목록은 웹 애플리케이션이 Python 2를 사용할지 Python 3을 사용할지에 따라 달라집니다. Python 3에서 Django를 설치하려면 다음 명령을 실행하세요.
|
1 |
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl |
Django 1.11 LTS는 Python 2를 지원하는 Django의 마지막 릴리스입니다. Python 2에서 Django를 사용하려면 다음 패키지를 설치하세요.
|
1 |
sudo apt install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx curl |
PostgreSQL 데이터베이스 및 사용자
데이터베이스 솔루션으로는 PostgreSQL을 사용할 것입니다. 이는 강력한 오픈 소스 객체-관계형 데이터베이스 시스템입니다. PostgreSQL은 신뢰성, 견고성 및 성능을 제공합니다. PostgreSQL 설정에 대한 자세한 단계는 Ubuntu 서버에 PostgreSQL 설정하기 가이드를 참조하세요. 본 가이드에서는 Django 애플리케이션을 위한 전용 데이터베이스와 사용자를 설정합니다.
기본적으로 PostgreSQL은 로컬 연결에 대한 인증 체계로 “peer 인증”을 구현합니다. 간단히 말해, “peer 인증”은 사용자의 운영 체제 사용자 이름이 유효한 PostgreSQL 사용자 이름과 일치하는 경우 로그인을 인증합니다. 설치 과정에서 PostgreSQL은 postgres 운영 체제 사용자가 postgres PostgreSQL 관리 사용자에 대응하도록 구성했습니다. 다음 명령을 사용하여 postgres 사용자로 PostgreSQL 대화형 셸 세션에 로그인합니다.
|
1 |
sudo -u postgres psql |
PostgreSQL 프롬프트로 이동하게 됩니다. 첫 번째 단계는 프로젝트를 위한 전용 데이터베이스를 생성하는 것입니다. 데모를 위해 데이터베이스 이름은 viktor_project:
|
1 |
CREATE DATABASE viktor_project; |
다음 단계는 프로젝트 데이터베이스를 위한 전용 사용자를 생성하는 것입니다. 사용자는 강력한 사용자 이름을 가져야 합니다. 데모를 위해 사용자 이름은 viktor_project_user:
|
1 |
CREATE USER viktor_project_user WITH PASSWORD 'password123'; |
이제 몇 가지 매개변수를 수정하겠습니다:
- 특정 연결 매개변수입니다. 간단히 말해, 연결이 설정될 때마다 올바른 값을 쿼리하고 설정할 필요가 없습니다. 이는 데이터베이스 성능을 크게 향상시킵니다.
- 기본 인코딩을
UTF-8로 설정합니다. 이는 범용 인코딩이며 Django가 이를 요구합니다. - 기본 트랜잭션 격리 수준을 “read committed”로 설정합니다. 이는 커밋되지 않은 트랜잭션으로부터의 읽기를 차단합니다.
- 시간대를
UTC.
로 설정합니다. 이러한 모든 매개변수 변경은 Django 프로젝트 자체에서 권장하는 사항입니다. 이러한 변경 사항을 적용하려면 다음 명령을 실행하세요. 데이터베이스 사용자 이름을 올바른 이름으로 변경하는 것을 잊지 마세요:
|
1 2 3 |
ALTER ROLE viktor_project_user SET client_encoding TO 'utf8'; ALTER ROLE viktor_project_user SET default_transaction_isolation TO 'read committed'; ALTER ROLE viktor_project_user SET timezone TO 'UTC'; |
데이터베이스 관리자를 전용 데이터베이스 사용자로 변경합니다:
|
1 |
GRANT ALL PRIVILEGES ON DATABASE viktor_project TO viktor_project_user; |
이제 PostgreSQL 작업이 완료되었습니다. PostgreSQL 대화형 셸을 종료합니다:
|
1 |
\q |
Python 가상 환경
데이터베이스가 준비되었으므로 이제 나머지 프로젝트 요구 사항을 설정하는 데 집중할 수 있습니다. 더 쉬운 관리를 위해 가상 환경을 구축하고 여기에 모든 Python 요구 사항을 설치하겠습니다. 가상 환경을 생성하려면 virtualenv가 필요합니다. 이는 pip를 사용하여 쉽게 설치할 수 있습니다.
다음 명령은 pip를 업그레이드하고 virtualenv를 설치합니다. Python 3의 경우 다음 명령을 실행하세요:
|
1 2 |
sudo -H pip3 install --upgrade pip sudo -H pip3 install virtualenv |
Python 2의 경우 대신 다음 명령을 실행하세요:
|
1 2 |
sudo -H pip install --upgrade pip sudo -H pip install virtualenv |
Once virtualenv가 설치되면 가상 환경을 생성할 차례입니다. 다음으로 가상 환경을 위한 전용 디렉터리를 생성합니다:
|
1 |
mkdir -v ~/viktor_project |
그 후, 현재 활성 디렉터리를 가상 환경 전용 디렉터리로 변경합니다:
|
1 |
cd ~/viktor_project |
디렉터리 내에서 다음 명령을 실행합니다. virtualenv 도구가 프로젝트 이름으로 가상 환경을 생성합니다:
|
1 |
virtualenv viktor_project |
프로젝트 이름으로 하위 디렉터리가 생성됩니다. 이 하위 디렉터리에는 로컬 버전의 Python과 pip가 포함됩니다. 이는 프로젝트를 위해 격리된 Python 환경을 설치하고 구성할 수 있는 유연성을 제공합니다.
다음 명령은 가상 환경을 활성화합니다:
|
1 |
source viktor_project/bin/activate |
터미널 프롬프트가 변경되어 Python 가상 환경 내에서 작업 중임을 나타냅니다. 이제 가상 환경 내에 있으므로 필요한 Python 요구 사항을 설치하겠습니다. Django, Gunicorn 및 psycopg2(PostgreSQL 어댑터)가 필요합니다. 다음 명령은 로컬 pip에 구성 요소를 설치하도록 명령합니다:
|
1 |
pip install django gunicorn psycopg2-binary |
Python 3를 사용하더라도 pip가 올바른 명령입니다. 가상 환경 내에서는 pip3의 이름이 pip로 변경되기 때문입니다.
새 Django 프로젝트
Python 구성 요소가 준비되었으므로 이제 실제 Django 프로젝트 파일 작업을 시작할 수 있습니다.
-
Django 프로젝트 생성
프로젝트 디렉터리가 이미 생성되었습니다. Django에 해당 디렉터리에 파일을 설치하도록 지시하겠습니다. 이 절차는 실제 코드가 포함된 2단계 디렉터리를 생성합니다. 이 디렉터리에는 관리 스크립트도 포함됩니다. 핵심은 Django가 현재 디렉터리를 기준으로 디렉터리를 결정하도록 하는 대신 대상 디렉터리를 명시적으로 지정한다는 것입니다:
|
1 |
django-admin.py startproject viktor_project ~/viktor_project |
Django가 이에 따라 프로젝트를 생성할 것입니다. 여기에서 우리가 집중할 몇 가지 중요한 파일과 디렉토리가 있습니다. 디렉토리 및 파일 이름은 데모에 따라 사용됩니다.
~/viktor_project/manage.py: Django의 프로젝트 관리 스크립트입니다.~/viktor_project/viktor_project/: Django 프로젝트를 포함하는 패키지입니다. __init__.py, settings.py, urls.py, asgi.py, wsgi.py 파일이 포함되어야 합니다.
-
프로젝트 설정 조정
프로젝트가 생성된 후 가장 먼저 해야 할 일은 구성을 조정하는 것입니다. 텍스트 편집기에서 settings.py를 엽니다:
|
1 |
nano ~/viktor_project/viktor_project/settings.py |
우리가 가장 먼저 찾을 지시어는 ALLOWED_HOSTS입니다. 이는 Django 인스턴스에 연결할 수 있는 서버 또는 도메인 이름을 정의합니다. 만약 들어오는 요청의 Host 헤더가 ALLOWED_HOSTS 목록과 일치하지 않으면 예외가 발생합니다. 특정 유형의 보안 취약점을 방지하기 위해 Django에서 권장하는 방법입니다:
|
1 |
ALLOWED_HOSTS = ['<server_ip_or_domain_name_1>',' server_ip_or_domain_name_2','localhost'] |
다음으로 집중할 섹션은 DATABASE입니다. 데이터베이스 액세스를 관리합니다. 기본적으로 SQLite 데이터베이스 엔진에 대한 구성이 포함되어 있습니다. 하지만 이 프로젝트에서는 PostgreSQL 데이터베이스를 사용할 것입니다. Django는 PostgreSQL과 통신하기 위해 psycopg2 어댑터를 사용합니다:
|
1 2 3 4 5 6 7 8 9 10 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'viktor_project', 'USER': 'viktor_project_user', 'PASSWORD': 'password123', 'HOST': 'localhost', 'PORT': '', } } |
이제 파일의 맨 아래로 이동합니다. 정적 파일의 위치를 지정하기 위해 다음 줄을 추가합니다. 이는 Nginx가 이러한 항목에 대한 요청을 처리하는 데 도움이 됩니다:
|
1 2 |
import os STATIC_ROOT = os.path.join(BASE_DIR, 'static/') |
현재로서는 settings.py 작업이 완료되었습니다. 파일을 저장하고 편집기를 닫습니다.
-
초기 프로젝트 설정 완료
이제 초기 데이터베이스 스키마를 전용 PostgreSQL 데이터베이스로 마이그레이션할 수 있습니다. 다음 명령을 실행합니다:
|
1 2 |
~/viktor_project/manage.py makemigrations ~/viktor_project/manage.py migrate |
다음으로, 프로젝트의 슈퍼유저를 생성해야 합니다. 슈퍼유저를 생성하려면 다음 명령을 실행합니다:
|
1 |
~/viktor_project/manage.py createsuperuser |
settings.py에 지정한 위치로 모든 정적 파일을 수집합니다. 정적 파일은 프로젝트 디렉토리 아래의 “static”이라는 별도의 디렉토리에 수집됩니다:
|
1 |
~/viktor_project/manage.py collectstatic |
이제 서버 방화벽을 조정해야 합니다. 서버 구성 가이드를 따랐다면 이미 UFW가 구성 및 활성화되어 있을 것입니다. 포트 8000에 대한 예외를 생성하겠습니다. 이는 Django가 사용하는 기본 포트입니다. 다음에 대해 자세히 알아보려면 이 가이드를 확인하세요: UFW 방화벽 기본 사항 및 사용법.
|
1 |
sudo ufw allow 8000 |
다음으로, 작업을 확인합니다:
|
1 |
sudo ufw status |
마지막으로, 작동 중인 서버를 테스트할 수 있습니다. Django 개발 서버를 시작합니다:
|
1 |
~/viktor_project/manage.py runserver 0.0.0.0:8000 |
구성이 성공적으로 완료되면 Django 개발 서버가 시작되고 들어오는 요청을 수락해야 합니다. 브라우저를 열고 8000 포트에서 서버의 IP/도메인으로 이동합니다:
|
1 |
http://<server_or_domain>:8000 |
Django 기본 인덱스 페이지가 표시되어야 합니다. 관리자 패널에 액세스하려면 URL에 /admin을 추가합니다. 관리자 패널은 이전에 생성한 슈퍼유저만 액세스할 수 있습니다:
|
1 |
http://<server_or_domain>:8000/admin |
로그인하면 기본 Django 관리자 인터페이스로 이동합니다:
지금은 테스트를 마쳤습니다. 서버를 중지하려면 터미널 창에서 “Ctrl + C”를 누르세요.
-
Gunicorn 테스트
가상 환경을 종료하기 전에 Gunicorn이 애플리케이션을 서비스할 수 있는지 확인해야 합니다. 이를 테스트하는 방법은 Gunicorn을 사용하여 프로젝트의 WSGI 모듈을 로드하는 것입니다.
Gunicorn 명령은 프로젝트 디렉터리 내에 있습니다:
|
1 2 |
cd ~/viktor_project gunicorn --bind 0.0.0.0:8000 viktor_project.wsgi |
이렇게 하면 Django가 실행 중이던 동일한 인터페이스에서 Gunicorn이 시작됩니다. 일반 웹 브라우저에서 앱을 다시 테스트할 수 있습니다. Gunicorn은 아직 정적 CSS 콘텐츠를 찾는 방법을 모르기 때문에 관리자 인터페이스에 스타일이 적용되지 않습니다:
|
1 |
http://<server_or_domain>:8000 |
완료되면 터미널 창에서 “Ctrl + C”를 눌러 Gunicorn 서버를 중지합니다.
-
가상 환경 종료
Django 애플리케이션 설정이 완료되었습니다. 가상 환경을 종료하려면 다음 명령을 실행하세요:
|
1 |
deactivate |
Gunicorn 소켓 및 서비스 파일
Gunicorn이 Django 애플리케이션과 상호 작용할 수 있음을 확인했습니다. 하지만 애플리케이션 서버를 관리하는 더 강력한 방법이 필요합니다. 여기서 systemd가 등장합니다. Systemd는 Linux에서 사용할 수 있는 가장 인기 있는 초기화(init) 시스템 중 하나입니다. 다음은 이에 대한 심층 가이드입니다: systemd 서비스 및 유닛 관리 방법.
systemd가 Gunicorn을 서비스처럼 관리할 수 있도록 Gunicorn용 소켓 및 서비스 파일을 생성할 수 있습니다. 부팅 시 Gunicorn 소켓이 생성됩니다. 소켓은 들어오는 연결을 대기합니다. 연결이 발생하면 systemd가 연결을 처리하기 위해 Gunicorn 프로세스를 시작합니다.
-
Gunicorn 소켓
먼저 Gunicorn 소켓을 생성해 보겠습니다. 이 파일은 sudo 권한으로 생성해야 합니다:
|
1 |
sudo nano /etc/systemd/system/gunicorn.socket |
파일 내부에 다음 코드를 입력합니다:
|
1 2 3 4 5 6 7 |
[Unit] Description=gunicorn socket [Socket] ListenStream=/run/gunicorn.sock [Install] WantedBy=sockets.target |
보시다시피 코드에는 세 가지 섹션이 있습니다.
[Unit]:이 섹션은 소켓을 설명합니다.[Socket]:소켓 위치를 정의합니다.[Install]:이 부분은 systemd가 적절한 시점에 소켓을 생성하도록 보장합니다.
파일을 저장하고 편집기를 닫습니다.
-
Gunicorn 서비스
다음으로 Gunicorn용 서비스 파일을 생성하겠습니다. 소켓 파일과 마찬가지로 이 파일도 sudo 권한으로 생성해야 합니다:
|
1 |
sudo nano /etc/systemd/system/gunicorn.service |
다음 코드를 입력합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target [Service] User=cloudsigma Group=www-data WorkingDirectory=/home/cloudsigma/viktor_project ExecStart=/home/cloudsigma/viktor_project/viktor_project/bin/gunicorn \ --access-logfile - \ --workers 3 \ --bind unix:/run/gunicorn.sock \ viktor_project.wsgi:application [Install] WantedBy=multi-user.target |
코드에는 여러 섹션이 포함되어 있습니다:
[Unit]:이 섹션은 메타데이터와 종속성을 지정합니다. 또한 네트워크 타겟에 도달한 후에만 시작하도록 설명합니다.[Service]:이 섹션은 프로세스가 실행될 사용자 및 그룹을 지정합니다. Nginx가 Gunicorn과 통신할 수 있도록 그룹 소유권은 “www-data”로 설정됩니다. 또한 작업 디렉터리를 매핑하고 시작 명령을 지정합니다.[Install]:이 섹션은 부팅 시 이 서비스가 활성화될 경우 systemd가 이 서비스를 무엇에 연결할지 알려줍니다. 일반 다중 사용자 시스템이 실행을 시작한 후에 시작되어야 합니다.
다음으로 파일을 저장하고 편집기를 닫습니다.
-
Gunicorn 소켓 활성화
Gunicorn 소켓을 사용할 준비가 되었습니다. 따라서 다음 명령을 실행할 수 있습니다. 소켓이 시작되고 활성화됩니다. 소켓 파일은 부팅 시 /run/gunicorn.sock에 생성됩니다. 소켓에 연결이 이루어지면 systemd가 이를 처리하기 위해 Gunicorn 서비스를 시작합니다:
|
1 2 |
sudo systemctl start gunicorn.socket sudo systemctl enable gunicorn.socket |
Gunicorn 소켓의 상태를 확인합니다:
|
1 |
sudo systemctl status gunicorn.socket |
이제 소켓 파일이 존재하는지 확인합니다:
|
1 |
file /run/gunicorn.sock |
systemctl의 상태에 오류가 표시되거나 gunicorn.sock 파일을 찾을 수 없는 경우, 소켓이 올바르게 생성되지 않았음을 나타냅니다. 단서를 찾기 위해 상세 로그를 확인해 보세요:
|
1 |
sudo journalctl -u gunicorn.socket |
잠재적인 오류가 있는지 gunicorn.socket 파일을 다시 한 번 확인하는 것을 잊지 마세요.
-
소켓 활성화
지금까지 gunicorn.socket을(를) 시작했습니다. 하지만 연결 요청이 없으면 gunicorn.service가 활성화되지 않습니다. 다음으로 Gunicorn의 상태를 확인합니다:
|
1 |
sudo systemctl status gunicorn |
우리는 다음을 사용하여 연결 요청을 보냄으로써 소켓 활성화 메커니즘을 테스트할 수 있습니다: curl:
|
1 |
curl --unix-socket /run/gunicorn.sock localhost |
애플리케이션에서 HTML 출력을 받아야 합니다. 이는 Gunicorn이 성공적으로 시작되었고 Django 애플리케이션을 서비스할 수 있음을 나타냅니다. Gunicorn 서비스의 현재 상태를 확인합니다:
|
1 |
sudo systemctl status gunicorn |
예기치 않은 동작이나 출력(오류를 나타냄)이 있는 경우, 단서를 찾기 위해 상세 로그를 확인해 보세요:
|
1 |
sudo journalctl -u gunicorn |
gunicorn.service 파일이 변경된 경우, 서비스 정의를 다시 읽으려면 데몬을 다시 로드해야 합니다. 또한 Gunicorn 서비스를 재시작해야 합니다:
|
1 2 |
sudo systemctl daemon-reload sudo systemctl restart gunicorn |
Nginx 구성하기
이제 들어오는 트래픽을 프로세스로 전달하도록 Nginx를 구성하겠습니다. 먼저 Nginx에 새 서버 블록을 생성합니다:
|
1 |
sudo nano /etc/nginx/sites-available/viktor_project |
그런 다음 아래 코드를 입력합니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
server { listen 80; server_name 31.171.250.71; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/cloudsigma/viktor_project; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } } |
구성에는 다음과 같은 여러 블록이 있습니다:
service:이 블록은 서버가 포트 80에서 정상적으로 수신 대기하고 서버의 도메인 이름 또는 IP 주소에 응답해야 함을 정의합니다.location:첫 번째 location 항목입니다. 정적 자산을 찾을 위치를 정의합니다.location:두 번째 location 항목입니다. 이 블록은 표준 프록시 매개변수와 트래픽을 Gunicorn 소켓으로 전달하는 방법을 정의합니다.
파일을 저장하고 편집기를 닫습니다. 활성화하려면 파일을 “sites-enabled” 디렉터리에 연결합니다:
|
1 |
sudo ln -s /etc/nginx/sites-available/viktor_project /etc/nginx/sites-enabled |
그 후, Nginx 설정에 구문 오류가 있는지 테스트합니다:
|
1 |
sudo nginx -t |
오류가 발견되지 않았다면, 변경 사항을 적용하기 위해 Nginx를 재시작합니다:
|
1 |
sudo systemctl restart nginx |
UFW 규칙을 다시 수정해야 합니다. 더 이상 개발 서버에 액세스할 필요가 없으므로 8000번 포트에 대한 예외를 제거할 수 있습니다. 또한 일반 트래픽을 위해 80번 포트를 열어야 합니다:
|
1 2 |
sudo ufw delete allow 8000 sudo ufw allow 'Nginx Full' |
이러한 방화벽 규칙 변경 사항을 확인합니다:
|
1 |
sudo ufw status |
이제 일반 웹 브라우저에서 서버에 액세스할 수 있어야 합니다.
문제 해결 절차
모든 단계를 올바르게 따랐다면 인터넷을 통해 Django 애플리케이션에 액세스할 수 있어야 합니다. 그렇지 않다면 설치가 계획대로 진행되지 않았음을 나타냅니다. 문제의 원인을 파악하기 위해 문제를 해결해야 합니다.
-
Nginx가 기본 페이지를 표시하는 경우
Nginx가 애플리케이션 프록시 대신 기본 페이지를 표시하는 경우, 대개 server_name이(가) 서버 블록에서 잘못 설정되었음을 의미합니다.
이 예시에서 서버 블록은 다음 위치에 저장되어 있습니다:
|
1 |
/etc/nginx/sites-available/viktor_project |
The server_name 항목은 Nginx가 요청에 응답하는 데 사용할 서버 블록을 결정합니다. 기본 페이지가 표시된다면 Nginx가 요청을 명시적인 서버 블록과 일치시키지 못해 대신 기본 블록으로 대체하고 있을 가능성이 높습니다:
|
1 |
/etc/nginx/sites-available/default |
Django 프로젝트의 서버 블록에 적절한 server_name.
-
502 Bad Gateway
502 오류는 Nginx가 요청을 성공적으로 프록시하지 못했음을 나타냅니다. 502 오류를 유발할 수 있는 구성 문제는 매우 다양하므로, 올바르게 문제를 해결하려면 단서가 필요합니다.
단서의 주요 원천은 Nginx 오류 로그입니다. 일반적으로 프록시 중에 문제를 일으킨 조건에 대한 힌트를 제공합니다. 다음 명령을 사용하여 Nginx 오류 로그를 확인하십시오:
|
1 |
sudo tail -F /var/log/nginx/error.log |
로그가 열리면 서버에 다시 한 번 액세스해 보십시오. 로그에 새로운 오류 메시지가 생성될 것입니다. 이는 문제를 좁히는 데 도움이 될 수 있습니다. 다음은 발생 가능한 몇 가지 메시지입니다:
- connect() to unix:/run/gunicorn.sock failed (2: No such file or directory)
이는 Nginx가 설정된 위치에서 gunicorn.sock을(를) 찾을 수 없음을 나타냅니다. 해당 위치는 사이트 블록 아래의 proxy_pass 지시문에 설명되어 있습니다. proxy_pass이(가) gunicorn.socket systemd 유닛에 의해 생성된 gunicorn.sock의 올바른 위치를 가리키고 있는지 확인하십시오:
|
1 |
/etc/nginx/sites-available/viktor_project |
만약 gunicorn.sock이(가) /run 디렉터리 아래에서 발견되지 않았다면, systemd가 이를 생성하지 못했음을 의미합니다. Gunicorn 소켓 파일 구성 단계를 다시 확인해야 합니다.
- connect() to unix:/run/gunicorn.sock failed (13: Permission denied)
이는 권한 문제로 인해 Nginx가 Gunicorn 소켓에 연결할 수 없음을 나타냅니다. 이 작업이 sudo 사용자가 아닌 root 사용자로 수행된 경우 발생할 수 있습니다. systemd가 gunicorn.sock을(를) 성공적으로 생성했더라도 Nginx는 이를 사용할 수 없습니다.
가능한 원인 중 하나는 루트 디렉터리(/)와 gunicorn.sock 파일 사이의 제한된 권한일 수 있습니다. 소켓 파일 및 각 상위 디렉터리의 권한과 소유권을 확인하십시오:
|
1 |
namei -l /run/gunicorn.sock |
첫 번째 열은 파일 권한을 설명합니다. 두 번째 열은 소유자 사용자를 설명하고, 세 번째 열은 소유자 그룹을 설명합니다. gunicorn.sock에 이르는 디렉터리 중 적절한 읽기 및 실행 권한이 없는 디렉터리가 있다면 Nginx는 소켓에 액세스하는 데 실패합니다.
-
Django에 “could not connect to the server: Connection refused”가 표시되는 경우
이는 Django가 PostgreSQL 서버에 연결하지 못했음을 나타냅니다. PostgreSQL 서버가 가동되어 실행 중인지 확인하십시오:
|
1 |
sudo systemctl status postgresql |
실행 중이 아니라면, 다음 명령어를 실행하여 시작하고 활성화하십시오:
|
1 2 |
sudo systemctl start postgresql sudo systemctl enable postgresql |
여전히 이 오류가 발생한다면, 데이터베이스 자격 증명이 다음 파일에 올바르게 정의되어 있는지 확인하십시오: settings.py:
|
1 |
~/viktor_project/viktor_project/settings.py |
추가 문제 해결
추가적인 문제 해결을 위해 다양한 로그가 마련되어 있습니다. 이 로그들은 문제의 원인을 좁히는 데 도움이 될 수 있습니다.
도움이 될 수 있는 로그 목록은 다음과 같습니다:
- Nginx 로그
|
1 |
sudo journalctl -u nginx |
- 액세스 로그-Nginx
|
1 |
sudo less /var/log/nginx/access.log |
- 에러 로그-Nginx
|
1 |
sudo less /var/log/nginx/error.log |
- 애플리케이션 로그-Gunicorn
|
1 |
sudo journalctl -u gunicorn |
- 소켓 로그-Gunicorn
|
1 |
sudo journalctl -u gunicorn.socket |
|
1 |
sudo systemctl restart gunicorn |
|
1 2 |
sudo systemctl daemon-reload sudo systemctl restart gunicorn.socket gunicorn.service |
|
1 2 |
sudo nginx -t sudo systemctl restart nginx |
마치며
이 가이드는 Django의 기반을 다지는 방법을 성공적으로 보여줍니다. Django는 웹 애플리케이션의 공통 구성 요소 중 상당수를 제공하므로 고유한 요소에 집중할 수 있습니다. Django 프로젝트는 가상 환경 내에서 작동합니다. Gunicorn은 클라이언트 요청과 Django 간의 통신을 관리합니다. 마지막으로 Nginx는 클라이언트 연결을 처리하기 위한 역방향 프록시(reverse proxy) 역할을 합니다.
즐거운 컴퓨팅 되세요!










댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.