在Amazon Linux EC2实例上使用nginx/gunicorn部署Python flask应用程序
我正在尝试在AmazonLinuxEC2实例上部署python flask应用程序。我无法启动upstart脚本并使其运行 我遵循本教程(适用于ubuntu): 我的配置文件看起来像:myapp.conf在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
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版本不使用groupwww data
或root目录/var/www/html
。这是它在ubuntu apt repo中的存在方式,旨在模仿apache。相反,amazon linux yum repo使用groupnginx
和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