活动公告

系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

AlmaLinux服务器配置完全手册 PHP与MySQL安装部署实战教程 包含常见问题解决方案和性能优化建议 适合各级用户学习使用从入门到精通

SunJu_FaceMall

3万

主题

2720

科技点

3万

积分

执行版主

碾压王

积分
32881

塔罗立华奏

执行版主 发表于 2025-8-31 14:30:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

AlmaLinux是一个开源的、企业级的Linux发行版,作为CentOS的替代品,它提供了稳定、可靠的服务器操作系统环境。在Web开发领域,PHP和MySQL的组合是最流行的技术栈之一,被广泛应用于从小型个人网站到大型企业级应用的各种项目中。本教程将指导您在AlmaLinux系统上完成PHP与MySQL的安装、配置和优化,无论您是初学者还是有经验的管理员,都能从中获益。

环境准备

系统更新与基础配置

在开始安装PHP和MySQL之前,我们需要确保系统是最新的,并进行一些基础配置。首先,更新系统软件包:
  1. sudo dnf update -y
复制代码

接下来,安装一些必要的工具和软件包:
  1. sudo dnf install -y epel-release
  2. sudo dnf install -y wget vim curl unzip
复制代码

设置防火墙规则

AlmaLinux默认使用firewalld作为防火墙管理工具。我们需要开放HTTP(80)和HTTPS(443)端口,以便Web服务可以正常访问:
  1. sudo firewall-cmd --permanent --add-service=http
  2. sudo firewall-cmd --permanent --add-service=https
  3. sudo firewall-cmd --reload
复制代码

SELinux配置

SELinux是AlmaLinux中的安全模块,虽然它提供了额外的安全层,但有时可能会对Web服务造成限制。我们可以暂时将其设置为宽松模式,以便于后续配置:
  1. sudo setenforce 0
  2. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
复制代码

PHP安装与配置

安装PHP

AlmaLinux默认的软件仓库可能不包含最新版本的PHP,因此我们需要添加REMI仓库来获取更新的PHP版本:
  1. sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
复制代码

启用REMI仓库并安装PHP及其常用扩展:
  1. sudo dnf module enable php:remi-8.1 -y
  2. sudo dnf install -y php php-cli php-common php-fpm php-mysqlnd php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath php-json
复制代码

配置PHP

PHP的主配置文件通常位于/etc/php.ini。我们可以根据需要调整一些关键参数:
  1. sudo cp /etc/php.ini /etc/php.ini.bak
  2. sudo vim /etc/php.ini
复制代码

以下是一些推荐的配置项:
  1. ; 增加上传文件大小限制
  2. upload_max_filesize = 64M
  3. post_max_size = 64M
  4. ; 增加执行时间限制
  5. max_execution_time = 300
  6. ; 设置时区
  7. date.timezone = Asia/Shanghai
  8. ; 开启错误显示(开发环境)
  9. display_errors = On
  10. ; 关闭错误显示(生产环境)
  11. ; display_errors = Off
  12. ; log_errors = On
  13. ; error_log = /var/log/php/error.log
复制代码

配置PHP-FPM

PHP-FPM(FastCGI Process Manager)是用于处理PHP请求的服务。我们需要配置它以确保与Web服务器正常工作:
  1. sudo cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.bak
  2. sudo vim /etc/php-fpm.d/www.conf
复制代码

以下是一些关键配置项:
  1. ; 设置用户和组
  2. user = nginx
  3. group = nginx
  4. ; 设置监听方式
  5. listen = /var/run/php-fpm/php-fpm.sock
  6. ; 设置监听所有者和权限
  7. listen.owner = nginx
  8. listen.group = nginx
  9. listen.mode = 0660
  10. ; 优化进程管理
  11. pm = dynamic
  12. pm.max_children = 50
  13. pm.start_servers = 5
  14. pm.min_spare_servers = 5
  15. pm.max_spare_servers = 35
复制代码

启动并启用PHP-FPM服务:
  1. sudo systemctl start php-fpm
  2. sudo systemctl enable php-fpm
复制代码

PHP版本管理

如果您需要安装多个PHP版本,可以使用php-fpm的多版本管理功能。例如,安装PHP 8.0:
  1. sudo dnf module reset php -y
  2. sudo dnf module enable php:remi-8.0 -y
  3. sudo dnf install -y php php-fpm
复制代码

然后为不同版本创建不同的配置文件和池。

MySQL安装与配置

安装MySQL

