在我的 configuration.nix 中,它显示
services.nginx.enable=true;
services.nginx.httpConfig="a";
(我尝试了一个普通文件和空字符串,但都没有起作用)
运行时nixos-rebuild switch
,它显示服务器已启动,但curl localhost
连接拒绝。
当我nginx
从命令行运行时,它会响应could not open error log file: open() "/nix/store/HASHHERE-nginx-1.8.1/logs/error.log failed", read only filesystem
。
我查看了那里的 conf 文件/nix/store/HASHHERE-nginx-1.8.1/conf/nginx.conf
,它与默认的相同!('diff nginx.conf nginx.conf.default'
返回一个空白行)。
为什么不services.nginx.httpConfig
更改配置文件?
答案1
它确实会更改配置文件,但配置文件不会写入 nginx 包中。相反,它会被写入新位置的新文件。
一开始我也有点困惑。我发现记住 nix 存储反映了 nix 函数式语言的纯粹性会很有帮助 - 当你更改某些内容时,原始副本应该保持不变,而是会创建一个新的副本并结合任何更改(正是这个属性支持即时回滚)。你的 nginx 配置也是如此 - 永远不会触及包,而是会创建一个新的配置文件。
正如 Rok 所说,您可以使用 快速检查配置文件的位置systemd status
。您还可以阅读 nginx 模块的配置部分,了解整个过程是如何实现的。在这种情况下,您将看到您的nginx.httpConfig
文本被写入 中的 configFile /nix/store/HASHHERE-nginx.conf
。然后,该文件通过其 -c 选项直接传递给您的 nginx 二进制文件。因此,nginx systemd unit execStart 命令就像${pkgs.nginx}/bin/nginx -c ${configFile}..
PS 这也是为什么你的 curl 返回拒绝连接的原因 - 因为你的 nginx 配置只是 'a'!默认服务器位于 nginx 包中,但完全没有被引用(我遇到了完全相同的事情)。