web-dev-qa-db-ja.com

ubuntu 16.04でnginx、uwsgipython-flaskを使用して「502BadGateway」を取得する

これに従って、Ubuntu 16-04にflaskアプリ(simplehello world)をデプロイします。 デジタルオーシャンチュートリアル

uWSGIサービングのテストまではすべて正常に機能します。その後、説明した手順に従い、最終的に一番下に到達してサーバーのIPアドレスを確認すると、次のようになりました。

502 Bad Gateway

いいよ。エラーログを検索して確認しました。これを取得しました:-

2017/01/16 05:29:27 [crit] 20714#20714: *2 connect() to unix:/home/sajjan/project/project.sock failed (2: No such file or directory) while connecting to upstream, client: xx.9.xxx.xxx, server: 138.xxx.xx.xxx, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", Host: "xx.xx.xx.xx"

そのため、エラーログを取得した後、project.sockファイルを手動で作成しました。もう一度サーバーのIPアドレスに移動し、同じエラー "502 Bad Gateway"

もう一度エラーログを確認し、これを見つけました

2017/01/16 06:07:11 [crit] 20874#20874: *1 connect() to unix:/home/sajjan/project/project.sock failed (13: Permission denied) while connecting to upstream, client: 47.9.237.113, server: XX.XX.XX.XX, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", Host: " XX.XX.XX.XX "

権限の問題を理解し、以下のコマンドを使用して権限を変更しました

Sudo chmod 666 project.sock

今私は許可をチェックしました(ls -lファイル名を使用して)

-rw-rw-rw- 1 root root 0 Jan 16 05:31 project.sock

ここで、サーバーのIPを確認するために戻りますが、同じ「502BadGateway」が見つかりました。もう一度エラーログをチェックして、これを見つけました:

017/01/16 06:13:31 [error] 20897#20897: *6 connect() to unix:/home/sajjan/project/project.sock failed (111: Connection refused) while connecting to upstream, client: 47.9.237.113, server: XX.XX.XX.XX, request: "GET /favicon.ico HTTP/1.1", upstream: "uwsgi://unix:/home/sajjan/project/project.sock:", Host: " XX.XX.XX.XX ", referrer: "http:// XX.XX.XX.XX /"

私は過去2日間にたくさん読んだ上記のエラーをグーグルで検索しましたが、何も機能していないようです。私はこれらの答えをチェックしましたが、助けはありません stackanswer-1stackanswer-2 そしてこれらと一緒に私はすべてのデジタルオーシャンコミュニティスレッドをチェックしましたが何も機能していないようです。

私はサーバーの初心者で、ubuntuについてはあまり知りません。私が何を間違っているのかを見つけるのを手伝ってくれるか、私のflaskアプリケーションをデプロイするためのより良いチュートリアル/方法を提案することができれば、私は素晴らしいでしょう。

これらは私のファイルです

  1. hello.py

    from flask import Flask
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "<h1 style='color:blue'>Hello There!</h1>"
    
    if __name__ == "__main__":
        app.run(Host='0.0.0.0')
    
  2. project.ini

    [uwsgi]
    
    module = wsgi:app
    
    master = true
    
    processes = 5
    
    socket = /home/sajjan/project/project.sock
    
    chmod-socket = 660
    
    vacuum = true
    
    die-on-term = true
    
  3. wsgi.py

    from hello import app
    
    if __name__ == "__main__":
          app.run()
    
  4. 以下はファイルです:/ etc/nginx/sites-available/project

    server {
        listen 80;
        server_name 138.197.28.107;
    
        location / {
            include uwsgi_params;
            uwsgi_pass unix:/home/sajjan/project/project.sock;
        }
    }
    

コマンドを実行すると:

    Sudo service uwsgi restart

出力:

   Failed to restart wsgi.service: Unit wsgi.service not found. 

の出力中

   Sudo service nginx status/restart

次に、これはnginxが実行されていることを示しています。

私を助けてください、あなたが知りたいことが他にあれば、私に知らせてください。ありがとう

編集:

Project.serviceファイルを作成しましたが、その内容は次のとおりです。

    [Unit]
    Description=uWSGI instance to serve project
    After=network.target

    [Service]
    User=sajjan
    Group=www-data
    WorkingDirectory=/home/sajjan/project
    Environment="PATH=/home/sajjan/project/venv/bin"
    ExecStart=/home/sajjan/project/venv/bin/uwsgi --ini project.ini

    [Install]
    WantedBy=multi-user.target

私はコマンドの下で実行する必要があることを理解しました:

    Sudo systemctl start project

