AB型技術系 主に備忘録

ほぼプログラム関連の備忘録

DSM上でPython + MariaDBを使ってWebアプリを稼働させるためにやったこと

5年ほど使用しているDS216jのDSMを7.1に更新したことをきっかけにDSM上でWebアプリを稼働させようと思って試したことの記録です。
必要なパッケージをパッケージセンターで検索してインストールしました。
pythonのライブラリについてはSSHサービスを有効にしてTera Termで接続してインストールしました。

DS216jのDSMを7.1に更新

DSM バージョン

まずDSMを7.1に更新しました。

Web Stationをインストール

Web Station インストール
Web Station インストール完了

Webサーバーの機能を追加したいのでWeb Stationをインストールしました。

MariaDBをインストール

MariaDB インストール

MariaDBをインストール。

パスワードとポートを入力

パスワードとポートを入力。
ポートはデフォルトで3306です。

インストール完了

インストール完了後にMariaDBの設定画面を開く。

MariaDBの設定画面を開く
MariaDBの設定画面

TCP/IP接続を有効にする」を選択して適用ボタンをクリック。
これでTCP/IP接続でDSM上のMariaDBに接続できるようになりました。
MariaDBMySQLの派生として開発されているのでMySQL感覚で使えるかと。

phpMyAdminをインストール

phpMyAdminをインストール
インストール完了

ブラウザ上でMariaDBを管理するためphpMyAdminをインストールしました。

ユーザーアカウントを作成

phpMyAdminを開く

phpMyAdminを開いて

phpMyAdminのログインページ

ユーザー名に「root」を入力、パスワードにMariaDBインストール時に設定したパスワードを入力、サーバーの選択は「MariaDB 10」を選択して「実行」をクリック。

データベースを作成

phpMyAdmin TOP画面

「ユーザーアカウント」をクリック。

ユーザーアカウント画面

「ユーザーアカウントを追加する」をクリック。

ユーザーアカウントを追加画面

ユーザー名とパスワードを入力、認証プラグインは「ネイティブMySQL認証」を選択、
グローバル特権を全てチェックして「実行」をクリック。

ユーザーアカウント作成完了

新しいユーザーが追加されました。
「データベース」をクリック。

テーブルを作成

データベース画面 TOP

データベース名を入力して「作成ボタン」をクリック。
作成したデータベースを選択。

データベース設定画面

テーブル名を入力して「実行」をクリック。

カラム追加画面

追加するカラムの情報を入力して「保存する」をクリック。

テーブル構造画面

テーブルが作成できました。

DBeaverから接続できるか確認

DBeaver 接続設定

SQLクライアントはDBeaverを使用することにしました。

接続結果

DBeaverでMariaDBに接続することができました。

Python実行環境の設定

Web StationでPythonの実行環境を設定できるようなので設定方法を調べてみました。

スクリプト言語の設定

スクリプト言語の設定

Web Station→スクリプト言語の設定→Pythonで設定画面を開いてみました。
Python3をインストールする必要があるみたいですね。

パッケージセンターを確認

パッケージセンターでpythonを検索

パッケージセンターでPythonのインストール状況を調べてみるとPython2がインストールされていることが確認できました。
Python3はインストールできないのか?

SSHサービスを有効化

SSHサービスを有効化

DSMにTera Termを使って接続するためSSHサービスを有効化しました。

Pyhonのバージョンを調べる

Tera Termで接続

Tera Termで接続してPythonのバージョンを調べてみました。
※ 接続時のユーザーはDSM上で追加

testuser@DS216J:~$ python --version					
Python 3.8.12					
testuser@DS216J:~$					

Python2系がインストールされていると思ったらPython 3.8がインストールされていました。
ということはPythonのパスを調べてApacheをインストールすればPythonCGIとして動作させることができるのでは?
という仮説を立てる。

Apacheをインストール

バックエンドパッケージ

Web Stationのあ管理ページで関連するパッケージのインストール状況を確認。
Apacheは2.2と2.4がインストールできます。

Apache2.4をインストール

Apache2.4をインストールします。

Apache2.4がインストールされたことを確認

Apache2.4をインストールしました。

webサービスポータルを追加

webサービスポータルを追加

Web Station→webサービスポータル→で設定画面を開いて作成ボタンをクリック。

ポータルタイプを選択

「仮想ホスト」をクリック。

仮想ホストのセットアップ

ポータルタイプは「名前ベース」を選択、ホスト名を入力、80/443をチェックして「次へ」ボタンをクリック。

仮想ホストのセットアップ

ドキュメントルートを入力、HTTPバックエンドサーバーはApache2.4を選択。
他はデフォルトのままで「次へ」ボタンをクリック。

タイムアウトを設定

変更せず「次へ」ボタンをクリック。

設定の確認

設定を確認して「作成」ボタンをクリック。

ユーザー定義のポータル

ユーザー定義のポータルが追加されました。

仮想ホストの稼働確認

web/rootに下記のindex.htmlを追加

<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>サンプルページ</title>
</head>
<body>
    <b>サンプルページ</b>
</body>
</html>					

http://test

仮想ホストの稼働確認

仮想ホストが稼働していることが確認できました。

Pythonのパスを確認

pythonコマンドが実行できるので実行されているpythonのパスを調べます。

installdir.py

import os
import sys
print(os.path.dirname(sys.executable))		

installdir.pyファイルを/volume1/webに置いてTera Termで接続して実行します。

