温馨提示×

使用Debian MariaDB进行Web应用开发

小樊
33
2025-12-07 04:46:10
栏目: 云计算

在 Debian 上使用 MariaDB 搭建 Web 开发环境的实操指南

一 环境准备与 MariaDB 安装

  • 更新系统并安装 MariaDB(Debian 12 默认仓库提供 MariaDB 10.11.x,安装即自动启动):
    • 执行:sudo apt update && sudo apt install mariadb-server mariadb-client -y
    • 检查状态:sudo systemctl status mariadb
  • 运行安全初始化:sudo mysql_secure_installation(设置 root 密码、移除匿名用户、禁止 root 远程登录、删除测试库等)。
  • 认证方式要点:Debian 上 root 默认使用 unix_socket 插件,仅本机 sudo mysql 可登录;如需兼容工具(如 phpMyAdmin)或远程管理,可改为密码认证:
    • 进入 MariaDB:sudo mysql
    • 执行:
      • ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password;
      • ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongRootPass!';
      • FLUSH PRIVILEGES;
    • 之后可用:mysql -u root -p 登录。

二 选择栈与快速部署

  • 方案 A LNMP(Nginx + PHP-FPM + MariaDB)
    • 安装组件:sudo apt install nginx php-fpm php-mysql
    • PHP-FPM 示例(路径随版本变化,如 7.4/8.2):/etc/php/8.2/fpm/pool.d/www.conf 中设置 listen = /run/php/php8.2-fpm.sock
    • Nginx 站点配置片段:
      server {
        listen 80;
        root /var/www/html;
        index index.php index.html;
        location / { try_files $uri $uri/ =404; }
        location ~ \.php$ {
          include snippets/fastcgi-php.conf;
          fastcgi_pass unix:/run/php/php8.2-fpm.sock;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
        }
      }
      
    • 重载服务:sudo systemctl restart php8.2-fpm && sudo systemctl reload nginx
    • 防火墙(UFW):sudo ufw allow 'Nginx Full'
    • 可选 HTTPS:sudo apt install certbot python3-certbot-nginx && sudo certbot --nginx -d your_domain.com
  • 方案 B LAMP(Apache + mod_php + MariaDB)
    • 安装组件:sudo apt install apache2 libapache2-mod-php php-mysql
    • 启用重写:sudo a2enmod rewrite
    • 虚拟主机示例(DocumentRoot 指向框架的 public 目录,如 Laravel):
      <VirtualHost *:80>
        DocumentRoot /var/www/html/public
        <Directory /var/www/html/public>
          AllowOverride All
          Require all granted
        </Directory>
      </VirtualHost>
      
    • 重载服务:sudo systemctl restart apache2
  • 版本提示:如需较新 PHP(如 8.2),可添加 Ondřej Surý 仓库后安装:sudo apt install php8.2 php8.2-fpm php8.2-mysql ...

三 数据库与权限配置

  • 登录数据库:mysql -u root -p
  • 创建应用专用库与用户(示例名:appdb / appuser):
    CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongAppPass!';
    GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
    FLUSH PRIVILEGES;
    
  • 远程访问(仅在内网/受控网络启用):
    • 创建远程用户:CREATE USER 'appuser'@'10.0.0.%' IDENTIFIED BY 'StrongAppPass!';
    • 授权:GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'10.0.0.%';
    • 刷新:FLUSH PRIVILEGES;
    • 修改绑定地址:sudo sed -i 's/^bind-address=.*/bind-address=0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf
    • 开放防火墙:sudo ufw allow 3306/tcp(仅对可信网段开放)
    • 注意:生产环境不建议对公网开放 3306,优先使用 SSH 隧道或内网。

四 应用接入与连接示例

  • PHP(PDO,使用上面创建的 appdb/appuser)
    <?php
    $host = '127.0.0.1';
    $db   = 'appdb';
    $user = 'appuser';
    $pass = 'StrongAppPass!';
    $charset = 'utf8mb4';
    
    $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $options = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
    
    try {
        $pdo = new PDO($dsn, $user, $pass, $options);
        echo "Connected successfully";
    } catch (\PDOException $e) {
        throw new \PDOException($e->getMessage(), (int)$e->getCode());
    }
    
  • Java Spring Boot(Maven 依赖 + 配置)
    • 依赖:
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
      <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      
    • 配置(application.properties):
      spring.datasource.url=jdbc:mariadb://localhost:3306/appdb
      spring.datasource.username=appuser
      spring.datasource.password=StrongAppPass!
      spring.jpa.hibernate.ddl-auto=update
      spring.jpa.show-sql=true
      
    • 说明:驱动为 org.mariadb.jdbc.mariadb-java-client,URL 使用 jdbc:mariadb://

五 开发最佳实践与安全加固

  • 最小权限原则:应用使用专用数据库用户,仅授予目标库权限;禁止生产环境以 root 直连应用。
  • 字符集与排序规则:统一使用 utf8mb4 / utf8mb4_unicode_ci,避免表情符号和排序问题。
  • 连接安全:优先本地 socket 或 TLS 连接;远程仅限内网,限制来源网段与端口。
  • 防火墙与端口:仅开放必要端口(HTTP/HTTPS、SSH);数据库端口不对公网暴露。
  • 备份与恢复:定期逻辑备份(mysqldump -u appuser -p appdb > appdb.sql),重要变更前先备份。
  • 错误与日志:开发环境开启错误显示便于排错;上线后关闭显示并记录到安全日志。
  • 框架规范:遵循框架目录与路由约定(如 Laravel 的 public/ 为 Web 根),避免将 .env 等敏感文件纳入版本控制。

0