我试图在Amazon-Linux-2上的公共Amazon-Linux-2实例上使用aws-cdk托管一个烧瓶应用程序。
我已经为定制的健康检查端点/healthcheck配置了nginx,我在那里创建了python并安装了gunicorn,并在python中运行了gunicorn --bind 127.0.0.1:5000 wsgi:app,并且能够使用POSTMAN访问端点('/‘for POST方法)。但是,当我试图创建一个myproject.service文件时,问题就出现了。myproject.sock文件是创建的,它拥有所有必要的权限,chmod 755 /home/ec2-user/myproject,systemctl status myproject也说正在运行,但是现在我无法使用POSTMAN访问POST请求。
我的reverse.proxy文件如下-
配置文件/etc/nginx/sites启用/反向-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 "healthy\n";
}
location / {
error_page 405 =200 $uri;
proxy_pass http://127.0.0.1:5000;
}
}其中“/”用于服务来自我的flaskapp.py文件的post请求
这就是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.targetsock文件也已创建并成功运行,但无法命中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工作得很好!
请提供洞察
发布于 2022-09-21 15:44:52
您的NGINX配置指向正在侦听本地主机端口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)拥有足够的权限。
考虑在这里采用对接方式:只为myproject.sock和应该连接到它的客户端创建一个组(即:nginx用户等等)
https://stackoverflow.com/questions/73697686
复制相似问题