AlmaLinux默认提供MariaDB(MySQL的一个分支),但我们也可以安装官方的MySQL服务器:
  1. sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
  2. sudo dnf install -y mysql-community-server
复制代码

启动MySQL服务

安装完成后,启动MySQL服务并设置为开机自启:
  1. sudo systemctl start mysqld
  2. sudo systemctl enable mysqld
复制代码

MySQL安全初始化

MySQL安装后会生成一个临时root密码,我们需要获取并修改它:
  1. sudo grep 'temporary password' /var/log/mysqld.log
复制代码

运行安全配置脚本:
  1. sudo mysql_secure_installation
复制代码

按照提示设置root密码、移除匿名用户、禁止root远程登录等。

创建数据库和用户

登录MySQL控制台:
  1. mysql -u root -p
复制代码

创建一个新的数据库和用户:
  1. CREATE DATABASE myapp;
  2. CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'strong_password';
  3. GRANT ALL PRIVILEGES ON myapp.* TO 'myuser'@'localhost';
  4. FLUSH PRIVILEGES;
  5. EXIT;
复制代码

基本MySQL优化

MySQL的配置文件位于/etc/my.cnf。我们可以根据服务器资源进行一些基本优化:
  1. sudo cp /etc/my.cnf /etc/my.cnf.bak
  2. sudo vim /etc/my.cnf
复制代码

在[mysqld]部分添加或修改以下配置:
  1. # 设置缓冲池大小(通常为系统内存的50-70%)
  2. innodb_buffer_pool_size = 2G
  3. # 设置最大连接数
  4. max_connections = 200
  5. # 设置查询缓存
  6. query_cache_type = 1
  7. query_cache_size = 128M
  8. # 设置日志文件大小
  9. innodb_log_file_size = 256M
  10. # 设置表打开缓存
  11. table_open_cache = 2000
复制代码

重启MySQL服务使配置生效:
  1. sudo systemctl restart mysqld
复制代码

Web服务器配置

安装Nginx

Nginx是一个高性能的Web服务器,我们可以用它来处理HTTP请求并与PHP-FPM交互:
  1. sudo dnf install -y nginx
复制代码

启动并启用Nginx服务:
  1. sudo systemctl start nginx
  2. sudo systemctl enable nginx
复制代码

配置Nginx与PHP-FPM

创建一个新的Nginx配置文件:
  1. sudo vim /etc/nginx/conf.d/myapp.conf
复制代码

添加以下配置:
  1. server {
  2.     listen 80;
  3.     server_name your_domain.com www.your_domain.com;
  4.     root /var/www/myapp;
  5.     index index.php index.html index.htm;
  6.     location / {
  7.         try_files $uri $uri/ /index.php?$query_string;
  8.     }
  9.     location ~ \.php$ {
  10.         try_files $uri =404;
  11.         fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
  12.         fastcgi_index index.php;
  13.         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  14.         include fastcgi_params;
  15.     }
  16.     location ~ /\.ht {
  17.         deny all;
  18.     }
  19.     # 启用gzip压缩
  20.     gzip on;
  21.     gzip_vary on;
  22.     gzip_min_length 1024;
  23.     gzip_proxied any;
  24.     gzip_comp_level 6;
  25.     gzip_types
  26.         text/plain
  27.         text/css
  28.         text/xml
  29.         text/javascript
  30.         application/javascript
  31.         application/xml+rss
  32.         application/json;
  33. }
复制代码

创建网站目录并设置权限:
  1. sudo mkdir -p /var/www/myapp
  2. sudo chown -R nginx:nginx /var/www/myapp
  3. sudo chmod -R 755 /var/www/myapp
复制代码

测试Nginx配置并重新加载:
  1. sudo nginx -t
  2. sudo systemctl reload nginx
复制代码

配置SSL证书

为了启用HTTPS,我们可以使用Let’s Encrypt提供的免费SSL证书:
  1. sudo dnf install -y certbot python3-certbot-nginx
  2. sudo certbot --nginx -d your_domain.com -d www.your_domain.com
复制代码

按照提示完成证书申请和配置。Certbot会自动修改Nginx配置文件以启用SSL。

设置自动续期:
  1. sudo echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
复制代码

PHP与MySQL集成测试

创建PHP测试文件

创建一个简单的PHP文件来测试PHP和MySQL的连接:
  1. sudo vim /var/www/myapp/test.php
复制代码

添加以下内容:
  1. <?php
  2. // 显示PHP信息
  3. phpinfo();
  4. ?>
复制代码

