云服务器必须用系统包管理器配原生lnmp,禁用xampp/phpstudy:因权限混乱、服务失控、扩展兼容性差;ubuntu 22.04部署需换源、装nginx/mysql/php-fpm、设socket通信、配fastcgi_pass与script_filename、加固mysql。

直接说结论:别装 XAMPP 或 PHPStudy,云服务器上必须用系统包管理器配原生 LAMP/LNMP,否则后期权限、更新、安全全踩坑。
为什么不能直接上传 phpstudy 或 xampp
phpstudy 和 xampp 是为本地开发打包的“全家桶”,在云服务器上运行会带来三个硬伤:
- 默认以 root 启动所有服务,
nginx、mysql、php-fpm全挤在同一个用户下,违反最小权限原则 - 自带的
mysql不走系统 service 管理,systemctl restart mysql失效,日志路径混乱,备份脚本根本找不到进程 - PHP 扩展(如
mysqli、opcache)版本和系统libssl、libc不兼容,上线后随机报undefined symbol: OPENSSL_sk_pop_free
Ubuntu 22.04 上部署 LNMP 的最小可行命令集
以腾讯云/阿里云新购 Ubuntu 22.04 实例为例(非 CentOS,因后者已 EOL),只保留生产必需组件:
- 先换源(避免
apt update卡在Release file not found):sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
- 装核心组件(不装
apache2,避免端口冲突):sudo apt install -y nginx mysql-server php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip
- 启动并设开机自启:
sudo systemctl enable --now nginx mysql php-fpm
- 确认 PHP-FPM 监听的是 Unix socket(比 TCP 更快更安全):
sudo grep -E "listen =|listen.owner" /etc/php/*/fpm/pool.d/www.conf
输出应为listen = /run/php/php8.1-fpm.sock(版本号依实际安装而定)
nginx 配置 PHP 解析时最常漏掉的两件事
502 Bad Gateway 不是 PHP 没起来,而是 nginx 找不到或连不上 php-fpm。重点检查:
-
fastcgi_pass路径必须和php-fpm实际监听路径完全一致。Ubuntu 22.04 默认用php8.1-fpm,所以配置里得写:fastcgi_pass unix:/run/php/php8.1-fpm.sock;
写成php7.4或php8.0就直接 502 -
SCRIPT_FILENAME必须用$document_root$fastcgi_script_name,不能硬编码路径。否则index.php可跑,但 Laravel 的public/index.php会 404 —— 因为$document_root指向的是/var/www/html,不是你的项目目录 - 别碰
cgi.fix_pathinfo:Ubuntu 官方包默认已是0,手动改反而可能覆盖安全设置
MySQL 初始化后必须立刻做的三步
执行 sudo mysql_secure_installation 只解决了一半问题:
- 它不会禁用
root@localhost的密码登录(仅禁远程),你得手动执行:sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPass123!';"
- 创建应用专用用户,且限制来源(别用
%):sudo mysql -e "CREATE USER 'appuser'@'127.0.0.1' IDENTIFIED BY 'AppPass456!'; GRANT ALL ON mydb.* TO 'appuser'@'127.0.0.1'; FLUSH PRIVILEGES;"
- 确认 MySQL 绑定地址是
127.0.0.1(不是0.0.0.0):sudo grep -E "^bind-address" /etc/mysql/mysql.conf.d/mysqld.cnf
如果不是,改成bind-address = 127.0.0.1并sudo systemctl restart mysql
真正麻烦的从来不是“怎么装”,而是“装完谁来管”。比如 php-fpm 进程崩溃后不会自动拉起,mysql 日志满盘导致服务静默退出,这些都得靠 systemctl status 和 journalctl -u 日常盯。别等线上挂了才翻文档。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











