在阿里云Linux服务器上部署PHP项目,是许多开发者从本地开发迈向线上交付的必经之路。无论你是想搭建个人博客、企业官网,还是运行一套复杂的PHP商业应用,只要熟练掌握这套流程,后续的维护和扩展都会更加得心应手。本文将从零开始,详细梳理从服务器准备到项目上线的完整链路,其中包含大量实战踩坑经验,希望能助你高效避坑。

一、服务器准备与初始化
首先,登录阿里云控制台,进入ECS管理页面。
1.1 选购ECS实例
新手建议先使用按量付费模式进行测试,避免资源浪费。操作系统方面,推荐选择Alibaba Cloud Linux 3/2或CentOS 7.x——这两个系统在阿里云生态中兼容性最佳,且拥有长期稳定支持。内存方面,如果运行ThinkPHP、Laravel等现代PHP框架,2 GiB内存起步更为稳妥;1 GiB虽然也能运行,但当内存紧张时,PHP-FPM极易出现崩溃问题。
1.2 安全组规则配置
安全组是阿里云提供的虚拟防火墙,核心原则是“最小授权”——仅开放业务必需的端口。以下三个端口必须放行:
22端口(SSH):用于远程登录。强烈建议仅授权你公司或个人的固定公网IP,切勿开放给0.0.0.0/0。否则,每天数万次暴力破解攻击将轮番轰炸,这是真实发生过的情况。
80端口(HTTP):用于Web服务对外访问,可以开放给0.0.0.0/0。
443端口(HTTPS):用于加密Web服务,同样开放给0.0.0.0/0。
配置路径:ECS控制台 → 网络与安全 → 安全组 → 管理规则 → 添加安全组规则。选择自定义TCP,端口范围按需填写,授权对象根据端口安全性选择具体IP或0.0.0.0/0。
1.3 SSH连接服务器
获取服务器公网IP和root密码(或密钥对)后,使用SSH进行连接:
ssh root@你的服务器公网IP
连接成功后,建议先更新系统软件包:
yum update -y # Alibaba Cloud Linux / CentOS
apt update && apt upgrade -y # Ubuntu
二、搭建PHP运行环境
PHP项目的主流运行环境主要有两大阵营:LNMP(Linux + Nginx + MySQL + PHP)和LAMP(Linux + Apache + MySQL + PHP)。Nginx在处理高并发静态资源时性能更优,而Apache则在.htaccess配置和模块兼容性方面有一定优势。对于中小型PHP项目,LNMP已成为公认的主流方案。下面将两种方式的手动部署步骤都列出,你可以根据偏好选择。
2.1 LNMP方案:安装Nginx
Nginx采用事件驱动架构,处理高并发连接时内存占用极低。执行以下命令:
yum install -y epel-release
yum install -y nginx
systemctl start nginx
systemctl enable nginx
2.2 LAMP方案:安装Apache
如果你更习惯使用Apache:
yum install -y httpd httpd-manual mod_ssl mod_perl
systemctl start httpd
systemctl enable httpd
安装完成后,可以使用 httpd -v 命令查看版本信息。
2.3 安装PHP及PHP-FPM
现代PHP项目通常配合PHP-FPM(FastCGI Process Manager)使用,这是一个专门处理PHP动态请求的高性能实现。推荐通过Remi仓库安装较新版本的PHP:
# 安装EPEL和Remi仓库
yum install -y epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# 启用PHP 8.0仓库
yum-config-manager --enable remi-php80
# 安装PHP及常用扩展
yum install -y php php-cli php-fpm php-common php-mysqlnd php-gd php-mbstring php-curl php-xml php-bcmath
# 启动PHP-FPM并设置开机自启
systemctl start php-fpm
systemctl enable php-fpm
安装完成后,用 php -v 确认版本。如果项目需要Composer管理依赖,可额外安装:
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
2.4 安装MySQL数据库
大多数PHP网站离不开数据库支持。以安装MySQL为例:
# 添加MySQL官方源
rpm -Uvh https://repo.mysql.com/mysql84-community-release-el7-1.noarch.rpm
# 安装MySQL服务
yum install -y mysql-server
# 启动并设置开机自启
systemctl start mysqld
systemctl enable mysqld
获取root初始临时密码:
grep 'temporary password' /var/log/mysqld.log
使用临时密码登录后,按照密码策略(至少8个字符,包含大写字母、小写字母、数字和特殊字符)设置新密码。
三、Nginx配置PHP支持
安装完Nginx和PHP-FPM后,最关键的一步是让Nginx能够将PHP请求转发给PHP-FPM处理。Nginx的主配置文件是 /etc/nginx/nginx.conf,但更推荐在 /etc/nginx/conf.d/ 目录下为每个站点建立独立的配置文件。
创建站点配置:
vim /etc/nginx/conf.d/yourdomain.conf
填入以下基础配置(以域名 yourdomain.com 为例):
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
配置要点解读:
listen 80:Nginx监听80端口以处理HTTP请求。server_name:指定绑定的域名,支持多个,用空格分隔。root:网站文件的根目录,所有HTML、PHP、CSS、JS文件都存放于此。location ~ \.php$:正则匹配所有以.php结尾的请求,通过fastcgi_pass将其传递给PHP-FPM。fastcgi_pass unix:/run/php-fpm/www.sock:指定PHP-FPM监听的Unix Socket路径。虽然也可以使用TCP端口方式,但Socket方式性能更优。
测试配置并重载Nginx:
nginx -t
systemctl reload nginx
在网站根目录下创建一个 info.php 文件用于测试:
访问 https://你的服务器IP/info.php,如果能够看到PHP信息页面,则表示配置成功。
四、PHP项目代码部署
4.1 上传代码到服务器
PHP代码文件通常需要上传到Nginx配置的root目录(例如 /var/www/yourdomain)。上传方式主要有两种:
- SFTP方式:使用FileZilla等工具,通过SFTP协议连接服务器,将本地项目文件夹拖拽上传。
- 命令行方式:使用scp命令,适合熟练使用命令行的开发者:
scp -r 本地项目文件夹路径 root@服务器IP:/var/www/yourdomain
4.2 文件权限设置
文件权限是部署中最容易被忽视但又极其关键的环节。配置不当,轻则导致网站无法写入缓存日志,重则可能被恶意用户上传后门程序。建议的方案如下:
- 普通PHP文件:权限设为
644(所有者可读写,其他用户只读)。 - 配置文件(包含数据库密码等敏感信息):权限设为
600(仅所有者可读写)。 - 网站根目录及所有子目录:权限设为
755(所有者可读写执行,其他用户只读执行)。 - 上传目录:需要为Web服务器用户赋予写入权限,可设为
775,但必须同时配置禁止直接访问该目录下的PHP文件,以防上传木马。
在实际项目中,代码所有者和Web运行用户通常不同。建议将代码所有者设为部署用户(如root),并将Web服务用户(Nginx通常运行在nginx用户下,Apache运行在apache或www-data下)加入同一用户组,然后设置目录权限为770(所有者和组可读写执行,其他用户无权限)。
示例命令:
chown -R root:nginx /var/www/yourdomain
chmod -R 755 /var/www/yourdomain
chmod -R 644 /var/www/yourdomain/*.php
chmod 775 /var/www/yourdomain/uploads
4.3 创建MySQL数据库并导入数据
使用MySQL命令行创建项目所需的数据库和用户:
mysql -u root -p
CREATE DATABASE yourdbname;
CREATE USER 'youruser'@'localhost' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON yourdbname.* TO 'youruser'@'localhost';
FLUSH PRIVILEGES;
USE yourdbname;
SOURCE /path/to/your/database.sql;
导入完成后,修改项目中的数据库配置文件(如 config.php),将数据库名、用户名和密码更新为刚才创建的信息。
五、域名绑定与SSL证书配置
5.1 域名解析
要让用户通过域名访问网站,需要在阿里云DNS控制台添加A记录,将域名解析到ECS的公网IP:
- 登录阿里云控制台,进入域名管理页面。
- 找到目标域名,点击解析设置。
- 点击添加记录:记录类型选择A,主机记录填写
@(主域名)或www(子域名),记录值填写ECS公网IP。 - 保存后等待DNS生效(通常需要几分钟到几小时)。
5.2 申请SSL证书并启用HTTPS
HTTPS已是现代网站的标配,不仅能加密传输数据,还能提升搜索引擎排名。阿里云提供免费的一年期SSL证书。操作流程如下:
进入阿里云SSL证书控制台 → 购买证书 → 选择免费型DV证书 → 绑定域名 → 完成域名验证(DNS验证或文件验证)→ 下载Nginx版本的证书文件(包含.crt和.key两个文件)。
将证书文件上传到服务器的证书存放目录(如 /etc/nginx/ssl/),然后修改Nginx站点配置,添加443端口的HTTPS监听:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri; # 强制跳转HTTPS
}
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
root /var/www/yourdomain;
index index.php index.html;
ssl_certificate /etc/nginx/ssl/yourdomain.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.key;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
六、性能优化与安全加固
基础部署完成后,还需要进行以下优化和加固措施,让网站运行更稳定、更安全。
6.1 PHP配置优化
编辑 /etc/php.ini 文件:
memory_limit = 256M # 根据服务器内存调整,不能超过物理内存
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off # 生产环境必须关闭,防止泄露路径信息
upload_max_filesize = 50M
post_max_size = 50M # 应大于等于upload_max_filesize
max_execution_time = 300
max_input_time = 300
启用OPcache(字节码缓存),能够大幅提升PHP执行效率:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
6.2 PHP-FPM进程管理优化
编辑 /etc/php-fpm.d/www.conf 文件:
pm = dynamic # 动态进程管理模式
pm.max_children = 50 - 200 # 最大子进程数
pm.start_servers = 8 # 起始进程数,建议设为CPU核心数的4倍
pm.min_spare_servers = 4
pm.max_spare_servers = 8 # 建议设为CPU核心数的1-2倍
pm.max_requests = 1000 # 每个子进程处理1000个请求后自动销毁,防止内存泄漏
6.3 安全加固措施
禁用危险PHP函数:在
php.ini的disable_functions配置项中加入高危函数:disable_functions = exec,system,passthru,shell_exec,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source修改SSH默认端口:编辑
/etc/ssh/sshd_config文件,将Port 22改为自定义端口(如Port 2222),并禁用root远程登录:PermitRootLogin no。重启SSH服务后使用新端口登录。配置系统防火墙:开放自定义SSH端口、80、443,关闭其他非必要端口:
firewall-cmd --permanent --zone=public --add-port=2222/tcp
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
七、常见错误排查
7.1 浏览器访问显示502 Bad Gateway
这通常是Nginx无法连接到PHP-FPM的表现。首先检查PHP-FPM服务是否正常运行:systemctl status php-fpm。同时确认Nginx配置中的fastcgi_pass地址与PHP-FPM实际监听的地址(Socket路径或端口号)一致。
7.2 访问出现403 Forbidden
这通常是由于文件权限不足或SELinux策略限制所致。检查网站根目录和文件的权限(755/644),以及SELinux的状态:getenforce。可以临时关闭SELinux进行测试:setenforce 0,如果问题解决,则需要为Web目录配置正确的SELinux上下文。
7.3 数据库连接失败
首先检查MySQL服务是否已启动:systemctl status mysqld。确认项目配置文件中的数据库用户名、密码、库名以及端口号(默认3306)是否正确。如果数据库和应用部署在不同实例上,还需检查安全组中3306端口的入方向规则是否已开放。
7.4 PHP文件直接下载而不执行
这说明Nginx未能正确识别PHP请求。最常见的原因是配置文件中缺少location ~ \.php$处理块,或者fastcgi_pass地址配置错误。使用nginx -t检查配置文件语法,确认无误后重载Nginx:systemctl reload nginx。
八、总结
在阿里云Linux服务器上部署PHP项目,核心流程可以概括为:选购ECS并配置安全组 → SSH连接 → 搭建LNMP/LAMP环境 → 配置Nginx/Apache支持PHP → 上传代码并设置文件权限 → 创建数据库并导入数据 → 域名解析与HTTPS配置 → 安全加固与性能优化。每一步都蕴含关键细节:安全组不能随意全开放,文件权限不能一刀切设为777,PHP-FPM进程数需根据服务器配置合理设置——这些细节决定了网站能否稳定安全地运行。按照本文的步骤逐步操作,你就能在阿里云上顺利完成PHP项目的生产级部署。
