【Django入門】Nginxを使ってWebサーバーを動かそう

こんにちは。ryoです。

今回は、Nginx(エンジンエックス)からPythonのWebフレームワークであるDjangoを動かす方法を解説します。

DjangoでWebアプリケーションを作って公開をする際には欠かせない知識になります。

この記事では、

・Nginx
・Nginxで運用する際に必要となるuWSGI

について解説します。さらに、

・Nginxが動くDjango環境

についての解説を通して、実際にDjangoアプリケーションを公開してみましょう。

また、次の記事ではPythonを使ったWebアプリの開発手順を、開発例やPythonを活用するメリットも交えて紹介しているので良ければ参考にしてください。

PythonでWebアプリ開発!手順からサービス例、メリットも紹介

目次

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を使ってサーバーを動かそう
更新日:2024年3月1日

WSGI、uWSGIとは

PythonにはDjango以外にも色々なWebフレームワークがあります。

PythonのWebフレームワークについてはこちらの記事をご覧ください。

Pythonのフレームワークとは?人気の5種を徹底比較
更新日:2024年3月8日

選択肢が多いということはとても嬉しいことではありますがその反面、選ぶ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'^

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を使う際の注意点

環境によってファイルのパスを変える必要があるので注意してください。

, views.hello, name='hello'), ]

Webアプリケーション配下にあるurls.pyは自動で生成されないので、自分で作って編集しましょう。

次にmySite/urls.pyをこのように編集します。

 

これで「/myapp」にアクセスした時に、先程の「Hello, Nginx.」を返すようにURLを設定出来ました。

Django付属のrunserverコマンドで確認をしましょう。

http://localhost:8000/myapp/ にアクセスして、このように表示されればDjangoの準備は出来ました。

スクリーンショット 2017-08-05 15.54.04

次にuWSGIサーバーを使って起動してみましょう。

このコマンドを実行してみましょう。

 

8000番のポートを利用して、mySiteディレクトリにあるwsgi.pyを使って起動しています。

http://localhost:8000/myapp/ にアクセスしてみましょう。

Djangoのrunserverコマンドを利用したときと同じように表示されれば、uWSGIを使った起動は完了です。

次にNginxを設定していきます。

uwsgi_paramsというファイルをプロジェクトの直下に作成して、このように編集します。

 

次にNginxの設定ファイルを編集していきます。

プロジェクトの直下にmySite_nginx.confというファイルを作り、このように編集します。

 

そしてこのコマンドを実行します。

 

これでシンボリックリンクと呼ばれるものが/usr/local/etc/nginx/sites-enabled/に貼られました。

シンボリックリンクとはショートカットのようなもので、リンクのパスがリンク元のファイルと同じように使うことができる機能を持っています。

次にstaticディレクトリを作ります。

mySite/settingsの末尾にこの文を追記します。

 

そしてこのコマンドを実行しましょう。

 

これでプロジェクトの直下にstaticというディレクトリが作られます。

このページを編集する時はこのstaticというディレクトリの中を編集していきます。

ここまでのディレクトリはこのようになっています。

 

これで全ての準備が整いました。

このコマンドを実行しましょう。

 

これで http://localhost:8001/myapp/ にアクセスして「Hello, Nginx.」と表示されればNginxを使ってサーバーが起動できました。

お疲れ様でした。

まとめ

DjangoでNginxを使う方法を解説しました。

Apacheよりもとても簡潔な記述で動かすことが出来て、初心者がサーバー起動の流れを掴むにはとても良いサンプルになったと思います。

環境によってファイルのパスを変える必要があるので注意してください。

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次