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的实战经验。