1. 环境准备与基础概念
在Ubuntu上搭建LAMP环境是PHP开发者必须掌握的核心技能之一。LAMP代表Linux操作系统、Apache网页服务器、MySQL数据库和PHP编程语言,这个组合构成了当今互联网上约70%动态网站的技术基础。
选择Ubuntu作为操作系统有几个显著优势:
- 长期支持版本(LTS)提供5年的安全更新
- 完善的软件包管理系统(APT)
- 活跃的开发者社区支持
- 对云环境的良好适配性
在开始安装前,我们需要确保系统处于最新状态。打开终端执行以下命令:
bash复制sudo apt update && sudo apt upgrade -y
这个命令会先更新软件包索引,然后升级所有可更新的软件包。-y参数表示自动确认所有提示,适合在脚本中使用。对于生产环境,建议逐个确认重要软件的升级。
提示:如果是在本地虚拟机环境操作,建议先拍摄快照。我在多次环境搭建过程中发现,这能有效避免因操作失误导致需要重装系统的麻烦。
2. Apache的安装与配置
2.1 Apache基础安装
Apache是目前最流行的网页服务器之一,以其稳定性和灵活性著称。安装Apache只需一条命令:
bash复制sudo apt install apache2
安装完成后,系统会自动创建并启动Apache服务。我们可以通过以下命令验证服务状态:
bash复制systemctl status apache2
正常运行的输出应该显示"active (running)"。如果状态不是running,可以用sudo systemctl start apache2手动启动。
2.2 防火墙配置
Ubuntu默认使用UFW(Uncomplicated Firewall)管理防火墙规则。为了让外部能够访问网页服务,需要开放HTTP(80端口)和HTTPS(443端口):
bash复制sudo ufw allow 'Apache Full'
这条命令相当于同时允许80和443端口。如果只需要HTTP,可以使用Apache代替Apache Full。验证防火墙规则:
bash复制sudo ufw status
2.3 验证安装
在浏览器中输入服务器IP地址,应该能看到Apache的默认欢迎页面。如果是在本地机器操作,可以用以下命令获取IP:
bash复制hostname -I
或者使用curl测试:
bash复制curl localhost
如果看到HTML格式的输出,说明Apache已经正常工作。
2.4 关键目录结构
了解Apache的目录结构对后续配置很重要:
/var/www/html:默认网站根目录/etc/apache2:主配置文件目录sites-available:可用站点配置sites-enabled:已启用站点配置(通常是前者的符号链接)mods-available/enabled:模块配置conf-available/enabled:全局配置
3. MySQL数据库安装与安全加固
3.1 MySQL基础安装
MySQL是LAMP栈中的关系型数据库组件,执行以下命令安装:
bash复制sudo apt install mysql-server
安装完成后,MySQL服务会自动启动。验证服务状态:
bash复制systemctl status mysql
3.2 安全加固
新安装的MySQL包含一些不安全的默认配置,必须运行安全脚本:
bash复制sudo mysql_secure_installation
这个交互式脚本会引导你完成以下安全设置:
- 设置root密码(生产环境必须设置)
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重新加载权限表
经验分享:在最近的MySQL 8.0版本中,默认使用
auth_socket插件认证root用户,这可能导致mysql_secure_installation脚本出错。解决方法是在运行脚本前先执行:bash复制sudo mysql ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; exit
3.3 基本操作验证
登录MySQL控制台测试安装:
bash复制sudo mysql -u root -p
在MySQL提示符下执行一些基本命令:
sql复制SHOW DATABASES;
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50));
INSERT INTO users (name) VALUES ('John'), ('Jane');
SELECT * FROM users;
exit
这些命令验证了数据库的创建、表操作和数据查询功能。
4. PHP安装与Apache集成
4.1 PHP核心安装
PHP是LAMP栈中处理动态内容的组件。安装PHP及其Apache模块:
bash复制sudo apt install php libapache2-mod-php php-mysql
这个命令安装了:
- PHP核心(当前Ubuntu LTS默认版本)
- Apache的PHP模块
- MySQL的PHP扩展
验证PHP版本:
bash复制php -v
4.2 配置Apache处理PHP文件
默认情况下,Apache优先处理index.html而不是index.php。我们需要调整目录索引优先级:
bash复制sudo nano /etc/apache2/mods-enabled/dir.conf
将index.php移到DirectoryIndex列表的首位:
code复制<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
保存后重启Apache使更改生效:
bash复制sudo systemctl restart apache2
4.3 测试PHP处理
创建一个测试文件验证PHP是否正常工作:
bash复制sudo nano /var/www/html/info.php
内容为:
php复制<?php phpinfo(); ?>
在浏览器中访问http://你的服务器IP/info.php,应该能看到详细的PHP配置页面。
安全提示:测试完成后务必删除此文件,因为它会暴露服务器信息:
bash复制sudo rm /var/www/html/info.php
4.4 安装常用PHP扩展
根据项目需求安装额外扩展:
bash复制sudo apt install php-curl php-gd php-mbstring php-xml php-zip
这些扩展提供了常见功能支持:
- curl:HTTP请求
- gd:图像处理
- mbstring:多字节字符串
- xml:XML处理
- zip:压缩文件处理
查看已安装扩展:
bash复制php -m
5. 虚拟主机配置与优化
5.1 创建虚拟主机
为项目创建专用目录并设置权限:
bash复制sudo mkdir /var/www/your_domain
sudo chown -R $USER:$USER /var/www/your_domain
创建虚拟主机配置文件:
bash复制sudo nano /etc/apache2/sites-available/your_domain.conf
基本配置模板:
apache复制<VirtualHost *:80>
ServerName your_domain
ServerAlias www.your_domain
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
启用站点并禁用默认站点:
bash复制sudo a2ensite your_domain
sudo a2dissite 000-default
sudo systemctl reload apache2
5.2 目录权限最佳实践
安全设置建议:
- 网站根目录权限设置为750
- 文件所有者设为www-data(Apache用户)
- 组设为开发者用户组
bash复制sudo chown -R www-data:devgroup /var/www/your_domain
sudo chmod -R 750 /var/www/your_domain
5.3 性能优化配置
调整Apache的MPM(多处理模块)设置:
bash复制sudo nano /etc/apache2/mods-available/mpm_prefork.conf
典型优化参数(根据服务器配置调整):
code复制<IfModule mpm_prefork_module>
StartServers 4
MinSpareServers 4
MaxSpareServers 8
MaxRequestWorkers 100
MaxConnectionsPerChild 10000
</IfModule>
启用压缩和缓存模块:
bash复制sudo a2enmod deflate expires headers
6. 数据库连接测试与PHP应用部署
6.1 创建专用数据库用户
为应用创建专用数据库用户比使用root更安全:
bash复制sudo mysql -u root -p
在MySQL控制台中执行:
sql复制CREATE DATABASE app_db;
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
exit
6.2 PHP连接测试
创建测试脚本验证PHP-MySQL连接:
bash复制nano /var/www/your_domain/dbtest.php
内容示例:
php复制<?php
$host = 'localhost';
$dbname = 'app_db';
$user = 'app_user';
$pass = 'strong_password';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
echo "数据库连接成功!";
// 创建测试表
$pdo->exec("CREATE TABLE IF NOT EXISTS test (id INT AUTO_INCREMENT PRIMARY KEY, message VARCHAR(255))");
// 插入数据
$pdo->exec("INSERT INTO test (message) VALUES ('PHP连接测试成功')");
// 查询数据
$stmt = $pdo->query("SELECT * FROM test");
while ($row = $stmt->fetch()) {
echo "<pre>" . print_r($row, true) . "</pre>";
}
} catch (PDOException $e) {
die("连接失败: " . $e->getMessage());
}
?>
访问这个页面应该显示连接成功信息和测试数据。
6.3 实际应用部署示例
以部署WordPress为例展示完整流程:
- 下载并解压WordPress:
bash复制cd /var/www/your_domain
sudo wget https://wordpress.org/latest.tar.gz
sudo tar -xzvf latest.tar.gz
sudo mv wordpress/* .
sudo rm -rf wordpress latest.tar.gz
- 设置权限:
bash复制sudo chown -R www-data:www-data /var/www/your_domain
sudo find /var/www/your_domain -type d -exec chmod 750 {} \;
sudo find /var/www/your_domain -type f -exec chmod 640 {} \;
- 创建WordPress配置文件:
bash复制cp wp-config-sample.php wp-config.php
nano wp-config.php
更新数据库连接信息:
php复制define('DB_NAME', 'app_db');
define('DB_USER', 'app_user');
define('DB_PASSWORD', 'strong_password');
define('DB_HOST', 'localhost');
- 完成浏览器中的安装向导
7. 常见问题排查与进阶配置
7.1 权限问题排查
常见的权限问题表现:
- 403 Forbidden错误
- 文件无法上传
- 配置文件无法修改
解决方法:
- 确认文件所有者是www-data或属于www-data组
- 检查目录权限至少为755,文件权限至少为644
- 查看Apache错误日志:
bash复制sudo tail -50 /var/log/apache2/error.log
7.2 PHP错误调试
开发阶段启用错误显示:
bash复制sudo nano /etc/php/8.1/apache2/php.ini
修改以下设置:
code复制display_errors = On
display_startup_errors = On
error_reporting = E_ALL
重启Apache使更改生效:
bash复制sudo systemctl restart apache2
7.3 性能监控与优化
安装监控工具:
bash复制sudo apt install htop mytop
Apache性能监控:
bash复制apache2ctl status
MySQL性能监控:
bash复制mytop -u root -p
7.4 HTTPS配置(使用Let's Encrypt)
安装Certbot:
bash复制sudo apt install certbot python3-certbot-apache
获取证书:
bash复制sudo certbot --apache -d your_domain -d www.your_domain
自动续期测试:
bash复制sudo certbot renew --dry-run
8. 环境维护与更新策略
8.1 定期更新
保持系统更新:
bash复制sudo apt update
sudo apt upgrade
特别注意安全更新:
bash复制sudo unattended-upgrade -d
8.2 备份策略
数据库备份(每日):
bash复制mysqldump -u root -p --all-databases > full_backup.sql
网站文件备份:
bash复制tar -czvf website_backup.tar.gz /var/www/your_domain
8.3 日志轮转
配置日志自动轮转:
bash复制sudo nano /etc/logrotate.d/apache2
典型配置:
code复制/var/log/apache2/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
/usr/lib/apache2/apache2ctl graceful
endscript
}
8.4 监控设置
安装基础监控工具:
bash复制sudo apt install netdata
访问http://your_server_ip:19999查看实时监控数据。
9. 不同Ubuntu版本的注意事项
9.1 Ubuntu 20.04 vs 22.04
主要区别:
- PHP默认版本:20.04为7.4,22.04为8.1
- MySQL默认认证插件变化
- Apache配置细微差异
9.2 指定PHP版本
当系统有多个PHP版本时,指定Apache使用的版本:
bash复制sudo update-alternatives --set php /usr/bin/php8.1
sudo a2dismod php7.4
sudo a2enmod php8.1
sudo systemctl restart apache2
9.3 第三方仓库使用
添加Ondřej的PHP仓库获取最新版本:
bash复制sudo add-apt-repository ppa:ondrej/php
sudo apt update
然后可以安装特定版本:
bash复制sudo apt install php8.2
10. 容器化部署方案(可选)
10.1 Docker Compose方案
创建docker-compose.yml:
yaml复制version: '3'
services:
web:
image: php:8.1-apache
ports:
- "80:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: app_db
MYSQL_USER: app_user
MYSQL_PASSWORD: userpass
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
启动服务:
bash复制docker-compose up -d
10.2 传统部署与容器化对比
| 方面 | 传统部署 | 容器化部署 |
|---|---|---|
| 隔离性 | 一般 | 优秀 |
| 资源占用 | 较低 | 较高 |
| 部署速度 | 较慢 | 快速 |
| 可移植性 | 依赖系统 | 自包含 |
| 学习曲线 | 平缓 | 较陡 |
在实际项目中,我通常这样选择:
- 开发环境:优先使用容器化,方便快速搭建和销毁
- 生产环境:根据团队技能和运维能力决定,小型项目传统部署更简单,大型分布式系统容器化更有优势
