[英]Deploying Python flask application using nginx/gunicorn on Amazon Linux EC2 instance
我正在尝试在 Amazon Linux EC2 实例上部署一个 python Flask 应用程序。 我无法启动 upstart 脚本并让它运行。
我正在关注本教程(适用于 ubuntu): https : //www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-14- 04
我的配置文件看起来像: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
我收到一条错误消息,提示未知工作。 我到底需要做什么才能让它运行? 或者有没有其他方法可以在 Amazon Linux 实例上制作新贵脚本? 有人可以帮忙吗
我也遇到了同样的问题。 经过一番挖掘,这是我发现的。
start: Unknown job: myapp
消息表明Upstart
脚本myapp.conf
。 您可以通过运行sudo tail -n 5 /var/log/messages
来检查日志
init: /etc/init/myapp.conf:7: Unknown stanza
在这种情况下,它与setuid
有问题。 根据Upstart 文档,在 Upstart v1.4 中添加了setuid
。
现在通过运行initctl --version
检查安装的Upstart
initctl --version
。 它返回了initctl (upstart 0.6.5)
,这解释了为什么它不适用于 Amazon Linux。 不幸的是, 升级 Upstart似乎没有简单的方法。
作为概念证明,您可以将setuid
和setgid
注释掉(我还更改了--bind
参数)
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 0.0.0.0:8000 wsgi
然后它应该工作
sudo start myapp
但是,不建议这样做,因为它会以root
身份运行gunicorn
。 而不是使用setuid
和setgid
, 新贵文档提到
如果您不使用 Upstart 1.4,则很容易实现所需的目标。 您可以使用几种方法。 Debian 和 Ubuntu 系统的推荐方法是使用 helper 实用程序 start-stop-daemon(8),如下所示:
exec start-stop-daemon --start -c myuser --exec command
不幸的是,亚马逊 Linux 上也没有start-stop-daemon
......还有其他可能的替代品,例如daemon
和runuser
,但在这一点上,我认为不值得追求使用Upstart
。 Gunicorn
还有许多其他监控选项。 我最终改用了Supervisor
。
在编写这本书的时候,使用gunicorn 19.9.0
,有参数--user
和--group
可与指定gunicorn
命令。 因此,为了使用 upstart 0.6.5(即ec2-user:nginx
)在 amazon linux 上以非 root 用户身份运行您的 gunicorn wsgi 服务器,您可以在您的 upstart 脚本的 exec 节中指定它,如下所示(此示例使用unix 套接字但address:port
也可以工作:
exec gunicorn --user ec2-user --group nginx --bind socket.sock wsgi
此外,在您的情况下,当前在 amazon linux yum repo 中的 nginx 版本不使用组www-data
或根目录/var/www/html
。 这是它存在于 ubuntu apt 存储库中的方式,旨在模仿 apache。 相反,amazon linux yum repo 使用组nginx
和根目录/usr/share/nginx/html
。 您可以将系统设置为模仿 ubuntu,但这不是默认设置。 在这种情况下,只需使用:
exec gunicorn --user ec2-user --group www-data --bind socket.sock wsgi
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.