【Python】VMWare16ProにOracleLinux搭載のテスト環境にDjangoのサンプルアプリケーションをデプロイしてみた。

どうも。
フランツプロジェクトの永田です。

最近、技術ブログを更新していませんでした。訳は2つ。
・この後、本記事にてお伝えする内容に相当ハマッて時間がかかった事。
・当初、このWebサービスを2/28(月)にリリース予定でしたが、経済的事情により、受託を始めなければならなくなったので、数社のエージェント会社を通じて案件を探している事。

なので、いま開発中のWebサービス、いつ、どのような形でリリースしていくかは別記事にしたいと思います。

さて、本記事では下記の内容でお伝えしたいと思います。
ご覧になられた方が参考になりますように。

前提として

下記記事でお伝えしているとおり、OracleLinux8.5とOracle Database XEがインストールされている事。

本記事では、ステージング環境であるWindows10Homeに仮想環境構築ソフトVMWareを導入。ゲストOSにOracle Linux8.5、DBはOracle Database Express Edition(XE)を導入。別PCのクライアントソフトにて疎通確認を行った。

そして、下記記事のように、開発環境(私の場合はPycharm)にてサンプルプログラムを動かせる状態になっている事が前提となります。

Python開発環境マシンであるMacProにPycharm,Anaconda,Django、そしてOracleIInstantClientをインストールしてDB環境と疎通確認しつつ、今回参考させて頂いたサイト通りに開発環境にてWebアプリが動くさまを記事にした。

参考サイト

はじめての Django アプリ作成、その 1

[Django]Anacondaで本番環境を構築する

テスト環境構成

  • VMWare16Pro
  • OracleLinux8.5
  • Oracle Database XE
  • OracleInstantClient_19_13
  • Python 3.9.7
  • anaconda3-2021.11
  • Django 3.5.2
  • Apache 2.4.37
  • mod_wsgi 4.9.0
  • pyenv 
  • Git 2.27.0

Gitのインストール

コンパイルに必要なパッケージを入手。

sudo yum install -y wget gcc

依存関係のあるパッケージをインストール

sudo yum install -y curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel

OracleLinuxにインストール

sudo yum install git-all

pyenvのインストール

git clone  https://github.com/pyenv/pyenv.git ~/.pyenv

環境変数の設定

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

Anacondaのインストール

pyenv install anaconda3-2021.11
pyenv rehash
pyenv global  anaconda3-2021.11

環境変数の設定

echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2021.11/bin/:$PATH"' >> ~/.bashrc
source ~/.bashrc

condaのアップデード

conda update conda

Pythonの環境構築

仮想環境の作成 ※環境名は「 Franz_Sample_VM2 」にしています。

conda create -n Franz_Sample_VM2 python=3.9.7

仮想環境のアクティベート

conda activate Franz_Sample_VM2

仮想環境のリストを見る。

conda-env list

様々なcondaコマンド(ご紹介)

デフォルトの仮想環境Baseを指定しない(する)コマンド

conda config --set auto_activate_base False (True)

仮想環境の削除

conda remove -n (環境名) --all

Djangoのインストール 

私の場合は開発環境と合わせて同じバージョンにしています。

conda install -c conda-forge django=3.2.5

CX_ORACLEのインストール

オラクル社が自ら作成しているDBアクセスの為のモジュール。

conda install cx_Oracle

インストールされているか確認

conda list

Oracle Instant Clientのインストール

このアプリの導入で数日間ハマり続けました。エラー内容は下記に記します。そして、対処した内容をお伝えしますが、どの対処が正しかったのか、正直不明ではあります。色々と設定をいじったりしましたので、全てが意味のある作業だとは思いませんが、現在稼働出来ているという事でご容赦下さい。

特に対応④の内容は盲点でした。

[アクション]
この記事に記載している作業内容を全て完了後、ブラウザから下記のURLでアクセスした時。
<URL>
Http://XXX.XXX.XXX.X/polls/
[エラー内容]
apacheのエラーログ。およびにてブラウザにて出力していました。

cx_Oracle.DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library: “libclntsh.so: cannot open shared object file: No such file or directory”. See https://cx-oracle.readthedocs.io/en/latest/user_guide/installation.html for help

[対応①]
Oracle Instant Client19_13をOracle社のサイトからダウンロードし、下記の場所に配置した。
<Path>
/opt直下

[対応②]
/etc/profileに下記の内容でパス設定をした。
※こちらのプロファイルに設定すると、全ユーザログイン時に設定内容が反映されるとの事。

ORACLE_SID=XE
ORACLE_BASE=/opt/oracle

LD_LIBRARY_PATH=/opt/instantclient_19_13

export ORACLE_SID ORACLE_BASE LD_LIBRARY_PATH
export NLS_LANG=Japanese_Japan.AL32UTF8
export PYTHONPATH=/home/(hoge)/.pyenv/versions/anaconda3-2021.11/bin:/home/(hoge)/.pyenv/versions/anaconda3-2021.11/lib/python3.9/site-packages

