AWSのサーバーにDjangoのwebアプリ環境を構築(Nginx, gunicorn)
ぜひフォローしてください
Follow @SoYaNoNikkeyEC2にDjangoの環境を構築してIPアドレスでアクセスできるようにするところまでのメモ
構成
- AWS EC2サーバー
- Python(3.6.8)
- pyenv(1.2.9)
- Django(2.1.5)
- gunicorn(19.9.0)
- nginx(1.14.1)
Nginx
Nginxはオープンソースのwebサーバーです。他にはapacheとかありますね。
クライアントとサーバー内のwebアプリを繋いでくれます。
NginxとApache HTTP Serverの違いメモ - Qiita
gunicorn
gunicornはWSGI(Web Server Gateway Interface)の一種です。 WSGIを簡単に説明すると、NginxはPython言語を直接やりとりできないので、Pythonによって書かれたフレームワーク(Flask, Djangoなど)とNginxの架け橋をしてあげている存在と言えます。
第1回 WSGIの概要:WSGIとPythonでスマートなWebアプリケーション開発を|gihyo.jp … 技術評論社
Nginxのインストール
$ ssh -i [root/to/key] ec2-user@[your-ip-address] #まずはssh接続 #以下EC2サーバーでの作業 [ec2-user@ip-***-***-**-* ~]$ sudo su - [root@ip-***-***-*-* ~]# yum install nginx
Python,pyenv,Djangoのインストール
[参考]
$ yum install git -y #pyenvをインストール $ git clone https://github.com/yyuu/pyenv.git ~/.pyenv $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile $ source ~/.bash_profile #依存環境をインストール $ sudo yum install gcc zlib-devel bzip2 bzip2-devel readline readline-devel sqlite sqlite-devel openssl openssl-devel -y #Pythonをインストール $ pyenv install 3.6.8 Downloading Python-3.6.8.tar.xz... -> https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz Installing Python-3.6.8... $ pyenv global 3.6.8 $ pyenv rehash $ python --version Python 3.6.8 #Djangoインストール $ pip install django
結局pyenvとpipenvどっちがいいんですか?教えてえらい人
gunicornでDjangoを走らせる
[参考]
Djangoの既存プロジェクトをec2にデプロイ - Qiita
$ django-admin startproject hoge #gunicornをインストール $ pip install gunicorn #wsgi.pyのあるディレクトリ上で実行 $ gunicorn hoge.wsgi --bind=0.0.0.0:8000
これでWSGIを経由してDjangoのアプリが実行されました。
Nginxを経由させる
僕がはまったのはここでした。
クライアントとWSGIの間にNginxをかませるためにnginx.confをいじります。
EC2サーバー上だと
/etc/nginx/nginx.conf
というパスになります。
#nginx.conf upstream app_server { server 127.0.0.1:8000 fail_timeout=0; } server { #listen 80 default_server; #listen [::]:80 default_server; #server_name localhost; #root /usr/share/nginx/html; listen 80; server_name yourIPaddress; client_max_body_size 4G; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; }
いじるのはこの辺りです。
upstream app_serverは新しく付け足しました。
server{}内のserver_name
はEC2のIPアドレス(あるいはドメイン)を入れます。
そしてlocation{}のproxy_pass
app_serverを参照していますね。
ここでずっとはまっていました。
僕はここでappserver{}にEC2のIPアドレスをずっと入れていたのです。
proxy_passというのはnginxがサーバー内で参照する場所(今回ではgunocornがDjangoを走らせているポート)を示してあげるのでここでは8000番ポートをさしてあげるのです。
最後にアプリを起動
$ gunicorn awstask.wsgi --bind=0.0.0.0:8000 -D
Dオプションでデーモン化(常に起動)させます。 8000番ポートにバインドしていますね。
さっきのproxy_passとここで繋がるのね
(やっとわかった顔)
ちなみにgunicornを止めるときは
gunicornとつく実行中プロセスを探す $ ps ax|grep gunicorn 2979 ? S 0:00 /root/.pyenv/versions/3.6.8/bin/python3.6 /root/.pyenv/versions/3.6.8/bin/gunicorn awstask.wsgi --bind=0.0.0.0:8000 -D 2982 ? S 0:00 /root/.pyenv/versions/3.6.8/bin/python3.6 /root/.pyenv/versions/3.6.8/bin/gunicorn awstask.wsgi --bind=0.0.0.0:8000 -D 2996 pts/5 S+ 0:00 grep --color=auto gunicorn #停止 $ kill 2979
[参考]
Django で gunicorn の起動と停止のメモ - 牌語備忘録 -pygo
まとめ
- nginxでいじるのはnginx.confファイル。
- proxy_passはgunicornがDjangoを起動させているポートを参照させてあげる。
- 環境は汚さないようにしよう
雑。