部署PHP项目,新手照着走就行
PHP虚拟机部署的核心流程就三步:装环境、传代码、配伪静态,全程跟着命令行操作大约一个小时能跑通。别被网上的长篇教程吓住,本文直接把命令给你列出来,照着敲就能完成一套LNMP环境的搭建。
部署前先搞清虚拟机选哪家,避免换系统重来
新手最容易犯的错是买完虚拟机才发现系统版本选错,大多数云厂商的控制台都支持选择操作系统镜像,建议选CentOS 7.9或Ubuntu 22.04 LTS,这两套系统的包管理命令最成熟,网上踩坑案例也最多,搜问题容易找到答案。
- 内存低于1GB的机器别装宝塔面板,面板本身就要吃300MB内存,跑起来吃力
- 系统盘建议40GB起步,PHP日志和MySQL数据增长比想象中快
- 地域选择离你用户最近的城市节点,比如你的用户主要在华南,就选广州或深圳节点
顺带说一句,本地电脑装个VMware虚拟机练手也行,但本地虚拟机的网络模式和云服务器不一样,练习时记得把网络适配器设为桥接模式,新手阶段建议直接买一台1核2GB配置的云服务器,新用户活动价一年百来块,比折腾本地虚拟机省事得多。
php环境搭建步骤:按这个顺序装能少踩一半坑
部署PHP环境网上有各种一键脚本,但新手强烈建议手工安装一遍,否则出了问题完全不知道排查方向,下面以Ubuntu 22.04系统为例,按依赖顺序来。
第一步:升级系统组件,装基础依赖
先SSH登录服务器,执行系统更新:
apt update && apt upgrade -y
然后安装编译工具和依赖库,这些是后面装PHP扩展要用的:
apt install -y build-essential libxml2-dev libsqlite3-dev libcurl4-openssl-dev
libonig-dev libzip-dev libssl-dev pkg-config
第二步:装Nginx作为Web服务
apt install -y nginx
systemctl enable nginx
systemctl start nginx
装完在浏览器输入服务器公网IP,看到Nginx欢迎页就代表Web服务正常,此时Nginx默认站点在/var/www/html,先记下这个路径,后面要改。
第三步:编译安装PHP 8.2
这里不走apt install php捷径的原因是:系统自带的PHP版本较旧,有些项目要求特定PHP版本或扩展,编译安装虽然多花二十分钟,但能掌控每个参数:
cd /usr/local/src wget https://www.php.net/distributions/php-8.2.15.tar.gz tar -zxvf php-8.2.15.tar.gz cd php-8.2.15
依次执行配置、编译、安装(configure参数按你项目需求增减,这是最常见的一组):
./configure --prefix=/usr/local/php --with-fpm-user=www-data --with-fpm-group=www-data
--enable-fpm --with-mysqli --with-pdo-mysql --with-openssl --enable-mbstring
--with-curl --with-zip --enable-gd
make && make install
编译过程大约十到十五分钟,期间你可以去编辑Nginx配置,装完复制默认配置文件:
cp php.ini-production /usr/local/php/lib/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
第四步:配置PHP-FPM并启动
编辑/usr/local/php/etc/php-fpm.d/www.conf,找到user和group参数,确保它们指向www-data,然后启动:
/usr/local/php/sbin/php-fpm
用ps -ef | grep php-fpm能看到进程列表,就说明PHP-FPM跑起来了。
第五步:配置Nginx站点指向PHP解析
这是新手最容易卡壳的地方,编辑Nginx站点配置/etc/nginx/sites-available/default,把server块改成类似这样:
server {
listen 80;
server_name _;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
}
改完执行nginx -t检查配置语法,无误后systemctl reload nginx,然后在/var/www/html下建一个test.php,写入<?php phpinfo(); ?>,浏览器访问http://服务器IP/test.php,能看到PHP版本信息页面就说明PHP解析正常。
PHP部署到服务器的完整流程:从打包到线上
环境就绪后,把本地项目传上去是另一门学问,很多新手用rz命令传压缩包,结果忘了解压后改目录权限,导致页面一顿报错。
上传代码与依赖管理
项目根目录执行依赖安装(本地操作):
composer install --optimize-autoloader --no-dev
然后把整个项目目录(排除vendor和.env)打包成zip,用WinSCP或直接SSH命令上传到服务器/var/www/html目录并解压:
unzip project.zip -d /var/www/html
chown -R www-data:www-data /var/www/html
chmod -R 755 /var/www/html/storage
配置数据库连接
在.env文件里改数据库地址和账号密码。别忘了把数据库迁移执行一遍:进入项目目录跑php artisan migrate(Laravel)或用你的框架对应的迁移命令。
开启伪静态与URL重写
很多项目需要隐藏入口文件,比如ThinkPHP的index.php,Nginx配置里上面那段location /块已经包含了try_files处理逻辑,如果用的是Apache服务器,则需要额外开启mod_rewrite模块并配置.htaccess文件。
新手部署完必做的三项安全加固
改SSH默认端口是第一步,编辑/etc/ssh/sshd_config,把端口从22改成四位随机数(比如2222),改完重启SSH服务。登录服务器时记得用新端口连接,否则会被拒之门外。
第二件是禁用root密码登录,生成SSH密钥对并把公钥追加到服务器~/.ssh/authorized_keys,然后sshd_config里设置PermitRootLogin prohibit-password。
第三件是配置防火墙白名单,Ubuntu系统用UFW:
ufw allow 2222/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
用什么面板管理PHP环境:宝塔还是AMH
宝塔面板是国内新手用得最多的一站式管理工具,可视化界面能省去上面所有命令行操作,装个面板后,Nginx、MySQL、PHP都能在网页上点装,还能定时备份、部署SSL证书,不过面板吃资源,2GB内存的机器跑起来有点勉强。
AMH面板走的是另一个路线,面板本身更精简,但应用市场相对少一些,行业共识认为:不差内存且追求效率的选宝塔,喜欢精简操作的去用AMH,如果是学习目的,建议压着自己不用面板,把命令练熟后再考虑工具。
常见报错排查方向
新手部署总会在同一个地方摔跟头PHP-FPM监听方式与Nginx配置不匹配,上面Nginx配置里用的unix:/run/php/php8.2-fpm.sock,但如果你是用源码编译安装的PHP-FPM,它默认监听的是0.0.1:9000端口,两者必须一致,否则浏览器访问PHP文件时会直接下载文件而不是解析执行。
另一个高频问题是目录权限不足,报Permission denied,绝大多数情况是项目文件owner是root,PHP-FPM运行用户是www-data,执行chown -R www-data:www-data就能解决。
PHP项目上线前要检查哪些配置项
php.ini里几个关键参数直接影响上线后的表现:
memory_limit:建议调高到128M以上,WordPress这类程序跑主题自定义时很吃内存upload_max_filesize和post_max_size:如果项目有上传文件功能,这两个默认2M肯定不够,按业务量调大display_errors:生产环境务必设为Off,避免报错信息直接暴露给用户
PHP部署失败后怎么找到真正的原因
看日志是唯一正路,Nginx错误日志默认在/var/log/nginx/error.log,PHP-FPM日志在/usr/local/php/var/log/php-fpm.log,把这两个文件打开看最后的报错记录。大多数情况下,报错信息够你定位问题,新手最大的毛病是光看页面上的500错误就慌,其实日志里写得明明白白。
如何验证PHP部署是否真正成功
装监控工具比单纯看页面有无报错靠谱得多,在项目里引入laravel/telescope(如果用的是Laravel),或安装netdata查看实时系统状态。看两个指标:PHP-FPM请求耗时和内存占用率,跑一个周末稳定在80%以下就算合格。
### PHP虚拟机部署常见问题速查
问:php部署到服务器的完整流程中,代码放在哪个目录最合理?
源码放`/var/www/html`下面没毛病,但建议直接建项目名为子目录,/var/www/html/myapp`,把Nginx的root指向这个目录,好处是以后同一台机器多项目并存时,不会互相污染文件结构。
问:为什么本地跑得好好的PHP项目,一上服务器就白屏?
白屏且无任何报错,九成是`display_errors`被关了,而PHP又遇到致命错误,先把`php.ini`里`display_errors`临时改成`On`,重启PHP-FPM再访问,具体错误信息就会显示出来,改完记得关回去,另一种常见原因是PHP扩展缺失,比如项目用了`fileinfo`扩展,你编译PHP时没加`--enable-fileinfo`,解决方法是回到编译配置步骤重新编译安装带齐扩展的版本。
问:网站访问量涨了以后,单台PHP虚拟机扛不住,需要做什么优化?
先给PHP-FPM开慢日志,`slowlog`参数设成`/usr/local/php/var/log/slow.log`,`request_slowlog_timeout`设5秒,然后看哪些请求耗时超长,常见优化路径是:升级PHP版本(PHP 8.2比7.4性能提升明显)、启用OPcache扩展、数据库查询加索引、套一层CDN缓存静态资源,据统计,多数中小站点把OPcache开启后,QPS能提升近一倍,这是性价比最高的一步。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/620880.html





