はじめに
普段サーバーではPHPを主に利用していますが、Pythonも一度試してみたいと思い環境を構築しました。
レンタルサーバーにPython仮想環境を構築
サーバーの準備
LOLIPOP!レンタルサーバー
このブログを書いているサーバーは「LOLIPOP!レンタルサーバー」でプランは「ライト」です。
Pythonが利用できるかLOLIPOP!のホームページで確認したところ、使えるようです。

まずはインストールされているPythonのバージョンを確認しようと思いSSHの設定をしようと思ったら・・・ライトプランではSSHは利用できないようです。

仮想環境の構築やライブラリのインストールにはSSH接続によるサーバーへのターミナルアクセスが必要となるのでLOLIPOP!は諦めることにします。
もう一つ趣味のハンドメイド作品を紹介しているサイトを置いているサーバーがあるので、こちらが使えるが調べてみます。
CORESERVER(コアサーバー)
レンタルサーバーはCORESERVERでプランはV1プランのCORE-MINI、これまた一番安いプランです。
調べた所、SSHもPythonも利用できるようです。

こちらのサーバーで作業していこうと思います。
サイトの準備
https://map.sugi-koubou.com というURLでサイトを立ち上げました。
とりあえず、index.html だけ置いてあります。
ssh接続の準備
Tera TermでSSH接続して操作していくので、SSH接続出来るように準備をします。
CORESERVERではコントロールパネルの[サイト設定]-[ツール/セキュリティー]のSSH接続IP許可にある「SSH接続IP許可」ボタンをクリックすることで今接続している回線からのSSH接続が可能になります。

