Разрешить apache пользователю подключаться к mysql через сокет авторизации - PullRequest
1 голос
/ 12 февраля 2020

У меня есть следующий стек:

  • apache
  • php -fpm
  • mysql
  • несколько экземпляров WordPress

Я хочу использовать unix_socket для mysql аутентификации. Я создал пользователя linux для каждого пользователя mysql, чтобы они могли получить доступ к своей БД. Например:

У меня есть блог 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, мы увидим ошибку аутентификации базы данных.

Итак, мой вопрос: как я могу запустить apache, а также использовать unix_socket в настройках WordPress (если я запускаю несколько экземпляров WP)?

1 Ответ

1 голос
/ 13 февраля 2020

Я решил это с 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";
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...