创建一个数据库连接测试文件:
  1. sudo vim /var/www/myapp/db_test.php
复制代码

添加以下内容:
  1. <?php
  2. $host = 'localhost';
  3. $dbname = 'myapp';
  4. $user = 'myuser';
  5. $pass = 'strong_password';
  6. $charset = 'utf8mb4';
  7. $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
  8. $options = [
  9.     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
  10.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  11.     PDO::ATTR_EMULATE_PREPARES   => false,
  12. ];
  13. try {
  14.     $pdo = new PDO($dsn, $user, $pass, $options);
  15.     echo "数据库连接成功!<br>";
  16.    
  17.     // 创建测试表
  18.     $pdo->exec("CREATE TABLE IF NOT EXISTS test_table (
  19.         id INT AUTO_INCREMENT PRIMARY KEY,
  20.         name VARCHAR(100) NOT NULL,
  21.         email VARCHAR(100) NOT NULL,
  22.         created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  23.     )");
  24.    
  25.     // 插入测试数据
  26.     $stmt = $pdo->prepare("INSERT INTO test_table (name, email) VALUES (?, ?)");
  27.     $stmt->execute(['测试用户', 'test@example.com']);
  28.    
  29.     // 查询数据
  30.     $stmt = $pdo->query("SELECT * FROM test_table");
  31.     while ($row = $stmt->fetch()) {
  32.         echo "ID: " . $row['id'] . ", 姓名: " . $row['name'] . ", 邮箱: " . $row['email'] . "<br>";
  33.     }
  34.    
  35. } catch (\PDOException $e) {
  36.     throw new \PDOException($e->getMessage(), (int)$e->getCode());
  37. }
  38. ?>
复制代码

访问测试文件

通过浏览器访问http://your_domain.com/test.php和http://your_domain.com/db_test.php,如果一切正常,您应该能看到PHP信息和数据库连接成功的消息。

常见问题解决方案

PHP相关问题

如果您尝试上传大文件时遇到问题,可能需要调整PHP的上传限制:
  1. sudo vim /etc/php.ini
复制代码

修改以下参数:
  1. upload_max_filesize = 64M
  2. post_max_size = 64M
  3. memory_limit = 256M
复制代码

重启PHP-FPM服务:
  1. sudo systemctl restart php-fpm
复制代码

如果脚本执行时间过长导致超时,可以增加执行时间限制:
  1. max_execution_time = 300
复制代码

如果缺少必要的PHP扩展,可以使用以下命令安装:
  1. sudo dnf install -y php-[扩展名]
复制代码

例如,安装GD图像处理扩展:
  1. sudo dnf install -y php-gd
复制代码

MySQL相关问题

如果MySQL无法启动,首先检查错误日志:
  1. sudo tail -f /var/log/mysqld.log
复制代码

常见原因包括权限问题、配置错误或磁盘空间不足。检查数据目录权限:
  1. sudo chown -R mysql:mysql /var/lib/mysql
复制代码

如果无法连接到MySQL,检查服务状态:
  1. sudo systemctl status mysqld
复制代码

确保MySQL服务正在运行。如果连接被拒绝,检查用户权限和主机限制:
  1. -- 允许特定用户从任何主机连接
  2. GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
  3. FLUSH PRIVILEGES;
复制代码

如果MySQL性能不佳,可以使用慢查询日志来找出问题查询:
  1. -- 启用慢查询日志
  2. SET GLOBAL slow_query_log = 'ON';
  3. SET GLOBAL slow_query_log_file = '/var/log/mysql/slow-query.log';
  4. SET GLOBAL long_query_time = 2;
复制代码

分析慢查询日志并优化相关查询。

服务器配置问题

检查磁盘使用情况:
  1. df -h
复制代码

清理不必要的文件和日志:
  1. sudo journalctl --vacuum-size=100M
  2. sudo dnf clean all
复制代码

检查内存使用情况:
  1. free -h
复制代码

如果内存不足,可以创建交换空间:
  1. sudo fallocate -l 2G /swapfile
  2. sudo chmod 600 /swapfile
  3. sudo mkswap /swapfile
  4. sudo swapon /swapfile
  5. echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
复制代码

如果服务无法启动因为端口被占用,可以使用以下命令找出占用端口的进程:
  1. sudo ss -tulnp | grep :80
复制代码

然后终止占用端口的进程或更改服务配置使用其他端口。

性能优化建议

PHP性能优化

OPcache可以显著提高PHP性能,通过预编译脚本字节码并缓存在内存中:
  1. sudo vim /etc/php.d/10-opcache.ini
