GCP + Apache + mod-wsgi + Django 独自ドメインで公開

こんにちは。

OpenCVを使ったDjangoAPIを作成して、独自ドメインで公開という事をしたくなりました。思い立ってから1週間、呪われた1週間でした。色々試してようやくやりたい事が実現出来た「今」残しておかないと、忘れるっ。すぐ忘れるっ。

プランA
XServer

失敗(OpenCVの処理で OutOfMemoryError)
プランB
GCP + NginX + Uwsgi

失敗(サブディレクトリで404解消できず…マジで?なんで?)
プランC
GCP + Apache + mod-wsgi

やっと成功!
mami
プランA,プランBも結構時間かけて構築したんですけど~。したんですけど~。涙。

プランAの「OutOfMemoryError」は仕方ない。。レンタルサーバーやもん。メモリ使いすぎちゃったよね。私が悪かった。。でもプランBの
NginX + Uwsgiよ!初めて使いました。今キテるらしいので使ってみたかったんだよ~。というか、どこかのブログでNginXはエンジンエックス、Uwsgiはウィスキーと読むことについて、するどく突っ込んでたブログがあって、めっちゃ笑いました。ほんと読めないよ(笑)ドメイントップはいけるんですけどね、サブディレクトリを認識してくれないんですよ。こんな事あるんですかね。。結構そういう質問を英語サイトで見て、みんな同じ悩み抱えてるんだなぁって思ったけど、解決できんかったよー。

というわけで、プランCの設定方法を忘れないように残しておきます。

前提

・GCPでプロジェクト作成済み

Ubuntu18.04LTS(GCP)にWindowsリモートデスクトップ接続

2020.04.23

・Ubuntu18.04(GCP)にOpenCV他インストール済み
この記事が下書きで止まってたっ。殆ど以下と同じ。違うのはOpenCVはソースからコンパイルしたくらい。
Python3.6
OpenCV3.4.4
がインストールされています。

RaspberryPiにOpenCVをインストール

2020.05.01

・独自ドメイン取得済み

・GCPで独自ドメイン設定済み
これも今度記事書こう。。

①Apacheインストール

Apache + mod-wsgiをインストールしていきます。簡単です。

sudo apt install apache2 libapache2-mod-wsgi-py3

Apache2.4.29がインストールされました。

②仮想環境にDjangoインストール

仮想環境をvirtualenvで作成しています。ここにDjangoを入れていきます。

workon cvapi(←仮想環境名)
pip install django requests

django3.0.6がインストールされました。requestsはWebAPIとのインターフェースを簡単にしてくれるパッケージなので、インストールしましたが、とりあえずAPIはいいよ、っていう人はインストール不要です。※この記事ではAPIの内容については触れていません。

③Djangoプロジェクト作成

cd XXX(好きな場所)
django-admin startproject django_cvapi(好きなプロジェクト名)

以下のような構成で出来上がりました。

|--- django_cvapi
|    |--- django_cvapi
|        |--- __init__.py
|        |--- settings.py
|        |--- urls.py
|        |--- wsgi.py
|    |--- manage.py

④いきなり公開(Djangoプロジェクト側設定)

Djangoプロジェクトはプログラム何もせずに、いきなり公開したいと思います。この前にlocalhostでもしたけど、割愛します。
ドキュメントルート(/var/www/html)を公開用として、Djangoプロジェクトのシンボリックリンクを貼ります。勿論ドキュメントルート(/var/www/html)に直接、Djangoプロジェクトを置いても構いません。

Djangoプロジェクトの「wsgi.py」を以下のようにします。

import os
import sys

from django.core.wsgi import get_wsgi_application

path = '/var/www/html/django_cvapi'
if path not in sys.path:
    sys.path.append(path)

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_cvapi.settings')

application = get_wsgi_application()

次に「settings.py」を以下にします。

(変更前)
ALLOWED_HOSTS = []
(変更後)
ALLOWED_HOSTS = ['*']

本当はドメイン名を入れた方がいいですが、とりあえずこれで。
同じく「settings.py」に以下選択行の箇所を追加します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_cvapi',
]

⑤いきなり公開(Apache側設定)

今度はApacheの設定をします。

設定ファイルの置き場所に移動します。000-default.confというファイルがあるので、それをコピーして使います。

cd /etc/apache2/sites-available
sudo cp 000-default.conf django.conf

django.confを編集します。お好きなエディタで。私はVimでご紹介します。

sudo vim django.conf

挿入モードにします。「a」を入力してください。

以下にします。

LoadModule wsgi_module modules/mod_wsgi.so

WSGIPythonPath /home/mami/.virtualenvs/cvapi/lib/python3.6/site-packages
WSGIScriptAlias / /var/www/html/django_cvapi/django_cvapi/wsgi.py
WSGISocketPrefix /var/run/wsgi


    ServerName cvapi.XXXXX.com

    
        
            Require all granted
        
    

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined


Escキーで挿入モードを抜けて、「:wq」で保存してファイルを閉じます。

⑤いきなり公開(設定読込み)

さぁあと少しです。うまくいくでしょうか。ドキドキですね。
Apache設定ファイルを一度無効にしてから、設定したいものを有効にしてApache再起動します。

cd /etc/apache2/sites-available
sudo a2dissite *
sudo a2ensite django.conf
systemctl reload apache2

ブラウザを立ち上げでURLを入力します。つながりましたでしょうか。

おまけ エラーやんけ…

そんな人向けに(笑)いや、自分用に。

Apacheの状態を確認しましょう。

systemctl status apache2.service

Apache設定ファイルに不備がないか確認しましょう。

cd /etc/apache2
sudo apache2ctl configtest

エラーログを確認しましょう。

sudo less /var/log/apache2/error.log

Djangoのwsgi.pyはパーミッション755に設定しましょう。

sudo chmod 755 wsgi.py

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)