コアサーバーにログインできることがわかったので、Python CGI を試してみました。
最初は順調でしたが、ちょっと苦戦してなんとか動きました。
実施した手順やコマンドなどを記載しておきます。本記事ではエラーが発生したところまでを記載してます。
コアサーバーで Python CGI を動かしてみる
前回の記事でコアサーバーにログインまでできるようになりました。
【コアサーバーv1】コアサーバーv1にTeraTermで入ってWordPressを探索
レンタルサーバーのコアサーバーv1(CORE-A)にTeraTermでログインして仮想サーバの仕組みや、WordPressのディレクトリ構成などを調べてみました。Linux がわかる人向けで通常のブログ作成では不要ですが、知っておくと便利な時もあります。
今回はコアサーバー上で Python CGI を試してみます。
Python CGI とは
Python は最近は主流となってきてるプログラム言語のことで、ライブラリが多くて簡単に追加などできるので、難しいプログラムもライブラリを追加することで簡単に作れたりします。
CGI(Common Gateway Interface)とは、Webでアクセスした時にプログラムが動いて画面表示の内容を作って出力するもので、あらかじめ書いてる記事と違い動的に表示を変えたりできます。
例えば、予約できるHPで予約表を見たりすると、データベースから情報を取りだして予約表の画面を作って表示するとか。
先人の知恵を借りる
検索すると既に実施してる人たちがノウハウを公開しています。
最初はとにかく検索して真似をしてみるのが一番てっとり早いです。
今回はコアサーバーで Python CGI を動かしてみたかったので、検索して以下のページを発見しました。まさにビンゴの内容!やってる内容もいい感じなので、まずはこれを試してみます!
Python の動作や Web 環境の確認
記事ではいきなり public_html 配下で CGI を作ってますが、今回の環境は WordPress が入ってるので、public_html のディレクトリ自体が違ってたりします。
そもそも Python がちゃんと動くかとかも試してみます。
自分はレンタルサーバーにコアサーバーを使ってますが、前回調べた結果、 /virtual/cuzuser/public_html/teqnobreaker.com 配下が Webのホームディレクトリとわかりました。
ただ、この直下でいろいろファイルを作ると面倒そうなので、作業用のディレクトリ(work)を作って、その中で作業をすることにします。
ls -l でファイルやディレクトリのアクセス権限を確認してみるとグループにはアクセス権限が無いという不思議な設定。
よくわからないですが、これに合わせて work ディレクトリも chmod 707 しておきました。
[cuzuser@xxxx teqnobreaker.com]$ pwd
/virtual/cuzuser/public_html/teqnobreaker.com
[cuzuser@xxxx teqnobreaker.com]$ ls -l
total 110
-rwx---rwx 1 cuzuser hpusers 405 Feb 6 2020 index.php
-rwxr--rwx 1 cuzuser hpusers 19915 Dec 13 04:27 license.txt
-rwxr--rwx 1 cuzuser hpusers 10089 Dec 13 04:27 readme.html
-rwx---rwx 1 cuzuser hpusers 7101 Jul 29 02:20 wp-activate.php
drwx---rwx 9 cuzuser hpusers 98 Dec 13 04:27 wp-admin
-rwx---rwx 1 cuzuser hpusers 351 Feb 6 2020 wp-blog-header.php
-rwxr--rwx 1 cuzuser hpusers 2328 Dec 13 04:27 wp-comments-post.php
-rwx---rwx 1 cuzuser hpusers 3931 Sep 2 13:00 wp-config-sample.php
-rw-rw-rw- 1 cuzuser hpusers 4229 Nov 9 22:31 wp-config.php
drwxr-xrwx 12 cuzuser hpusers 14 Jan 17 01:32 wp-content
-rwxr--rwx 1 cuzuser hpusers 3939 Dec 13 04:27 wp-cron.php
drwx---rwx 25 cuzuser hpusers 223 Dec 13 04:27 wp-includes
-rwx---rwx 1 cuzuser hpusers 2496 Feb 6 2020 wp-links-opml.php
-rwx---rwx 1 cuzuser hpusers 3300 Feb 6 2020 wp-load.php
-rwxr--rwx 1 cuzuser hpusers 49831 Dec 13 04:27 wp-login.php
-rwx---rwx 1 cuzuser hpusers 8509 Apr 14 2020 wp-mail.php
-rwxr--rwx 1 cuzuser hpusers 20975 Dec 13 04:27 wp-settings.php
-rwxr--rwx 1 cuzuser hpusers 31337 Dec 13 04:27 wp-signup.php
-rwxr--rwx 1 cuzuser hpusers 4747 Dec 13 04:27 wp-trackback.php
-rwx---rwx 1 cuzuser hpusers 3236 Jun 9 2020 xmlrpc.php
[cuzuser@xxxx teqnobreaker.com]$
[cuzuser@xxxx teqnobreaker.com]$ mkdir work
[cuzuser@xxxx teqnobreaker.com]$ chmod 707 work
[cuzuser@xxxx teqnobreaker.com]$ cd work/
[cuzuser@xxxx work]$ pwd
/home/cuz/domains/teqnobreaker.com/public_html/work
Python のバージョンを確認してみます。
通常の Python は 2.7.5、Python3 を指定すると 3.6.8 が動くようです。
参考にしたページのソースでは /usr/local/bin/python3 を指定してるので大丈夫そうです。
[cuzuser@xxxx work]$ python --version
Python 2.7.5
[cuzuser@xxxx work]$ python3 --version
Python 3.6.8
[cuzuser@xxxx work]$ which python3
/usr/local/bin/python3
次に work 配下でちゃんと web が表示されるか確認してみます。
エディタ(vi)で定番の「Hello, World!」を作って表示されるか試してみます。
[cuzuser@xxxx work]$ vi hello.html
[cuzuser@xxxx work]$ ls -l
total 1
-rw-r--r-- 1 cuzuser hpusers 20 Jan 17 02:28 hello.html
[cuzuser@xxxx work]$ cat hello.html
<p>Hello,World!</p>
それでは、https://teqnobreaker.com/work/hello.html にアクセスしてみます。
出ました!
これで、work 配下でも大丈夫なことが確認できました。
Hello.cgi を試してみる
それでは、参考の記事にあった「hello.cgi」を試してみます。
同様にエディタで hello.cgi を編集します。
テキストでいいのですが、python スクリプトを実行させるのに実行権が必要となるので、chmod +x で実行権を付けてます。
[cuzuser@xxxx work]$ vi hello.cgi
[cuzuser@xxxx work]$ cat hello.cgi
#!/usr/local/bin/python
print('Content-Type:text/html')
print('')
print('Hello,World!')
[cuzuser@xxxx work]$ ls -l hello.cgi
total 1
-rw-r--r-- 1 cuzuser hpusers 89 Jan 17 02:32 hello.cgi
[cuzuser@xxxx work]$ chmod +x hello.cgi
[cuzuser@xxxx work]$ ls -l hello.cgi
total 1
-rwxr-xr-x 1 cuzuser hpusers 89 Jan 17 02:32 hello.cgi
それでは、https://teqnobreaker.com/work/hello.cgi にアクセスしてみます。
出ました!
あっさりと Python CGI が動くことが確認できました!
CGIの拡張子で .py が使えるように .htaccess の設定をする
次のサンプル message.py は Web 起動時にパラメータを渡して、そのパラメータを出力するというもののようです。
ファイル名が xxx.cgi では無く、xxx.py と python の拡張子になってます。
この場合、.py ファイルでも CGI として動くように Webサーバーに設定が必要です。
参考の記事の最初の方に、~/public_html/.htaccess に以下を追加するように記載があります。
AddHandler cgi-script .py
実際に xxx.py だと動かないのか確認してみます。
先ほど作った hello.cgi を hello.py にコピーして、https://teqnobreaker.com/work/hello.py にアクセスしてみます。
[cuzuser@xxxx work]$ pwd
/virtual/cuzuser/public_html/teqnobreaker.com/work
[cuzuser@xxxx work]$ cp hello.cgi hello.py
なるほど、ソースがそのまま表示されてしまいました。
コアサーバーの環境では .htaccess は /virtual/cuzuser/public_html/teqnobreaker.com 配下にあるので、このファイルを編集します。
しかし .htaccess を見ると WordPress の設定が入ってるようで、"BEGIN WordPress" から "END WordPress" までには記載をしないようにコメントがありました。
今回は "END WordPress" の後ろに追加しようと思いますが、問題が起きた時に元に戻せるように、.htaccess ファイルのバックアップを取っておきます。
自分のホームディレクトリは /virtual/cuzuser ですが、Linux では ~ と略すことが可能です。
まずはホームディレクトリ配下に bkup ディレクトリを作成して、.htaccess をコピーします。
その後、/virtual/cuzuser/public_html/teqnobreaker.com 配下の .htaccess をエディタで編集しました。
[cuzuser@xxxx teqnobreaker.com]$ pwd
/virtual/cuzuser/public_html/teqnobreaker.com
[cuzuser@xxxx teqnobreaker.com]$ mkdir ~/bkup
[cuzuser@xxxx teqnobreaker.com]$ cp -p .htaccess ~/bkup
[cuzuser@xxxx teqnobreaker.com]$ vi .htaccess
[cuzuser@xxxx teqnobreaker.com]$ cat .htaccess
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
AddHandler cgi-script .py
では、もう一度、https://teqnobreaker.com/work/hello.py にアクセスしてみましょう。
行けました!これで xxx.py でも CGI として動くようになりました。
message.py を試してみる
では、参考にしているページの「message.py」をエディタで作ってみます。
この時、注意が必要なのは日本語が使える設定がされてない「vi」なので日本語が文字化けします。
でも、文字化けしても気にせずコピペで貼り付けて保存すると大丈夫だったりします。
保存した後、cat で中身を確認してちゃんと日本語が表示されれば ok です。
ただ、ソースの編集をしたい場合、文字化けした状態では画面表示がずれてるので正しく編集できません。
ソース編集が必要な場合は、あらかじめ windows 上で日本語のコメント部分を削ったソースを作ってコピペするか、windows 上でファイルを編集して、winscp などのファイル転送ソフトで編集するたびにアップロードするのが良いと思います。
参照ページにある message.py の日本語コメントを抜いたものを載せておきます。
編集したい場合はこちらをコピペして使ってみてください。
これまでのように、vi message.py で以下を貼り付けます。
また、実行権が無いと動かせないので、chmod +x message.py もしておきます。
#!/usr/local/bin/python3
import cgi
import html
import io
import sys
# set encoding
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# get message parameter
form = cgi.FieldStorage()
message = form.getfirst('message', 'Hello, world.')
# HTTP header
print('Content-Type: text/html; charset=utf-8')
print() # blank line, end of headers
# HTML body
print('<html><body>')
print(f'message: {html.escape(message)}')
print('</body></html>')
パラメータを付けて起動してみて、付けたパラメータが表示されることを確認します。
https://teqnobreaker.com/work/message.py?message=テスト
外部ライブラリ利用サンプル(draw.py)を試してみる
外部ライブラリは難しい処理を簡単にできるように Python に追加できるもので、使いたいライブラリを追加することで様々な関数を追加することができます。
ここでは NumPy という多次元配列の計算ができるようになるライブラリと、多次元配列からグラフ描画ができる Matplotlib というライブラリを追加しています。
まずは、参考にしてるページの通りに numpy と matplotlib を入れて、参考のソースを作成して起動してみました。
すると、ついにここで問題が発生しました!
ここから、原因がなかなかわからず苦戦しました。。
最終的にはなんとかなったのですが、ちょっと長くなるので本記事はここまでにして、続きは後編にしようと思います。
【レンタルサーバー】コアサーバで Python CGI を動かしてみる(後編)
前回の記事でコアサーバで Python CGI は簡単に動くことがわかりましたが、外部ライブラリを使用したところ「Internal Server Error」が出るようになりました。 ちょっと苦戦しましたが、なんとか動いたので原因と対策を書いておきます。
コメント