Tera Term 無事繋がりました。
CORESERVERではサイトを作成すると「public_html」の下にサイト名のフォルダが出来ます。
今回「map.sugi-koubou.com」というサイトを作成したので「public_html/map.sugi-koubou.com」というフォルダが作業場所になります。
このフォルダに移動しておきます。
[~]$ cd public_html/map.sugi-koubou.com
[map.sugi-koubou.com]$ここで作業していきます。
仮想環境を構築
Pythonのバージョン確認
サーバーにインストールされているPythonのバージョンを確認してみます。
[map.sugi-koubou.com]$ python --version
Python 3.6.8Python 3.6.8が入っているようです。
仮想環境構築
venv を使用して myvenv というフォルダの中に構築します。
[map.sugi-koubou.com]$ python3 -m venv myvenv
Error: Command '['myvenv/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 2.
[map.sugi-koubou.com]$と、エラーが出ました。
どうやらCORESERVERのCORE-MINIプランにはディフォルトではpipがインストールされていないようです。
なのでpipなしで仮想環境を作成し、仮想環境に直接pipをインストールしようと思います。
まずは中途半端に作成されたフォルダを削除。
[map.sugi-koubou.com]$ rm -rf myvenv
[map.sugi-koubou.com]$「—-without-pip」オプションを付けて仮想環境のみ作成。
[map.sugi-koubou.com]$ python -m venv --without-pip myvenv
[map.sugi-koubou.com]$ ls
index.html myvenv
[map.sugi-koubou.com]$なにもメッセージが表示されなかったので、無事構築されたと思われます。
「ls」でファイル一覧を見ると、myvenvフォルダが作成されていました。
仮想環境にpipをインストールするので、仮想環境を有効化(アクティベート)します。
有効化すると、カーソルの前に仮想環境名(ここでは(myvenv))が付きます。
[map.sugi-koubou.com]$ . ./myvenv/bin/activate
(myvenv) [map.sugi-koubou.com]$「curl」コマンドを使ってpipをダウンロードします。
(myvenv) [map.sugi-koubou.com]$ curl https://bootstrap.pypa.io/pip/3.6/get-pip.py -o get-pip.py
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2108k 100 2108k 0 0 22.6M 0 --:--:-- --:--:-- --:--:-- 22.6M
(myvenv) [map.sugi-koubou.com]$ダウンロードしたファイルを実行して、pipをインストールします。
(myvenv) [map.sugi-koubou.com]$ python3 get-pip.py
Collecting pip<22.0
Downloading pip-21.3.1-py3-none-any.whl (1.7 MB)
・
・ (中略)
・
Collecting wheel
Downloading wheel-0.37.1-py2.py3-none-any.whl (35 kB)
Installing collected packages: wheel, setuptools, pip
Successfully installed pip-21.3.1 setuptools-59.6.0 wheel-0.37.1
(myvenv) [map.sugi-koubou.com]$念のためpipを最新にします。
(myvenv) [map.sugi-koubou.com]$ pip install --upgrade pip
Requirement already satisfied: pip in ./myvenv/lib/python3.6/site-packages (21.3.1)
(myvenv) [map.sugi-koubou.com]$ pip --version
pip 21.3.1 from /myvenv/lib64/python3.6/site-packages/pip (python 3.6)
(myvenv) [map.sugi-koubou.com]$これでPythonの仮想環境が構築されましたので、動作確認をしていきます。
動作確認
まずは、Hello Python!。
Windows11の秀丸エディタでhello.pyを作成しました。
print("Hello, Python!")作成したファイルはWinSCPでサーバーに転送しました。
下記がサーバーのファイルです。
[map.sugi-koubou.com]$ ls -la
total 4
drwx---r-x 3 kougeisya hpusers 4 Dec 12 16:01 .
drwx---r-x 23 kougeisya hpusers 24 Dec 11 16:12 ..
-rw-r--r-- 1 kougeisya hpusers 25 Dec 12 16:01 hello.py <--アップしたファイル
drwxr-xr-x 5 kougeisya hpusers 7 Dec 9 17:09 myvenv <--仮想環境
[map.sugi-koubou.com]$
ここからはサーバーでの処理です。
仮想環境を有効化(アクティベート)していなければアクティベートしてから実行します。
[map.sugi-koubou.com]$ . ./myvenv/bin/activate <--アクティべート
(myvenv) [map.sugi-koubou.com]$ python3 hello.py <--プログラム実行
Hello, Python!
(myvenv) [map.sugi-koubou.com]$ 無事に実行確認できましたので、とりあえず仮想環境から抜けます。
(myvenv) [map.sugi-koubou.com]$ deactivate <--仮想環境終了
[map.sugi-koubou.com]$ブラウザから呼び出す
サーバー上でPythonの実行は確認できましたが、このままではブラウザからCGIとして呼び出すことは未だできません。
ちなみに、このままブラウザから呼んでみると、

一瞬動いたのかと思ってしまいましたが、単にテキストファイルとして中身が表示されただけでした。
プログラムとして実行できるように設定していきます。
hello.pyファイルを実行ファイルにする
hello.pyファイルに実行権限を与えるためにパーミッションを変更します。
パーミッションは 755 にしました。

