【问题标题】:Allow apache user to connect to mysql via auth socket允许 apache 用户通过 auth socket 连接到 mysql
【发布时间】:2020-05-27 23:54:37
【问题描述】:

我有以下堆栈:

  • 阿帕奇
  • 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 mysql wordpress apache


    【解决方案1】:

    我已经用 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";
    }
    
    

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 2019-02-26
      • 2012-08-02
      • 2014-01-27
      • 2015-09-17
      • 2011-11-03
      • 2022-01-12
      • 2016-02-20
      • 2013-01-24
      相关资源
      最近更新 更多