こんにちは。ryoです。
今回は、Nginx(エンジンエックス)からPythonのWebフレームワークであるDjangoを動かす方法を解説します。
DjangoでWebアプリケーションを作って公開をする際には欠かせない知識になります。
この記事では、
・Nginx
・Nginxで運用する際に必要となるuWSGI
について解説します。さらに、
・Nginxが動くDjango環境
についての解説を通して、実際にDjangoアプリケーションを公開してみましょう。
Nginxとは
今回使うNginxとは何かについて、知っておきましょう。
NginxとはWebサーバー向けのソフトウェアのことです。
WebサーバーでWebアプリケーションを公開するときに、DjangoのようなWebフレームワーク以外にも必要なアプリケーションがあります。
そのWebフレームワーク以外に必要な、ベースとなるアプリケーションこそがNginxやApacheになります。
DjangoのようなWebフレームワークでアプリケーションを公開するときには、Webサーバーソフトウェアが無ければ公開することが出来ません。
Apacheとの違いについて
似たようなWebサーバーソフトウェアにApacheがあります。
Webサーバーソフトウェアの主流はApacheでしたが、現在は半数近いWebサーバーがNginxで動いています。
Apacheは同時接続数が極端に多くなると対応をすることができなくなったり、レスポンスがとても遅くなってしまいます。
この問題を解決したのがNginxです。
他にも設計思想やメモリの使用量、Nginxのほうがシンプルな構成になっていることなどの違いはあります。
NginxはApacheよりも同時接続に強いことを覚えておきましょう。
DjangoとApacheの連携は、こちらの記事をご覧ください。
【Django入門】apacheを使ってサーバーを動かそう
更新日 : 2020年3月9日
WSGI、uWSGIとは
PythonにはDjango以外にも色々なWebフレームワークがあります。
PythonのWebフレームワークについてはこちらの記事をご覧ください。
【2020年版】Pythonのフレームワークとは?人気の4種を徹底比較!
更新日 : 2020年7月15日
選択肢が多いということはとても嬉しいことではありますがその反面、選ぶWebフレームワークによって機能や使えるWebサーバーアプリケーションが制限されることがありました。
これを解決したのがWSGI(ウィズギー)と呼ばれるインターフェイスです。
WSGIはWeb Server Gateway Interfaceの略で、Gateway Interfaceの名前から機能のイメージがしやすいかと思います。
そして今回使うuWSGIは、NginxとDjangoをつなぐ役割をします。
Djangoではmod_wsgiを使ったように、WebサーバーアプリケーションによってWSGIの種類も変わります。
Nginxが動くDjango環境を作る
ここからは実際にNginxが動くDjnago環境を作っていきます。
ここから動作させるコードやコマンドはすべてMacで実行したものになります。
WindowsやLinuxで動かす場合は、コマンドを置き換えて見てください。
また、Pythonの環境は、
・Python 3.6.0
・Django 1.11.2
となっています。
Djangoの下準備
まずはDjangoの環境を整えましょう。
Djangoはプロジェクトを作成して、その中にWebアプリケーションを作成するのが基本の流れになっています。
まずは、プロジェクトを作りたいディレクトリに移動して、このコマンドを実行しましょう。
django-admin startproject mySite
これでmySiteというディレクトリが出来上がります。
次にmySiteディレクトリに移動して、このコマンドを実行しましょう。
python manage.py startapp myapp
これでmySiteプロジェクトの中に、myappというWebアプリケーションが出来上がりました。
現在のディレクトリ構成はこのようになっています。
├── manage.py
├── mySite
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ └── settings.cpython-36.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── myapp
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
4 directories, 14 files
これでDjnagoの環境は出来上がりました。
Nginxの導入
次にNginxをインストールしましょう。
MacではHomebrewを使ってインストールします。
brew install nginx
インストールが終わったことを確認して、このコマンドを実行しましょう。
nginx
これで、サーバーが起動します。
http://localhost:8080 にアクセスしてみましょう。
このような表示がされていれば、Nginxの起動は完了しました。
![スクリーンショット 2017-08-05 15.00.02]()
Nginxは、このコマンドを実行することで終了することが出来ます。
nginx -s stop
これでNginxの導入は完了です。
uWSGIの導入
次に、uWSGIをインストールします。
uWSGIはNginxとDjangoをつなぐ糊のようなものでしたね。
Pythonのパッケージマネージャであるpipを使ってインストールしましょう。
pip install uwsgi
これで、インストールは完了です。
NginxでWebページを表示する
ここからは実際にページを表示してみましょう。
まずは、Djangoに作ったWebアプリケーションを知らせるために、mySite/settings.pyにmyappを追加しましょう。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
次に、myapp/views.pyをこのように編集しましょう。
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello, Nginx.")
リクエストに対して、「Hello, Nginx.」という文字列を返します。
次にmyapp/urls.pyをこのように編集します。
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.hello, name='hello'),
]
Webアプリケーション配下にあるurls.pyは自動で生成されないので、自分で作って編集しましょう。
次にmySite/urls.pyをこのように編集します。
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^myapp/', include('myapp.urls')),
]
これで「/myapp」にアクセスした時に、先程の「Hello, Nginx.」を返すようにURLを設定出来ました。
Django付属のrunserverコマンドで確認をしましょう。
http://localhost:8000/myapp/ にアクセスして、このように表示されればDjangoの準備は出来ました。
![スクリーンショット 2017-08-05 15.54.04]()
次にuWSGIサーバーを使って起動してみましょう。
このコマンドを実行してみましょう。
uwsgi --http :8000 --module mySite.wsgi
8000番のポートを利用して、mySiteディレクトリにあるwsgi.pyを使って起動しています。
http://localhost:8000/myapp/ にアクセスしてみましょう。
Djangoのrunserverコマンドを利用したときと同じように表示されれば、uWSGIを使った起動は完了です。
次にNginxを設定していきます。
uwsgi_paramsというファイルをプロジェクトの直下に作成して、このように編集します。
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
次にNginxの設定ファイルを編集していきます。
プロジェクトの直下にmySite_nginx.confというファイルを作り、このように編集します。
upstream django {
server 127.0.0.1:8001;
}
# configuration of the server
server {
listen 8000;
server_name 127.0.0.1;
charset utf-8;
location /static {
alias /Users/username/anaconda3/mySite/static;
}
location / {
uwsgi_pass django;
include /Users/username/anaconda3/mySite/uwsgi_params;
}
}
そしてこのコマンドを実行します。
sudo ln -s ~/mySite/mySite_nginx.conf /usr/local/etc/nginx/sites-enabled/
これでシンボリックリンクと呼ばれるものが/usr/local/etc/nginx/sites-enabled/に貼られました。
シンボリックリンクとはショートカットのようなもので、リンクのパスがリンク元のファイルと同じように使うことができる機能を持っています。
次にstaticディレクトリを作ります。
mySite/settingsの末尾にこの文を追記します。
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
そしてこのコマンドを実行しましょう。
python manage.py collectstatic
これでプロジェクトの直下にstaticというディレクトリが作られます。
このページを編集する時はこのstaticというディレクトリの中を編集していきます。
ここまでのディレクトリはこのようになっています。
mySite
├── db.sqlite3
├── manage.py
├── mySite
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ ├── settings.cpython-36.pyc
│ │ ├── urls.cpython-36.pyc
│ │ └── wsgi.cpython-36.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── mySite_nginx.conf
├── myapp
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ ├── admin.cpython-36.pyc
│ │ ├── models.cpython-36.pyc
│ │ ├── urls.cpython-36.pyc
│ │ └── views.cpython-36.pyc
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── __pycache__
│ │ └── __init__.cpython-36.pyc
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── static
│ └── (作成したページ)
└── uwsgi_params
これで全ての準備が整いました。
このコマンドを実行しましょう。
uwsgi --socket :8001 --module mySite.wsgi
これで http://localhost:8001/myapp/ にアクセスして「Hello, Nginx.」と表示されればNginxを使ってサーバーが起動できました。
お疲れ様でした。
まとめ
DjangoでNginxを使う方法を解説しました。
Apacheよりもとても簡潔な記述で動かすことが出来て、初心者がサーバー起動の流れを掴むにはとても良いサンプルになったと思います。
環境によってファイルのパスを変える必要があるので注意してください。