|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
AlmaLinux是一个开源的、企业级的Linux发行版,作为CentOS的替代品,它提供了稳定、可靠的服务器操作系统环境。在Web开发领域,PHP和MySQL的组合是最流行的技术栈之一,被广泛应用于从小型个人网站到大型企业级应用的各种项目中。本教程将指导您在AlmaLinux系统上完成PHP与MySQL的安装、配置和优化,无论您是初学者还是有经验的管理员,都能从中获益。
环境准备
系统更新与基础配置
在开始安装PHP和MySQL之前,我们需要确保系统是最新的,并进行一些基础配置。首先,更新系统软件包:
接下来,安装一些必要的工具和软件包:
- sudo dnf install -y epel-release
- sudo dnf install -y wget vim curl unzip
复制代码
设置防火墙规则
AlmaLinux默认使用firewalld作为防火墙管理工具。我们需要开放HTTP(80)和HTTPS(443)端口,以便Web服务可以正常访问:
- sudo firewall-cmd --permanent --add-service=http
- sudo firewall-cmd --permanent --add-service=https
- sudo firewall-cmd --reload
复制代码
SELinux配置
SELinux是AlmaLinux中的安全模块,虽然它提供了额外的安全层,但有时可能会对Web服务造成限制。我们可以暂时将其设置为宽松模式,以便于后续配置:
- sudo setenforce 0
- sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
复制代码
PHP安装与配置
安装PHP
AlmaLinux默认的软件仓库可能不包含最新版本的PHP,因此我们需要添加REMI仓库来获取更新的PHP版本:
- sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
复制代码
启用REMI仓库并安装PHP及其常用扩展:
- sudo dnf module enable php:remi-8.1 -y
- 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。我们可以根据需要调整一些关键参数:
- sudo cp /etc/php.ini /etc/php.ini.bak
- sudo vim /etc/php.ini
复制代码
以下是一些推荐的配置项:
- ; 增加上传文件大小限制
- upload_max_filesize = 64M
- post_max_size = 64M
- ; 增加执行时间限制
- max_execution_time = 300
- ; 设置时区
- date.timezone = Asia/Shanghai
- ; 开启错误显示(开发环境)
- display_errors = On
- ; 关闭错误显示(生产环境)
- ; display_errors = Off
- ; log_errors = On
- ; error_log = /var/log/php/error.log
复制代码
配置PHP-FPM
PHP-FPM(FastCGI Process Manager)是用于处理PHP请求的服务。我们需要配置它以确保与Web服务器正常工作:
- sudo cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.bak
- sudo vim /etc/php-fpm.d/www.conf
复制代码
以下是一些关键配置项:
- ; 设置用户和组
- user = nginx
- group = nginx
- ; 设置监听方式
- listen = /var/run/php-fpm/php-fpm.sock
- ; 设置监听所有者和权限
- listen.owner = nginx
- listen.group = nginx
- listen.mode = 0660
- ; 优化进程管理
- pm = dynamic
- pm.max_children = 50
- pm.start_servers = 5
- pm.min_spare_servers = 5
- pm.max_spare_servers = 35
复制代码
启动并启用PHP-FPM服务:
- sudo systemctl start php-fpm
- sudo systemctl enable php-fpm
复制代码
PHP版本管理
如果您需要安装多个PHP版本,可以使用php-fpm的多版本管理功能。例如,安装PHP 8.0:
- sudo dnf module reset php -y
- sudo dnf module enable php:remi-8.0 -y
- sudo dnf install -y php php-fpm
复制代码
然后为不同版本创建不同的配置文件和池。
MySQL安装与配置
安装MySQL
AlmaLinux默认提供MariaDB(MySQL的一个分支),但我们也可以安装官方的MySQL服务器:
- sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
- sudo dnf install -y mysql-community-server
复制代码
启动MySQL服务
安装完成后,启动MySQL服务并设置为开机自启:
- sudo systemctl start mysqld
- sudo systemctl enable mysqld
复制代码
MySQL安全初始化
MySQL安装后会生成一个临时root密码,我们需要获取并修改它:
- sudo grep 'temporary password' /var/log/mysqld.log
复制代码
运行安全配置脚本:
- sudo mysql_secure_installation
复制代码
按照提示设置root密码、移除匿名用户、禁止root远程登录等。
创建数据库和用户
登录MySQL控制台:
创建一个新的数据库和用户:
- CREATE DATABASE myapp;
- CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'strong_password';
- GRANT ALL PRIVILEGES ON myapp.* TO 'myuser'@'localhost';
- FLUSH PRIVILEGES;
- EXIT;
复制代码
基本MySQL优化
MySQL的配置文件位于/etc/my.cnf。我们可以根据服务器资源进行一些基本优化:
- sudo cp /etc/my.cnf /etc/my.cnf.bak
- sudo vim /etc/my.cnf
复制代码
在[mysqld]部分添加或修改以下配置:
- # 设置缓冲池大小(通常为系统内存的50-70%)
- innodb_buffer_pool_size = 2G
- # 设置最大连接数
- max_connections = 200
- # 设置查询缓存
- query_cache_type = 1
- query_cache_size = 128M
- # 设置日志文件大小
- innodb_log_file_size = 256M
- # 设置表打开缓存
- table_open_cache = 2000
复制代码
重启MySQL服务使配置生效:
- sudo systemctl restart mysqld
复制代码
Web服务器配置
安装Nginx
Nginx是一个高性能的Web服务器,我们可以用它来处理HTTP请求并与PHP-FPM交互:
- sudo dnf install -y nginx
复制代码
启动并启用Nginx服务:
- sudo systemctl start nginx
- sudo systemctl enable nginx
复制代码
配置Nginx与PHP-FPM
创建一个新的Nginx配置文件:
- sudo vim /etc/nginx/conf.d/myapp.conf
复制代码
添加以下配置:
- server {
- listen 80;
- server_name your_domain.com www.your_domain.com;
- root /var/www/myapp;
- index index.php index.html index.htm;
- location / {
- try_files $uri $uri/ /index.php?$query_string;
- }
- location ~ \.php$ {
- try_files $uri =404;
- fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- include fastcgi_params;
- }
- location ~ /\.ht {
- deny all;
- }
- # 启用gzip压缩
- gzip on;
- gzip_vary on;
- gzip_min_length 1024;
- gzip_proxied any;
- gzip_comp_level 6;
- gzip_types
- text/plain
- text/css
- text/xml
- text/javascript
- application/javascript
- application/xml+rss
- application/json;
- }
复制代码
创建网站目录并设置权限:
- sudo mkdir -p /var/www/myapp
- sudo chown -R nginx:nginx /var/www/myapp
- sudo chmod -R 755 /var/www/myapp
复制代码
测试Nginx配置并重新加载:
- sudo nginx -t
- sudo systemctl reload nginx
复制代码
配置SSL证书
为了启用HTTPS,我们可以使用Let’s Encrypt提供的免费SSL证书:
- sudo dnf install -y certbot python3-certbot-nginx
- sudo certbot --nginx -d your_domain.com -d www.your_domain.com
复制代码
按照提示完成证书申请和配置。Certbot会自动修改Nginx配置文件以启用SSL。
设置自动续期:
- 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的连接:
- sudo vim /var/www/myapp/test.php
复制代码
添加以下内容:
- <?php
- // 显示PHP信息
- phpinfo();
- ?>
复制代码
创建一个数据库连接测试文件:
- sudo vim /var/www/myapp/db_test.php
复制代码
添加以下内容:
- <?php
- $host = 'localhost';
- $dbname = 'myapp';
- $user = 'myuser';
- $pass = 'strong_password';
- $charset = 'utf8mb4';
- $dsn = "mysql:host=$host;dbname=$dbname;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 "数据库连接成功!<br>";
-
- // 创建测试表
- $pdo->exec("CREATE TABLE IF NOT EXISTS test_table (
- id INT AUTO_INCREMENT PRIMARY KEY,
- name VARCHAR(100) NOT NULL,
- email VARCHAR(100) NOT NULL,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- )");
-
- // 插入测试数据
- $stmt = $pdo->prepare("INSERT INTO test_table (name, email) VALUES (?, ?)");
- $stmt->execute(['测试用户', 'test@example.com']);
-
- // 查询数据
- $stmt = $pdo->query("SELECT * FROM test_table");
- while ($row = $stmt->fetch()) {
- echo "ID: " . $row['id'] . ", 姓名: " . $row['name'] . ", 邮箱: " . $row['email'] . "<br>";
- }
-
- } catch (\PDOException $e) {
- throw new \PDOException($e->getMessage(), (int)$e->getCode());
- }
- ?>
复制代码
访问测试文件
通过浏览器访问http://your_domain.com/test.php和http://your_domain.com/db_test.php,如果一切正常,您应该能看到PHP信息和数据库连接成功的消息。
常见问题解决方案
PHP相关问题
如果您尝试上传大文件时遇到问题,可能需要调整PHP的上传限制:
修改以下参数:
- upload_max_filesize = 64M
- post_max_size = 64M
- memory_limit = 256M
复制代码
重启PHP-FPM服务:
- sudo systemctl restart php-fpm
复制代码
如果脚本执行时间过长导致超时,可以增加执行时间限制:
如果缺少必要的PHP扩展,可以使用以下命令安装:
- sudo dnf install -y php-[扩展名]
复制代码
例如,安装GD图像处理扩展:
- sudo dnf install -y php-gd
复制代码
MySQL相关问题
如果MySQL无法启动,首先检查错误日志:
- sudo tail -f /var/log/mysqld.log
复制代码
常见原因包括权限问题、配置错误或磁盘空间不足。检查数据目录权限:
- sudo chown -R mysql:mysql /var/lib/mysql
复制代码
如果无法连接到MySQL,检查服务状态:
- sudo systemctl status mysqld
复制代码
确保MySQL服务正在运行。如果连接被拒绝,检查用户权限和主机限制:
- -- 允许特定用户从任何主机连接
- GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
- FLUSH PRIVILEGES;
复制代码
如果MySQL性能不佳,可以使用慢查询日志来找出问题查询:
- -- 启用慢查询日志
- SET GLOBAL slow_query_log = 'ON';
- SET GLOBAL slow_query_log_file = '/var/log/mysql/slow-query.log';
- SET GLOBAL long_query_time = 2;
复制代码
分析慢查询日志并优化相关查询。
服务器配置问题
检查磁盘使用情况:
清理不必要的文件和日志:
- sudo journalctl --vacuum-size=100M
- sudo dnf clean all
复制代码
检查内存使用情况:
如果内存不足,可以创建交换空间:
- sudo fallocate -l 2G /swapfile
- sudo chmod 600 /swapfile
- sudo mkswap /swapfile
- sudo swapon /swapfile
- echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
复制代码
如果服务无法启动因为端口被占用,可以使用以下命令找出占用端口的进程:
- sudo ss -tulnp | grep :80
复制代码
然后终止占用端口的进程或更改服务配置使用其他端口。
性能优化建议
PHP性能优化
OPcache可以显著提高PHP性能,通过预编译脚本字节码并缓存在内存中:
- sudo vim /etc/php.d/10-opcache.ini
复制代码
确保以下配置已启用并优化:
- opcache.enable=1
- opcache.memory_consumption=128
- opcache.interned_strings_buffer=8
- opcache.max_accelerated_files=4000
- opcache.revalidate_freq=60
- opcache.fast_shutdown=1
- opcache.enable_cli=1
- opcache.validate_timestamps=0 # 生产环境建议关闭
复制代码
重启PHP-FPM服务:
- sudo systemctl restart php-fpm
复制代码
根据服务器负载调整PHP-FPM进程池配置:
- sudo vim /etc/php-fpm.d/www.conf
复制代码
优化进程管理:
- pm = dynamic
- pm.max_children = 100
- pm.start_servers = 20
- pm.min_spare_servers = 10
- pm.max_spare_servers = 30
- pm.max_requests = 1000
复制代码
考虑使用APCu(Alternative PHP Cache)来进一步优化PHP性能:
- sudo dnf install -y php-pecl-apcu
复制代码
配置APCu:
- apc.enabled=1
- apc.shm_size=64M
- apc.ttl=7200
- apc.enable_cli=1
复制代码
MySQL性能优化
确保数据库表有适当的索引:
- -- 查看表的索引
- SHOW INDEX FROM table_name;
- -- 添加索引
- CREATE INDEX index_name ON table_name (column_name);
- -- 复合索引
- CREATE INDEX index_name ON table_name (column1, column2);
复制代码
使用EXPLAIN分析查询执行计划:
- EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
复制代码
避免使用SELECT *,只选择需要的列。
根据服务器资源调整MySQL配置:
- # InnoDB缓冲池大小(通常为系统内存的50-70%)
- innodb_buffer_pool_size = 4G
- # 增加连接数
- max_connections = 500
- # 查询缓存
- query_cache_type = 1
- query_cache_size = 256M
- # 日志设置
- innodb_log_file_size = 512M
- innodb_log_buffer_size = 64M
- # 表缓存
- table_open_cache = 2000
- table_definition_cache = 2000
复制代码
MySQLTuner是一个Perl脚本,可以帮助您分析MySQL性能并提供优化建议:
- wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
- perl mysqltuner.pl
复制代码
服务器整体性能优化
调整系统内核参数以提高服务器性能:
- sudo vim /etc/sysctl.conf
复制代码
添加以下配置:
- # 增加文件描述符限制
- fs.file-max = 100000
- # 网络优化
- net.core.rmem_max = 16777216
- net.core.wmem_max = 16777216
- net.ipv4.tcp_rmem = 4096 87380 16777216
- net.ipv4.tcp_wmem = 4096 65536 16777216
- net.ipv4.tcp_congestion_control = cubic
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_fin_timeout = 15
- # 虚拟内存优化
- vm.swappiness = 10
- vm.dirty_ratio = 60
- vm.dirty_background_ratio = 2
复制代码
应用配置:
考虑使用Redis或Memcached作为缓存系统:
- # 安装Redis
- sudo dnf install -y redis
- sudo systemctl start redis
- sudo systemctl enable redis
- # 安装PHP Redis扩展
- sudo dnf install -y php-pecl-redis5
复制代码
对于生产环境,考虑使用CDN(内容分发网络)来加速静态内容的传输,减轻服务器负担。
对于高流量网站,考虑使用负载均衡器(如Nginx、HAProxy或云服务提供商的负载均衡服务)来分配流量到多个服务器。
安全加固建议
PHP安全设置
在PHP配置中禁用危险函数:
添加或修改以下配置:
- disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
复制代码
隐藏PHP版本信息以减少攻击面:
限制PHP文件访问范围:
- open_basedir = /var/www/myapp:/tmp
复制代码
MySQL安全设置
删除默认的测试数据库和匿名用户:
- DROP DATABASE IF EXISTS test;
- DELETE FROM mysql.user WHERE User = '';
- FLUSH PRIVILEGES;
复制代码
为每个应用创建特定的数据库用户,并只授予必要的权限:
- CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password';
- GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'localhost';
- FLUSH PRIVILEGES;
复制代码
设置定期备份脚本:
- sudo vim /usr/local/bin/mysql_backup.sh
复制代码
添加以下内容:
- #!/bin/bash
- # 设置变量
- DATE=$(date +%Y%m%d_%H%M%S)
- BACKUP_DIR="/var/backups/mysql"
- MYSQL_USER="backup_user"
- MYSQL_PASSWORD="backup_password"
- # 创建备份目录
- mkdir -p $BACKUP_DIR
- # 备份所有数据库
- mysqldump --user=$MYSQL_USER --password=$MYSQL_PASSWORD --all-databases | gzip > $BACKUP_DIR/all_databases_$DATE.sql.gz
- # 删除30天前的备份
- find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +30 -delete
复制代码
设置可执行权限并添加到cron:
- sudo chmod +x /usr/local/bin/mysql_backup.sh
- echo "0 2 * * * /usr/local/bin/mysql_backup.sh" | sudo crontab -
复制代码
服务器安全加固
确保只开放必要的端口:
- sudo firewall-cmd --permanent --list-all
- sudo firewall-cmd --permanent --add-service=ssh
- sudo firewall-cmd --permanent --add-service=http
- sudo firewall-cmd --permanent --add-service=https
- sudo firewall-cmd --reload
复制代码
禁用root用户的SSH登录,使用普通用户登录后切换:
- sudo vim /etc/ssh/sshd_config
复制代码
修改以下配置:
重启SSH服务:
- sudo systemctl restart sshd
复制代码
Fail2Ban可以防止暴力破解攻击:
- sudo dnf install -y fail2ban
- sudo systemctl start fail2ban
- sudo systemctl enable fail2ban
复制代码
配置Fail2Ban:
- sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
- sudo vim /etc/fail2ban/jail.local
复制代码
配置SSH保护:
- [sshd]
- enabled = true
- port = ssh
- filter = sshd
- logpath = /var/log/secure
- maxretry = 3
- bantime = 3600
复制代码
重启Fail2Ban服务:
- sudo systemctl restart fail2ban
复制代码
设置自动安全更新:
- sudo dnf install -y dnf-automatic
- sudo systemctl enable --now dnf-automatic.timer
复制代码
配置自动更新:
- sudo vim /etc/dnf/automatic.conf
复制代码
修改以下配置:
- upgrade_type = security
- 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开发和服务器管理的道路上不断前进。 |
|