Djangoをエックスサーバー で動かしたときのメモの巻

Djangoをエックスサーバー で動かしたときのメモの巻

はじめに

Djangoで作ったwebアプリがローカルマシン(Mac)で動いたことを確認したあと、エックスサーバー上で公開したのですが、その時にいくつか「これ覚えとかなきゃ」ってことがあったのでメモに残しておきます。

まず今回、Djangoで作ったwebアプリをエックスサーバー 上で動かした全体的な流れは以下です。

1. ローカルでDjangoで作ったwebアプリが動くことを確認する

2. エックスサーバー にssh接続する

3. エックスサーバー でPython仮想環境を構築する

4. 見られたらダメなシークレットキーなどを環境変数化して別途管理する(django-environを使用)

5. Djangoをエックスサーバーの仮想環境でインストールする

6. ローカルのDjangoのプロジェクトをディレクトリごとエックスサーバーにまるっとアップロードする

7. cgiファイルと.htaccessファイルの作成と設置をする

8. マイグレーションとcollectstaticを実行して、出来たstaticディレクトリを移動する

9. エックスサーバー 上で動くことを確認する

そのうちの1、2、3は既に済ましていて、本記事でも主要なことではないのでスルーします。

1〜3についての情報が必要な方は別途検索してみてください。

本記事では次に記載の関連記事の方法で2と3の下準備をしていますので、

 関連記事1:エックスサーバーにMinicondaでPython仮想環境を作るの巻

 関連記事2:エックスサーバーのPython仮想環境でDashでHelloの巻

をご参照いただければと良いのかなと思います。

というわけで、本記事はエックスサーバー上でCGIで動かすDjangoについての記載です。

それでは、4以降についての備忘録を以下に記載していくことにします。

(なんか勘違いしているところや漏れているところがあるかも知れないので、発覚したら修正するつもりです。)

Djangoで作ったwebアプリをエックスサーバー 上で動かしたときのメモ

4. 見られたらダメなシークレットキーなどを環境変数化して別途管理する(django-environを使用)

ええと、Djangoのsettings.pyの、

DEBUG=Trueである状態と、

SECRET_KEY
ALLOWED_HOSTS
DATABASE_URL

の変数の中身がsettings.pyにそのまま記載されている状態で公開しちゃうとセキュリティ上まずいということなので、なんとかする必要があります。

なので

django-environを使わせていただいて管理することにしました。

settings.pyの該当箇所を環境変数に書き換えて、

.envファイルを作成して環境変数の中身を記載して、.envファイルをmanage.pyと同じ階層に設置して、大事なこやつらを隠すことにしました。

この時settings.pyに以下も追加しておきます。

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL ='/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

settings.pyと.envの具体的な記載方法はdjango-environのREADMEを参照、またはウェブで検索してみてください。

作成した.envファイルのパーミッションは600にして所有者しか見たり触ったりすることができないようにしました。

django-environは

pip install django-environ

でインストールします(anacondaには無いみたい)。

そしたら変更後もローカルマシンでアプリがちゃんと動くことを確認しておく、と。

5. Djangoをエックスサーバーの仮想環境でインストールする

これはエックスサーバー の仮想環境下で 

conda install django

でインストールでOKっと。

django-environも必要なので

pip install django-environ

でインストールします(anacondaには無いみたいなのでpipでインストール)。

6. ローカルのDjangoのプロジェクトをディレクトリごとエックスサーバーにまるっとアップロードする

では、ローカルで作成したDjangoのプロジェクトをディレクトリごとまるっとエックスサーバー 上にコピーして持って行こう。。。と思ったら、エックスサーバー の「ファイル管理」のところの「ファイルマネージャ」ではディレクトリごとアップロードできないのね。。。(やり方知らないだけかも)

なのでFTPクライアントであるFileZillaを新たにMacに入れてからまるっとアップロードしました。楽ちんだ。

この時、「public_html」ディレクトリの下に「django」というディレクトリを作って、その中にローカルで作成したDjangoプロジェクトのディレクトリをコピーして入れ込む形にしました。

なのでディレクトリ構成を眺めると次の通りです。

ドメインのディレクトリ 
 |-- public_html
        |-- django (djangoのプロジェクト群を入れる用に作ったディレクトリ)
             |-- プロジェクトのコンテナディレクトリ(まるっとコピーしてきたやつ)
                   |-- プロジェクトパッケージのディレクトリ
                   |     |-- settings.py, urls.pyとか
                   |-- アプリケーションのディレクトリ
                   |     |-- views.py, form.py, /static, /templateとか
                   |-- manage.pyとか

