最稳妥方式是用rsync同步并排除开发文件,线上执行composer install --no-dev,确保目录归属web服务用户,Nginx root指向public,Apache启用mod_rewrite,修复SELinux/AppArmor权限。

PHP项目怎么传到服务器上才不会500
直接把本地代码拖到服务器,十有八九会报 500 Internal Server Error。不是代码问题,而是权限、路径、环境三处没对齐。
最稳妥的方式是用 rsync 同步(比 scp 更可控),且必须排除开发环境文件:
rsync -avz --exclude='.git' --exclude='vendor/' --exclude='node_modules/' ./ user@server:/var/www/myapp/-
vendor/别传——线上要composer install --no-dev --optimize-autoloader - 确保
/var/www/myapp所属用户是 web 服务运行用户(如www-data或nginx),否则opcache或日志写入会失败 - 别用
root运行 PHP-FPM;改用专用用户(如phpuser),并在www.conf里设user = phpuser和group = www-data
Apache/Nginx 配置里哪些路径最容易写错
错误配置导致 403、404 或入口文件不生效,核心就两个路径:文档根目录和 index.php 转发规则。
Apache 示例(.htaccess 在 Laravel/ThinkPHP 类框架中必须启用 mod_rewrite):
<ifmodule mod_rewrite.c><ifmodule mod_negotiation.c>
Options -MultiViews -Indexes
</ifmodule><pre class="brush:php;toolbar:false;">RewriteEngine On
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
Nginx 更容易栽在 root 和 try_files 上:
-
root必须指向public/目录(如root /var/www/myapp/public;),不是项目根目录 -
try_files $uri $uri/ /index.php?$query_string;缺少$query_string会导致 GET 参数丢失 - 如果用了子目录部署(如
https://site.com/app/),location块要加前缀重写,不能只靠alias
为什么 composer install 在服务器上总失败
线上执行 composer install 失败,90% 是权限或内存问题,不是网络。
- 先确认 PHP CLI 版本与 FPM 一致:
php -v和php-fpm -v输出要一样,否则ext-pdo等扩展可能加载失败 - 内存不足时 Composer 会卡死或报
Allowed memory size exhausted:临时加大限制:php -d memory_limit=2G /usr/bin/composer install --no-dev - 若用国内镜像但未全局配置,加
-vvv看是否卡在 packagist.org;手动设镜像:composer config -g repo.packagist composer https://packagist.phpcomposer.com -
vendor/autoload.php路径写死在代码里?改成相对引入:require __DIR__.'/../vendor/autoload.php';
上线后 file_put_contents 写不了日志怎么办
本地能写,线上报 failed to open stream: Permission denied,本质是用户和 SELinux(CentOS)或 AppArmor(Ubuntu)双重拦截。
- 查当前 PHP 进程用户:
ps aux | grep php-fpm,再确认storage/、runtime/、logs/目录归属:chown -R www-data:www-data storage/ runtime/ logs/ - CentOS 7+ 默认开启 SELinux,用
ls -Z看目录上下文,应为httpd_sys_rw_content_t;修复命令:chcon -R -t httpd_sys_rw_content_t storage/ - Ubuntu 若启用了 AppArmor,检查
/etc/apparmor.d/usr.sbin.php-fpm7.4是否放行了对应路径,否则加一行:/var/www/myapp/storage/** rwk, - 别用
chmod 777——治标不治本,还埋安全漏洞
环境变量、缓存、数据库连接这些细节,得一条条对齐。上线不是复制粘贴,是校验链。漏掉任意一环,都可能让页面空白得毫无征兆。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











