使用nginx和uwsgi在flask中执行post请求时出现内部服务器错误



我正在使用本教程

背景:我正在使用flaskpost API激活硒来提取信息并将其发送到网站。当我不应用nginx配置,只在服务器上运行以下代码时(就像在使用端口5000的本地机器中一样(,这就可以完美地工作。

问题:当我尝试通过nginxuwsgi部署flask应用程序时,按照本教程的指示,每当我执行POST请求http://my_domain/find_data时,我都会收到内部服务器错误

下面我将显示我的部分代码。

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

app.py代码(它管理POST请求http://my_domain/find_data(是:


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)

我的project.ini文件是这样的:

[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = myproject.sock
chmod-socket = 660
vacuum = true
die-on-term = true

最后,我的nginx配置文件是


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液滴Ubuntu 18-0.4 LTS跑步蟒蛇3.10.6我使用了下面的堆栈溢出链接,但关于它们的信息还不够

指南1导轨2

如果我错过了任何信息,请让我知道我会提供。

感谢您的真知灼见

注意文件名

我遵循了相同的教程。

从你的回答中看不出你创建的不同文件的清晰名称。我建议您完全遵循教程,特别是它建议的名称模式(对于文件(。我试着给你一些建议。

  • 文件名:
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.pyuwsgi.py的同一文件夹中创建了Unix套接字文件myproject.sock。事实上,在文件project.ini中,您正在使用以下选项:
socket = 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'(。可能存在其他创建Unix套接字域文件的方法,但我在flank/uwsgi应用程序中使用了以前的Python程序。

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

最新更新