はじめに
レンタルしたさくらレンタルサーバー(スタンダードプラン)に、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
を変更する。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /hello/index.cgi/$1 [QSA,L]
<Files ~ "\.py$">
deny from all
</Files>
#!/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()
#!/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
ファイルを編集。
#!/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が発生している。
ファイルアクセス権限の書き換え
ここで、chmod 744 index.cgi
として、実行権限を付与する。
こうすることで、chromeからでもhello worldが確認できた!
結びに
ちなみに、権限はどの程度あればいいのかと思って色々試した結果、最低限
- .htaccessに所有者の読み取り権限
- index.cgiに所有者の読み取り・実行権限
app.pyになんの権限も付与されていないでも動くってのは不思議だなぁ。
参考文献
Try #019 – さくらのレンタルサーバでFlaskを利用した住所検索APIを構築してみた
さくらのレンタルサーバーでFlaskを使おうとして困ったことを残しておく.
chmod? chown? よくわからんって人のための、ファイル権限系まとめ