Visual Studioで作ったPythonのBottle Web ProjectをXREAサーバーで動かしてみた話

勉強がてらpythonでwebサイトを構築してみたくなったのでやってみた。
以前個人的に使っていた統合環境がVisual Studio 2017@Windowsだったので、とりあえずこの環境にあるテンプレをサーバー上で動かすのを第一目標とした。
もう少し詳しい人は↓のほうがはるかに参考になる。
errormaker.blog.fc2.com

Visual Studio で Bottle Web Project を作る

とりあえずテンプレートからプロジェクトを作成。
f:id:vidamrot:20181216152726p:plainf:id:vidamrot:20181216152744p:plainf:id:vidamrot:20181216152754p:plain
テンプレート作成後、まずVisual Studioを介したデバッグで動くかを確認。
f:id:vidamrot:20181216152835p:plainf:id:vidamrot:20181216152900p:plain
見れた。

XREAサーバーで動かすための編集

次に、テンプレートそのままではサーバーにアップロードしてもちゃんと動かないので、いくつか編集を加える。

http://ドメイン名/ というURLでアクセスされたときにスタートアップファイルであるapp.pyが起動するように、ファイル名をindex.cgiにリネーム。f:id:vidamrot:20181216154242p:plain

index.cgipythonスクリプトとして実行されるよう、次のようなshebangを1行目に追加(これはXREAサーバー側で指定されているもの)。

#!/usr/local/bin/python3

index.cgiの末尾のBottleを起動する箇所で、サーバーアダプターがwsgirefでは動かないので、cgiに変更する。

#bottle.run(server='wsgiref', host=HOST, port=PORT)
bottle.run(server='cgi', host=HOST, port=PORT)

※逆にcgiにしてしまうとVisual Studioからのデバッグ起動では動かなくなるようなので、PROJECT_ROOTでの分岐を入れたりする必要がありそうだが、ここでは割愛。

XREAサーバーへ転送

とりあえずこれだけの編集を施してサーバーへ転送。gitやFTPを介したファイル転送機能くらい統合環境なんだから付いていそうな気がするが、ぱっとは見つけられなかったのでFFFTPで普通に転送した。
f:id:vidamrot:20181216155507p:plain
index.cgiパーミッションを705にする。
f:id:vidamrot:20181216155730p:plainf:id:vidamrot:20181216155733p:plain

bottle.pyをサーバーに置く。Visual Studioを介して入手したものを使う。
f:id:vidamrot:20181216155816p:plainf:id:vidamrot:20181216155821p:plain
※ただし、1行目にshebangとしてローカルパスが書き込まれてしまっているので、サーバー上では閲覧できないパーミッションにしたり、shebangを変えたりしたほうがいいと思う。

XREAサーバーで動作テスト

サーバー上で問題なく動くかテスト。
f:id:vidamrot:20181216160046p:plain
トップページは見れるが……。
f:id:vidamrot:20181216160050p:plain
それ以外のページは見れない。

.htaccessの設定

これは、"http://ドメイン名/home" ではなく "http://ドメイン名/index.cgi/home" というURLでアクセスしないと見れないようになっているのが原因なので、.htaccessにURLを書き換える処理を追加することで対処する。

.htaccess
DirectoryIndex index.cgi
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.cgi/$1  [L]

<Files ~ ".(cgi|xcg)$>
<Limit GET POST>
order allow,deny
allow from all
</Limit>
</Files>

# https://errormaker.blog.fc2.com/blog-entry-54.html
# /*** を /index.cgi/*** に書き換える処理と、
# 外国からのアクセスが集中したときの403エラーを回避する処理が書いてある

これでテンプレートがサーバー上で動くようになった。あとはテンプレートの内容から適当に編集していけばいろいろ出来そう。