拡張子 .py をCGIとして実行できるようにする
拡張子 .cgi や .php はディフォルトでCGIとして実行できるようになっていますが、.py は設定されていないので .htaccess ファイルに設定を記述する必要があります。
.htaccess ファイルが無ければ作成し、ファイルの最後に「AddHandler cig-script .py」という1行を追加します。
AddHandler cgi-script .pyフォルダの状態
[map.sugi-koubou.com]$ ls -la
total 7
drwx---r-x 3 kougeisya hpusers 6 Dec 12 16:21 .
drwx---r-x 23 kougeisya hpusers 24 Dec 11 16:12 ..
-rwxr-xr-x 1 kougeisya hpusers 25 Dec 12 16:11 hello.py
-rw-r--r-- 1 kougeisya hpusers 45 Dec 11 16:20 .htaccess <--作成した設定ファイル
drwxr-xr-x 5 kougeisya hpusers 7 Dec 9 17:09 myvenv
[map.sugi-koubou.com]$hello.pyにPython実行パスを記述する
スクリプト(hello.pyファイル)の先頭にPythonインタプリタのパスを記述する必要があります。
この記述のことをシバンと言うようです。
Pythonインタプリタの場所は which コマンドで探せます。
[map.sugi-koubou.com]$ which python3
/usr/local/bin/python3
[map.sugi-koubou.com]$が、これはディフォルトでサーバーに入っているPython3の場所です。
仮想環境のPython3は「myvenv/bin」の中にあります。
[map.sugi-koubou.com]$ cd myvenv/bin
[bin]$ ls -la
total 14
drwxr-xr-x 2 kougeisya hpusers 11 Dec 9 17:25 .
drwxr-xr-x 5 kougeisya hpusers 7 Dec 9 17:09 ..
-rw-r--r-- 1 kougeisya hpusers 2241 Dec 9 17:09 activate
-rw-r--r-- 1 kougeisya hpusers 1289 Dec 9 17:09 activate.csh
-rw-r--r-- 1 kougeisya hpusers 2455 Dec 9 17:09 activate.fish
-rwxr-xr-x 1 kougeisya hpusers 274 Dec 9 17:25 pip
-rwxr-xr-x 1 kougeisya hpusers 274 Dec 9 17:25 pip3
-rwxr-xr-x 1 kougeisya hpusers 274 Dec 9 17:25 pip3.6
lrwxrwxrwx 1 kougeisya hpusers 7 Dec 9 17:09 python -> python3
lrwxrwxrwx 1 kougeisya hpusers 22 Dec 9 17:09 python3 -> /usr/local/bin/python3
-rwxr-xr-x 1 kougeisya hpusers 261 Dec 9 17:25 wheel
[bin]$シバンは絶対パスなので、myvenvまでのパスも pwd コマンドで調べておきます。
[map.sugi-koubou.com]$ pwd
/hoge/hogehoge/public_html/map.sugi-koubou.com
[sugi-koubou.com]$hello.py にシバンを記述します。
#!/hoge/hogehoge/public_html/map.sugi-koubou.com/myvenv/bin/python3
print("Hello, Python!")動作確認してみたが・・・
必要な設定は以上ですので、ブラウザから呼び出してみましたが・・・
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the servert administrator at info@coreserver.jp to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
エラーが出ました。
原因は些細なことでしたが、このエラーを解消するのに丸一日かかってしまいました。(T0T)
原因は2個ありました。
ヘッダーと本文の間には必ず空行が必要
hello.pyはかなり手をぬいた書き方ですが、本来は次のようなソースになります。
#!/hoge/hogehoge/public_html/map.sugi-koubou.com/myvenv/bin/python3
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
print('Content-Type: text/html; charset=utf-8')
print() # ヘッダーと本文の間には空行が必須!!!
print('<html><body>')
print('Hello, Python!<br>')
print('</body></html>')
この時、9行目にある「print()」はヘッダーと本文の間に空行を出力していますが、これが必須になっています。
ヘッダーと本文の間には必ず空行が必要だそうです。
手を抜いた「print(“Hello, Python!”)」1行だけの場合もこのルールは有効なので、
#!/hoge/hogehoge/public_html/map.sugi-koubou.com/myvenv/bin/python3
print("")
print("Hello, Python!")又は
#!/hoge/hogehoge/public_html/map.sugi-koubou.com/myvenv/bin/python3
print("\nHello, Python!")と、本文の前に空行が出力されるようにする必要がありました。
改行コードは「LF」にする
Windows上でソースコードを作成していたので改行コードが「CR+LF」になっていました。
サーバーはLinuxなので「LF」にしないとエラーになるようです。
エディタで保存時に「LF」を指定して保存しました。

上記2点を修正したところ無事エラーが解消されました。
ソースコードは手抜きじゃない方をアップています。

おわりに
以上でPythonの仮想環境の構築は完了です。
レンタルサーバーでは色々制限があるのでなかなか思い通りには行きませんが、プラン変更なしででなんとか構築出来たので良かったです。


コメント