【问题标题】:Internal Server Error while doing post request in flask using nginx and uwsgi使用 nginx 和 uwsgi 在烧瓶中进行发布请求时出现内部服务器错误
【发布时间】:2022-10-24 17:36:14
【问题描述】:

我正在使用这个tutorial

背景:我正在使用flask post api激活selenium以提取信息并发送到网站。当我不应用 nginx 配置并仅在服务器上运行以下代码(如在本地计算机中使用端口 5000)时,它运行良好,但是当我使用 tutorial 部署它时,每当我发布时,我都会收到内部服务器错误请求 http://my_domain/find_data

from app import app
if __name__ == "__main__":
        app.run()

应用代码在这里


from flask import Flask, send_from_directory, stream_with_context, request, Response
from flask_restful import Api, Resource, reqparse
from flask_cors import CORS #comment this on deployment
from data_finder import DataFinder
from time import sleep
from contextlib import closing
import requests
import json 
from flask import jsonify
from flask import jsonify, make_response

app = Flask(__name__, static_url_path='', static_folder='frontend/build')
CORS(app) #comment this on deployment
api = Api(app)


@app.route("/")
def hello():
    return send_from_directory(app.static_folder, 'index.html')

@app.route("/find_data", methods = ['POST'])
def FindData():
    person = request.get_json()['person']
    print(person)
    results = {}
    data_finder = DataFinder()


    results['Spokeo'] = list(data_finder.get_spokeo_data(person))
    results['White Pages'] = list(data_finder.get_whitepages_data(person).keys())

    return make_response(jsonify(results), 200)

我的项目ini文件是这样的:

[uwsgi]
module = wsgi:app

master = true
processes = 5

socket = myproject.sock
chmod-socket = 660
vacuum = true

die-on-term = true

最后我的 nginx.config 文件是


server {
    listen 80;
    server_name my_domain www.my_domain;


    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/help/data-finder/privaseame_web_app/myproject.sock;
        uwsgi_read_timeout 900;
        proxy_read_timeout 1800;
        proxy_connect_timeout 1800;
        proxy_send_timeout 1800;
        send_timeout 1800;
    }

    client_header_timeout 900s;
    client_body_timeout 900s;
    keepalive_timeout 900s;
    send_timeout 900s;
}

我正在使用数字海洋 linux droplet Ubuntu 18-0.4 LTS 运行python3.10.6 我在下面使用了堆栈溢出链接,但有关它们的信息还不够

Guide1 Guide2

如果我错过任何信息,请告诉我我会提供。

感谢您的洞察力

【问题讨论】:

    标签: python linux nginx flask uwsgi


    【解决方案1】:

    我关注了the same tutorial

    从您的回答中不清楚您创建的不同文件的名称。 我建议您完全遵循 the tutorial,尤其是它所建议的名称。 我试着给你一些建议。

    • 您的文件名:
    from app import app
    if __name__ == "__main__":
            app.run()
    

    必须是 uwsgi.py 因为在文件 project.ini 中您使用以下选项:

    [uwsgi]
    module = wsgi:app
    
    • 您的文件名:
    from flask import Flask, send_from_directory, stream_with_context, request, Response
    from flask_restful import Api, Resource, reqparse
    from flask_cors import CORS #comment this on deployment
    from data_finder import DataFinder
    from time import sleep
    from contextlib import closing
    import requests
    import json 
    from flask import jsonify
    from flask import jsonify, make_response
    
    app = Flask(__name__, static_url_path='', static_folder='frontend/build')
    CORS(app) #comment this on deployment
    api = Api(app)
    
    
    @app.route("/")
    def hello():
        return send_from_directory(app.static_folder, 'index.html')
    
    @app.route("/find_data", methods = ['POST'])
    def FindData():
        person = request.get_json()['person']
        print(person)
        results = {}
        data_finder = DataFinder()
    
    
        results['Spokeo'] = list(data_finder.get_spokeo_data(person))
        results['White Pages'] = list(data_finder.get_whitepages_data(person).keys())
    
        return make_response(jsonify(results), 200)
    

    必须是app.py,因为在文件uwsgi.py 中您使用以下指令: from app import app

    • 确保您已在包含app.pymyproject.py 的同一文件夹中创建了Unix 套接字文件myproject.sock。要创建此套接字并为其授予正确的权限,您可以使用以下 python 程序:
    import socket as s
    import pwd
    import grp
    import os
    
    path = './myproject.sock'
    
    # create the `Unix Domain Socket`
    sock = s.socket(s.AF_UNIX)
    sock.bind(path)
    
    # set user and group for the Unix Domain Socket created (www is the same user of NGINX)
    uid = pwd.getpwnam("www").pw_uid
    gid = grp.getgrnam("www").gr_gid
    
    os.chown(path, uid, gid)
    os.chmod(path, 0o660)
    

    将之前的程序保存在您必须创建 Unix 域套接字的文件夹中(参见指令path = './myproject.sock')。

    我希望这些建议对您有用。

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 2020-12-31
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 2015-09-22
      • 2015-07-21
      • 2014-08-06
      • 2012-11-28
      相关资源
      最近更新 更多