Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【現状整理】xサーバーにflaskのコードをデプロイしているのですが、500エラーが発生しており、原因調査に詰まってしまっています。

解決したいこと

下記リンクを参考にflaskで作成したコードをxサーバーに公開しようとしているのですが、500エラーが発生してしまい、その原因調査に詰まってしまっています。
https://youtu.be/5o9HJGPlSgk?si=weBoigMdr0xDD7ed
https://chikaraemon.com/wordpress/category/python-flask/

他の枠でも質問をさせていただいているのですが、情報がごちゃごちゃしてしまっているのでこちらで一度まとめさせていただきます。

エラー

.error
(省略)End of script output before headers: index.cgi

該当するソースコード

.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /test1/index.cgi/$1 [QSA,L]
<Files ~ "\.py$">
    deny from all
</Files>
index.cgi
#!/home/■■■■■■■■■■/anaconda3/bin/python3.11

from wsgiref.handlers import CGIHandler
from index import app
CGIHandler().run(app)
index.py
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello world!"

@app.route("/hello")
def hello():
    title="FlaskをレンタルサーバXserverで利用する!"
    subtitle="データベースmySQLのInsert,Update,Selectを実行する"
    return render_template('hello.html', title=title,subtitle=subtitle)

if __name__ == "__main__":
    app.run(host='0.0.0.0')
hello.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{{ title }}</title>
    </head>
    <body>
        <div id="contents">
            <h1 style="font-size: 16px;">{{ title }}</h1>
            <h2 style="font-size: 14px;">{{ subtitle }}</h2>
        </div>
    </body>
</html>

自分で試したこと

・所有権や実行権限の確認

$ ls -l /home/■■■■■■■■■■/anaconda3/bin/python3.11
-rwxr-xr-x 1 ■■■■■■■■■■ members 24608552  5月 27 22:31 /home/■■■■■■■■■■/anaconda3/bin/python3.11

・下記記事の「cgiの実行言語をperlにしてみる(2020/05/05追加)」という箇所の内容を試してみた
結果「OK」と表示された
https://teratail.com/questions/258777

index.cgi
#! /usr/local/bin/perl --

print "Content-Type: text/html\n\n";
print "OK";

・localのpythonでも試してみた。
こちらは500エラー

index.cgi
#! /usr/local/bin/python --

print("Content-Type: text/html\n\n")
print("OK")

エラー内容は以下になります。

.error
(省略)End of script output before headers: index.cgi

自分で試したこと(やらかしてしまったかもしれない内容)

・rootディレクトリにある「.bash_profile」の削除
参考にしていたを見返していた際に4:02秒あたりで.bash_profileファイルを削除するとうまくいったという記載があったため自分も削除してしまいました。
https://youtu.be/5o9HJGPlSgk

以前まではTeraTermにSSH接続したら

[■■■■■■■■■■@sv15043 ~]$

上記の表示だったのですが、.bash_profileファイルを削除してからは下記の表示になってしまいました。

-bash-4.2$

下記表示に戻すにはbinフォルダのPATHを通さないと治らなくなってしまいました。

[■■■■■■■■■■@sv15043 ~]$
-bash-4.2$ export PATH="/home/■■■■■■■■■■/anaconda3/bin:$PATH"
-bash-4.2$ source ~/.bashrc

最後まで読んでいただきありがとうございます。
なにかご存知の方がいらっしゃいましたらアドバイス頂けますと幸いです。
何卒よろしくお願いいたします。

0 likes

2Answer

こちらで一度まとめさせていただきます。

であれば、以前に立てたスレッドにその旨を書いて各スレッドをクローズしなさい。
まとめたければ質問元の内容を再編集出るので、そちらにまとめるように。


参考動画は見ていませんし、anacondaもあまり使ったことが無いのですが、anaconda自体のパーミッションよりもcgiファイルのパーミッションが重要になります。

sshでログインして

/home/■■■■■■■■■■/anaconda3/bin/python3.11 -m pip list --user

とコマンドして何も出ないか、或いはインストール済みのリストが出てくるか。

リストにFlaskが無い場合は

/home/■■■■■■■■■■/anaconda3/bin/python3.11 -m pip install --user Flask

でインストールする(--userオプションの位置がここであってるか記憶が曖昧なのでエラー吐いてたらずらして下さい、venvしてあるなら--userは不要です)。

localのpython

