【さくらレンタルサーバー】flaskを使ってみる。


はじめに

レンタルしたさくらレンタルサーバー(スタンダードプラン)に、APIサーバーを立てようと思ってflaskを使ってみる。(さくらレンタルサーバでは常駐デーモンプロセスは許可されていないため、注意が必要
詰まった点もあったので、その対処法も合わせて記録する。

手順

  • /home/(UserName)/www/hello以下に、.htaccess,app.py,index.cgiの三つのファイルを作成
  • chromeからhttps://(UserName).sakura.ne.jp/hello/にアクセス

.htaccess : Apacheの制御設定ファイルの一つ。通常Apacheの制御を行うhttpd.confはWEBサーバー全体の制御を行っているため、サーバー管理者しか変更することができない。さくらレンタルサーバー上で自分専用に設定を変えたい場合は、.htaccessを変更する。

cman.jp: htaccessとは?

.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /hello/index.cgi/$1 [QSA,L]
<Files ~ "\.py$">
  deny from all
</Files>
app.py
#!/home/miyablo/.pyenv/versions/flask_peewee_3.6.4/bin/python
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return "Hello World!\n"

if __name__ == '__main__':
    app.run()

index.cgi
#!/home/miyablo/.pyenv/versions/flask_peewee_3.6.4/bin/python

import cgitb
cgitb.enable()

from wsgiref.handlers import CGIHandler
from app import app
CGIHandler().run(app)

発生したエラーとその対応

chromeからのアクセス時

chromeからhttps://(UserName).sakura.ne.jp/hello/にアクセス時に、以下の表示が。

ファイルの直接実行時

ssh接続したさくらサーバーのコマンドライン上で、$python index.cgiコマンドにて直接index.cgiを実行してみると、以下のようなエラーが。

index.cgiの書き換え

このエラーが以下のページと同じエラーだったので、以下のページに書かれているようにindex.cgiファイルを編集。

さくらのレンタルサーバーでFlaskを使おうとして困ったことを残しておく.

index.cgi
#!/home/miyablo/.pyenv/versions/flask_peewee_3.6.4/bin/python

import cgitb
cgitb.enable()

from wsgiref.handlers import CGIHandler
from app import app
#-------------------以下、書き換え部分------------------------
from sys import path

path.insert(0, '/miyablo/www/hello/')
from app import app
class ProxyFix(object):
  def __init__(self, app):
      self.app = app
  def __call__(self, environ, start_response):
      # ※要書き換え
      environ['SERVER_NAME'] = "miyablo.sakura.ne.jp"
      environ['SERVER_PORT'] = "80"
      environ['REQUEST_METHOD'] = "GET"
      environ['SCRIPT_NAME'] = ""
      environ['PATH_INFO'] = "/"
      environ['QUERY_STRING'] = ""
      environ['SERVER_PROTOCOL'] = "HTTP/1.1"
      return self.app(environ, start_response)
if __name__ == '__main__':
   app.wsgi_app = ProxyFix(app.wsgi_app)
   CGIHandler().run(app)

index.cgiの直接実行

今度はエラーなく実行することができた。

しかしながら、いまだにchromeからのアクセスではinternal server errorが発生している。

ファイルアクセス権限の書き換え

$ ls -laを実行すると、現状では以下。

ここで、chmod 744 index.cgiとして、実行権限を付与する。

こうすることで、chromeからでもhello worldが確認できた!

結びに

ちなみに、権限はどの程度あればいいのかと思って色々試した結果、最低限

  • .htaccessに所有者の読み取り権限
  • index.cgiに所有者の読み取り・実行権限

があれば、正常に反応を返すことがわかった。

app.pyになんの権限も付与されていないでも動くってのは不思議だなぁ。

参考文献

Try #019 – さくらのレンタルサーバでFlaskを利用した住所検索APIを構築してみた
さくらのレンタルサーバーでFlaskを使おうとして困ったことを残しておく.
chmod? chown? よくわからんって人のための、ファイル権限系まとめ