Sanic 部署

Sanic教程 2019-04-21 22:27:09 阅读(15043) 评论(0)

部署Sanic的方法有很多种,可以通过内置的 webserver,也可以通过Gunicorn等。

Sanic deploying 部署应用

内置webserver

定义sanic.Sanic实例后,我们可以使用下面的关键字参数调用run方法:

  • host(默认为127.0.0.1):服务器运行的主机地址;
  • port(默认为8000): 服务器监听的端口;
  • debug(默认为False):是否开启调试模式(会让服务器变慢);
  • ssl(默认为None):开启 SSL 加密;
  • sock(默认为None): 服务器可以介绍来自该 Socket 的连接;
  • workers(默认为1): 需要创建的工作进程的个数;
  • loop(默认为None):一个asyncio兼容的事件循环。如果为none,Sanic则创建自己的事件循环;
  • protocol(默认为HttpProtocol):asyncio.protocol的子类;
  • access_log(默认为True):开启请求处理的日志(显著降低server速度)。

工作进程(Wrokers)

默认情况下,Sanic仅使用一个CPU核心在主进程中进行侦听。 为了提高性能,只需指定运行参数中的工作器数量。


app.run(host='0.0.0.0', port=1337, workers=4)

Sanic将自动启动多个进程并在它们之间路由流量。 我们建议使用与可用内核数相同的工作进程数。

通过命令行运行

如果你喜欢使用命令行参数,可用通过执行sanic模块来启动一个Sanic server。例如,我们在文件server.py中初始化了一个Sanic实例app,可用这样来运行服务器:

python -m sanic server.app --host=0.0.0.0 --port=1337 --workers=4

使用这种方式运行sanic,就不需要在Python文件中调用app.run方法了。如果要调用,确保把它包装在if __name__ == '__main__':中:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=1337, workers=4)

通过Gunicorn运行

Gunicorn(Green Unicorn)是用于Unix的WSGI HTTP服务器。它是从Ruby 的Unicorn项目移植过来的。

为了使用Gunicorn运行Sanic应用程序,我们需要使用sanic.worker.GunicornWorker作为Gunicorn的work-class参数:

gunicorn myapp:app --bind 0.0.0.0:1337 --worker-class sanic.worker.GunicornWorker

如果你的应用程序受尽了内存泄漏之苦,可以配置Gunicorn在它处理完给定数量的请求后自动重启工作进程。这是限制内存泄漏影响的比较方便的方式。

运行在方向代理后面

Sanic可以和反向代理(比如,nginx)一起使用。下面是nginx的简单配置:

server {
  listen 80;
  server_name example.org;

  location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

如果我们想要获取真实的客户端IP,我们可以配置X-Real-IPX-Forwarded-For HTTP头,并且设置app.config.PROXIES_COUNT1。更多信息请阅读Sanic 配置

禁止调试日志

为了提高性能,在run参数中添加debug=Falseaccess_log=False

app.run(host='0.0.0.0', port=1337, workers=4, debug=False, access_log=False)

通过 Gunicorn 运行可以设置环境变量SANIC_ACCESS_LOG="False"

env SANIC_ACCESS_LOG="False" \
gunicorn myapp:app --bind 0.0.0.0:1337 \
--worker-class sanic.worker.GunicornWorker \
--log-level warning

或者是重写app.config:

app.config.ACCESS_LOG = False

异步支持

这种方式适合于我们需要和其它应用程序分享sanic进程,尤其是loop事件循环。然而这种方式不支持多进程,并且通常不是运行sanic应用程序的首选方法。

下面是一个不完全的例子(请查看源代码/examples/run_async.py):

server = app.create_server(host="0.0.0.0", port=8000, return_asyncio_server=True)
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(server)
loop.run_forever()

猿人学banner宣传图

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。

***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.con 原创,没有猿人学授权,请勿以任何形式转载。***

  • 上一篇 >:
  • 下一篇 >:
  • 说点什么吧...