こんにちは。
OpenCVを使ったDjangoAPIを作成して、独自ドメインで公開という事をしたくなりました。思い立ってから1週間、呪われた1週間でした。色々試してようやくやりたい事が実現出来た「今」残しておかないと、忘れるっ。すぐ忘れるっ。
プランA: XServer → 失敗(OpenCVの処理で OutOfMemoryError)
プランB: GCP + NginX + Uwsgi → 失敗(サブディレクトリで404解消できず…マジで?なんで?)
プランC: GCP + Apache + mod-wsgi → やっと成功!
プランAの「OutOfMemoryError」は仕方ない。。レンタルサーバーやもん。メモリ使いすぎちゃったよね。私が悪かった。。でもプランBの
NginX + Uwsgiよ!初めて使いました。今キテるらしいので使ってみたかったんだよ~。というか、どこかのブログでNginXはエンジンエックス、Uwsgiはウィスキーと読むことについて、するどく突っ込んでたブログがあって、めっちゃ笑いました。ほんと読めないよ(笑)ドメイントップはいけるんですけどね、サブディレクトリを認識してくれないんですよ。こんな事あるんですかね。。結構そういう質問を英語サイトで見て、みんな同じ悩み抱えてるんだなぁって思ったけど、解決できんかったよー。
というわけで、プランCの設定方法を忘れないように残しておきます。
前提
・GCPでプロジェクト作成済み
・Ubuntu18.04(GCP)にOpenCV他インストール済み
この記事が下書きで止まってたっ。殆ど以下と同じ。違うのはOpenCVはソースからコンパイルしたくらい。
Python3.6
OpenCV3.4.4
がインストールされています。
・独自ドメイン取得済み
・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/wsgiServerName cvapi.XXXXX.com ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined Require all granted
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
コメント