繁体   English   中英

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

[英]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似乎没有简单的方法。

作为概念证明,您可以将setuidsetgid注释掉(我还更改了--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 而不是使用setuidsetgid新贵文档提到

如果您不使用 Upstart 1.4,则很容易实现所需的目标。 您可以使用几种方法。 Debian 和 Ubuntu 系统的推荐方法是使用 helper 实用程序 start-stop-daemon(8),如下所示:

exec start-stop-daemon --start -c myuser --exec command

不幸的是,亚马逊 Linux 上也没有start-stop-daemon ......还有其他可能的替代品,例如daemonrunuser ,但在这一点上,我认为不值得追求使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM