๐๋ค์ด๊ฐ๋ฉฐโฆ
AWS EC2 ubuntu 22.04 ํ๊ฒฝ์์ Nginx & Gunicorn์ ์ฌ์ฉํ์ฌ Django๋ฅผ ๋ฐฐํฌํ๊ณ ์ ํ๋ค.
์ธํ
git์ ์ฌ์ฉํ์ฌ ubuntu์ ํ๋ก์ ํธ ํด๋ก ํ๊ธฐ
AWS EC2 & RDS๋ฅผ ์ค์ ์ด ๋์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค.
git์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ํ๊ฒฝ์์ ๊ฐ๋ฐํ์๋ ํ๋ก์ ํธ๋ฅผ ํด๋ก ํ์ฌ EC2 ํ๊ฒฝ์ ๊ฐ์ ธ์จ๋ค.
/srv/ ํด๋์ ํด๋ก ์ ํ๊ธฐ ์ ์, ํด๋น ํด๋๋ root ์ฌ์ฉ์์ ์์ ์ด๊ธฐ์ ํ์ฌ ์ฌ์ฉ์์ ๋ํ ๊ถํ์ ๋ถ์ฌํด์ผ ํ๋ค.
sudo chown -R $(whoami):$(whoami) /srv/๋ช ๋ น์ด๋ฅผ ์ํํ์ฌ ๊ถํ์ ๋ณ๊ฒฝํ๋ค.git clone [repo]๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ณต์ ํ๋ค.
pyenv์ pipenv๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ํ๊ฒฝ ๊ตฌ์ถ
python ๋ฒ์ ผ ๊ด๋ฆฌ์ ๊ฐ์ํ๊ฒฝ ๊ตฌ์ถ์ ์ํด ํ์๋ ๋ณดํต pyenv & pipenv๋ฅผ ์ฌ์ฉํ๋ค.
ubuntu ํ๊ฒฝ์ ์ค์น๋ฅผ ์งํํ๋ค.
pyenv์ค์น๋ฅผ ์ํด ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ๋ค.1 2 3 4 5
sudo apt-get update sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev \ libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \ xz-utils tk-dev libffi-dev liblzma-dev python3-openssl git
curl https://pyenv.run | bash๋ช ๋ น์ด๋ฅผ ์ํํ์ฌpyenv๋ฅผ ์ค์นํ๋ค.pyenvํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํ๋ค.1 2 3
export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init --path)"pip eval "$(pyenv virtualenv-init -)"
- ๋ณ๊ฒฝ์ฌํญ ์ ์ฉ์ ์ํด ์์ ์ฌ์์ํ๊ฑฐ๋,
source ~/.bashrc๋ช ๋ น์ด๋ฅผ ์ํํ๋ค. - ํ๋ก์ ํธ์ ๋ง๋ ํ์ด์ฌ ๋ฒ์ ผ ์ค์น ๋ฐ ๊ด๋ฆฌ(ํ์ฌ ec2์์ ํ๋์ ํ๋ก์ ํธ๋ง ์ํํ๋ฏ๋ก, global๋ก ์ค์ ํจ)
1 2
pyenv install 3.11.2 pyenv global 3.11.2
pip install pipenvpipenv ํจํค์ง ์ค์น- ํ๋ก์ ํธ์
pipenv.lock๋๋ ํ ๋ฆฌ๋ก ์ด๋ ํpipenv install & pipenv shell์ํ
Gunicorn & Nginx ์ธํ
Gunicorn
sudo vi /etc/systemd/system/gunicorn.service์์ฑ ๋ฐ ํธ์ง
gunicorn.sockํ์ผ์ ์๋์ผ๋ก ์์ฑ๋๋ค. /run/ ํด๋๋ก ์ง์ ํ๋ฉด ๊ถํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋ค.
๊ฐ์ํ๊ฒฝ ์์น๋pipenv --venv๋ช ๋ น์ด๋ก ์ฐพ์ ์ ์๋ค.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
[Unit] Description=Deployment Server After=network.target [Service] User=ubuntu Group=www-data WorkingDirectory=[manange.py์ ๋๋ ํ ๋ฆฌ] ExecStart=[๊ฐ์ํ๊ฒฝ ์์น]/bin/gunicorn \ --access-logfile - \ --workers 1 \ --bind unix:/tmp/gunicorn.sock \ server.wsgi:application [Install] WantedBy=multi-user.targetsudo systemctl start gunicorn.service & sudo systemctl enable gunicorn.service๋ช ๋ น์ด ์คํsudo systemctl status gunicorn.service์ํ ํ์ธ -> active ์ํ๊ฐ ์ ์์ด๋ค.
Nginx
sudo apt install nginx python3-pip python3-dev libpq-devํจํค์ง ์ค์นsudo vi /etc/nginx/sites-available/serverํ์ผ ์์ฑ ๋ฐ ํธ์ง- static ํ์ผ ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง,
alias๊ฐ ์๋root๋ก ์ค์ ํ ๊ฒฝ์ฐ ์น์๋ฒ๊ฐstaticfiles/static์ด๋ฐ ์์ผ๋ก ์ ์ ํ์ผ์ ์ฐพ๋๋ค. - ํ์๋ ssl ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ https ํต์ ์ ํ๊ธฐ ๋๋ฌธ์ if๋ฌธ์ด ์ถ๊ฐ๋์๋ค. SSL ์ธ์ฆ ๋ฐฉ๋ฒ์ ๋ค์ ํฌ์คํธ์์ ์ค๋ช
ํ ๊ฒ์ด๋ค.
1 2 3
if ($http_x_forwarded_proto = 'http'){ return 301 https://$host$request_uri; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
server { listen 80; server_name [IP or Domain]; location /static/ { alias [ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ]/staticfiles/; } location / { include proxy_params; proxy_pass http://unix:/tmp/gunicorn.sock; } if ($http_x_forwarded_proto = 'http'){ return 301 https://$host$request_uri; } }- static ํ์ผ ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง,
sudo ln -sf /etc/nginx/sites-available/server /etc/nginx/sites-enabled๋ณต์ฌsudo nginx -t-> Nginx ๊ตฌ์ฑ ๊ฒ์ฌsudo systemctl restart nginx-> Nginx ์ฌ์์sudo ufw allow 'Nginx Full'
Error log ํ์ธ ๋ฐฉ๋ฒ
- Gunicorn
sudo systemctl status gunicorn.servicegunicorn ์ํ ํ์ธsudo journalctl -u gunicorn.service -n 100 --no-pager์ต๊ทผ 100๊ฐ์ ๋ก๊ทธ ํ์ธsudo systemctl daemon-reload & sudo systemctl restart gunicorn.service์ฌ์์ ๋ช ๋ น์ด
- Nginx
cat /var/log/nginx/error.lognginx ๋ช ๋ น์ด ํ์ธ
๋์์ด ๋๋ ์ธํ
- ์๊ฐ ์ค์
sudo timedatectl set-timezone Asia/Seoul
- ์ฌ์ฉ์ ํ์ธ
whoami
- ํด๋ ๊ถํ ์ค์
/srv/ํด๋์ ๊ถํ ์ค์ ํ ๋,sudo chown ubuntu:ubuntu /srv/
- (ํ๋ก์ ํธ์ ํ๊ฒฝ์ ๋๋ ๊ฒฝ์ฐ)
production.py์ ์ฉ์ ์ํด,export DJANGO_SETTINGS_MODULE=server.config.settings.production=> ํฐ๋ฏธ๋ ์ธ์ ์ด ์ข ๋ฃ๋๋ฉด ๋ค์ํด์ค์ผ ํด์ ๊ท์ฐฎ๋ค~/.bashrc๋๋~/.bash_profile์์ : Bash ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ํด๋น ํ์ผ์ export DJANGO_SETTINGS_MODULE=server.config.settings.production ๋ผ์ธ์ ์ถ๊ฐํ์
๋ง์น๋ฉฐ
๋ด์ฉ์ ์กฐ๊ธ ๋ ๊ฒํ ํ๊ณ ์์ ํด์ผ ํ๋ค. ์๋ง๋ ๋ฐ๋ผํด๋ณด๋ฉด ์ก๋คํ ์๋ฌ๋ค์ด ๋ฐ์ํ ๊ฒ์ด๋ค. ๋๊ธ์ ๋จ๊ฒจ์ฃผ๊ฑฐ๋, ๊ตฌ๊ธ๋ง์ ํตํด ํด๊ฒฐํ๋๋ก ํ์!