これに従って、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アプリケーションをデプロイするためのより良いチュートリアル/方法を提案することができれば、私は素晴らしいでしょう。
これらは私のファイルです
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')
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
wsgi.py
from hello import app
if __name__ == "__main__":
app.run()
以下はファイルです:/ 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'.
ガイドを使用しても同じ問題が発生しました。私が読んだ限りでは; 502不正なゲートウェイは、Nginxがuwsgiに正しく接続できないことの症状です。ソケットのアクセス許可を変更すると、問題が解決しました。
Sudo chmod 777 /home/sajjan/project/project.sock
Sudo systemctl restart nginx
777は少し過剰ですが、実際にパーミッションに問題があるかどうかを確認するための迅速で汚い方法です
Nginxにはソケットに書き込む権限がありません。以下のコマンドで適切なモードを付与することは、私を助けました。
chmod 0755 /to/project
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.ini
envパスではなく実際のパスに。
私はこれらのコマンドを通してこの問題を理解します。
同じ問題。
しかし、666に許可を与えてすべてを再起動すると、機能します。
エラーログには、問題の考えられる原因が1つだけ示されていると思います。一方、journalctl -u <yourproject>.service
コマンドヘルプは別の理由を提示します。
エラーログには、「myproject.socket」が見つからないことも示されています。しかし、.iniはすでにそれを構築するのに役立ちました。次に、このエラーが発生します:myproject.service:ステップUSERスポーンで失敗しました〜/ bin/uwsgi:そのようなプロセスはありません
だから多分それは許可の問題です。
多くの人がすでに述べたように、502エラーはソケットのアクセス許可に関するものです(Permission denied
に/var/log/nginx/error.log
エラーが表示される場合があります)。しかし、それはすべてうまくいく必要があるようです。
your_user:www-data
です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
そして、それはすべて今機能しなければなりません。
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に減らすとうまくいく可能性があります。