2017/06/17

XREAでPythonとBottleを動かしてみる

どうも。

最近、Pythonが使える無料のレンタルサーバを見つけました。 自身の勉強のため以下のことをやってみました。

  • Herokuのようにgit pushで更新できる環境を作った
  • Pythonの軽量フレームワークであるBottleを動くようにした

何かとつまずいた所が多かったので備忘録を残しておきます。 なお、SSHなどはLinux上で作業しています。

目次

Pythonが使えるレンタルサーバとして、今回、私が見つけたのは XREA(エクスリア) です。
とりあえず XREA へのリンクを貼っておきます。

料金プランもいくつかあるのですが、 2017年6月現在、XREA Free (無料プラン)というのがあるので、そのプランを使ってみました。 XREA Freeの詳細は XREA のサイトで確認してほしいですが、ざっとまとめると下記の通りです(2017年6月現在)。

  • 容量 1 GB
  • マルチドメイン 使用可能
  • 転送量 1GB/1日
  • 広告表示あり
  • 商用利用可能
  • SSH 使用可能
  • Python2/3 使用可能
  • cron 使用不可
  • MySQL 使用可能
  • PostgreSQL 使用可能
  • SQLite 2/3 使用可能

無料プランであるにもかかわらず、結構な高機能となっています。 ただし、ネット上での評価・口コミを見る限りでは、サポート面の弱さや障害の起きやすさなどから高評価とまでは言えないようです。

XREA.COMの評価・評判 | レンタルサーバー比較.website

XREA(エクスリア)の評判や障害の頻度について

とはいえ、容量こそ少ないものの、趣味や学習目的で使う分には十分な機能なので色々と試してみました。 ちなみにXREAを利用するには VALUE-DOMAIN への登録(無料)が必要になります。

Herokuのようにgit pushで更新できると便利ですね。 ググってみて調べてみたところ下記のQiitaの記事がとても役立ったのでリンクを貼っておきます。

Gitでサイトを更新したい! - Qiita

ただ今回は容量が少ないという制限があります。 そのため開発用のステージング環境は作らず、本番環境のみの下記のような構成にしました。

/ (ルートディレクトリ)
└── virtual
    └── myaccount (取得したアカウント名)
        ├── git
        │   └── mysite.git (リポジトリを置く場所)
        └── public_html (公開領域)
            └── mydomain (ドメイン名 … 取得してきた独自ドメインを設定したときにできるディレクトリ)