*.envはmanage.pyと同じディレクトリに入れてます。

7. cgiファイルと.htaccessファイルの作成と設置をする

cgiファイル(index.cgiとしました)を作成。

(cgitbが必要なければ該当部分の記載は必要ありません。)

#!/home/...仮想環境で使用するpythonへのパス.../python     
# coding: utf-8
import sys, os
import cgitb  #cgitbでトレースバックを生成する

cgitb.enable(display=0, logdir='.') #cgitbでトレースバックをカレントディレクトリにファイルとして生成する

sys.path.insert(0, '/home/....仮想環境で使用するbinへのパス..../bin')

os.environ['DJANGO_SETTINGS_MODULE'] = 'プロジェクト名.settings'    #settingsの読み込み先を記載

from wsgiref.handlers import CGIHandler
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application() 
CGIHandler().run(application)

.htaccessファイルを作成。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /django/[プロジェクトのコンテナディレクトリ]/index.cgi/$1 [QSA,L]

さて、index.cgiと.htaccessファイルを作ったのはいいのですが、「ん?置き場所どこなん?」ってしばらく迷子になりましたが、これらはmanage.pyと同じディレクトリに入れれば良いのでした。

ドメインのディレクトリ 
 |-- public_html
        |-- django (djangoのプロジェクト群を入れる用に作ったディレクトリ)
             |-- プロジェクトのコンテナディレクトリ(まるっとコピーしてきたやつ)
                   |-- プロジェクトパッケージのディレクトリ
                   |     |-- settings.py, urls.pyとか
                   |-- アプリケーションのディレクトリ
                   |     |-- views.py, form.py, /static, /templateとか
                   |-- manage.py
                   |-- .htaccess
                   |-- index.cgi

*.envはmanage.pyと同じディレクトリに入れてます。

パーミッションは.htaccessは744、index.cgiは755にしています。

その他のファイルやディレクトリのパーミッションも適切なものになってるかを確認しておいたほうが良いと思います。

8. マイグレーションとcollectstaticを実行して、出来たstaticディレクトリを移動する

manage.pyがあるディレクトリで

python manage.py makemigrations アプリ名

python manage.py migrate

にてマイグレーションします。

で、collectstaticをやって読み込み専用のstaticファイル(?)が入ったディレクトリを作ります。

python manage.py collectstatic

これでできたstaticディレクトリ(たぶんmediaディレクトリもですが、今回のアプリでは使用してないのでわからんです)を何故かpublic_htmlディレクトリの階層に移動します(エックスサーバー 特有?)。

ドメインのディレクトリ 
 |-- public_html
        |-- django (djangoのプロジェクト群を入れる用に作ったディレクトリ)
        |     |-- プロジェクトのコンテナディレクトリ(まるっとコピーしてきたやつ)
        |          |-- プロジェクトパッケージのディレクトリ
        |          |     |-- settings.py, urls.pyとか
        |          |-- アプリケーションのディレクトリ
        |          |     |-- views.py, form.py, /static, /templateとか
        |          |-- manage.py
        |          |-- .htaccess
        |          |-- index.cgi
        |-- static

*.envはmanage.pyと同じディレクトリに入れてます。

9. エックスサーバー 上で動くことを確認する

あれ?アクセスするURLどれなん?となりましたが。。。

今回の場合は

https://[ドメイン名]/django/[プロジェクトのコンテナディレクトリ]/

です。(www.が必要な場合はつけてくださいね)。

その他

サブドメインで動かす時は.envファイルのALLOWED_HOSTSをサブドメインが含まれるようにする。

メインドメインからサブドメインに移そうとしたときにこれを忘れててあたふたしてしまった。。。

あ。。。作ったのはこの記事に載っけているやつです。

スマホで見るGoogleカレンダーを曜日別に色分けしたりイベントタイトルを折り返したりするの巻


おしまい

実施環境(Minicondaによるエックスサーバー上の仮想環境)

 Django 3.2.5

 django-environ 0.7.0

 Python 3.8.8



https://business.xserver.ne.jp/

https://www.xdomain.ne.jp/

★LOLIPOP★

.tokyo

MuuMuu Domain!