naritoブログ

【お知らせ】
新ブログができました。今後そちらで更新し、このサイトは更新されません(ウェブサイト自体は残しておきます)
このブログの内容に関してコメントしたい場合は、新ブログのフリースペースに書き込んでください

このブログの内容を新ブログに移行中です。このブログで見つからない記事は、新ブログにありま

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

約547日前 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の初期ページ<br>

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

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

単純に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 X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme
}

}



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 約235日前 2018年2月22日11:31 返信する
aws+nginx+gunicornという環境でdjangoアプリを公開したのですが、DEBUGがTrueのときは投稿画像が表示され、Falseのときは表示されません。
管理者様のようにstaticの設定をしたいのですが、STATIC_ROOT = '/var/www/static'やpython manage.py collectstaticはnginxやgunicornが既に稼働している状態でもできますか?
なりと 約235日前 2018年2月22日13:58
nginxやgunicornが既に稼働している状態でも、問題なく動作します。
collectstaticは各アプリケーション内のstaticディレクトリ内の内容を、STATIC_ROOTにコピーするだけのコマンドです。nginxのconfファイルでlocation /static ...と記述しているならば、特にnginx等の再起動も必要ありません。
初心者a 約235日前 2018年2月22日16:16 返信する
ありがとうございます。助かります。
初心者a 約235日前 2018年2月22日18:09 返信する
再び失礼します。
STATIC_ROOT = '/var/www/static'としたらPermissionError: [Errno 13] Permission denied:となってしまいました。
解決策はあるでしょうか? ちなみにubuntuを使ってます。
なりと 約235日前 2018年2月22日19:23
chmod 777 /var/www/static
とすると、動きますか。
初心者a 約235日前 2018年2月22日20:05 返信する
chmodが実行できません。予め/var/www/にstaticファイルの作成が必要ですか?
なりと 約235日前 2018年2月22日20:33
そうです、mkdir /var/www/static としてディレクトリを作成しておいてください。
初心者a 約235日前 2018年2月22日21:22 返信する
できました。ありがとうございます。
とても親切で助かりました。
名無し 約83日前 2018年7月24日12:44 返信する
素人の質問で大変恐れ入ります。
2点ほど質問させてください。


さくらVPS(CentOS7)+nginx+djangoのサイトを、Let's EncryptでSSLしたいと考えております。
そこで、なりと様の記事を拝見させていただいたのですが、

https://torina.top/detail/358/
のページの
/etc/nginx/conf.d/ssl.conf


今ページの
/etc/nginx/conf.d/testdjango.conf
にかなり重複した記述がみられますが、
これらは両方必要(重複していて問題ない)と考えてよろしいのでしょうか?




staticファイル(おそらくmediaファイルも)をcollectstaticで/var/www/staticに集めていますが、
今後js,cssファイルを追加する場合には、最初から/var/www/staticにアップロードすればよろしいのでしょうか(画像の場合は/var/www/media)?また、編集する際にも/var/www/staticのファイルのみ編集すればよろしいのでしょうか?
※ようするに、ローカル上で用意していたstaticフォルダやmediaフォルダの中身は無視してOK、むしろ削除しちゃってもOK、という認識で合っていますでしょうか?
なりと 約83日前 2018年7月24日13:53

片方だけで大丈夫です。わかりにくかったですね。
ssl.confは単純にhtmlだけを配信するような例の設定で、
今回のtestdjango.confはDjangoの配信の例です。
Djangoを利用するのであれば、testdjango.confだけご利用ください。


staticファイルの場合は、まずDjangoプロジェクト内のstaticディレクトリに格納し、それをcollectstaticで/var/www/static 等に集め直す、という方法が確実です。ですので、cssやjsを追加したり編集するたびにcollectstaticを行うことになります。
Djangoプロジェクトが単体(manage.py runserver)でも問題なく動作するようにしておくと、Djangoプロジェクトをバージョン管理したり他のサーバーに移動するのも楽になります。

mediaファイルですが、画像というよりはアップロードファイルという趣が強いです。
ホームページのアイコンやヘッダーの画像などを管理する際は、それはstaticファイルとして考えたほうが簡単です。
ユーザーがそれぞれ好きにアップロードするようなものは、mediaファイルです。
mediaファイルはmodels.ImageFieldやmodels.FileFieldとして定義したもので、このブログのコメント欄にある「ファイルを選択」ボタンのようなものになります。ファイルを指定して送信すると、後はDjango側で自動的にアップロードまで行ってくれます。そのため、/var/www/media 等のmediaファイル置き場に直接ファイルを置く機会は少ないです。

mediaファイルの置き場所を/var/www/media から別の場所に移動したいなーというときは、staticファイルとは違って手作業でコピーし直す必要があります(例えばLinuxのcpコマンド等)。staticファイルの場合は、STATIC_ROOTを変更してcollectstaticをするだけで済みます。
名無し 約83日前 2018年7月24日19:18
早急のご連絡誠にありがとうございます。

①②ともに理解できました。素人の質問にもかかわらず、丁寧なご回答をありがとうございます。
引き続き何卒よろしくお願い申し上げます。