Ubuntu로 Django 파일 업로드 Gunicorn 서비스 소켓 생성


우선 전부다 때려 올릴 예정입니다.

가능한 방법은 Git을 쓰는 방법이 있고, FTP등을 이용하여 파일 전송을 하는 방법이 있습니다.


Git을 사용하실 수 없으신분들은(보안상의 이유 등으로) AWS의 Elastic Beanstalk 등을 사용하시게 될텐데, 그마저도 클라우드 호스팅 서비스를 쓰지 못하는 상황이면  FTP를 사용하시게 됩니다. Git이나 AWS EB 등을 사용하는 방법은 나중에 올리도록 하고 이번엔 FTP를 사용하는 방법을 간단히 설명해 보겠습니다.




1. VSFTPD 설치

$> sudo apt update
$> sudo apt install vsftpd


우선 vsftpd를 위와 같이 설치 해줍니다.
그리고 아래와 같이 설정파일을 복사해줍니다. (혹시 모르니까요.)

$> sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig




2. 방화벽 열기 


AWS를 사용하신다면, 이 파트를 건너 뛰세요. AWS는 시큐리티 그룹이라는 내부 시스템으로 컨트롤 합니다.

그리고 포트를 열어줄겁니다. 20번과 21번 포트는 FTP, 990번 포트는 TLS 로 접속할때 필요하고 40000-50000번 포트는 패시브 모드로 접속할때 사용하게 됩니다. 우리는 패시브 모드를 사용할 것이라 40000-50000 포트를 열어줘야 합니다.

$> sudo ufw allow 20/tcp
$> sudo ufw allow 21/tcp
$> sudo ufw allow 990/tcp
$> sudo ufw allow 40000:50000/tcp
$> sudo ufw status

sudo ufw status 를 입력하였는데 만약 Status: inactive 가 나온다면 아래와 같이 입력합니다. 22번 포트는 SSH연결 포트 이기때문에 먼저 열어 줘야 합니다.

$> sudo ufw allow 22/tcp
$> sudo ufw enable

 만약 AWS를 사용하신다면 ufw를 사용하지 마시고, AWS에서 지원하는 보안그룹을 사용하시면 됩니다.



3. VSFTPD 설정하기

우선 conf 파일을 열어줍니다.

$> sudo nano /etc/vsftpd.conf

# /etc/vsftpd.conf

. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . . . . .
write_enable=YES
. . . . . .
chroot_local_user=YES
. . . . . .
user_sub_token=$USER
local_root=/home/$USER
. . . . . .
pasv_min_port=40000
pasv_max_port=50000
. . . . . .
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
. . .


좀 길지만 /etc/vsftpd.conf를 열여서 이미 값이 설정되어 있다면 위와 같이 바꿔주고 설정되어 있지 않다면 주석을 풀어 주거나 파일 제일 뒤에 작성해줍니다. 주석을 풀어주려면 앞에 '#' 를 지워주면 됩니다.

그리고 저는 1편에서 mydjango 이라는 유저를 만들었기 때문에 아래와 같이  mydjango 유저를 vsftpd userlist에 추가해줍니다.


$>  echo "mydjango" | sudo tee -a /etc/vsftpd.userlist
$> cat /etc/vsftpd.userlist
#Output
mydjango


$> sudo systemctl restart vsftpd


자 이제 다되었습니다. 연결 프로토콜은 SFTP - SSH File Transfer Protocol 을 사용하시면 되고 패시브모드(수동 모드)를 선택하시는걸 잊지 말아주세요! 시간이 되면 FTP를 TLS로 연결하여 보안을 강화하는 방법을 포스팅 하겠습니다. 

그리고 다음에 이 vsftpd를 통해 장고에 필요한 파일들을 업로드 하시면됩니다.





자 웹사이트 설정하기 1편과 방금 설치한 vsftpd를 이용해서 개발할때 사용했던 venv 폴더와 디버그 모드일때 스태틱 파일을 서빙했던 static폴더를 제외하고 전부 서버에 업로드해 줍니다. 저는 FTP를 사용할 일이 있을때 FileZilla를 사용하는데 ALFTP나 뭐 다 상관없습니다.



4. 우선 전부 다 때려 올리고 테스트

아래 venv를 활성화(1,2편에 설명) 해준 후, 로컬 호스트에서 사용하던 모든 파이썬, Django 디펜던시를 설치해 주고 아래와 같이 settings.py를 변경해주고 서버를 시작해보세요.(로컬 개발시와 같이) 


# settings.py
DEBUG = True
ALLOWED_HOSTS = ['*']


python3 manage.py runserver 0.0.0.0:80



그리고 본인의 서버 ip 주소에 인터넷 브라우저로 들어가면 아래와 같이 나올겁니다!





5. AWS S3로 Static 파일 서빙하기

짞짞!
되었습니다. Static 서빙을 해줄수가 없어서 CSS, JS, 이미지 파일을 불러올 수 가 없어서 이렇게 나온겁니다.
자 이제 AWS S3에 버켓과 static 폴더를 만들고 모든 스태틱 파일을 업로드 해줍니다. (이것도 자세한건 추후에 포스팅 하겠습니다.)

