自分の分身を作りたい

理系の大学院生だよ

AWSのサーバーにDjangoのwebアプリ環境を構築(Nginx, gunicorn)

ぜひフォローしてください

EC2に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のインストール

[参考]

EC2サーバにPython3環境構築 - Qiita

$ 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を起動させているポートを参照させてあげる。
  • 環境は汚さないようにしよう

雑。