复制代码

确保以下配置已启用并优化:
  1. opcache.enable=1
  2. opcache.memory_consumption=128
  3. opcache.interned_strings_buffer=8
  4. opcache.max_accelerated_files=4000
  5. opcache.revalidate_freq=60
  6. opcache.fast_shutdown=1
  7. opcache.enable_cli=1
  8. opcache.validate_timestamps=0  # 生产环境建议关闭
复制代码

重启PHP-FPM服务:
  1. sudo systemctl restart php-fpm
复制代码

根据服务器负载调整PHP-FPM进程池配置:
  1. sudo vim /etc/php-fpm.d/www.conf
复制代码

优化进程管理:
  1. pm = dynamic
  2. pm.max_children = 100
  3. pm.start_servers = 20
  4. pm.min_spare_servers = 10
  5. pm.max_spare_servers = 30
  6. pm.max_requests = 1000
复制代码

考虑使用APCu(Alternative PHP Cache)来进一步优化PHP性能:
  1. sudo dnf install -y php-pecl-apcu
复制代码

配置APCu:
  1. apc.enabled=1
  2. apc.shm_size=64M
  3. apc.ttl=7200
  4. apc.enable_cli=1
复制代码

MySQL性能优化

确保数据库表有适当的索引:
  1. -- 查看表的索引
  2. SHOW INDEX FROM table_name;
  3. -- 添加索引
  4. CREATE INDEX index_name ON table_name (column_name);
  5. -- 复合索引
  6. CREATE INDEX index_name ON table_name (column1, column2);
复制代码

使用EXPLAIN分析查询执行计划:
  1. EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
复制代码

避免使用SELECT *,只选择需要的列。

根据服务器资源调整MySQL配置:
  1. # InnoDB缓冲池大小(通常为系统内存的50-70%)
  2. innodb_buffer_pool_size = 4G
  3. # 增加连接数
  4. max_connections = 500
  5. # 查询缓存
  6. query_cache_type = 1
  7. query_cache_size = 256M
  8. # 日志设置
  9. innodb_log_file_size = 512M
  10. innodb_log_buffer_size = 64M
  11. # 表缓存
  12. table_open_cache = 2000
  13. table_definition_cache = 2000
复制代码

MySQLTuner是一个Perl脚本,可以帮助您分析MySQL性能并提供优化建议:
  1. wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
  2. perl mysqltuner.pl
复制代码

服务器整体性能优化

调整系统内核参数以提高服务器性能:
  1. sudo vim /etc/sysctl.conf
复制代码

添加以下配置:
  1. # 增加文件描述符限制
  2. fs.file-max = 100000
  3. # 网络优化
  4. net.core.rmem_max = 16777216
  5. net.core.wmem_max = 16777216
  6. net.ipv4.tcp_rmem = 4096 87380 16777216
  7. net.ipv4.tcp_wmem = 4096 65536 16777216
  8. net.ipv4.tcp_congestion_control = cubic
  9. net.ipv4.tcp_tw_reuse = 1
  10. net.ipv4.tcp_fin_timeout = 15
  11. # 虚拟内存优化
  12. vm.swappiness = 10
  13. vm.dirty_ratio = 60
  14. vm.dirty_background_ratio = 2
复制代码

应用配置:
  1. sudo sysctl -p
复制代码

考虑使用Redis或Memcached作为缓存系统:
  1. # 安装Redis
  2. sudo dnf install -y redis
  3. sudo systemctl start redis
  4. sudo systemctl enable redis
  5. # 安装PHP Redis扩展
  6. sudo dnf install -y php-pecl-redis5
复制代码

对于生产环境,考虑使用CDN(内容分发网络)来加速静态内容的传输,减轻服务器负担。

对于高流量网站,考虑使用负载均衡器(如Nginx、HAProxy或云服务提供商的负载均衡服务)来分配流量到多个服务器。

安全加固建议

PHP安全设置

在PHP配置中禁用危险函数:
  1. sudo vim /etc/php.ini
复制代码

添加或修改以下配置:
  1. disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
复制代码

隐藏PHP版本信息以减少攻击面:
  1. expose_php = Off
复制代码

限制PHP文件访问范围:
  1. open_basedir = /var/www/myapp:/tmp
复制代码

MySQL安全设置

删除默认的测试数据库和匿名用户:
  1. DROP DATABASE IF EXISTS test;
  2. DELETE FROM mysql.user WHERE User = '';
  3. FLUSH PRIVILEGES;
