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

雑。

コメントを残す