gpt4 book ai didi

php - 允许 apache 用户通过 auth socket 连接到 mysql

转载 作者:行者123 更新时间:2023-12-04 10:35:49 24 4
gpt4 key购买 nike

我有以下堆栈:

  • Apache
  • php-fpm
  • mysql
  • WordPress 的几个实例

  • 我想使用 unix_socket 进行 mysql 身份验证。我为每个 mysql 用户创建了一个 linux 用户,以便他们可以访问他们的数据库。例如:

    我有一个 WP 博客 foo.com我创建了一个用户 foo_com和一个数据库用户 foo_com和一个数据库 foo_com .如果我 su foo_com我可以连接到数据库( mysql foo_com ),但如果我尝试以 root 身份与 mysql -u foo_com foo_com 连接,则无法连接到它我猜这是故意的,因为这就是 unix_socket 的工作方式。

    当用户访问 www.foo.com 时,apache 将尝试为 WordPress 博客提供服务。它将尝试连接到 mysql(使用 wp-config.php 中定义的凭据),但因为 wwwrun用户正在运行 apache,我们将看到数据库身份验证错误。

    所以我的问题是:如何在 WordPress 设置中运行 apache 并使用 unix_socket(假设我运行多个 WP 实例)?

    最佳答案

    我已经用 php-fpm 解决了这个问题。

    您需要的是以下内容。在 apache 中,您需要为 php 文件定义代理:

      <FilesMatch "\.php$">
    <If "-f %{REQUEST_FILENAME}">
    SetHandler "proxy:unix:/run/phpfpm/foo_com.sock"
    </If>
    </FilesMatch>

    在 php-fpm 配置中,您需要定义(例如 foo.com 站点):
    [foo_com]
    group = wwwrun
    listen = /run/phpfpm/foo_com.sock
    listen.group = wwwrun
    listen.owner = wwwrun
    pm = dynamic
    pm.max_children = 32
    pm.max_requests = 500
    pm.max_spare_servers = 4
    pm.min_spare_servers = 2
    pm.start_servers = 2
    user = wp-foo_com

    然后在 mysql 中你需要有 wp-foo_com具有权限的用户,例如 foo_com数据库。

    在 wp-config.php 中替换 define( 'DB_HOST', '120.0.0.1' );define( 'DB_HOST', 'localhost:/run/mysqld/mysqld.sock' );假设 /run/mysqld/mysqld.sock是mysql套接字的路径。

    为什么这样做?因为当请求进入任何 php 文件时,它将被传递给 php-fpm(由 apache),然后 php-fpm 以上面配置中定义的用户身份执行该代码(在我们的示例中为 wp-foo_com 用户)。

    如果有人在 nixos 上,你可以使用这个配置:
    { config, pkgs, lib, ... }:
    let
    domain = "foo.com";
    normalizedDomain = "foo_com";

    user = "wp-${normalizedDomain}";
    group = config.services.httpd.group;
    in {

    networking.firewall.enable = true;
    networking.firewall.allowedTCPPorts = [ 80 443 ];

    services.mysql.package = pkgs.mysql;
    services.mysql.enable = true;
    services.mysql.ensureDatabases = [ normalizedDomain ];
    services.mysql.ensureUsers = [{
    name = user;
    ensurePermissions = { "${normalizedDomain}.*" = "ALL PRIVILEGES"; };
    }];

    users.users.${user}.group = group;
    services.phpfpm.pools."${normalizedDomain}" = {
    inherit user group;
    phpPackage = pkgs.php;
    settings = {
    "pm" = "dynamic";
    "pm.max_children" = 32;
    "pm.max_requests" = 500;
    "pm.max_spare_servers" = 4;
    "pm.min_spare_servers" = 2;
    "pm.start_servers" = 2;
    "listen.owner" = config.services.httpd.user;
    "listen.group" = config.services.httpd.group;
    };
    };

    services.httpd = {
    enable = true;
    enablePHP = true;
    extraModules = [ "proxy_fcgi" ];

    virtualHosts."${normalizedDomain}" = {
    adminAddr = "admin@localhost";
    serverAliases = [ domain "www.${domain}" ];
    documentRoot = "/var/www/${normalizedDomain}/public_html";
    extraConfig = ''
    <Directory "/var/www/${normalizedDomain}/public_html">
    <FilesMatch "\.php$">
    <If "-f %{REQUEST_FILENAME}">
    SetHandler "proxy:unix:/run/phpfpm/${normalizedDomain}.sock|fcgi://localhost/"
    </If>
    </FilesMatch>

    # standard wordpress .htaccess contents
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>

    DirectoryIndex index.php
    Require all granted
    Options +FollowSymLinks
    </Directory>

    # https://wordpress.org/support/article/hardening-wordpress/#securing-wp-config-php
    <Files wp-config.php>
    Require all denied
    </Files>
    '';
    };

    };

    services.httpd.adminAddr = "admin@example.com";
    }

    关于php - 允许 apache 用户通过 auth socket 连接到 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60188092/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com