在Amazon Linux EC2实例上使用nginx/gunicorn部署Python flask应用程序

在Amazon Linux EC2实例上使用nginx/gunicorn部署Python flask应用程序,python,amazon-ec2,flask,Python,Amazon Ec2,Flask,我正在尝试在AmazonLinuxEC2实例上部署python flask应用程序。我无法启动upstart脚本并使其运行 我遵循本教程(适用于ubuntu): 我的配置文件看起来像:myapp.conf description "Gunicorn application server running myproject" start on runlevel [2345] stop on runlevel [!2345] respawn setuid user setgid www-data

我正在尝试在AmazonLinuxEC2实例上部署python flask应用程序。我无法启动upstart脚本并使其运行

我遵循本教程(适用于ubuntu):

我的配置文件看起来像:myapp.conf

description "Gunicorn application server running myproject"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid user
setgid www-data

env PATH=/home/ec2-user/flask/venv/bin
chdir /home/ec2-user/flask
exec gunicorn --workers 3 --bind unix:app.sock -m 007 wsgi
我的wsgi文件看起来像:wsgi.py

from app import application

if __name__ == "__main__":
    application.run()
我的实际应用程序看起来像:app.py

from flask import Flask
application = Flask(__name__)

@application.route("/")
def hello():
    return ""Hello World"

if __name__ == "__main__":
    application.run(host='0.0.0.0')
当我做一个测试时:

sudo start myapp

我说“未知工作”时出错。我到底要做什么才能让它运行?或者在AmazonLinux实例上是否有其他方法来生成upstart脚本?有人能帮忙吗?我也遇到了同样的问题。经过一些挖掘,这是我发现的

start:Unknown job:myapp
消息表示
Upstart
脚本
myapp.conf
有问题。您可以通过运行
sudotail-n5/var/log/messages

init: /etc/init/myapp.conf:7: Unknown stanza
在这种情况下,它与
setuid
有关。根据,Upstart v1.4中添加了
setuid

现在检查通过运行
initctl--version
安装的
Upstart
的版本。它返回了
initctl(upstart 0.6.5)
,这解释了为什么它不能与AmazonLinux一起工作。不幸的是,似乎没有简单的方法来解决这个问题

作为概念证明,您可以注释掉
setuid
setgid
(我还更改了
--bind
参数)

然后它应该会起作用

sudo start myapp
但是,不建议这样做,因为它将以
root
的方式运行
gunicorn
。而不是使用
setuid
setgid
,而是提到

如果您没有使用Upstart 1.4,那么很容易完成 要求的目标。有几种方法可以使用。这个 Debian和Ubuntu系统的推荐方法是使用helper 实用程序启动停止守护程序(8),如下所示:

exec start-stop守护进程--start-c myuser--exec命令


不幸的是,
start-stop-daemon
在Amazon Linux上也不可用……还有其他可能的替代品,例如
daemon
runuser
,但在这一点上,我认为使用
Upstart
是不值得的。Gunicorn有很多。我最终使用了。

在撰写本文时,使用
gunicorn 19.9.0
,可以使用
gunicorn
命令指定参数
--user
--group
。因此,为了在具有upstart 0.6.5(即
ec2用户:nginx
)的amazon linux上以非root用户身份运行gunicorn wsgi服务器,您可以在upstart脚本的exec节中指定以下内容(此示例使用unix套接字,但
地址:端口
也可以使用:

exec gunicorn--user ec2 user--group nginx--bind socket.sock wsgi

另外,在您的情况下,当前在amazon linux yum repo中的nginx版本不使用group
www data
或root目录
/var/www/html
。这是它在ubuntu apt repo中的存在方式,旨在模仿apache。相反,amazon linux yum repo使用group
nginx
和root目录ectory
/usr/share/nginx/html
。您可以将系统设置为模仿ubuntu,但这不是默认设置。在这种情况下,只需使用:


exec gunicorn--user ec2 user--group www data--bind socket.sock wsgi

嘿,我现在面临同样的问题。你对此有解决方案吗?提前谢谢。@das如下:我最后也使用了Supervisor。很抱歉,我在这篇文章上看到了这个更新/评论。使用Supervisor更容易。发布了一个新的答案来解决这个问题如何将gunicorn进程的uid和gid设置为root以外的值。本质上,gunicorn提供了如下内容:
exec gunicorn--user ec2 user--group www data--bind socket.sock wsgi
。我认为这比Supervisor容易,但其他wsgi web服务器可能不提供此选项,因此Supervisor可能是更好的选择这些选择。
sudo start myapp