В моем файле 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
изменить файл конфигурации?
Это действительно меняет файл конфигурации, но файл конфигурации не записывается в пакет nginx. Вместо этого он записывается в новый файл в новом месте.
Поначалу это меня тоже немного смутило. Я счел полезным разобраться в этом, вспомнив, что хранилище nix отражает чистоту функционального языка nix - когда вы что-то меняете, исходная копия должна оставаться такой же, вместо этого создается новая копия в сочетании с любыми изменениями (это свойство поддерживающий мгновенный откат). То же самое и с вашей конфигурацией nginx - пакет никогда не трогается, вместо этого создается новый файл конфигурации.
Как говорит Рок, вы можете быстро проверить, где находится файл конфигурации, с помощью systemd status
. Вы также можете прочитать раздел конфигурации для модуля nginx, чтобы увидеть, как все это реализовано. В этом случае вы увидите, что ваш nginx.httpConfig
текст записывается в файл конфигурации в /nix/store/HASHHERE-nginx.conf
. Затем этот файл передается напрямую в ваш двоичный файл nginx через параметр -c. Итак, команда execStart модуля nginx systemd похожа на ${pkgs.nginx}/bin/nginx -c ${configFile}..
PS именно поэтому ваш curl возвращает отказ в соединении - потому что ваша конфигурация nginx просто 'a'! Сервер по умолчанию находится в пакете nginx, но на него нет ссылок (то же самое произошло и со мной).