php网站部署

把PHP文件扔进服务器就能跑?站部我见过太多人在这第一步就栽了。去年帮朋友处理一个部署事故,站部他把代码上传到阿里云ECS的站部/var/www/html,访问域名直接显示源码。站部原因简单得可笑——Nginx配置里没写location ~ \.php$那段,站部PHP请求全被当静态文件返回了。站部所以部署这件事,站部核心就一句话:让Web服务器认识PHP,站部并且知道该把哪些请求交给它。站部

先说环境。站部现在主流就两套组合:LNMP(Linux+Nginx+MySQL+PHP)和LAMP(把Nginx换成Apache)。站部Nginx处理并发强,站部配置清爽,站部我偏向它。站部但如果你用宝塔面板,站部那基本就是点几下的事,它会自动帮你写好fastcgi_pass指向127.0.0.1:9000。手动装的话,Ubuntu下apt install nginx php8.1-fpm mysql-server三条命令完事。注意PHP版本号,别装完发现代码里用了match表达式而服务器上是PHP7.4。

关键在Nginx的server块。一个能跑的配置长这样:

server {  listen 80; server_name example.com; 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.1-fpm.sock; } }

那个try_files是给框架用的。ThinkPHP、Laravel这类单入口应用,所有请求都要打到index.php,靠路由分发。少了这行,你访问/user/profile会直接404。我第一次配Laravel时在这卡了半小时,还以为是路由缓存问题。

文件权限是另一个坑。很多人用root上传代码,结果PHP-FPM以www-data用户运行,写日志或上传文件时权限拒绝。正确做法:chown -R www-data:www-data /var/www/html,目录给755,文件给644。别偷懒给777,线上环境这么干等于开门揖盗。我见过一个WordPress站点被挂马,查到最后就是wp-content/uploads目录权限777,攻击者传了个shell上去。

数据库别用root连。建个专用用户,只给当前库的权限:CREATE USER 'app'@'localhost' IDENTIFIED BY '强密码'; GRANT ALL ON app_db.* TO 'app'@'localhost';。密码别写死在代码里,用环境变量。Laravel的.env文件、ThinkPHP的.env,都记得加进.gitignore。去年有个开源项目因为把.env提交到GitHub,数据库被挖矿脚本清空,教训够深刻。

HTTPS现在几乎是标配。Let's Encrypt的certbot一条命令搞定:certbot --nginx -d example.com,它会自动改Nginx配置并设置续期。注意续期后要nginx -s reload,否则证书更新了但Nginx还在用旧的。我习惯在crontab里加个每月1号执行的certbot renew --quiet && nginx -s reload。

最后说个真实案例。上个月帮人迁移一个老ThinkPHP5.0站点,PHP版本从5.6升到7.4后白屏。开display_errors看到是each()函数被废弃了。这种兼容性问题只能靠改代码,没有捷径。所以部署前一定在本地或测试环境跑通,别直接动生产。备份数据库和代码,出问题能回滚。我一般用mysqldump -u app -p app_db > backup_$(date +%Y%m%d).sql,代码直接tar打包,简单但管用。

部署完别急着关终端。tail -f /var/log/nginx/error.log盯着,同时用curl -I http://localhost看响应头。确认200了再绑域名解析。DNS生效那几分钟,泡杯茶等着,别反复刷新浏览器——那只会让你更焦虑。

时尚
上一篇:多邻国 duolingo官网
下一篇:系统漏洞的解决方案