참고 블로그 :
https://velog.io/@odh0112/Django-Nginx-Gunicorn-%EC%97%B0%EB%8F%99-2-fb00a9kg
이전에 다룬 것들
🔔 인스턴스 생성 , 우분투 접속, anaconda 설치
이번에서 다룰 것들
🔔 django 설치, Gunicorn, Nginx 배포, ssl 인증서 발급
1. Djnago 설치
1) django 설치
$ pip install django==3.0
# Django 버전 확인하기
(test_site) ubuntu@<ip ~~>:~$ python -m django --version
3.0
2) django 프로젝트 생성
# django 프로젝트를 저장할 디렉토리 test_site 생성
$ mkdir test_site
$ django-admin startproject core
manage.py 가 있는 경로로 들어가 runserver
(test_site) ubuntu@<ip ~~ >:~/test_site/core$ python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
May 22, 2023 - 07:59:50
Django version 3.0, using settings 'core.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
3) 데이터베이스 마이그레이션
db.sqlite3 파일이 생성 !
$ ./manage.py makemigrations
$ ./manage.py migrate
(test_site) ubuntu@<ip ~~>:~/test_site/core$ ls
core db.sqlite3 manage.py
4) settings.py 수정
ALLOWED_HOSTS = ['퍼블릭 IPv4 주소']
LANGUAGE_CODE = 'ko'
TIME_ZONE = 'Asia/Seoul'
5) ec2 보안그룹 8080 추가
인스턴스 클릭 -> [ 보안 ] 탭 클릭 -> 보안 그룹 클릭 -> 인바운드 규칙 편집 클릭 ->
$ python manage.py runserver 0:8080
2. Gunicorn 실행
# 설치
$ pip install gunicorn
1) 실행
$ gunicorn --bind 0:8000 [wsgi가 있는 앱 이름].wsgi:application
# wsgi가 있는 파일 경로에서 실행
$ gunicorn --bind 0:8080 core.wsgi:application
(1) --bind0:8080번 포트로 WSGI 서버 수행하다는 의미
(2) core.wsgi:application : WSGI 서버와 연결된 WSGI 애플리케이션은 core/wsgi.py 파일의 application이라는 의미
2) 소켓
포트를 이용해 서버를 가동할 수 있지만 Unix 계열 시스템에서는 포트로 서비스하기보다는 유닉스 소켓을 사용하는 것이 빠르고 효율적
$ gunicorn --bind unix:/tmp/gunicorn.sock core.wsgi:application
Tip!
유닉스 소켓 방식으로 Gunicorn 서버를 실행하면 단독으로 Gunicorn 서버에 접속하여 실행할 수 없다
유닉스 소켓 방식으로 실행한 Gunicorn 서버는 Nginx와 같은 웹 서버에서 유닉스 소켓으로 WSGI 서버에 접속하도록 설정해야 한다
3) 서비스
# sudo vi /etc/systemd/system/gunicorn.service 파일 생성
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=<계정명>
Group=<계정명>
WorkingDirectory=<프로젝트 경로. 즉 manage.py가 위치한 디렉토리 pwd>
ExecStart=<gunicorn이 설치된 가상환경 위치> \
--workers 1 \
--bind unix:/home/foo/django_test/run/gunicorn.sock \
<wsgi.py가 있는 디렉토리 이름>.wsgi:application
[Install]
WantedBy=multi-user.target
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/<앱이름>
ExecStart=/home/ubuntu/anaconda3/envs/<앱이름>/bin/gunicorn --workers 3 --bind 0.0.0.0:8080 core.wsgi:application
[Install]
WantedBy=multi-user.target
4) 시스템 데몬 재시작 & 서비스 상태 확인
# 서비스 새로 등록 또는 수정시 데몬 리로드
$ sudo systemctl daemon-reload
# 서비스 실행 / 등록
$ sudo systemctl start gunicorn # 실행
$ sudo systemctl enable gunicorn # 등록
# 상태 확인
$ sudo systemctl status gunicorn
# 이 외 명령어
$ sudo systemctl stop gunicorn #gunicorn.service 중지
$ sudo systemctl restart gunicorn #gunicorn.service 재시작
3. static 파일
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ROOT_DIR = os.path.dirname(BASE_DIR)
# static files
STATIC_URL = '/static/'
STATIC_DIR = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [
STATIC_DIR,
]
STATIC_ROOT = os.path.join(ROOT_DIR, '.static_root') # 요기
# static 파일이 없을 경우 생성
$ mkdir static
1. 해당 명령 입력시 프로젝트 내에 static 파일 들 몽땅 모아줌
$ python manage.py collectstatic
4. Nginx 서버 연결하기
$ sudo apt-get install -y nginx
1) 기본 설정 파일 열기
$ sudo vi /etc/nginx/nginx.conf
# worker 프로세스를 실행할 사용자 설정
# - 이 사용자에 따라 권한이 달라질 수 있다.
user nginx;
# 실행할 worker 프로세스 설정
# - 서버에 장착되어 있는 코어 수 만큼 할당하는 것이 보통, 더 높게도 설정 가능
worker_processes 1;
# 오류 로그를 남길 파일 경로 지정
error_log /var/log/nginx/error.log warn;
# NGINX 마스터 프로세스 ID 를 저장할 파일 경로 지정
pid /var/run/nginx.pid;
# 접속 처리에 관한 설정을 한다.
events {
# 워커 프로레스 한 개당 동시 접속 수 지정 (512 혹은 1024 를 기준으로 지정)
worker_connections 1024;
}
# 웹, 프록시 관련 서버 설정
http {
# mime.types 파일을 읽어들인다.
include /etc/nginx/mime.types;
# MIME 타입 설정
default_type application/octet-stream;
# 엑세스 로그 형식 지정
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 엑세스 로그를 남길 파일 경로 지정
access_log /var/log/nginx/access.log main;
# sendfile api 를 사용할지 말지 결정
sendfile on;
#tcp_nopush on;
# 접속시 커넥션을 몇 초동안 유지할지에 대한 설정
keepalive_timeout 65;
# (추가) nginx 버전을 숨길 수 있다. (보통 아래를 사용해서 숨기는게 일반적)
server_tokens off
#gzip on;
# /etc/nginx/conf.d 디렉토리 아래 있는 .conf 파일을 모두 읽어 들임
include /etc/nginx/conf.d/*.conf;
}
2) nginx-gunicorn-django 연결 (1)
# sudo vi /etc/nginx/sites-available/<장고 프로젝트 이름>
# sudo vi /etc/nginx/sites-available/core
server {
listen 80;
server_name {ip};
location / {
include proxy_params;
proxy_pass http://{ip}:8080;
}
}
3) nginx-gunicorn-django 연결 (2)
$ sudo ln -s /etc/nginx/sites-available/<장고 프로젝트 이름> /etc/nginx/sites-enabled
$ sudo ln -s /etc/nginx/sites-available/core /etc/nginx/sites-enabled
4) 문법검사 후 재실행하기
$ sudo nginx -t # 문법검사
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl restart nginx # 재실행
5. admin 페이지
1. 정적파일들을 모아주기
# manage.py 파일이 있는 경로에서
$ python manage.py collectstatic
2. nginx에 static파일 경로 알려주기
$ sudo vi /etc/nginx/sites-enabled/core
server {
listen 80;
server_name <ip>;
location / {
include proxy_params;
proxy_pass http://<ip>:8080;
}
location /static/ {
alias /home/ubuntu/test_site/core/static_root/;
}
}
3. django 내부 파일을 수정했을 경우 ... 꼭 Gunicorn 재시작하기 ....Nginx도 ...
# gunicorn
sudo systemctl daemon-reload
sudo service gunicorn restart
# nginx
sudo systemctl restart nginx
# Gunicorn 상태확인
systemctl status gunicorn.service
6. 도메인 연결
참고 블로그 :
https://hello-gg.tistory.com/45
$ sudo vi /etc/nginx/sites-available/core
server {
listen 80;
server_name print-blue.shop;
location / {
include proxy_params;
proxy_pass http://43.206.254.97:8080;
}
location /static/ {
alias /home/ubuntu/test_site/core/static_root/;
}
}
해결 방법 . . . .
static_root -> static 으로 변경
모든 파일 다시 수정
$ sudo vi /etc/nginx/sites-available/core
server {
listen 80;
server_name print-blue.shop;
location / {
include proxy_params;
proxy_pass http://print-blue.shop:8080;
}
location /static/ {
alias /home/ubuntu/test_site/core/static/;
}
}
$ sudo vi settings.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ROOT_DIR = os.path.dirname(BASE_DIR)
STATIC_URL = '/static/'
STATIC_DIR = os.path.join(BASE_DIR, 'static')
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
7. SSL 인증 받기
참고 :
# certbot을 설치
$ sudo apt install certbot
# Let's Encrypt의 인증서를 발급
$ sudo certbot certonly --nginx
/etc/letsencrypt/live/print-blue.shop/fullchain.pem
/etc/letsencrypt/live/print-blue.shop/privkey.pem
있는지 확인하려고 하는데 "Permission denied" 가 뜰 때 !
$ sudo chmod -R a+rwx <foldername>
$ sudo vi /etc/nginx/sites-available/core
server {
listen 80;
server_name print-blue.shop;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 443 ssl;
server_name print-blue.shop;
ssl_certificate /etc/letsencrypt/live/print-blue.shop/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/print-blue.shop/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
alias /home/ubuntu/test_site/core/static/;
}
location / {
include proxy_params;
proxy_pass http://print-blue.shop:8080;
}
}
# Nginx 설정을 바꾼후엔 다음과 같이 Nginx를 재시작
$ sudo systemctl restart nginx.service
'Others > 인프라' 카테고리의 다른 글
개발자의 기본 인프라란? (0) | 2023.12.19 |
---|