部署Sanic的方法有很多种,可以通过内置的 webserver,也可以通过Gunicorn等。
内置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()

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。
***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.con 原创,没有猿人学授权,请勿以任何形式转载。***
说点什么吧...