Python Web框架Sanic 部署

发表时间:2020-02-18

部署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-IP X-Forwarded-For HTTP头,并且设置 app.config.PROXIES_COUNT 1 。更多信息请阅读 Sanic 配置

禁止调试日志

为了提高性能,在 run 参数中添加 debug=False access_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()

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free