naritoブログ

このブログはPython/DjangoとBootstrap4で作成されました
Githubのソースコード

さくらVPS(CentOS7) Nginx+GunicornでDjangoを動かす

約406日前 2017年4月16日19:54
プログラミング関連
Django nginx Gunicorn Linux CentOS
Djangoアプリケーションを公開する場合、いくつかの方法があります。
今回はnginx+Gunicornで動かしたいと思います。

venvで仮想環境を作り、django-admin startproject でdjangoプロジェクトを作ります。
そして、djangoの管理画面にアクセスするところまでです。

Pythonのインストールは以下のページ等
さくらVPS(CentOS7) yumでPythonをインストール
https://torina.top/detail/359/

/homeに、まず仮想環境を作成し、有効かします。
cd /home
python3.6 -m venv testvenv
cd testvenv
source  bin/activate


djangoをpipします。
pip install django


djangoプロジェクトの作成
django-admin startproject testdjango
cd testdjango


はじめのmigrateと、管理ユーザの作成
python manage.py migrate
python manage.py createsuperuser



一旦、ここまで確認してみましょう。使わなそうなポートを空けて...
firewall-cmd --add-port=9999/tcp --permanent
firewall-cmd --reload


このままアクセスするとエラーになるので、ちょっと修正します。
vim testdjango/settings.py


以下のように書き換えておきましょう。
ついでに、タイムゾーンと言語も日本に。
# ここは、サーバーのIPアドレスを入れるほうが安心
ALLOWED_HOSTS = ['*']
...
...
# かなり下のほう
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'


0.0.0.0とすると、外部からアクセスできるようになります。
これで一旦アクセスし、管理画面などに入ってみましょう。
python manage.py runserver 0.0.0.0:9999



http://1.1.1.1:9999
のようにしてアクセスしましょう。IPアドレスは、サーバのIPアドレスです。
Djangoの初期ページ

/adminにもアクセスしましょう。
デフォルトの管理画面

適当にユーザーを追加したりしてもエラーが出なければ、概ね大丈夫でしょう。
ユーザーの追加

単純にrunserver で動かせればいいよ、という方ならここまででも大丈夫です。
これをnginx+Gunicornで動かせるようにしましょう。

まず、staticなファイルの準備です。
今は他の方法も出てきましたが、本番環境ではstaticやmediaは別の方法で配信することも多いです。今回はnginxで、aliasの設定をします。
vim testdjango/settings.py


以下のように追加します。
STATIC_ROOT = '/var/www/static'


ついでに、DEBUGもFalseにしときましょう。
DEBUG = False


以下のコマンドで、/var/www/staticに静的ファイルが集まります。
python manage.py collectstatic


Ctrl+C等で戻り、空けたポートを閉じておきましょう。
firewall-cmd --remove-port=9999/tcp --permanent
firewall-cmd --reload


Gunicornをインストールします。
pip install gunicorn


confファイルを作成します。
vim /etc/nginx/conf.d/testdjango.conf



Let’s EncryptでSSL化している例です。
さくらVPS(CentOS7) nginxの導入と、Let’s EncryptでSSL
https://torina.top/detail/358/
server {
    listen 80;
    listen [::]:80;
    server_name torina.club;
    return 301 https://$host$request_uri;
}

server {
    listen  443 ssl;
    server_name     torina.club;

    ssl_certificate         /etc/letsencrypt/live/torina.club/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/torina.club/privkey.pem;

    location /static {
        alias /var/www/static;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}



nginxの再起動です。
systemctl reload nginx



Djangoアプリの起動と終了の方法を楽にしましょう。
systemctl start gunicorn で起動するように設定します。
vim /etc/systemd/system/gunicorn.service



何となく内容はわかると思います。
[Unit]
Description=gunicorn
After=network.target

[Service]
WorkingDirectory=/home/testvenv/testdjango
ExecStart=/home/testvenv/bin/gunicorn --bind 127.0.0.1:8000 testdjango.wsgi:application

[Install]
WantedBy=multi-user.target



起動と、自動起動の設定をします。
systemctl start gunicorn
systemctl enable gunicorn



この後は、実際にブラウザでアクセスしてみましょう。


参考サイト
http://gunicorn.org/#deployment
https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04
http://docs.gunicorn.org/en/latest/index.html
初心者a 約95日前 2018年2月22日11:31 返信する
aws+nginx+gunicornという環境でdjangoアプリを公開したのですが、DEBUGがTrueのときは投稿画像が表示され、Falseのときは表示されません。
管理者様のようにstaticの設定をしたいのですが、STATIC_ROOT = '/var/www/static'やpython manage.py collectstaticはnginxやgunicornが既に稼働している状態でもできますか?
なりと 約95日前 2018年2月22日13:58
nginxやgunicornが既に稼働している状態でも、問題なく動作します。
collectstaticは各アプリケーション内のstaticディレクトリ内の内容を、STATIC_ROOTにコピーするだけのコマンドです。nginxのconfファイルでlocation /static ...と記述しているならば、特にnginx等の再起動も必要ありません。
初心者a 約94日前 2018年2月22日16:16 返信する
ありがとうございます。助かります。
初心者a 約94日前 2018年2月22日18:09 返信する
再び失礼します。
STATIC_ROOT = '/var/www/static'としたらPermissionError: [Errno 13] Permission denied:となってしまいました。
解決策はあるでしょうか? ちなみにubuntuを使ってます。
なりと 約94日前 2018年2月22日19:23
chmod 777 /var/www/static
とすると、動きますか。
初心者a 約94日前 2018年2月22日20:05 返信する
chmodが実行できません。予め/var/www/にstaticファイルの作成が必要ですか?
なりと 約94日前 2018年2月22日20:33
そうです、mkdir /var/www/static としてディレクトリを作成しておいてください。
初心者a 約94日前 2018年2月22日21:22 返信する
できました。ありがとうございます。
とても親切で助かりました。