export PATH=/opt/oracle/product/18c/dbhomeXE/bin:/opt/instantclient_19_13:${PATH
}

#ORACLE_HOME=/opt/oracle/product/18c/dbhomeXE

※特に(hoge)の部分はご自身の環境に合わせて設定下さい。

Oracle Instant Clientのパスを指定する為に必要な環境変数「 LD_LIBRARY_PATH 」はここで設定しています。

ORACLE_HOME」はインスタントクライアントを導入した場合、設定しないようにとのコメントが散見されたので、ここではコメントアウトしています。
なお、root以外の所定の作業ユーザの.bash_profileに sqlplusを使用したい為、「ORACLE_HOME」を設定しています。

[対応③]
Oracle Instant Clientの所有者とグループを変更した。

chown -hR oracle:oinstall instantclient_19_13

[対応④]
Oracle Instant Client のパスの記載内容をld.so.conf.d配下に配置した。

sudo sh -c "echo /opt/instantclient_19_13 > /etc/ld.so.conf.d/oracle-instantclient.conf"

mod_wsgiのインストール

apache関連パッケージを先にインストール

apacheの関連パッケージを先にインストールします。そうしないと、mod_wsgiのインストール時にエラーになります。

dnf install httpd-devel -y

mod_wsgiのインストール

pip install mod_wsgi

apacheユーザがDjangoプロジェクトにアクセスできるようにする。

chmod 755 -R /home/(hoge)

Apacheの設定

下記のディレクトリ直下にwsgi.confを新規作成する。設定内容は下記。参考にして頂ければ。

[ディレクトリ]
/etc/httpd/conf.d

# wsgi.conf
LoadModule wsgi_module "/home/(hoge)/.pyenv/versions/anaconda3-2021.11/envs/Franz_Sample_VM2/lib/python3.9/site-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"

#WSGIPythonHome /home/(hoge)/versions/anaconda3-2021.11
WSGIScriptAlias / /home/(hoge)/(hoge)/(hoge)/mysite/mysite/wsgi.py
WSGIPythonPath /home/(hoge)/(hoge)/(hoge)/mysite:/home/(hoge)/.pyenv/versions/anaconda3-2021.11/envs/Franz_Sample_VM2/lib/python3.9/site-packages

<Directory /home/(hoge)/(hoge)/(hoge)/mysite>
  <Files wsgi.py>
    Require all granted
  </Files>
</Directory>


Alias /static/ /home/(hoge)/(hoge)/(hoge)/mysite/static/
<Directory /home/(hoge)/(hoge)/(hoge)/mysite/static>
  Require all granted
</Directory>

※(hoge)はご自身の環境に合わせた形で設定下さい。

なお、環境変数「 WSGIPythonHome 」は設定すると何故かLinuxコマンド実行時にエラー(エラー内容は失念しました)になる為、コメントアウト。

apacheの再起動

systemctl stop  httpd
systemctl start httpd
systemctl enable httpd
systemctl status httpd

最後にapacheが正常に起動しているか確認する。

apacheが起動出来ない時

SELinuxのログを参照しながら対処する。
<ログ出力先>
/var/log/messagea

私のケースでは以下のコマンドで事象が解消された。
ログを見る限りだと、どうやらmod_wgsiインストール時に生成されるファイル「mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so」にアクセス出来ないという事象であった。
参考までに。

ausearch -c 'httpd' --raw | audit2allow -M my-httpd
semodule -i my-httpd.pp

Djangoプロジェクト(サンプルアプリケーション)のデプロイ

手順①
プロジェクトごとFTPなどでwsgi.confで指定したディレクトリ配下にアップする。
※私の場合は、PyCharmのデプロイ機能を使って行っています。

手順②
サンプルプログラムを動かす為のDBマイグレーション

python manage.py migrate 

手順③
サンプルプログラムを動かす為の静的ファイル(JS.CSSなど)の収集

python manage.py collectstatic 

手順③
サンプルプログラムの管理ユーザ作成

python manage.py createsuperuser

動作確認

http://(domainname or IPAddress)/adminでログイン画面が表示されれればオーケーです。あとの動作確認については下記の参考サイトを参考の事。

さいごに

Pythonでの環境構築にかなり時間を割いてしまいました。今回はハマった箇所を重点にお伝えしたつもりですが、設定上で細かいエラーが頻発してかなりのストレスを感じました。実際に作業のキリが悪くて徹夜対応した日もありました。

しかし、お陰様でPythonで開発環境、テスト環境、本番環境(実は構築済み)の経験が出来てかなり勉強になりました。機会があれば現場で活躍出来る様にさらに精進したいと思います。



See You(^^♪

シェアお願いします♬

フォローお願いします♬