部署

使用三个选项之一部署SANIC非常简单:内置Web服务器、ASGi Web服务器或Gunicorn。把sanic放在反向代理后面也是很常见的,比如nginx。

通过sanic webserver运行

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

  • 主机(默认为“127.0.0.1”):服务器的主机地址。

  • 端口(默认8000):承载服务器的端口。

  • 调试(默认为假):启用调试输出(减慢服务器速度)。

  • ssl(默认无):sslcontext,用于工作进程的ssl加密。

  • sock(默认无):服务器接受连接的套接字。

  • workers(默认值1):要生成的工作进程数。

  • 循环(默认无):异步兼容事件循环。如果没有指定,SANIC将创建自己的事件循环。

  • 协议(默认httpprotocol):asyncio.protocol的子类。

  • 访问日志(默认为真):启用登录处理请求(显著降低服务器速度)。

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

在上面的示例中,我们决定关闭访问日志以提高性能。

工人

默认情况下,sanic只使用一个CPU核心在主进程中侦听。要启动果汁,只需在运行参数中指定工人的数量。

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

SANIC将自动旋转多个进程并在它们之间路由流量。我们建议尽可能多的员工使用可用的核心。

通过命令运行

如果您喜欢使用命令行参数,可以通过执行模块来启动SANIC Web服务器。例如,如果在名为server.py的文件中初始化sanic as app,则可以这样运行服务器:

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

通过这种运行sanic的方式,不需要在python文件中调用app.run。如果这样做,请确保包装它,以便它仅在由解释器直接运行时执行。

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

通过ASGi运行

SANIC也符合ASGI。这意味着您可以使用首选的asgi webserver来运行sanic。ASGi的三个主要实现是daphne、uvicorn和hypercorn。

按照他们的文档寻找正确的方法来运行它们,但是它应该看起来像:

daphne myapp:app
uvicorn myapp:app
hypercorn myapp:app

使用asgi时需要注意的几个事项:

  1. 使用SANIC WebServer时,WebSockets将使用WebSockets包运行。在asgi模式下,不需要这个包,因为websockets是在asgi服务器中管理的。

  2. asgi lifespan协议只支持两个服务器事件:启动和关闭。SANIC有四种:启动前、启动后、关机前和关机后。因此,在asgi模式下,启动和关闭事件将连续运行,而不是围绕服务器进程开始和结束(因为现在由asgi服务器控制)。因此,最好在服务器启动后和服务器停止前使用。

  3. 自SANIC V19.6起,ASGi模式仍处于“beta”状态。

通过Gunicorn跑步

gunicorn“green unicorn”是用于Unix的wsgi HTTP服务器。这是一个前叉工人模型移植自Ruby的独角兽项目。

要使用gunicorn运行sanic应用程序,需要使用特殊的sanic.worker.gunicorn worker for gunicorn worker类参数:

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

如果应用程序出现内存泄漏,可以将Gunicorn配置为在处理给定数量的请求后优雅地重新启动工作程序。这是一种帮助限制内存泄漏影响的方便方法。

有关更多信息,请参阅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,您应该为HTTP头配置x-real-ip和x-forwarded-并将app.config.proxys的计数设置为1;有关详细信息,请参见配置页。

为性能禁用调试日志记录

要提高性能,请在运行参数中添加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过程,那么这是合适的。但是,请注意,此方法不支持使用多个进程,并且通常不是运行应用程序的首选方法。

以下是一个不完整的示例(请参阅示例中的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()