任何相当复杂的应用程序都需要未融入实际代码的配置。不同环境或安装的设置可能不同。
基础
Sanic在 config 应用程序对象的属性。配置对象只是一个对象,可以使用点符号或类似字典进行修改:
app = Sanic('myapp') app.config.DB_NAME = 'appdb' app.config['DB_USER'] = 'appuser'
由于config对象具有从dictionary继承的类型,因此可以使用 update
方法一次设置多个值:
db_settings = { 'DB_HOST': 'localhost', 'DB_NAME': 'appdb', 'DB_USER': 'appuser' } app.config.update(db_settings)
一般来说,约定只使用大写配置参数。下面描述的加载配置的方法只查找这样的大写参数。
正在加载配置
有几种方法可以加载配置。
从环境变量
定义的任何变量 SANIC_ 前缀将应用于sanic配置。例如,设置 SANIC_REQUEST_TIMEOUT 将由应用程序自动加载并馈送到 REQUEST_TIMEOUT 配置变量。可以向Sanic传递不同的前缀:
app = Sanic(__name__, load_env='MYAPP_')
那么上面的变量是 MYAPP_REQUEST_TIMEOUT . 如果要禁用从环境变量加载,可以将其设置为 False 而是:
app = Sanic(__name__, load_env=False)
从文件、dict或任何对象(具有 __dict__ 属性)。
您可以将应用程序配置存储在:(1)Python文件、(2)字典或(3)其他类型的自定义对象中。
为了从ove加载配置,可以使用 app.upload_config()
.
1) 从文件
假设你有 my_config.py
文件如下所示:
# my_config.py A = 1 B = 2
从该文件加载配置非常简单:
app.update_config("/path/to/my_config.py")
您也可以在这里的路径名中使用环境变量。
假设您有这样一个环境变量:
$ export my_path="/path/to"
然后你可以这样使用它:
app.update_config("${my_path}/my_config.py")
注解
请记住,您必须以${environment_variable}格式提供环境变量,$environment_variable没有展开(被视为“纯”文本)。
2) 从dict
您还可以通过提供 dict
:
d = {"A": 1, "B": 2} app.update_config(d)
3) From _any_ object
应用程序配置可以从对象获取。在内部,它使用 __dict__
检索键和值。
例如,传递类:
class C: A = 1 B = 2 app.update_config(C)
或者,可以实例化:
c = C() app.update_config(c)
- 从一个物体(具有 __dict__ 属性)
来自对象
注解
已弃用,将在21.3版中删除。
如果有很多配置值,并且它们有合理的默认值,那么将它们放入模块可能会有所帮助:
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')
也可以使用类或任何其他对象。
从文件中
注解
已弃用,将在21.3版中删除。
通常,您需要从不是分布式应用程序一部分的文件加载配置。您可以使用 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'
内置配置值
开箱即用,只有几个预定义的值可以在创建应用程序时被覆盖。注意,如果在ASGI模式下运行,websocket配置值不会有任何影响。
变量 | 违约 | 描述 |
---|---|---|
REQUEST_MAX_SIZE | 100000000 | 请求的大小(字节) |
REQUEST_BUFFER_QUEUE_SIZE | 100 | 请求流缓冲区队列大小 |
REQUEST_TIMEOUT | 60 | 请求到达需要多长时间(秒) |
RESPONSE_TIMEOUT | 60 | 处理响应需要多长时间(秒) |
KEEP_ALIVE | 对 | 禁用“假时保持活动” |
KEEP_ALIVE_TIMEOUT | 5 | 保持TCP连接打开的时间(秒) |
WEBSOCKET_MAX_SIZE | 2^20分 | 传入消息的最大大小(字节) |
WEBSOCKET_MAX_QUEUE | 32 | 保存传入消息的队列的最大长度 |
WEBSOCKET_READ_LIMIT | 2^16年 | 传入字节的缓冲区上限 |
WEBSOCKET_WRITE_LIMIT | 2^16年 | 传出字节的缓冲区上限 |
WEBSOCKET_PING_INTERVAL | 20 | 每隔Ping峎间隔秒发送一个Ping帧。 |
WEBSOCKET_PING_TIMEOUT | 20 | 当ping嫒超时秒后未接收到Pong时,连接关闭 |
GRACEFUL_SHUTDOWN_TIMEOUT | 15.0 | 强制关闭非空闲连接的等待时间(秒) |
ACCESS_LOG | 对 | 禁用或启用访问日志 |
FORWARDED_SECRET | 没有 | 用于安全地标识特定的代理服务器(见下文) |
PROXIES_COUNT | 没有 | 应用程序前面的代理服务器数量(例如nginx;请参见下文) |
FORWARDED_FOR_HEADER | “X-转发-For” | 包含客户端和代理ip的“X-Forwarded-For”HTTP头的名称 |
REAL_IP_HEADER | 没有 | 包含真实客户端IP的“X-Real-IP”HTTP头的名称 |
不同的超时变量:
REQUEST_TIMEOUT
请求超时测量将新的打开的TCP连接传递到Sanic后端服务器与接收到整个HTTP请求之间的时间间隔。如果花费的时间超过 REQUEST_TIMEOUT 值(以秒为单位),这被视为客户端错误,因此Sanic生成 HTTP 408 响应并将其发送到客户端。如果您的客户机经常传递非常大的请求有效负载或上传请求非常慢,请将此参数的值设置得更高。
RESPONSE_TIMEOUT
响应超时测量从Sanic服务器将HTTP请求传递到Sanic应用程序,到将HTTP响应发送到客户端之间的持续时间。如果花费的时间超过 RESPONSE_TIMEOUT 值(以秒为单位),这被视为服务器错误,因此Sanic生成 HTTP 503 响应并将其发送到客户端。如果应用程序可能具有延迟响应生成的长时间运行进程,请将此参数的值设置得更高。
KEEP_ALIVE_TIMEOUT
什么是活的?那么keep-alive超时值的作用是什么呢?
Keep-Alive 是在 HTTP 1.1 . 当发送HTTP请求时,客户端(通常是web浏览器应用程序)可以设置 Keep-Alive 头,指示http服务器(Sanic)在发送响应后不关闭TCP连接。这允许客户端重用现有的TCP连接来发送后续的HTTP请求,并确保客户端和服务器的网络通信更有效。
这个 KEEP_ALIVE 配置变量设置为 True 默认情况下在Sanic。如果应用程序中不需要此功能,请将其设置为 False 使所有客户端连接在发送响应后立即关闭,而不管 Keep-Alive 请求的头。
服务器保持TCP连接打开的时间由服务器本身决定。在Sanic中,该值使用 KEEP_ALIVE_TIMEOUT 价值。默认设置为5秒。这是与Apache HTTP服务器相同的默认设置,在允许客户端有足够的时间发送新请求和不同时打开太多连接之间有很好的平衡。不要超过75秒,除非你知道你的客户端正在使用一个支持TCP连接保持打开的浏览器。
供参考:
- Apache httpd服务器默认keepalive超时=5秒
- Nginx服务器默认keepalive超时=75秒
- Nginx性能调整指南使用keepalive=15秒
- IE(5-9)客户端硬保持限制=60秒
- Firefox客户端硬keepalive限制=115秒
- Opera 11客户端硬保持限制=120秒
- Chrome13+客户端keepalive限制>300+秒
代理服务器配置
当您使用反向代理服务器(例如nginx)时 request.ip 将包含代理的ip,通常 127.0.0.1 . Sanic可以配置为使用代理报头来确定真正的客户端IP,可用作 request.remote_addr . 完整的外部URL也由头字段构造(如果可用)。
如果没有适当的预防措施,恶意客户端可能会使用代理头欺骗自己的IP。为了避免此类问题,Sanic不使用任何代理头,除非显式启用。
反向代理背后的服务必须配置 FORWARDED_SECRET , REAL_IP_HEADER 和/或 PROXIES_COUNT .
转发头
- 集合 FORWARDED_SECRET 到感兴趣的代理使用的标识符。
机密用于安全地标识特定的代理服务器。上面的标题,秘密 Pr0xy would use the information on the first line and secret _ 1234proxy将使用第二行。这个秘密必须与 `secret or by. A secret in by must begin with an underscore and use only characters specified in RFC 7239 section 6.3 ,同时 secret 没有这样的限制。
Sanic忽略没有密钥的任何元素,如果没有设置密钥,它甚至不会解析头。
一旦找到受信任的转发元素,所有其他代理头都将被忽略,因为它已经包含了有关客户端的完整信息。
传统代理头
- 集合 REAL_IP_HEADER 到 x-real-ip , true-client-ip , cf-connecting-ip 或此类标题的其他名称。
- 集合 PROXIES_COUNT 中预期的条目数 x-forwarded-for (名称可通过 FORWARDED_FOR_HEADER )
如果通过这些方法之一找到客户端IP,Sanic将以下头用于URL部分:
- x-forwarded-proto , x-forwarded-host , x-forwarded-port , x-forwarded-path 如果有必要, x-scheme .
如果使用代理配置。。。
- 支持 forwarded :设置 FORWARDED_SECRET 到代理在头中插入的值
- Apache流量服务器: CONFIG proxy.config.http.insert_forwarded STRING for|proto|host|by=_secret
- NGHTTPX公司: nghttpx –add-forwarded=for,proto,host,by –forwarded-for=ip –forwarded-by=_secret
- NGINX公司: Nginx部署 .
- 具有客户端IP:集的自定义头 REAL_IP_HEADER 到那个标题的名字
- x-forwarded-for :设置 PROXIES_COUNT 到 1 对于单个代理,或允许Sanic选择正确IP的更大数字
- 无代理:无需配置!
Sanic的变化19.9
早期的Sanic版本具有不安全的默认设置。从19.9开始,必须手动设置代理设置,并且已删除对负代理计数的支持。