复制代码

为每个应用创建特定的数据库用户,并只授予必要的权限:
  1. CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password';
  2. GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'localhost';
  3. FLUSH PRIVILEGES;
复制代码

设置定期备份脚本:
  1. sudo vim /usr/local/bin/mysql_backup.sh
复制代码

添加以下内容:
  1. #!/bin/bash
  2. # 设置变量
  3. DATE=$(date +%Y%m%d_%H%M%S)
  4. BACKUP_DIR="/var/backups/mysql"
  5. MYSQL_USER="backup_user"
  6. MYSQL_PASSWORD="backup_password"
  7. # 创建备份目录
  8. mkdir -p $BACKUP_DIR
  9. # 备份所有数据库
  10. mysqldump --user=$MYSQL_USER --password=$MYSQL_PASSWORD --all-databases | gzip > $BACKUP_DIR/all_databases_$DATE.sql.gz
  11. # 删除30天前的备份
  12. find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +30 -delete
复制代码

设置可执行权限并添加到cron:
  1. sudo chmod +x /usr/local/bin/mysql_backup.sh
  2. echo "0 2 * * * /usr/local/bin/mysql_backup.sh" | sudo crontab -
复制代码

服务器安全加固

确保只开放必要的端口:
  1. sudo firewall-cmd --permanent --list-all
  2. sudo firewall-cmd --permanent --add-service=ssh
  3. sudo firewall-cmd --permanent --add-service=http
  4. sudo firewall-cmd --permanent --add-service=https
  5. sudo firewall-cmd --reload
复制代码

禁用root用户的SSH登录,使用普通用户登录后切换:
  1. sudo vim /etc/ssh/sshd_config
复制代码

修改以下配置:
  1. PermitRootLogin no
复制代码

重启SSH服务:
  1. sudo systemctl restart sshd
复制代码

Fail2Ban可以防止暴力破解攻击:
  1. sudo dnf install -y fail2ban
  2. sudo systemctl start fail2ban
  3. sudo systemctl enable fail2ban
复制代码

配置Fail2Ban:
  1. sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  2. sudo vim /etc/fail2ban/jail.local
复制代码

配置SSH保护:
  1. [sshd]
  2. enabled = true
  3. port = ssh
  4. filter = sshd
  5. logpath = /var/log/secure
  6. maxretry = 3
  7. bantime = 3600
复制代码

重启Fail2Ban服务:
  1. sudo systemctl restart fail2ban
复制代码

设置自动安全更新:
  1. sudo dnf install -y dnf-automatic
  2. sudo systemctl enable --now dnf-automatic.timer
复制代码

配置自动更新:
  1. sudo vim /etc/dnf/automatic.conf
复制代码

修改以下配置:
  1. upgrade_type = security
  2. apply_updates = yes
复制代码

结论与后续学习资源

通过本教程,您已经学会了如何在AlmaLinux服务器上配置PHP和MySQL环境,包括安装、配置、优化和安全加固。这些技能将帮助您构建稳定、安全、高性能的Web应用环境。

后续学习资源

1. 官方文档AlmaLinux文档PHP官方文档MySQL官方文档
2. AlmaLinux文档
3. PHP官方文档
4. MySQL官方文档
5. 进阶主题容器化部署(Docker、Kubernetes)自动化部署(Ansible、Jenkins)监控与日志分析(Prometheus、Grafana、ELK Stack)高可用架构(主从复制、负载均衡)
6. 容器化部署(Docker、Kubernetes)
7. 自动化部署(Ansible、Jenkins)
8. 监控与日志分析(Prometheus、Grafana、ELK Stack)
9. 高可用架构(主从复制、负载均衡)
10. 社区资源Stack OverflowServer FaultReddit的r/linuxadmin和r/sysadmin
11. Stack Overflow
12. Server Fault
13. Reddit的r/linuxadmin和r/sysadmin

官方文档

• AlmaLinux文档
• PHP官方文档
• MySQL官方文档

进阶主题

• 容器化部署(Docker、Kubernetes)
• 自动化部署(Ansible、Jenkins)
• 监控与日志分析(Prometheus、Grafana、ELK Stack)
• 高可用架构(主从复制、负载均衡)

社区资源

• Stack Overflow
• Server Fault
• Reddit的r/linuxadmin和r/sysadmin

持续学习和实践是掌握服务器管理技能的关键。希望本教程能为您提供一个坚实的基础,帮助您在Web开发和服务器管理的道路上不断前进。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则