どうも。
フランツプロジェクトの永田です。
最近、技術ブログを更新していませんでした。訳は2つ。
・この後、本記事にてお伝えする内容に相当ハマッて時間がかかった事。
・当初、このWebサービスを2/28(月)にリリース予定でしたが、経済的事情により、受託を始めなければならなくなったので、数社のエージェント会社を通じて案件を探している事。
なので、いま開発中のWebサービス、いつ、どのような形でリリースしていくかは別記事にしたいと思います。
さて、本記事では下記の内容でお伝えしたいと思います。
ご覧になられた方が参考になりますように。
目次
前提として
下記記事でお伝えしているとおり、OracleLinux8.5とOracle Database XEがインストールされている事。
そして、下記記事のように、開発環境(私の場合はPycharm)にてサンプルプログラムを動かせる状態になっている事が前提となります。
参考サイト
テスト環境構成
- 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(^^♪