静看光阴荏苒
不管不顾不问不说也不念

NixOS配置LNMP环境

记录下lnmp环境的配置,我这里会搭建一个wordpress作为演示,你也可以部署其它基于php的程序。

这种和系统配置不怎么沾边的东西个人觉得还是不要直接写到configuration.nix里面,可以import一下,这样更方便维护和管理:

nano /etc/nixos/configuration.nix

这样编辑一下即可:

{
  imports =
    [
      ./hardware-configuration.nix
      ./lnmp.nix
    ];
  ...
}

新建lnmp.nix:

nano /etc/nixos/lnmp.nix

写入如下配置:

{ config, pkgs, lib, ... }:
let
  phpext = pkgs.php74.buildEnv {
    extensions = { enabled, all }: with all; enabled ++ [ imagick redis ];
  };
in 
{
  security.acme = {
    acceptTerms = true;
    defaults = {
      email = "nixos@example.com";
    };
  };
  services.nginx = {
    enable = true;
    virtualHosts."nixos.example.com" = {
      enableACME = true;
      forceSSL = true;
      kTLS = true;
      root = "/var/www/nixos.example.com";
      locations."/" = {
        index = "index.php index.html";
        extraConfig = ''
          client_max_body_size 0;
          try_files $uri $uri/ /index.php?$args;
        '';
      };
      locations."~ \.php$".extraConfig = ''
        fastcgi_pass  unix:${config.services.phpfpm.pools.wordpress.socket};
        fastcgi_index index.php;
      '';
    };
  };
  services.mysql = {
    enable = true;
    package = pkgs.mariadb;
    settings.mysqld.bind-address = "127.0.0.1";
  };
  services.phpfpm.pools.wordpress = {                                                                                                                                                                                                             
    user = config.services.nginx.user;
    group = config.services.nginx.group;                                                                                                                                                                                                                           
    settings = {                                                                                                                                                                                                                               
      pm = "dynamic";            
      "listen.owner" = config.services.nginx.user;
      "listen.group" = config.services.nginx.group;                                                                                                                                                                                                              
      "pm.max_children" = 10;                                                                                                                                                                                                                   
      "pm.start_servers" = 5;                                                                                                                                                                                                                  
      "pm.min_spare_servers" = 3;                                                                                                                                                                                                              
      "pm.max_spare_servers" = 8;                                                                                                                                                                                                              
      "pm.max_requests" = 500;                                                                                                                                                                                                                 
    };
    phpPackage = phpext;
    phpOptions = ''
      max_execution_time = 300
      post_max_size = 100M
      upload_max_filesize = 100M
      memory_limit = 512M
    '';                                                                                                                                                                                                                                        
  };
  systemd.tmpfiles.rules = [
    "d /var/www"
    "d /var/www/nixos.example.com 0755 nginx nginx"
  ];
  services.redis.servers.wordpress = {
    enable = true;
    port = 6379;
  };
}

这里详细说一下上面的这个配置都做了什么。首先这个配置:

let
  phpext = pkgs.php74.buildEnv {
    extensions = { enabled, all }: with all; enabled ++ [ imagick redis ];
  };
...

启用了php7.4的额外扩展:imagick和redis,默认情况下这两个扩展是不会启用的,而我要搭建的wordpress需要用到这两个扩展,所以必须要自己build。

如果你需要php8.0或者8.1直接修改:pkgs.php74.buildEnv里面的php74为php或者php81即可。你可以在https://search.nixos.org/搜索到相关的包名:

自己build好了php包,还要让phpfpm用才行,所以有以下配置使用了我们自己build的php包:

  ...
  services.phpfpm.pools.wordpress = { 
    phpPackage = phpext;
    ...
  ...

nginx配置的这部分提供了wordpress的伪静态规则:

  services.nginx = {
    ...
      locations."/" = {
        ...
        extraConfig = ''
          ...
          try_files $uri $uri/ /index.php?$args;
        '';
      };
  ...

这部分配置了nginx与phpfpm的通信:

    ...
      locations."~ \.php$".extraConfig = ''
        fastcgi_pass  unix:${config.services.phpfpm.pools.wordpress.socket};
        fastcgi_index index.php;
      '';
    ...

phpfpm这块的配置,需要注意的是phpfpm运行的用户和组以及socket的用户和组:

  services.phpfpm.pools.wordpress = {                                                                                                                                                                                                             
    user = config.services.nginx.user;
    group = config.services.nginx.group;                                                                                                                                                                                                                           
    settings = {                                                                                                                                                                                                                               
      ...           
      "listen.owner" = config.services.nginx.user;
      "listen.group" = config.services.nginx.group;
      ...
   ...

这里phpfpmsocket的用户和组必须要和nginx服务使用的用户和组相同,而phpfpm池运行的用户和组可以自己新建一个,然后把nginx服务的用户加到自己新建的组里面,解决权限问题。我这里为了方便干脆就直接用和nginx一样的用户了。

mariadb在nixos上默认监听在0.0.0.0,通过下面的配置将其修改为仅监听到本地:

  services.mysql = {
    ...
    settings.mysqld.bind-address = "127.0.0.1";
  };

必须配置acme才能使用nginx内的enableACME选项:

  security.acme = {
    acceptTerms = true;
    defaults = {
      email = "nixos@example.com";
    };
  };

剩下的就没什么特别值得说明的了,如果还差什么配置就自己去查option:

https://search.nixos.org/options

配置完成后重建系统:

nixos-rebuild switch

下面就用刚才配置的LNMP环境搭建一个wordpress,首先创建需要用到的数据库和用户:

mysql -u root
CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
GRANT ALL PRIVILEGES ON wordpress.* TO wordpress@localhost IDENTIFIED BY '设置你的数据库用户密码';
FLUSH PRIVILEGES;
quit

下载解压wordpress程序给予正确的权限:

cd /var/www/nixos.example.com
wget https://wordpress.org/latest.zip
unzip latest.zip
mv wordpress/* .
rm -rf wordpress
chown -R nginx:nginx .

访问wordpress程序的安装页面,配置数据库,设置管理员,完成安装后可以检查一下站点的健康状态,一切正常:

也可以看看:

https://nixos.wiki/wiki/Nginx
https://nixos.wiki/wiki/Phpfpm
https://discourse.nixos.org/t/how-to-deploy-laravel-app-to-nixos-machine/12572

赞(11)
未经允许不得转载:荒岛 » NixOS配置LNMP环境
分享到: 更多 (0)

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

分享创造快乐

广告合作资源投稿