見出し画像

【プログラミング】さくらのレンタルサーバーでFlaskを使おうとして困ったことを残しておく.

"さくらサーバー Flask"などで検索すると,さくらサーバーでFlaskを使うための手順が書かれている記事がいくつか出てきます.私の場合,それらの記事を参考に進めても上手くいかなかった点があったので,同じことで困っている人のために残しておくことにしました.
以下の2点が大きく困った点です.
※現在は参考Webページは停止しています.

1.pip で install できない.
2.URLにアクセスするとInternal server error (500エラー)となってしまう.

1.pip で install できない

過去の記事を見ると,pyenvを使用してpython環境構築しています.私も同様にpyenvを使用してpython環境を構築しましたが,python環境構築後にpipでFlaskをinstall使用としたら次のようなエラーがでて,installができませんでした.

Retrying (Retry(total=4, connect=None, read=None, redirect=None))・・・
Retrying (Retry(total=3, connect=None, read=None, redirect=None))・・・
・・・

原因と解決方法
OpenSSLの参照先が古い(もしくはない?)ことによるエラーのようです.従って,pyenvでpythonをinstallする際に次のようなコマンドでinstallします.
(pythonのバージョンは好きなバージョンで)

CPPFLAGS="-I/usr/local/ssl/include" LDFLAGS="-L/usr/local/ssl/lib" pyenv install 3.6.8

2.URLにアクセスするとInternal server error (500エラー)となってしまう.

環境構築が終わったら以下の3つのファイルを用意すると思います.
(ファイル名は各自で異なる.)

・.htaccess
・app.py
・index.cgi

また、各ファイルの中身はシンプルな内容だと以下になると思います.
(というよりもFlaskの公式を参考にすると)

.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /(Flaskファイルの格納フォルダ)/index.cgi/$1 [QSA,L]
app.py

# coding: utf-8
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
   return "Hello!"
if __name__ == '__main__':
   app.run()
index.cgi

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

しかし,私の場合だとこれだとエラーになってしまい動きませんでした.

原因と対策①
TeraTermからさくらサーバーに接続し,index.cgiを1行ずつ実行してみたところ,次のようなエラーでました.

wsgi_server_name = environ.get('HTTP_HOST', environ['SERVER_NAME'])
KeyError: 'SERVER_NAME'
Status: 500 Internal Server Error
Content-Type: text/plain
Content-Length: 59

そこでindex.cgiを次のように書き換えました.
(色々検索してstackoverflowの記事を参考にしました.)

index.cgi

from wsgiref.handlers import CGIHandler
from sys import path
# ※要書き換え
path.insert(0, '/ドメインフォルダ/Flask格納フォルダ/')
from app import app
class ProxyFix(object):
  def __init__(self, app):
      self.app = app
  def __call__(self, environ, start_response):
      # ※要書き換え
      environ['SERVER_NAME'] = "ドメイン名"
      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)

この状態で,TeraTerm上でindex.cgiを実行すると,"Hello!"が返ってきたのですが,URLにアクセスすると,まだエラーのままでした.

原因と対策②
色々悩みましたが,もう一つの原因は権限の問題でした。以下のコマンドで各ファイルに権限を付与することで無事に解決しました.

chmod 755 ファイル名

終わりに

私のように困っている人が1人でも救われればよいなと思います.
("Hello!"をだすために丸2日近くかかりました.)
※参考↓(色々いじってしまい,動いていない時もあります)

※記事の内容に関して問題がありましたらご連絡ください.速やかに対処いたします.その他ご意見も.(優しくお願いします.)


PCとスマホ,wifiだけを持って全国をのんびり旅したい.