1、PHP项目部署基础:LAMP/LNMP环境搭建、PHP-FPM配置、Nginx/Apache虚拟主机配置
说实话,我见过太多PHP项目在本地跑得飞起,一上服务器就各种报错。环境不一致,是新手最容易踩的坑。今天咱们就把LAMP和LNMP这套东西彻底捋清楚。
1.1 LAMP vs LNMP:到底选哪个?
先说说这两个架构的区别。LAMP是Linux + Apache + MySQL + PHP,LNMP是Linux + Nginx + MySQL + PHP-FPM。我个人的习惯是:
- LAMP:适合传统项目、对.htaccess依赖强的项目、新手入门
- LNMP:适合高并发场景、静态资源多的项目、微服务架构
你想想看,Apache处理动态请求确实有一套,但面对静态文件并发时,Nginx的IO多路复用机制明显更轻量。我在项目中遇到过,一个日活百万的资讯站,从Apache切到Nginx后,服务器负载直接降了40%。
核心结论:新项目我建议直接上LNMP,老项目如果稳定运行就别折腾了。
1.2 环境搭建实战(以CentOS 7为例)
1.2.1 LNMP一键安装
嗯,这里要注意。虽然网上有很多一键安装脚本,但我还是建议你手动走一遍流程,这样才能真正理解每个组件的作用。
# 安装EPEL和Remi源
yum install -y epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# 安装Nginx
yum install -y nginx
systemctl enable nginx
systemctl start nginx
# 安装PHP 7.4及常用扩展
yum install -y php74-php-fpm php74-php-cli php74-php-mysqlnd \
php74-php-gd php74-php-mbstring php74-php-xml php74-php-redis
# 安装MySQL 5.7
yum install -y mysql-community-server
systemctl enable mysqld
systemctl start mysqld
我曾经犯过一个低级错误——装完PHP发现没有装php-mysqlnd扩展,结果数据库连接一直报错。排查了半天,最后发现是扩展没装全。所以建议你装完PHP后,用 php -m 检查一下扩展列表。
1.2.2 配置PHP-FPM
PHP-FPM的配置,说白了就是调教PHP进程池。默认配置往往不适合生产环境。
# 编辑 /etc/opt/remi/php74/php-fpm.d/www.conf
[www]
user = nginx
group = nginx
; 进程管理方式:dynamic、static、ondemand
pm = dynamic
; 最大子进程数
pm.max_children = 50
; 起始时创建的子进程数
pm.start_servers = 5
; 最小空闲进程数
pm.min_spare_servers = 5
; 最大空闲进程数
pm.max_spare_servers = 35
; 每个进程最大处理请求数,防止内存泄漏
pm.max_requests = 500
我的经验:pm.max_requests 这个参数很多人会忽略。如果不设置,PHP进程会一直驻留内存,时间长了内存泄漏会越来越严重。我一般设成500-1000,既能保证性能,又能及时回收内存。
1.3 Nginx虚拟主机配置
虚拟主机,就是在一台服务器上跑多个网站。Nginx通过server块来实现。
# /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.php index.html;
# 日志配置
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静态资源缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
}
为什么用 try_files $uri $uri/ /index.php?$query_string;?这是为了让Nginx先尝试找静态文件,找不到再交给PHP处理。很多框架(比如Laravel、ThinkPHP)都依赖这个规则来实现路由。
避坑指南:我曾经在配置Laravel项目时,忘了设置 root 指向 public 目录,结果所有请求都返回404。记住,PHP框架的入口文件通常在 public/index.php,root一定要指对。
1.4 Apache虚拟主机配置
虽然我个人更偏爱Nginx,但Apache在某些场景下依然不可替代。比如你需要用.htaccess做细粒度权限控制时。
# /etc/httpd/conf.d/example.com.conf
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public
<Directory /var/www/example.com/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/httpd/example.com_error.log
CustomLog /var/log/httpd/example.com_access.log combined
</VirtualHost>
注意 AllowOverride All 这个配置。它允许.htaccess文件覆盖目录级别的配置。但说实话,生产环境我建议关掉它,因为每次请求Apache都要去检查.htaccess文件,性能损耗不小。
1.5 环境验证与调优
配置完别急着上线,先跑一轮验证。
# 检查PHP-FPM状态
systemctl status php74-php-fpm
# 检查Nginx配置语法
nginx -t
# 创建phpinfo文件验证
echo "<?php phpinfo(); ?>" > /var/www/example.com/public/info.php
访问 http://example.com/info.php,看到PHP信息页面就说明环境通了。记得测试完删掉这个文件,不然会暴露服务器信息。
| 组件 | 常用命令 | 配置文件路径 |
|---|---|---|
| Nginx | nginx -t, systemctl restart nginx | /etc/nginx/nginx.conf |
| PHP-FPM | php74-php-fpm -t, systemctl restart php74-php-fpm | /etc/opt/remi/php74/php-fpm.d/www.conf |
| MySQL | mysql -u root -p, systemctl restart mysqld | /etc/my.cnf |
1.6 性能调优小贴士
环境搭好了,但离「生产可用」还有一段距离。我分享几个常用的调优点:
- PHP-FPM进程数:不是越多越好。我一般按「总内存 / 每个PHP进程平均内存」来算。比如8G内存,每个PHP进程占40M,那max_children设200左右比较合理。
- Nginx worker_processes:设为CPU核心数即可。设多了反而会因为上下文切换降低性能。
- 开启OPcache:PHP 7.4默认带了OPcache,记得在php.ini里开启。我见过一个项目,开启OPcache后接口响应时间从200ms降到了30ms。
一句话总结:环境搭建只是第一步,真正的功力体现在调优和排错上。多动手、多踩坑,慢慢就熟了。
好了,这一章的内容就到这里。下一章咱们聊聊版本控制与自动化部署,到时候我会分享一些Git工作流和Webhook的实战经验。