Ubuntu 上部署与运行 ThinkPHP 的最佳实践
一 环境准备与版本选择
- 选择 PHP 7.4+(ThinkPHP 6.0 要求 PHP ≥ 7.2.5;新项目建议使用 PHP 8.0+ 以获得更好性能与安全补丁)。安装常用扩展:PDO、MySQL、OpenSSL、MBString、XML、CURL、GD、Zip、BCMath。示例:sudo apt install php php-fpm php-mysql php-mbstring php-xml php-curl php-gd php-zip php-bcmath。
- Web 服务器推荐 Nginx + PHP-FPM(亦可 Apache),数据库使用 MySQL/MariaDB。
- 依赖管理使用 Composer;创建项目:composer create-project topthink your_project。
- 目录建议:代码置于 /var/www/your_project,Web 根目录指向 public;运行权限与属主设置为 www-data:www-data,并确保 runtime 可写。
二 目录与权限配置
- 将站点根目录指向 public:Nginx/Apache 的 DocumentRoot 或 root 应为 /var/www/your_project/public。
- 权限最小化:
- 目录:755;文件:644。
- 可写目录(如 runtime、日志、上传):仅对 www-data 可写,建议 750/640,避免过度开放。
- 属主统一:sudo chown -R www-data:www-data /var/www/your_project。
- 安全基线:禁止访问敏感文件与目录,例如 Nginx 中加入 location ~ /.ht { deny all; }。
三 Web 服务器与 URL 重写
- Nginx 推荐配置(要点:root 指向 public、try_files 支持 PATH_INFO、fastcgi_pass 与 SCRIPT_FILENAME 正确):
- 示例:
- root /var/www/your_project/public;
- location / { try_files $uri $uri/ /index.php?$query_string; }
- location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_param PATH_INFO $fastcgi_path_info; }
- 启用站点:sudo ln -s /etc/nginx/sites-available/your_project /etc/nginx/sites-enabled/;sudo nginx -t && sudo systemctl reload nginx。
- Apache 要点:启用 mod_rewrite,设置 AllowOverride All,并确保项目 public/.htaccess 正确(典型规则为:RewriteEngine On;RewriteCond %{REQUEST_FILENAME} !-f;RewriteCond %{REQUEST_FILENAME} !-d;RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L])。
- 生产环境务必隐藏 index.php,通过 URL 重写实现“入口统一”。
四 安全与运行配置
- 关闭调试:生产环境将 app_debug => false,避免泄露敏感信息。
- 配置分离:数据库等敏感信息写入 .env,文件权限设为仅属主可读写(如 600/640)。
- 强制 HTTPS:使用 Let’s Encrypt 免费证书,配置 301 跳转,保护传输安全。
- PHP-FPM 安全:在 /etc/php/7.4/fpm/pool.d/www.conf 中将 cgi.fix_pathinfo=0,降低代码执行风险;重启 PHP-FPM 生效。
- 日志与排错:优先查看 /var/log/nginx/error.log 与 /var/log/php7.4-fpm.log 定位 502/404/路由失效 等问题。
五 部署流程与常见问题速查
- 部署流程(生产建议):
- 拉取代码(git clone 或 rsync/scp);2) composer install --optimize-autoloader --no-dev;
- 配置 .env(数据库、缓存、应用地址等);4) 设置目录权限与属主;
- 配置 Nginx/Apache(root 指向 public、启用重写);6) 开启 HTTPS;7) 重启服务并健康检查。
- 常见问题速查:
- 502 Bad Gateway:检查 PHP-FPM 是否运行、fastcgi_pass 路径是否与系统中 php-fpm.sock 一致(如 /var/run/php/php7.4-fpm.sock)。
- 路由 404/失效:确认 Nginx 使用 try_files 指向 index.php?$query_string,或 Apache 启用 mod_rewrite 且 AllowOverride All。
- 权限错误:确保 runtime 与上传目录对 www-data 可写,避免过度 777。
- 数据库连接失败:核对 .env 中 DB_HOST/DB_PORT/DB_USER/DB_PWD/DB_NAME 与数据库实际配置一致。