1. 环境准备与系统更新
在开始搭建LAMP环境之前,我们需要确保Ubuntu系统处于最佳状态。我建议使用Ubuntu 20.04 LTS或更高版本,因为长期支持版本能获得更稳定的更新支持。
1.1 系统更新与基础工具安装
首先登录你的Ubuntu服务器,建议使用SSH连接以获得更好的操作体验。执行以下命令更新系统:
bash复制sudo apt update
sudo apt upgrade -y
这个操作会更新所有已安装的软件包到最新版本。我强烈建议在执行升级前先运行apt update,因为直接运行apt upgrade可能会导致依赖问题。
注意:在生产环境中,建议在非高峰期执行系统更新,因为某些服务可能需要重启。
安装一些基础工具包,这些工具在后续配置中会很有用:
bash复制sudo apt install -y software-properties-common curl wget unzip
2. Apache Web服务器安装与配置
2.1 Apache安装与基本设置
Apache是LAMP栈中的"A"部分,它是一个成熟稳定的Web服务器。安装Apache非常简单:
bash复制sudo apt install apache2 -y
安装完成后,Apache服务会自动启动。我们可以通过以下命令检查服务状态:
bash复制sudo systemctl status apache2
你应该看到类似"active (running)"的状态信息。如果没有自动启动,可以手动启动并设置开机自启:
bash复制sudo systemctl start apache2
sudo systemctl enable apache2
2.2 防火墙配置
Ubuntu默认使用UFW防火墙。我们需要允许HTTP和HTTPS流量:
bash复制sudo ufw allow 'Apache Full'
sudo ufw enable
验证防火墙规则:
bash复制sudo ufw status
你应该看到Apache Full规则被允许。
2.3 测试Apache安装
在浏览器中输入你的服务器IP地址,应该能看到Apache的默认欢迎页面。如果看不到,可以尝试以下排查步骤:
- 检查Apache是否正在运行
- 检查防火墙设置
- 检查服务器网络配置
3. MySQL数据库安装与安全配置
3.1 MySQL服务器安装
MySQL是LAMP栈中的"M"部分。安装MySQL服务器:
bash复制sudo apt install mysql-server -y
安装完成后,启动并启用MySQL服务:
bash复制sudo systemctl start mysql
sudo systemctl enable mysql
3.2 MySQL安全配置
MySQL安装后需要进行一些安全配置。运行安全脚本:
bash复制sudo mysql_secure_installation
这个脚本会引导你完成以下设置:
- 设置root密码
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重新加载权限表
重要提示:生产环境中务必设置强密码,并考虑创建专用应用用户而非使用root账户。
3.3 创建数据库和用户
登录MySQL:
bash复制sudo mysql -u root -p
创建数据库和用户:
sql复制CREATE DATABASE myapp_db;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
4. PHP安装与配置
4.1 添加PHP PPA仓库
为了获取最新版本的PHP,我们添加Ondřej Surý的PPA:
bash复制sudo add-apt-repository ppa:ondrej/php
sudo apt update
4.2 PHP 8.3及扩展安装
安装PHP 8.3核心和常用扩展:
bash复制sudo apt install php8.3 php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl php8.3-mbstring php8.3-zip php8.3-gd php8.3-opcache -y
这里安装的扩展包括:
- mysql:MySQL数据库连接
- xml:XML处理
- curl:HTTP请求
- mbstring:多字节字符串处理
- zip:压缩文件处理
- gd:图像处理
- opcache:PHP性能优化
4.3 PHP-FPM配置
PHP-FPM是FastCGI进程管理器,我们需要配置它与Apache协同工作:
bash复制sudo systemctl start php8.3-fpm
sudo systemctl enable php8.3-fpm
检查PHP-FPM状态:
bash复制sudo systemctl status php8.3-fpm
5. Apache与PHP-FPM集成
5.1 启用必要的Apache模块
bash复制sudo a2enmod proxy proxy_fcgi rewrite
这些模块的作用:
- proxy和proxy_fcgi:用于将PHP请求转发给PHP-FPM处理
- rewrite:URL重写功能
5.2 配置虚拟主机
创建新的虚拟主机配置文件:
bash复制sudo nano /etc/apache2/sites-available/myapp.conf
添加以下内容(根据实际情况修改):
apache复制<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName your_domain_or_ip
DocumentRoot /var/www/myapp/public
<Directory /var/www/myapp/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/myapp_error.log
CustomLog ${APACHE_LOG_DIR}/myapp_access.log combined
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
5.3 启用虚拟主机并测试
启用新配置并禁用默认配置:
bash复制sudo a2ensite myapp.conf
sudo a2dissite 000-default.conf
测试配置语法:
bash复制sudo apache2ctl configtest
重新加载Apache:
bash复制sudo systemctl reload apache2
6. 项目部署与权限设置
6.1 创建项目目录
bash复制sudo mkdir -p /var/www/myapp/public
6.2 设置正确的权限
更安全的权限设置方式:
bash复制sudo chown -R $USER:www-data /var/www/myapp
sudo chmod -R 775 /var/www/myapp/storage
这种设置比直接使用777更安全,同时保证Web服务器有必要的访问权限。
6.3 上传项目文件
你可以使用SFTP或Git将项目文件上传到服务器。如果是使用Git:
bash复制cd /var/www/myapp
git clone your_repository_url .
7. 测试与验证
7.1 创建测试PHP文件
bash复制echo "<?php phpinfo(); ?>" > /var/www/myapp/public/info.php
访问http://your_server_ip/info.php 应该能看到PHP信息页面。
7.2 测试数据库连接
创建一个测试数据库连接的PHP文件:
php复制<?php
$conn = new mysqli('localhost', 'myapp_user', 'strong_password', 'myapp_db');
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
echo "数据库连接成功";
?>
7.3 移除测试文件
测试完成后,务必移除这些测试文件:
bash复制rm /var/www/myapp/public/info.php
rm /var/www/myapp/public/dbtest.php
8. 常见问题排查
8.1 403 Forbidden错误
可能原因:
- 目录权限不正确
- Apache配置中Directory指令设置不当
- SELinux限制(如果启用)
解决方案:
- 检查目录权限
- 确保Apache配置中的Directory指令允许访问
- 检查/var/log/apache2/error.log获取详细信息
8.2 PHP文件被下载而非执行
可能原因:
- PHP-FPM未正确配置
- Apache未正确处理PHP文件
解决方案:
- 检查FilesMatch指令是否正确
- 确认PHP-FPM服务正在运行
- 检查Apache是否加载了proxy_fcgi模块
8.3 数据库连接问题
可能原因:
- MySQL用户权限不足
- 防火墙阻止连接
- MySQL绑定地址限制
解决方案:
- 检查MySQL用户权限
- 确保MySQL监听正确接口
- 检查防火墙规则
9. 性能优化建议
9.1 PHP-FPM配置优化
编辑PHP-FPM池配置:
bash复制sudo nano /etc/php/8.3/fpm/pool.d/www.conf
建议调整的参数:
- pm.max_children:根据服务器内存调整
- pm.start_servers:初始PHP进程数
- pm.min_spare_servers/p.max_spare_servers:空闲进程范围
9.2 Apache优化
编辑Apache配置文件:
bash复制sudo nano /etc/apache2/mods-available/mpm_prefork.conf
调整参数:
- StartServers
- MinSpareServers
- MaxSpareServers
- MaxRequestWorkers
9.3 Opcache配置
编辑PHP配置文件:
bash复制sudo nano /etc/php/8.3/fpm/php.ini
调整Opcache参数:
- opcache.enable=1
- opcache.memory_consumption=128
- opcache.max_accelerated_files=4000
10. 安全加固措施
10.1 文件权限最小化
遵循最小权限原则:
- 配置文件:640权限,root:www-data所有者
- 上传目录:750权限,特定用户:www-data所有者
10.2 禁用危险PHP函数
编辑php.ini:
ini复制disable_functions = "exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source"
10.3 定期更新
设置自动安全更新:
bash复制sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades
10.4 日志监控
配置日志轮转和监控,及时发现异常行为。