connect()在连接到上游时失败(111:连接被拒绝)NGINX,Gunicorn在运行Flask应用程序时



我正试图使用aws-cdkAmazon-Linux-2上的Public EC2实例上托管一个flask应用程序。

我已经为自定义健康检查端点/healthcheck配置了nginx我已经创建了一个python环境,并在那里安装了gunicorn,在我的python环境中运行了gunicorn --bind 127.0.0.1:5000 wsgi:app,并且能够使用POSTMAN到达端点(POST方法为"/"(。但是,当我尝试创建myproject.service文件时,问题就出现了。创建了myproject.sock文件,它具有所有必要的权限chmod 755 /home/ec2-user/myprojectsystemctl status myproject也表示正在运行,但现在我无法使用POSTMAN处理POST请求。

我的reverse.proxy文件如下-

配置文件/etc/nginx/sites-enabled/reverse-proxy.conf:

server {
listen 80;
listen [::]:80;
access_log /var/log/nginx/reverse-access.log;
error_log /var/log/nginx/reverse-error.log;
location /healthcheck {
limit_except GET {
deny all;
}
access_log off;
return 200 "healthyn";
}
location / {
error_page 405 =200 $uri;
proxy_pass http://127.0.0.1:5000;
}
}

其中"/"用于服务来自我的flaskapp.py文件的投递请求

这就是myproject.service文件看起来像的样子

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=ec2-user
WorkingDirectory=/home/ec2-user/myproject
Environment="PATH=/home/ec2-user/myproject/myprojectenv/bin"
ExecStart=/home/ec2-user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app
[Install]
WantedBy=multi-user.target

sock文件也已创建并成功运行,但无法达到POST

这就是我的flaskapp.py的外观

from flask import Flask, request

app = Flask(__name__)
@app.route('/', methods=['POST'])
def handler():
return f''' Hello {request.get_json()['name']}'''

这就是我的wsgi.py看起来的

from myproject import app
if __name__ == "__main__":
app.run(host='127.0.0.1')

我不明白当我运行gunicorn --bind 127.0.0.1:5000 wsgi:app时,我可以点击POST请求,但当我退出gunicorn并尝试创建myproject.service时,我似乎无法点击POST请求。/healthcheck运行良好!

请提供见解

您的NGINX配置指向在localhost端口5000上侦听的服务器,但您的服务在unix套接字myproject.sock上侦听。因此,当您运行服务时,NGINX找不到服务器。

尝试将您的NGINX配置设置为以下内容:

server {
...
location / {
...
proxy_pass http://unix:/path/to/myproject.sock;
}
}

gunicorn在unix套接字上侦听时,例如在您的服务中,这应该会起作用。

您需要确保NGINX能够对unix套接字进行读写操作。运行stat /path/to/myproject.sock并确保NGINX的用户(很可能是nginx(具有足够的权限。

考虑采用docker方式:只为myproject.sock和应该连接到它的客户端(即:nginx用户等(创建一个组

最新更新