우선 boto3 디펜던시를 설치해 줍시다. 이 작업은 업로드 하시기 전에 로컬에서 하시는게 편합니다!


$> pip3 install boto3

#settings.py
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_STORAGE_BUCKET_NAME = '당신의 버켓 이름'
AWS_S3_CUSTOM_DOMAIN = AWS_STORAGE_BUCKET_NAME+'.s3.ap-northeast-2.amazonaws.com'
STATIC_URL = 'https://'+ AWS_S3_CUSTOM_DOMAIN + '/static/'


저 위에 커스텀도메인은 버켓 리젼이 서울일때 입니다. 다른 지역이면 알맞게 수정하셔야 합니다. 이제 S3에 업로드한 스태틱 파일을 장고가 불러올 것 입니다. 403 Forbidden 에러가 나면 S3안에 파일 권한을 퍼블릭으로 바꿔주세요.




6. Gunicorn 서비스파일과 소켓 만들기


자 잘 나오나요? 어플리케이션 서버를 시작하고 멈추고 리로드 하는 가장 강력한 방법중 하나인 DJANGO(GUNICORN) <-> NGINX 연결 방법을 알아볼겁니다. 실제 프로덕션 레벨까지 도달하면 python3 manage.py runserver로 대중에게 서비스 하지 않습니다. NGINX가 GUNICORN을 통해 서비스 해줍니다. 먼저 Gunicorn 소켓파일을 만들어 보겠습니다. sudo 권한으로 하셔야해요!


sudo nano /etc/systemd/system/gunicorn.socket

# /etc/systemd/system/gunicorn.socket
[Unit]
Description=gunicorn socket [Socket]
ListenStream=/run/gunicorn.sock [Install]
WantedBy=sockets.target


저장 후 나옵니다. 다시 sudo 권한을 이요해서 서비스 파일을 만들어줍니다. 이 서비스 파일 이름은 소켓파일이름과 같아야 합니다.



#/etc/systemd/system/gunicorn.service
[Unit] 
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target [Service]
User=mydjango
Group=www-data
WorkingDirectory=/home/mydjango/myprojectdir
ExecStart=/home/mydjango/myprojectdir/venv/bin/gunicorn \
--access-logfile - \
--workers 3 \ --bind unix:/run/gunicorn.sock \ myproject.wsgi:application

위 처럼 작성 후 저장해주세요. 물론 User와 WorkingDirectory 등 바꿔야 할 내용을 본인 프로젝트에 맞게 수정하시는 것 잊지 마시구요. 그리고 나서 아래처럼 소켓을 활성화 해봅니다. 이제 부팅 후 자동으로 시작합니다.


sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket



7. Gunicorn 서비스파일과 소켓 만들기


gunicorn 소켓 상태를 아래 커맨드로 확인해 보실수 있습니다.

$> sudo systemctl status gunicorn.socket

 

그리고, gunicorn.sock 파일이 정상적으로 있는지 확인해보세요.

$> file /run/gunicorn.sock

#output
/run/gunicorn.sock: socket

 

나중에 계속 쓰실 명령어중 하나인 journalctl 을 ~/.bashrc 에 alias로 등록해 두면 편합니다. 한번 커맨드를 입력해 보세요.

sudo journalctl -u gunicorn.socket




8. 소켓 활성화 체크


$> sudo systemctl status gunicorn

#output

● gunicorn.service - gunicorn daemon
   Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-12-12 04:17:08 UTC; 1h 5min ago
 Main PID: 31800 (gunicorn)
    Tasks: 4 (limit: 1110)

curl --unix-socket /run/gunicorn.sock localhost


위 curl 커맨드를 입력하면 localhost로 접속했을때 나오는 HTML이 출력될거에요. 그리고 다시 아래 명령어를 쳐서 curl 결과가 200이 나왔는지 확인해보세요. 오류나 났다면, settings.py 를 유심히 보시기 바랍니다. 로컬에서 하다가 달라질 수 있거든요. 특히 윈도우에서 작업하다가 리눅스로 오면 파일 path를 입력하는데에서 많이들 오류를 범합니다.

$> sudo journalctl -u gunicorn.socket

 

포스팅이 길어져 NGINX를 통해 Gunicorn으로 프록시 패스를 설정하는 법을 다루겠습니다.

  • [[a.original_name]] ([[a.file_size | fileSizer]])
'Django 배포하기' 시리즈 포스트
Ubuntu 에서 Django 가상환경으로 배포하기
2020-10-11
Ubuntu에서 Django 서빙을 위한 NGINX 프록시 설정
2020-10-11
Ubuntu로 Django 파일 업로드 Gunicorn 서비스 소켓 생성
2020-10-11
좋아요[[ postLike | likePlus ]]
공유
라이언

“Lead Python Engineer”

댓글 [[totalCommentCount]]
[[ comment.author__nick_name ]] [[ comment.datetime_updated | formatDate]] (수정됨)

[블라인드 처리된 글 입니다.]

답장
[[ sub.author__nick_name ]] [[ sub.datetime_created | formatDate ]] (수정됨)

취소
댓글을 남겨주세요.
'Django' 관련 최신 포스트
[[ post.title ]]
[[ post.datetime_published_from | DateOnly ]]