testuser@DS216J:~$ cd /volume1/web
testuser@DS216J:/volume1/web$ python installdir.py
/bin
testuser@DS216J:/volume1/web$				

/binにあるpythonで実行されてることが分かりました。

pythoncgiとして動作させる

.htaccessとテスト用のpyファイルを準備します。

.htaccess

DirectoryIndex index.php index.html index.py
AddHandler cgi-script .py	

test.py

#!/bin/python
print('Content-Type: text/plain; charset=UTF-8\n')
print("Pythonで文字列出力")

.htaccessとtest.pyを/volume1/web/rootに置きます。

http://test/test.py

PythonCGIとして動作

PythonCGIとして動作させることができました。

PythonMariaDBにアクセスできるか確認

PythonMariaDBにアクセスするためにPyMySQLを使います。
pypi.org

pipをインストール

PyMySQLをインストールするためにpipをインストールします。

testuser@DS216J:~$ sudo curl -k https://bootstrap.pypa.io/get-pip.py | sudo python3
pipをインストール

インストールできましたが、警告が発生。
pipを使うにはrootユーザーでないとだめってことかな?

PyMySQLをインストール

pipコマンドを使ってPyMySQLをインストールします。

testuser@DS216J:~$ pip install PyMySQL
raceback (most recent call last):
  File "/bin/pip", line 5, in <module>
    from pip._internal.cli.main import main
ModuleNotFoundError: No module named 'pip._internal'

pipインストール時に表示された警告メッセージの通りrootユーザー以外では権限の問題で失敗するようです。

rootユーザーに変更してインストール

testuser@DS216J:~$ sudo -i
Password:パスワードを入力
root@DS216J:~#pip install PyMySQL
PyMySQLをインストール

PyMySQLがインストールできました。

PyMySQLを使ってMariaDBに接続(失敗)

testMyql.py

#!/bin/python

print('Content-Type: text/plain; charset=UTF-8\n')

conn = None
cursor = None
try:

    import pymysql
    import pymysql.cursors

    # コネクションの作成
    conn = pymysql.connect(host='DS216J',
                                    user='testuser',
                                    port=3306,
                                    password='xxxxxxxx',
                                    db='test_db',
                                    charset='utf8',
                                    cursorclass=pymysql.cursors.DictCursor)

    cursor = conn.cursor()

    # SQL実行
    cursor.execute("select * from test_table")

    row = cursor.fetchone()
    if row is not None:
        print(row["column1"])
        print("\n")
        print(row["column2"])
except Exception as e:
    print(e.args)
finally:
    print("完了")
    cursor.close()
    conn.close()

test_tableに登録したデータ

テストデータ

testMyql.pyを/volume1/web/rootに置きます。

http://test/testMySql.py

PyMySQLが動作しない

コネクションの作成時にエラーが発生しました。

インストールしたPyMySQLについて調べる

PyMySQLに問題がないか調べてみます。

root@DS216J:$ pip show PyMySQL
インストールしたPyMySQLの詳細

/usr/lib/python3.8/site-packagesにPyMySQLがインストールされているようです。

root@DS216J:~$ cd /usr/lib/python3.8/site-packages

/usr/lib/python3.8/site-packagesに移動して

root@DS216J:/usr/lib/python3.8/site-packages>$ ls

/usr/lib/python3.8/site-packagesにあるファイル一覧

PyMySQLが存在することが確認できました。
pymysqlディレクトリの中身を確認してみます。

root@DS216J:/usr/lib/python3.8/site-packages~$ cd ./pymysql

/usr/lib/python3.8/site-packages/pymysqlに移動して

root@DS216J:/usr/lib/python3.8/site-packages/pymysql$ ls
/usr/lib/python3.8/site-packages/pymysqlにあるファイル一覧

ファイルも存在するし問題なさそう。

rootユーザーで直接実行

権限周りが怪しそうなのでrootユーザーで直接実行してみました。

root@DS216J:~# python /volume1/web/root/testMySql.py
rootユーザーで実行

MariaDBに接続してデータが取得できました。

rootユーザー以外で実行

testuser@DS216J:~$ python /volume1/web/root/testMySql.py
rootユーザー以外で実行

ブラウザで確認した時と同じエラーが発生しました。
やはり権限の問題でした。

パッケージの実行権限を調べる

/usr/lib/python3.8/site-packagesにあるディレクトリの権限を調べてみます。

testuser@DS216J:~$ cd /usr/lib/python3.8/site-packages

/usr/lib/python3.8/site-packagesに移動して

testuser@DS216J:/usr/lib/python3.8/site-packages$ ls -l
権限を確認

所有者以外の権限がないです。

権限を設定

rootユーザーに変更してpymysqlディレクトリの権限を設定します。

root@DS216J:/usr/lib/python3.8/site-packages$ chmod -R 755 ./pymysql
root@DS216J:/usr/lib/python3.8/site-packages$ ls -l
設定した権限を確認

所有者以外に読取と実行権限が追加されました。

rootユーザー以外で実行

testuser@DS216J:~$ python /volume1/web/root/testMySql.py
rootユーザー以外で実行

rootユーザー以外でMariaDBに接続してデータが取得できました。

PyMySQLを使ってMariaDBに接続(成功)

http://test/testMySql.py

接続成功

ブラウザ上でも取得したデータを表示することができました。

スクリプト言語の設定でpythonが設定できない、
rootユーザー以外でPyMySQLが動かない、等いろいろはまりましたが何とかDSM上でPythonを使ってMariaDBからデータを取得することができました。