簡體   English   中英

Flask + gunicorn 代理設置?

[英]Flask + gunicorn proxy setup?

我嘗試將 Flask、gunicorn 和 nginx 連接在一起,但最終得到 400 個錯誤請求和 500 個錯誤。 希望任何人都可以提供幫助。

nginx配置文件

server {
    listen 8000;
    server_name 127.0.0.1;

    location /Hello {
        uwsgi_pass 127.0.0.1:8081;
    }
}

wsgi.py 片段:

from app import app

app.run(host="127.0.0.1", port=8081)

應用程序

app = Flask(__name__)
app.secret_key = "Not A Secret Anymore By Now"

@app.route('/Hello')
def hello():
  return("Hello")


#if __name__ == "__main__":
#  app.run(host='0.0.0.0', port=8000)

運行命令

export FLASK_APP=app
export FLASK_ENV=development
gunicorn --bind 0.0.0.0:8081 wsgi:app

測試用例

  1. curl http://localhost/ >>> 返回 nginx 主頁
  2. curl http://localhost/Hello >>> 返回 404 Not found
  3. curl http://localhost:8000/ >>> 返回nginx主頁
  4. curl http://localhost:8000/Hello >>> 返回 502 Bad Gateway
  5. curl http://localhost:8081 >>> 返回連接被拒絕

我試圖讓測試用例工作,但不知道為什么會出現錯誤,(nginx 重新啟動)。

謝謝你。

這里有幾個問題...

您的視圖函數結束時沒有返回語句,這可能是第一個 500 錯誤的原因。 更好的使用:

@app.route('/Hello')
def hello():
  print("Hello")
  return 'success'

此外,當您提到uwsgi.py是 emtpy 時,那里沒有要導入的應用程序對象。 最好將 gunicorn 命令指向有效的應用程序對象:

gunicorn --bind 0.0.0.0:8081 app:app

此外,nginx 位置塊希望請求轉到http://example.com/Hello/Hello 所以最好像下面這樣制作位置塊。 (還要確保端口與您向 gunicorn 的--bind標志提供的端口相同)。

location / {
    proxy_pass http://127.0.0.1:8081;
}

在這里,我還根據gunicorn 部署(使用 nginx)文檔使用了proxy_pass

現在請求應該有效:

# Direct to app server...
curl -i  http://localhost:8081/Hello
HTTP/1.1 200 OK
Server: gunicorn/20.0.4
# ...
success

並且:

# Via nginx:
curl -i http://localhost/Hello
HTTP/1.1 200 OK
Server: nginx
...
success

請注意,在所有接口 (0.0.0.0) 上運行 gunicorn 意味着如果沒有防火牆防止這種情況發生,外部請求可以直接到達應用服務器(繞過 nginx)。 可能值得將 gunicorn 綁定到本地接口: --bind 127.0.0.1:8081

通常還要小心,在自己配置這樣的東西時,有很多方法可以使安全性失誤。 祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM