我的代码位于远程服务器中的/home/ubuntu/api
。 WSGI对象名为app
,它出现在/home/ubuntu/api/api.py
中。我的gunicorn conf文件名为gunicorn.conf.py
,位于/home/ubuntu/api
我的gunicorn.conf.py
import multiprocessing
bind = "127.0.0.1:8000"
workers = multiprocessing.cpu_count() * 2 + 1
backlog = 2048
worker_class = 'gevent'
daemon = True
debug = True
loglevel = 'debug'
accesslog = '/mnt/log/gunicorn_access.log'
errorlog = '/mnt/log/gunicorn_error.log'
max_requests = 1000
graceful_timeout = 20
我正试图通过结构远程启动服务器上的gunicorn。我的结构代码如下所示
@roles('stag_api')
def run_server():
with cd('/home/ubuntu/api'):
sudo('gunicorn -c gunicorn.conf.py api:app')
现在织物没有显示任何错误,但枪炮没有启动。
所以我在__init__.py
中创建/home/ubuntu/api
以使其成为一个包。我在__init__.py
文件
from api import app
这使得WSGI app
在包的命名空间中可用。然后我将我的结构代码更改为此
@roles('stag_api')
def run_server():
sudo('gunicorn -c /home/ubuntu/api/gunicorn.conf.py api:app')
即使现在布料也没有出现任何错误,但枪炮没有启动。
所以我创建了一个名为server
的shell脚本,其代码如下所示
if [ "$1" = "start" ]; then
echo 'starting'
gunicorn -c /home/ubuntu/api/gunicorn.conf.py api:app
fi
if [ "$1" = "stop" ]; then
echo 'stopping'
pkill gunicorn
fi
if [ "$1" = "restart" ]; then
echo 'restarting'
pkill gunicorn
gunicorn -c /home/ubuntu/api/gunicorn.conf.py api:app
fi
我将此shell脚本放在/home/ubuntu/api
现在我的结构代码看起来像这样
@roles('stag_api')
def stag_server(action='restart'):
if action not in ['start', 'stop', 'restart']:
print 'not a valid action. valid actions are start, stop and restart'
return
sudo('./server %s' % action)
现在,当我尝试通过结构启动服务器时,它会打印starting
,因此shell脚本正在执行并且已到达if
块,但仍然无法通过结构启动服务器。 / p>
但如果我ssh到服务器并执行sudo ./server start
,gunicorn就会启动。
有人可以解释我做错了什么吗?
答案 0 :(得分:2)
这很可能与这两个FAQ点有关:
http://www.fabfile.org/faq.html#init-scripts-don-t-work
http://www.fabfile.org/faq.html#why-can-t-i-run-programs-in-the-background-with-it-makes-fabric-hang
答案 1 :(得分:0)
尝试使用以下方式全局设置pty False:
from fabric.api import env
env.always_use_pty = False
或者使用以下命令为该命令设置pty False:
run('run unicorn command etc...' pty=False)
请参阅:
中的Init脚本部分