出力は:

    Warning: project.service changed on disk. Run 'systemctl daemon-reload' to reload units.

そして私が走るとき

     Sudo systemcl reload project 

次に出力:

    Failed to reload project.service: Job type reload is not applicable for unit project.service.
    See system logs and 'systemctl status project.service' for details.

「systemctlstatusproject.service」を確認すると

     ● project.service - uWSGI instance to serve project
      Loaded: loaded (/etc/systemd/system/project.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Mon 2017-01-16 17:49:29 UTC; 6min ago
      Main PID: 27157 (code=exited, status=203/EXEC)

     Jan 16 17:49:29 learningwithpython systemd[1]: Started uWSGI instance to serve project.
     Jan 16 17:49:29 learningwithpython systemd[1]: project.service: Main process exited, code=exited, status=203/EXEC
     Jan 16 17:49:29 learningwithpython systemd[1]: project.service: Unit entered failed state.
     Jan 16 17:49:29 learningwithpython systemd[1]: project.service: Failed with result 'exit-code'.
9
Sajjjan Kumar

ガイドを使用しても同じ問題が発生しました。私が読んだ限りでは; 502不正なゲートウェイは、Nginxがuwsgiに正しく接続できないことの症状です。ソケットのアクセス許可を変更すると、問題が解決しました。

Sudo chmod 777 /home/sajjan/project/project.sock
Sudo systemctl restart nginx

777は少し過剰ですが、実際にパーミッションに問題があるかどうかを確認するための迅速で汚い方法です

3
Leafbreaker

Nginxにはソケットに書き込む権限がありません。以下のコマンドで適切なモードを付与することは、私を助けました。

chmod 0755 /to/project
1
surge_

https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-16-04 に関するコメントを見ました==

実行してみてくださいSudo /etc/init.d/nginx start次に開いてみてください http:// server_domain_or_IP

動作する場合は、which uwsgiと入力して正しいuwsgiパスを見つけ、「/ etc/systemd/system /myproject.service」を変更します。

変化する

Environment="PATH=/home/sammy/myproject/myprojectenv/bin" ExecStart=/home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.inienvパスではなく実際のパスに。

私はこれらのコマンドを通してこの問題を理解します。

0
Harper Koo

同じ問題。

しかし、666に許可を与えてすべてを再起動すると、機能します。

エラーログには、問題の考えられる原因が1つだけ示されていると思います。一方、journalctl -u <yourproject>.serviceコマンドヘルプは別の理由を提示します。

エラーログには、「myproject.socket」が見つからないことも示されています。しかし、.iniはすでにそれを構築するのに役立ちました。次に、このエラーが発生します:myproject.service:ステップUSERスポーンで失敗しました〜/ bin/uwsgi:そのようなプロセスはありません

だから多分それは許可の問題です。

0
user10379342

多くの人がすでに述べたように、502エラーはソケットのアクセス許可に関するものです(Permission denied/var/log/nginx/error.logエラーが表示される場合があります)。しかし、それはすべてうまくいく必要があるようです。

  1. ソケットのファイル所有権はyour_user:www-dataです
  2. ソケットのファイルパーミッションは660です(つまり、あなたとグループはソケットの読み取り/書き込みができます)
  3. nginxはユーザーwww-data:www-dataで動作します(nginx .confファイルで構成されています)

本当の問題はnginxがホームディレクトリにあるソケットに接続できない

したがって、解決策は簡単です。ソケットファイルを別の場所に移動するだけです。たとえば、/tmp/または/var/www/...フォルダに移動します。


解決策:

ディレクトリを作成する

Sudo mkdir /var/www/your_project
Sudo chown your_user:www-data /var/www/your_project

your_project.iniを変更します

socket = /var/www/your_project/your_project.sock

Nginxサーバーブロックを変更する

uwsgi_pass unix:///var/www/your_project/your_project.sock;

UWSGIとnginxを再起動します

Sudo systemctl restart your_project_service
Sudo systemctl restart nginx

そして、それはすべて今機能しなければなりません。

0
Viacheslav Z

myapp/bin/uwsgi --ini myapp.iniを実行して、uwsgiの実行を妨げる実際のエラーを確認してください。

私の場合、.ini構成ファイルの5つのプロセスは、CPUを処理するのに非常に多く、これがエラー出力でした。

your processes number limit is 3900 your memory page size is 4096 bytes detected max file descriptor number: 1024

この場合、.iniファイルのプロセス数を2に減らすとうまくいく可能性があります。

0