まずはSSH接続を行う自分の端末のIPをXREAのコントロールパネルから登録しなければなりません。 とは言っても作業としてはコンパネの「SSH接続IP許可」のボタンをクリックするだけです。 ただ、慣れるまでは このコンパネまで行くのによく迷子になったのでメモしておきます。 (VALUE-DOMAINへのアカウント登録が必要です。)

  • VALUE-DOMAINのサーバのページ( https://www.value-domain.com/web.php )に移動
  • XREAアカウントのコンパネへのリンクからXREAのコンパネを開く
  • 「サイト設定」-「ツール/セキュリティー」-「SSH接続IP」へたどって「SSH接続IP許可」のボタンをクリック
  • 「サイト設定」-「FTP設定」-「FTP/SFTP接続情報」から「パスワード」の「表示」ボタンを押してSSH接続時のパスワードを覚えておく
$ ssh アカウント名@sXXXX.xrea.com
(中略)
Are you sure you want to continue connecting (yes/no)?  # 初回の場合に出てくる。ここでは "yes" と入力
アカウント名@sXXXX.xrea.com's password: # パスワードを入力する

ただし、時々ですがSSH接続直後にcdコマンドで移動できないときがあります。 その場合はbashコマンドを使うとcdで移動できるようになります。

あとは先程のQiitaの記事とほとんど手順が同じなので説明は省略してコマンドのみメモしておきます。

# ホームディレクトリに移動
$ cd ~
 
# リポジトリ置き場のディレクトリを作成
$ mkdir git
$ cd git
 
# mysite.git 用のディレクトリを作成
$ mkdir mysite.git
$ cd mysite.git
 
# mysite.git をベアリポジトリとして初期化
$ git init --bare
#!/usr/bin/bash
 
cd ~/public_html/mydomain
git --git-dir=.git pull origin master:master

※XREAでのファイルのアップロードはコントロールパネルの「サイト設定」-「FTP設定」-「net2ftp ファイルマネージャー」ボタンから出来ます。

$ chmod 755 ~/git/mysite.git/hooks/post-receive
cd ~/public_html/mydomain
git init
git remote add origin ~/git/mysite.git

さて、ここからはローカル端末上で作業です。

SSH接続で先ほど作ったベアリポジトリをgit cloneしましょう。 「SSH接続IP許可」を忘れずに。

任意のディレクトリで以下のようにすればgit cloneできます。

$ git clone ssh://アカウント名@sXXXX.xrea.com:NN/virtual/アカウント名/git/mysite.git

ポートの番号(上記コマンド例のNNの部分)はXREAのコンパネから確認できます。 「サイト設定」-「FTP設定」-「FTP/SFTP接続情報」に記載されている「SFTPポート」の番号です(2017年6月現在)。

いずれかの方法でbottle.pyをダウンロードします。

  • ブラウザから直接 http://bottlepy.org/bottle.py へアクセスして bottle.py をダウンロード
  • $ wget http://bottlepy.org/bottle.pyでダウンロード

index.cgiに下記のコードを書く。

#!/usr/local/bin/python3
import os
from bottle import route, run
 
@route('/')
def index():
    return "index page"
 
@route('/hello')
def hello():
    return "Hello, World!"
 
if __name__=='__main__':
    DEBUG = os.path.exists(os.path.expanduser('~/debug'))
    if DEBUG:
        run(host='localhost', port=8080, debug=True)
    else:
        run(host='0.0.0.0', port=80, server="cgi")

ローカルで実行するときはdebugモードで動かして、レンタルサーバ上ではcgiスクリプトとして動作させたいのでDEBUG = os.path.exists(os.path.expanduser('~/debug'))のところでローカルかレンサバ上か判定させています。 ホームにdebugというファイルがあるとローカル(localhostでdebugモードでrun)、なければレンサバ上(0.0.0.0で動かしてcgiスクリプトとしてrun)。 (今思えば、逆にレンサバ上のホームに配置したロジックにしとけばよかったかも)

で、ローカルでは以下のコマンドでdebugファイルを配置しておく。

$ echo "デバッグ用" > ~/debug

あとは先ほどgit cloneしたところにindex.cgibottle.pyを配置。 適切にパーミッションを付与してgit pushする。

$ chmod 700 index.cgi
$ chmod 700 bottle.py
$ git add --a
$ git commit -m "initial commit"
$ git push origin master:master

ここまでの作業がうまくいけば、サイトのURL(例えば http://example.com/) にアクセスすると index page という文字が表示されます。 しかし@route('/hello')でルーティングしているにもかかわらず、helloのページ (http://example.com/hello) には行けないはずです。


もし 自身のサイトの /hello (例えば http://example.com/index.cgi/hello) へアクセスして Hello, World! のページがこんにちはしたときはStack Overflowに載ってた方法で解決できると思います。


python - Problems with Routing URLs using CGI and Bottle.py - Stack Overflow


要するに .htaccess ファイルでリクエストされたURLを書き換えてリダイレクトさせると良いみたいです。 Stack Overflowでは index.py でしたが、今回は index.cgi なので書き換えてみました。

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

ちょっとだけ読み解くと1行目のDirectoryIndex index.cgi/(スラッシュ)のときの対策ですね。 /でアクセスが来た時にデフォルトでアクセスされるファイルを指定しています。 これがないと間違って index.html を配置してしまったときに index.cgi ではなく index.html の内容が表示されてしまいます。


それ以降の行は /hello (例 http://example.com/hello )のようにスラッシュ以降になにか付いているときの対策です。


2行目はRewriteモジュールを有効化してURLの書き換えを可能にしています。


3行目でURLを書き換える条件を指定しています。 この場合は「存在しないファイル名でのリクエストが来たら」だと思います。


4行目はURLの書き換えとリダイレクトを行っています。

つまり http://example.com/hello というリクエストが来た時には index.cgi と同じ階層の hello のファイル名を探しに行きますが、存在しないので http://example.com/index.cgi/hello で表示されるページを表示する、という内容になっています。


理解するとStack Overflowの回答は「なるほど」という回答になっています。 ただ、 index.cgi の階層には bottle.py.git などがあるはずです。 これらのファイルやディレクトリはそのままアクセスできてしまうと問題があるので .htaccess ファイルで適宜アクセス制限を行ってください。 .htaccess ファイルによるアクセス制限はここでは割愛します。


なお、読み解くには下記のサイトが参考になりました。

ということで、 .htaccessファイルを追加して再度git pushする必要があります。


ただ、XREAを1ヶ月ほど使ってみて気付いたのですが、403エラーが時々発生していました。 回避する方法は後述しますが .htaccess に追記が必要なので、追記が終わってからgit pushしましょう。

XREAのページに記載がありますが、一部のXREAのサーバに海外から大量アクセスがあった場合に一時的に拒否する設定が入っており、そのときにリクエストが403エラーとなっているようです。


技術 | よくある質問 | 無料から使える高機能・高品質レンタルサーバー | XREA(エクスリア)


XREAのページ通りに .htaccess に追記すれば403エラーを回避できているようです。

.htaccessに追記する内容

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

あとは自分のサイトに反映しておくためgit pushしておくとよいでしょう。

$ git add .htaccess
$ git commit -m "add .htaccess"
$ git push origin master:master

これでようやくPythonとBottleを使用したWEBアプリケーション開発の入り口に立てました。

ファイルやディレクトリへのアクセス制限もきちんと行わなければなりませんが、WEBアプリケーション開発の勉強には持って来いの環境だと思います。

なので、だれか便利なWEBアプリケーションを作ってください(他力本願)。


XREAさんの回し者じゃないよ!

今日はこのへんで。では。


[広告]

Amazon

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

関連記事

スポンサーリンク

スポンサーリンク

スポンサーリンク

コメント

非公開コメント

No title

bottle+XREAの記事が無くて困っていたので大変ありがたい記事でした。
ありがとうございます!