配置

任何相当复杂的应用程序都需要未融入实际代码的配置。不同环境或安装的设置可能不同。

基础

SANIC将配置保存在应用程序对象的config属性中。配置对象只是一个可以使用点标记法或类似字典进行修改的对象:

app = Sanic('myapp')
app.config.DB_NAME = 'appdb'
app.config.DB_USER = 'appuser'

由于config对象实际上是一个字典,因此可以使用它的update方法一次设置多个值:

db_settings = {
    'DB_HOST': 'localhost',
    'DB_NAME': 'appdb',
    'DB_USER': 'appuser'
}
app.config.update(db_settings)

一般来说,约定只使用大写配置参数。下面描述的加载配置的方法只查找这样的大写参数。

正在加载配置

有几种方法可以加载配置。

从环境变量

定义的任何变量 SANIC_ 前缀将应用于sanic配置。例如,设置sanic_request_timeout将由应用程序自动加载并输入request_timeout config变量。您可以将不同的前缀传递给sanic:

app = Sanic(load_env='MYAPP_')

那么上面的变量就是myapp请求超时。如果要禁用从环境变量加载,可以将其设置为false:

app = Sanic(load_env=False)

来自对象

如果有很多配置值,并且它们有合理的默认值,那么将它们放入模块可能会有所帮助:

import myapp.default_settings

app = Sanic('myapp')
app.config.from_object(myapp.default_settings)

或者通过路径配置:

app = Sanic('myapp')
app.config.from_object('config.path.config.Class')

也可以使用类或任何其他对象。

从文件中

通常,您需要从不是分布式应用程序一部分的文件中加载配置。您可以使用from_pyfile(/path/to/config_file)从文件加载配置。但是,这需要程序知道配置文件的路径。因此,您可以在环境变量中指定配置文件的位置,并告诉sanic使用该位置来查找配置文件:

app = Sanic('myapp')
app.config.from_envvar('MYAPP_SETTINGS')

然后,您可以使用myapp_settings环境变量集运行应用程序:

$ MYAPP_SETTINGS=/path/to/config_file python3 myapp.py
INFO: Goin' Fast @ http://0.0.0.0:8000

配置文件是常规的python文件,它们是为了加载它们而执行的。这允许您使用任意逻辑来构造正确的配置。配置中只添加大写变量。最常见的配置包括简单的键值对:

# config_file
DB_HOST = 'localhost'
DB_NAME = 'appdb'
DB_USER = 'appuser'

内置配置值

开箱即用,只有几个预定义的值可以在创建应用程序时被覆盖。

| Variable                  | Default           | Description                                                                 |
| ------------------------- | ----------------- | --------------------------------------------------------------------------- |
| REQUEST_MAX_SIZE          | 100000000         | How big a request may be (bytes)                                            |
| REQUEST_BUFFER_QUEUE_SIZE | 100               | Request streaming buffer queue size                                         |
| REQUEST_TIMEOUT           | 60                | How long a request can take to arrive (sec)                                 |
| RESPONSE_TIMEOUT          | 60                | How long a response can take to process (sec)                               |
| KEEP_ALIVE                | True              | Disables keep-alive when False                                              |
| KEEP_ALIVE_TIMEOUT        | 5                 | How long to hold a TCP connection open (sec)                                |
| GRACEFUL_SHUTDOWN_TIMEOUT | 15.0              | How long to wait to force close non-idle connection (sec)                   |
| ACCESS_LOG                | True              | Disable or enable access log                                                |
| PROXIES_COUNT             | -1                | The number of proxy servers in front of the app (e.g. nginx; see below)     |
| FORWARDED_FOR_HEADER      | "X-Forwarded-For" | The name of "X-Forwarded-For" HTTP header that contains client and proxy ip |
| REAL_IP_HEADER            | "X-Real-IP"       | The name of "X-Real-IP" HTTP header that contains real client ip            |

不同的超时变量:

REQUEST_TIMEOUT

请求超时度量将新的打开的TCP连接传递到SANIC后端服务器时的即时时间与接收到整个HTTP请求时的即时时间之间的持续时间。如果所用的时间超过请求超时值(以秒为单位),这将被视为客户端错误,因此SANIC生成HTTP 408响应并将其发送到客户端。如果您的客户机经常传递非常大的请求有效负载或非常慢地上载请求,请将此参数的值设置得更高。

RESPONSE_TIMEOUT

响应超时度量SANIC服务器将HTTP请求传递到SANIC应用程序和将HTTP响应发送到客户端之间的时间间隔。如果所用的时间超过响应超时值(以秒为单位),这将被视为服务器错误,因此SANIC生成HTTP 503响应并将其发送到客户端。如果您的应用程序可能有延迟响应生成的长时间运行的进程,请将此参数的值设置得更高。

KEEP_ALIVE_TIMEOUT

什么是活的?那么keep-alive超时值的作用是什么呢?

keep alive是HTTP 1.1中引入的一个HTTP功能。在发送HTTP请求时,客户机(通常是Web浏览器应用程序)可以设置keep-alive头来指示HTTP服务器(SANIC)在发送响应后不关闭TCP连接。这允许客户机重用现有的TCP连接来发送后续的HTTP请求,并确保客户机和服务器的网络通信更高效。

在sanic中,keep_-alive配置变量默认设置为true。如果在应用程序中不需要此功能,请将其设置为false,以便在发送响应后立即关闭所有客户端连接,而不考虑请求上的keep-alive头。

服务器保持TCP连接打开的时间由服务器本身决定。在sanic中,该值是使用keep_-alive_超时值配置的。默认设置为5秒。这是与ApacheHTTP服务器相同的默认设置,在允许客户机有足够的时间发送新请求和不同时打开太多连接之间是一个很好的平衡。不要超过75秒,除非您知道您的客户机使用的浏览器支持长时间保持打开的TCP连接。

供参考:

Apache httpd server default keepalive timeout = 5 seconds
Nginx server default keepalive timeout = 75 seconds
Nginx performance tuning guidelines uses keepalive = 15 seconds
IE (5-9) client hard keepalive limit = 60 seconds
Firefox client hard keepalive limit = 115 seconds
Opera 11 client hard keepalive limit = 120 seconds
Chrome 13+ client keepalive limit > 300+ seconds

关于代理服务器和客户端IP

当使用反向代理服务器(例如nginx)时,request.ip的值将包含代理的IP,通常为127.0.0.1。为了确定真正的客户机IP,使用x-forwarded-for和x-real-ip HTTP头。但是如果这些头没有被代理覆盖,客户机可以伪造它们。SANIC有一组选项来确定这些头文件中的可信度。

  • 如果您只有一个代理,请将代理计数设置为1。然后sanic将使用x-real-ip(如果可用)或x-forwarded-for的最后一个IP。

  • 如果您有多个代理,请将代理计数设置为其数量,以允许SANIC从x-forwarded-for中选择正确的IP。

  • 如果不使用代理,请将代理计数设置为0以忽略这些头并防止IP篡改。

  • 如果不使用x-real-ip(例如,代理只发送x-forwarded-for),请将real-ip-u头设置为空字符串。

实际IP将在request.remote_addr中提供。如果HTTP头不可用或不受信任,则request.remote_addr将为空字符串;在这种情况下,请改用request.ip。