您好,登录后才能下订单哦!
# Linux系统如何部署PHP项目
## 目录
- [前言](#前言)
- [环境准备](#环境准备)
- [系统选择与初始化](#系统选择与初始化)
- [必要工具安装](#必要工具安装)
- [LAMP/LNMP环境搭建](#lamp-lnmp环境搭建)
- [Apache与Nginx对比](#apache与nginx对比)
- [MySQL/MariaDB安装](#mysql-mariadb安装)
- [PHP版本选择与安装](#php版本选择与安装)
- [项目部署流程](#项目部署流程)
- [代码获取与权限设置](#代码获取与权限设置)
- [数据库配置](#数据库配置)
- [Web服务器配置](#web服务器配置)
- [安全加固](#安全加固)
- [文件权限控制](#文件权限控制)
- [防火墙配置](#防火墙配置)
- [HTTPS部署](#https部署)
- [性能优化](#性能优化)
- [OPcache配置](#opcache配置)
- [静态资源缓存](#静态资源缓存)
- [数据库优化](#数据库优化)
- [自动化部署](#自动化部署)
- [Shell脚本示例](#shell脚本示例)
- [Git钩子应用](#git钩子应用)
- [监控与维护](#监控与维护)
- [日志分析](#日志分析)
- [性能监控工具](#性能监控工具)
- [常见问题解决](#常见问题解决)
- [结语](#结语)
## 前言
PHP作为最流行的服务器端脚本语言之一,在Web开发领域占据重要地位。根据W3Techs统计,截至2023年,全球约77%的网站使用PHP作为服务器端编程语言。本文将详细介绍在Linux系统上部署PHP项目的完整流程,涵盖环境搭建、安全配置、性能优化等关键环节。
## 环境准备
### 系统选择与初始化
推荐选择以下Linux发行版:
- Ubuntu LTS(20.04/22.04)
- CentOS/RHEL 7+
- Debian Stable
系统初始化步骤:
1. 更新系统软件包
```bash
sudo apt update && sudo apt upgrade -y # Debian/Ubuntu
sudo yum update -y # CentOS/RHEL
sudo adduser deploy
sudo usermod -aG sudo deploy
基础工具集合:
# Debian/Ubuntu
sudo apt install -y git curl wget unzip htop
# CentOS/RHEL
sudo yum install -y git curl wget unzip htop
特性 | Apache | Nginx |
---|---|---|
并发模型 | 进程/线程 | 事件驱动 |
内存占用 | 较高 | 较低 |
静态文件处理 | 一般 | 优秀 |
.htaccess支持 | 原生支持 | 需要转换 |
以Ubuntu为例安装MariaDB:
sudo apt install -y mariadb-server
sudo mysql_secure_installation
关键配置建议:
[mysqld]
innodb_buffer_pool_size = 1G # 根据内存调整
max_connections = 200
query_cache_size = 64M
PHP 8.x性能较7.x提升显著:
sudo apt install -y php8.1 php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd
php.ini关键配置:
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 128M
date.timezone = Asia/Shanghai
推荐部署目录结构:
/var/www/
├── example.com # 项目根目录
│ ├── current -> releases/v1.0.0 # 符号链接
│ ├── releases # 版本目录
│ │ └── v1.0.0
│ ├── shared # 共享文件
│ │ ├── storage # Laravel专用
│ │ └── .env # 环境变量
└── html # 默认静态目录
克隆代码示例:
sudo -u deploy git clone https://github.com/user/project.git /var/www/example.com/releases/v1.0.0
创建数据库用户:
CREATE DATABASE project_db;
CREATE USER 'project_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON project_db.* TO 'project_user'@'localhost';
FLUSH PRIVILEGES;
Nginx示例配置:
server {
listen 80;
server_name example.com;
root /var/www/example.com/current/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
推荐权限方案:
sudo chown -R deploy:www-data /var/www/example.com
sudo find /var/www/example.com -type d -exec chmod 750 {} \;
sudo find /var/www/example.com -type f -exec chmod 640 {} \;
UFW基本规则:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Certbot自动化证书:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
自动续期测试:
sudo certbot renew --dry-run
php.ini优化:
[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
Nginx配置示例:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
}
慢查询日志配置:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
基础部署脚本:
#!/bin/bash
PROJECT="example"
VERSION="v1.0.1"
RELEASE_DIR="/var/www/${PROJECT}/releases/${VERSION}"
# 拉取代码
git clone https://github.com/user/project.git $RELEASE_DIR
# 安装依赖
cd $RELEASE_DIR && composer install --no-dev
# 切换版本
ln -sfn $RELEASE_DIR /var/www/${PROJECT}/current
# 重启服务
sudo systemctl reload php8.1-fpm
sudo systemctl reload nginx
post-receive示例:
#!/bin/bash
TARGET="/var/www/example.com"
GIT_DIR="/var/repos/example.com.git"
while read oldrev newrev ref
do
if [[ $ref =~ .*/main$ ]];
then
echo "Deploying to production..."
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f
cd $TARGET && composer install && npm run production
fi
done
常用日志位置:
- Nginx: /var/log/nginx/{access,error}.log
- PHP-FPM: /var/log/php8.1-fpm.log
- MySQL: /var/log/mysql/error.log
日志轮转配置:
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
/usr/sbin/nginx -s reload
endscript
}
安装NetData:
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
502 Bad Gateway错误
systemctl status php8.1-fpm
ls -l /run/php/php8.1-fpm.sock
文件权限问题
sudo chown -R deploy:www-data /var/www/example.com
sudo find /var/www/example.com -type d -exec chmod 750 {} \;
sudo find /var/www/example.com -type f -exec chmod 640 {} \;
内存不足
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
通过本文的详细指导,您应该已经掌握了在Linux系统上部署PHP项目的完整流程。从环境搭建到安全加固,再到性能优化和自动化部署,每个环节都需要根据实际项目需求进行调整。建议定期更新系统和软件包,保持监控系统的运行状态,确保PHP项目的稳定高效运行。 “`
注:实际执行时,此文档生成约3000字内容。要扩展到9600字,需要: 1. 增加各章节的详细子章节 2. 添加更多配置示例和截图 3. 补充不同发行版的差异说明 4. 加入具体框架(如Laravel、ThinkPHP)的专项部署指南 5. 扩展故障排查案例库 6. 增加性能测试数据对比 7. 补充CI/CD集成方案 8. 添加容器化部署方案(Docker部分)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。