[英]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.