You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NixOS的vhost.nix中循环创建指定用户?

Nix自定义模块中循环生成用户配置的解决方案

要实现像配置httpd.virtualHosts那样循环添加用户,你可以利用Nix的属性集处理函数自动生成用户配置,替代手动逐个定义的方式。

修改后的vhosts.nix完整代码

{ config, pkgs, lib, ... }: 
with lib;
let
  cfg = config.vhosts;
  # 提取所有唯一的PHP用户(去重避免重复定义)
  phpUsers = unique (attrValues (mapAttrs (_: vhostCfg: vhostCfg.phpuser) cfg));
in
{
  options.vhosts = mkOption {
    type = with types; attrsOf (submodule ({domain, ... }: {
      options = {
        customer = mkOption {
          type = str;
        };
        phpuser = mkOption {
          type = str;
        };
      };
    }));
  };
  config = {
    services.httpd.virtualHosts = mapAttrs (domain: vhostCfg: {
      documentRoot = "/srv/www/${vhostCfg.customer}/${domain}";
    }) cfg;

    # 循环生成用户配置
    users.users = genAttrs phpUsers (user: {
      isNormalUser = true;
      # 可按需添加更多用户默认配置,比如:
      # home = "/home/${user}";
      # shell = pkgs.bash;
    });
  };
}

关键逻辑说明

  1. 提取用户列表:

    • mapAttrs (_: vhostCfg: vhostCfg.phpuser) cfg:遍历所有虚拟主机配置,提取每个主机对应的phpuser字段,生成以域名为键、用户名为值的属性集。
    • attrValues:将上述属性集的取值转换为列表(如["web2www1", "web3www1"])。
    • unique:对用户列表去重,避免同一个用户被重复定义(适用于多个虚拟主机共享同一PHP用户的场景)。
  2. 生成用户配置:

    • genAttrs phpUsers (user: { ... }):将用户列表转换为users.users所需的属性集结构,每个用户名作为属性键,对应的值为该用户的配置(这里启用isNormalUser)。

这样修改后,你新增虚拟主机时只需在vm.nix的vhosts中定义phpuser,模块会自动生成对应的用户配置,无需手动添加用户条目。

内容的提问来源于stack exchange,提问作者Stefan Mielke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:00:34