シェバンのパスが間違っていますね。ホスティングが公開しているマニュアルぐらい読みましょう。

ここのは Python 3.6と古い物しか使えないようですが、とりあえずコードが怪しいので書き直しておきます。

test_python.cgi
#!/usr/bin/python3.6

print("Content-Type: text/plain")
print()
print("OK!")

test_python.cgitest_python.cgiを入れているディレクトリのパーミッションを705に変更する。

Flaskは使ったことが無いので、それについて聞かれても知りませんが、とりあえず低レベルのスクリプト、サーバーが既に用意しているPythonでの動作を試して下さい。

3.6だとFlaskはサポートされてないこと留意しておいて下さい。

1Like

Python の所有権の確認で1行目が #! /usr/local/bin/python -- となっていますが、 Flask を動かすに当たって使いたい Python は Anaconda でインストールした方なので、以下のように書き換えて試してください。

#!/home/■■■■■■■■■■/anaconda3/bin/python3.11

print("Content-Type: text/html\n\n")
print("OK")
0Like

Comments

  1. @Kobayashi0620

    Questioner

    そちらでも試したのですが500エラーが発生してしまいました。
    以下内容でも行ったのですがこちらも500エラーが発生してしまいました。。
    ‘’’
    #! ~/anaconda3/bin/python3.11

    print("Content-Type: text/html\n\n")
    print("OK")
    ‘’’

  2. ~/anaconda3/bin/python3.11 では動きません。 Shebang 行の中で ~ は展開されないからです。

    https://teratail.com/questions/258777 の解決状況を見たところでは、 Python の所有者が root:root なら動きそうです。 SSH して sudo chown -R root:root /home/■■■■■■■■■■/anaconda3/ を実行してから再度試してください。

  3. @Kobayashi0620

    Questioner

    教えていただいたコマンドを実施したのですが以下エラーが発生してしまいました。

    $ sudo chown -R root:root /home/■■■■■■■■■■/anaconda3/
    -bash: /usr/bin/sudo: 許可がありません
    

    以下のコマンドを使用して root 権限でログインしようとしたのですができませんでした。

    $ sudo su -
    -bash: /usr/bin/sudo: 許可がありません
    

    以下のコマンドで権限を追加しようとしたのですがそもそも追加する権限がないためダメでした。

    $ sudo usermod -aG sudo ■■■■■■■■■■
    -bash: /usr/bin/sudo: 許可がありません
    

    以下コマンドも権限がなくファイル操作を行うことはできませんでした。

    $ visudo
    visudo: /etc/sudoers: 許可がありません
    

    https://qiita.com/ritya/items/40b8392d98237f92bb1e
    上記の記事を参考にファイルの権限を確認しているのですが、

    $ ll /usr/
    dr-xr-xr-x   2 root root 40960  5月 14 10:56 bin
    
    $ ll /usr/bin/
    -rwxr-xr-x   1 root root       32128  2月  3  2021 su
    ---s--x---   1 root cpadmin   151424  1月 26  2023 sudo
    lrwxrwxrwx   1 root root           4  2月 14 16:21 sudoedit -> sudo
    ---x--x--x   1 root root       57456  1月 26  2023 sudoreplay
    

    以下コマンドを実行してもパスワードがわからずで詰まってしまいました。

    $ su -
    パスワード:
    

    上記のパスワードはいろいろと調べている最中になります。

    記事では結論として環境を作り直すのがいいかもしれないと記載されており、
    一度xサーバーの契約を切りもう一度再契約を行ってから実施するような流れになってしまうのでしょうか?
    こちらの原因としてはやはり「.bash_profile」を削除してしまったことが原因になり魔手でしょうか?

  4. 再契約しても権限の問題が解決するわけではないので意味はないと思います。 .bash_profile はこの問題には関係ありません。

  5. 原因は Anaconda でインストールした方の Python を Apache が起動できないことで、その理由は Python の所有者・所属グループが間違っているか、もしくは Perl などの許可された特定のプログラムしか起動できないように Apache が設定されているか、です。

    Python の所有者を変更できないようなので、 CGI を実行するユーザーとグループを変更してみるといいかもしれません。以下の記述を .htaccess に加えたうえで、もう一度この回答の最初に書いた CGI を実行してみてください。

    SuexecUserGroup ログインユーザー名 members
    
  6. @Kobayashi0620

    Questioner

    以下内容に修正してxサーバーにアップしたのですが、500エラーが発生してしまいます。

    .htaccess
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /test1/index.cgi/$1 [QSA,L]
    SuexecUserGroup ■■■■■■■■■■ members
    <Files ~ "\.py$">
        deny from all
    </Files>
    
    index.cgi
    #!/home/■■■■■■■■■■/anaconda3/bin/python3.11
    
    print("Content-Type: text/html\n\n")
    print("OK")
    

    以下エラー内容になります。

    .error
    (省略)/home/■■■■■■■■■■/■■■■■■■■■■.xsrv.jp/public_html/test1/.htaccess: SuexecUserGroup not allowed here
    
  7. すみません、 SuexecUserGroup は .htaccess には書けませんでした。 Apache の設定ファイルに書く必要がありますが、レンタルサーバでは書く権限がないかもしれません。

    FAQ では suEXEC に対応しているとだけ書いてありますが、設定方法は書いてありませんね。方法を問い合わせてみてください。 https://www.xserver.ne.jp/support/faq/service_cgi_suexec.php

  8. あと一応、 index.cgi 正しく動くことも確認してください。 index.cgi の権限が -rwxr-xr-x であり、 index.cgi があるディレクトリで ./index.cgi を実行して出力が以下であれば正常です。

    Content-Type: text/html
    
    OK
    

    ここまでアドバイスしましたが、正直 Flask を CGI で動かすのはあまり筋が良くないですし、制約の多いレンタルサーバで試行錯誤するのも効率が悪いので、行き詰まるようなら root 権限を持てる VPS を借りたほうが簡単だと思います。

  9. @Kobayashi0620

    Questioner

    ありがとうございます
    xサーバーではない方法をいろいろ調べてみます
    こんなにも面倒を見ていただいたのにすみません。。。

  10. @Kobayashi0620

    Questioner

    何度もすみません
    xserverを何も考えず数年契約してしまい諦められず、あの後も何度かいろいろ調べて(anacondaの削除・再インストールやxserverの初期化など)試してみたところ
    下記コードで

    index.cgi
    #! /home/■■■■■■■■■■/anaconda3/bin/python
    
    print("Content-Type: text/html\n\n")
    print("OK")
    

    /home/■■■■■■■■■■/■■■■■■■■■■.xsrv.jp/public_html/test1の階層で
    (base) [■■■■■■■■■■@sv15043 test1]$ python index.cgiコマンドを実行したところ

    下記出力結果を得られました!

    .出力内容
    Content-Type: text/html
    
    
    OK
    

    ですが、リンクで開くと依然下記画面のままでした、、、
    image.png

    図々しいお願いで恐縮なのですが、もう一度ご教授いただけますと幸いです。
    何卒よろしくお願いいたします。

  11. @Kobayashi0620

    Questioner

    index.cgi があるディレクトリで ./index.cgi を実行して出力が以下であれば正常です。
    こちらの内容はうまくはいきませんでした、、

    /home/■■■■■■■■■■/■■■■■■■■■■.xsrv.jp/public_html/test1の階層で

    (base) [■■■■■■■■■■@sv15043 test1]$ ./index.cgiを実行すると下記内容が出力されてしまいます、、

    -bash: ./index.cgi: /home/■■■■■■■■■■/anaconda3/bin/python^M: 誤ったインタプリタです: そのようなファイルやディレクトリはありません
    
  12. CGI で動かすには python index.cgi ではなく ./index.cgi が成功する必要があります。

    エラーを見るとファイルの改行コードが間違っているようです。テキストエディタで index.cgi を保存するとき、改行コードが選択できるのであれば、 Windows (CRLF) ではなく UNIX (LF) を選べば直ります。

    選べなかったり意味がわからなかったりしたら「テキストエディタ 改行コード」で調査してください。

  13. @Kobayashi0620

    Questioner

    スクリーンショット 2024-06-02 234017.png

    image.png

    スクリーンショット 2024-06-02 233613.png

    両方で確認取れました!!!

    (base) [■■■■■■■■■■@sv15043 test1]$ ./index.cgi
    Content-Type: text/html
    
    
    OK
    

    image.png

  14. 成功したようですね。元々のプログラムも同様に LF で保存すれば動くようになると思います。

  15. @Kobayashi0620

    Questioner

    ありがとうございます
    画面表示成功しました!!!!

Your answer might help someone💌