nginx 常见问题解答有没有一种正确的方法来使用 nginx 变量来缩短配置部分,将它们用作宏来使部分配置作为模板工作?)说(粗体是我的):
问:是否有适当的方法使用 nginx 变量来缩短配置部分,将它们用作宏以使部分配置作为模板工作?
A:变量不应该用作模板宏。变量在处理每个请求期间在运行时进行评估,因此与普通静态配置相比,它们的成本相当高。使用变量来存储静态字符串也是一个坏主意。相反,应该使用宏扩展和“包含”指令来更轻松地生成配置,并且可以使用外部工具来完成,例如 sed + make 或任何其他常见的模板机制。
add_header Content-Security-Policy
例如,为了更好的可读性,我使用的是一个超长的:
set $CSP "default-src 'none'";
set $CSP "${CSP}; connect-src 'self'";
set $CSP "${CSP}; script-src 'self' https://*.domain.org 'unsafe-inline' 'unsafe-eval'";
set $CSP "${CSP}; style-src 'self' https://*.domain.org 'unsafe-inline'";
set $CSP "${CSP}; img-src 'self' data: https://*.domain.org";
set $CSP "${CSP}; font-src 'self' https://*.domain.org";
## CSP closing colon.
set $CSP "${CSP};";
add_header Content-Security-Policy "$CSP";
适当地使用变量会对 nginx 性能产生多大影响?是否有关于该主题的任何性能测试/研究?
想象一下您必须从内存或运行时获取并保存变量的每个请求,您需要花费多少时间和内存?也许如果你有几个请求它并不重要,但如果你有这么多请求它会非常重要
它就像一个开放的静态普通文件与一个动态文件。没有什么比直接访问普通文件更快的了。
在您的情况下,您使用一个变量然后设置它很多次。由于缺乏基础设施,我无法使用 Nginx 它自己进行基准测试,但我想分享适用于您的案例的 PHP 脚本的基准测试。
您要设置此文本:
使用 PHP,您可以使用以下代码进行设置:
但是由于某些原因,您要在设置实际输出之前设置多次。所以代码将是这样的:
我使用循环运行第一个代码 1000 万次,耗时0.0725793838500982 秒,第二个代码耗时1.049282026290894 秒。所以第二个代码大约慢了 15 倍。它只显示请求时间基准,而不是内存、CPU、磁盘或任何其他资源使用基准。也许第二个代码也会比第一个代码占用更多的资源。
就像它发生在 PHP 中一样,它也会发生在 Nginx 运行时。正如 Nginx 文档所说,使用变量存储静态字符串是昂贵的,也是一个坏主意。如果它与上面的 PHP 类比相同,则成本要慢 15 倍
您应该对配置本身进行基准测试,因为您的特定设置中的许多因素都会影响减速。
因此,首先在一次设置所需 CSP 的位置设置配置。
使用例如 Siege 对配置进行基准测试:https ://github.com/JoeDog/siege
然后,像您的问题一样设置配置,然后再次运行相同的基准测试。
这样您就可以为您的设置获得准确的答案。
无论如何,我建议您使用 Ansible、Chef 或 Puppet 等配置管理系统构建配置文件。在源代码中,您可以随意拆分行,但最终结果对于 nginx 来说是最佳的。