LAMP与LNMP环境搭建全指南:从基础到生产实践

LAMP(Linux + Apache + MySQL/MariaDB + PHP)和LNMP(Linux + Nginx + MySQL/MariaDB + PHP-FPM)是PHP Web应用的经典运行环境,广泛用于WordPress、Drupal、Laravel等项目。两者的核心差异在于Web服务器的选择

  • LAMP:使用Apache作为Web服务器,适合传统PHP应用,配置灵活(如.htaccess),学习成本低;
  • LNMP:使用Nginx作为Web服务器,结合PHP-FPM(FastCGI Process Manager)处理动态请求,性能更优(尤其高并发、静态内容场景)。

本文将提供分步搭建指南最佳实践常见问题排查,并通过WordPress部署示例帮助你快速上手。

目录#

  1. 前置知识与准备
  2. LAMP环境搭建
  3. LNMP环境搭建
  4. 常见实践与最佳实践
  5. 示例:部署WordPress应用
  6. LAMP vs LNMP:核心差异与场景选择
  7. troubleshooting常见问题
  8. 参考资料

1. 前置知识与准备#

1.1 核心组件说明#

组件LAMP角色LNMP角色
Linux底层操作系统(Ubuntu/Debian/RHEL/CentOS)同LAMP
Apache/NginxWeb服务器(处理HTTP请求)Web服务器(轻量、高性能)
MySQL/MariaDB关系型数据库(存储数据)同LAMP
PHP动态脚本解释器(mod_php嵌入Apache)动态脚本解释器(PHP-FPM独立进程)

1.2 选择Linux发行版#

推荐选择长期支持(LTS)版本

  • Ubuntu 22.04 LTS:新手友好,软件包丰富;
  • Debian 12:稳定,适合生产环境;
  • RHEL 9/CentOS Stream 9:企业级稳定性,需配置EPEL源。

1.3 系统初始化#

1.3.1 更新系统#

# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y
 
# RHEL/CentOS
sudo dnf update -y && sudo dnf upgrade -y

1.3.2 配置防火墙#

开放HTTP(80)和HTTPS(443)端口:

# Ubuntu(ufw)
sudo ufw allow 'Apache Full'  # LAMP
sudo ufw allow 'Nginx Full'   # LNMP
sudo ufw enable
 
# RHEL/CentOS(firewalld)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

1.3.3 创建非root用户(安全最佳实践)#

sudo adduser your_user
sudo usermod -aG sudo your_user  # 赋予sudo权限
su - your_user  # 切换用户

2. LAMP环境搭建#

2.1 步骤1:安装Apache Web服务器#

Apache是模块化、高可配置的Web服务器,适合传统PHP应用。

安装命令#

# Ubuntu/Debian
sudo apt install apache2 -y
 
# RHEL/CentOS
sudo dnf install httpd -y

启动并设置开机自启#

# Ubuntu/Debian
sudo systemctl enable --now apache2
 
# RHEL/CentOS
sudo systemctl enable --now httpd

验证安装#

访问服务器IP(http://your-server-ip),看到Apache默认页面即成功。

2.2 步骤2:安装与配置MySQL/MariaDB#

MariaDB是MySQL的开源分支,兼容MySQL语法,推荐使用。

安装命令#

# Ubuntu/Debian
sudo apt install mariadb-server -y
 
# RHEL/CentOS
sudo dnf install mariadb-server -y

启动并设置开机自启#

sudo systemctl enable --now mariadb

安全初始化(关键!)#

运行mysql_secure_installation脚本,按提示完成:

  • 设置root密码;
  • 删除匿名用户;
  • 禁止root远程登录;
  • 删除测试数据库;
  • 刷新权限表。
sudo mysql_secure_installation

验证数据库#

sudo mysql -u root -p  # 输入root密码登录

成功登录后,执行SHOW DATABASES;查看数据库列表。

2.3 步骤3:安装PHP与Apache模块#

Apache通过mod_php模块处理PHP请求(PHP嵌入Apache进程)。

安装PHP及扩展#

# Ubuntu/Debian(PHP 8.1,默认版本)
sudo apt install php libapache2-mod-php php-mysql php-cli php-curl php-gd php-xml php-mbstring -y
 
# RHEL/CentOS(PHP 8.1)
sudo dnf install php php-mysqlnd php-cli php-curl php-gd php-xml php-mbstring -y

重启Apache使PHP生效#

# Ubuntu/Debian
sudo systemctl restart apache2
 
# RHEL/CentOS
sudo systemctl restart httpd

2.4 步骤4:测试LAMP环境#

创建phpinfo.php文件,验证PHP是否正常运行:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

访问http://your-server-ip/info.php,看到PHP信息页面即成功。

2.5 LAMP虚拟主机配置(多站点)#

虚拟主机允许同一台服务器托管多个网站(如example.comtest.com)。

步骤1:创建网站目录#

sudo mkdir -p /var/www/example.com/public_html
sudo chown -R www-data:www-data /var/www/example.com/public_html  # Apache用户权限

步骤2:创建虚拟主机配置文件#

sudo nano /etc/apache2/sites-available/example.com.conf  # Ubuntu/Debian
# 或 /etc/httpd/conf.d/example.com.conf  # RHEL/CentOS

添加以下内容:

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName example.com          # 主域名
    ServerAlias www.example.com     # 别名
    DocumentRoot /var/www/example.com/public_html  # 网站根目录
    ErrorLog ${APACHE_LOG_DIR}/example.com_error.log  # 错误日志
    CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined  # 访问日志
 
    <Directory /var/www/example.com/public_html>
        Options Indexes FollowSymLinks
        AllowOverride None  # 禁用.htaccess(安全最佳实践)
        Require all granted  # 允许所有访问
    </Directory>
</VirtualHost>

步骤3:启用虚拟主机#

# Ubuntu/Debian(需启用sites-available到sites-enabled的软链接)
sudo a2ensite example.com.conf
sudo systemctl reload apache2
 
# RHEL/CentOS(直接生效,无需链接)
sudo systemctl reload httpd

步骤4:测试虚拟主机#

在本地hosts文件添加域名映射(your-server-ip example.com),访问http://example.com验证。

3. LNMP环境搭建#

LNMP中,Nginx作为Web服务器(处理静态请求),PHP-FPM(FastCGI Process Manager)作为独立进程处理动态请求(性能更优)。

3.1 步骤1:安装Nginx Web服务器#

Nginx是轻量级、高并发的Web服务器,适合处理静态内容和反向代理。

安装命令#

# Ubuntu/Debian
sudo apt install nginx -y
 
# RHEL/CentOS(需先安装EPEL源)
sudo dnf install epel-release -y
sudo dnf install nginx -y

启动并设置开机自启#

sudo systemctl enable --now nginx

验证安装#

访问http://your-server-ip,看到Nginx默认页面即成功。

3.2 步骤2:安装与配置MySQL/MariaDB#

同LAMP环境的2.2节,无需重复操作。

3.3 步骤3:安装PHP-FPM#

PHP-FPM是PHP的FastCGI进程管理器,独立于Nginx运行,性能优于mod_php

安装命令#

# Ubuntu/Debian(PHP 8.1)
sudo apt install php-fpm php-mysql php-cli php-curl php-gd php-xml php-mbstring -y
 
# RHEL/CentOS(PHP 8.1)
sudo dnf install php-fpm php-mysqlnd php-cli php-curl php-gd php-xml php-mbstring -y

启动并设置开机自启#

# Ubuntu/Debian(PHP 8.1)
sudo systemctl enable --now php8.1-fpm
 
# RHEL/CentOS
sudo systemctl enable --now php-fpm

3.4 步骤4:配置Nginx与PHP-FPM联动#

Nginx通过fastcgi_pass指令将PHP请求转发给PHP-FPM处理。

步骤1:编辑Nginx默认配置#

# Ubuntu/Debian
sudo nano /etc/nginx/sites-available/default
 
# RHEL/CentOS
sudo nano /etc/nginx/nginx.conf

步骤2:修改配置(关键部分)#

替换server块内容为以下配置:

server {
    listen 80;
    server_name your-server-ip;  # 或域名(如example.com)
    root /var/www/html;          # 网站根目录
    index index.php index.html index.htm;  # 默认索引文件
 
    # 处理静态请求
    location / {
        try_files $uri $uri/ =404;  # 尝试访问文件,不存在则返回404
    }
 
    # 处理PHP请求:转发给PHP-FPM
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;  # 引入FastCGI配置片段
        # PHP-FPM的UNIX套接字(Ubuntu 22.04)
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        # 若为RHEL/CentOS,使用:fastcgi_pass unix:/run/php-fpm/www.sock;
    }
 
    # 禁止访问.htaccess文件(Apache特有的配置文件,Nginx无需)
    location ~ /\.ht {
        deny all;
    }
}

步骤3:验证Nginx配置#

sudo nginx -t  # 检查配置语法

输出nginx: configuration file /etc/nginx/nginx.conf test is successful即正常。

步骤4:重启Nginx使配置生效#

sudo systemctl restart nginx

3.5 步骤5:测试LNMP环境#

同LAMP环境的2.4节,创建info.php文件并访问,看到PHP信息页面即成功。

3.6 LNMP服务器块配置(多站点)#

Nginx的**服务器块(Server Block)**对应Apache的虚拟主机,配置逻辑类似。

步骤1:创建网站目录#

sudo mkdir -p /var/www/example.com/public_html
sudo chown -R www-data:www-data /var/www/example.com/public_html  # Nginx用户(Ubuntu)
# RHEL/CentOS使用:sudo chown -R nginx:nginx /var/www/example.com/public_html

步骤2:创建服务器块配置文件#

sudo nano /etc/nginx/sites-available/example.com

添加以下内容:

server {
    listen 80;
    server_name example.com www.example.com;  # 域名
    root /var/www/example.com/public_html;    # 网站根目录
    index index.php index.html;
 
    location / {
        try_files $uri $uri/ =404;
    }
 
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;  # Ubuntu
        # fastcgi_pass unix:/run/php-fpm/www.sock;   # RHEL/CentOS
    }
 
    location ~ /\.ht {
        deny all;
    }
}

步骤3:启用服务器块#

创建软链接到sites-enabled目录(Ubuntu/Debian):

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

步骤4:重启Nginx#

sudo systemctl restart nginx

步骤5:测试服务器块#

同LAMP虚拟主机测试,访问http://example.com验证。

4. 常见实践与最佳实践#

4.1 安全加固#

4.1.1 启用HTTPS(SSL/TLS)#

使用Let's Encrypt免费证书,通过certbot自动配置:

安装Certbot#

# Ubuntu/Debian(LAMP)
sudo apt install certbot python3-certbot-apache -y
 
# Ubuntu/Debian(LNMP)
sudo apt install certbot python3-certbot-nginx -y
 
# RHEL/CentOS(LAMP)
sudo dnf install certbot python3-certbot-apache -y
 
# RHEL/CentOS(LNMP)
sudo dnf install certbot python3-certbot-nginx -y

生成证书并配置HTTPS#

# LAMP(Apache)
sudo certbot --apache
 
# LNMP(Nginx)
sudo certbot --nginx

按提示选择域名,自动更新配置(强制HTTPS跳转)。

自动续期证书#

Let's Encrypt证书有效期90天,certbot会自动续期:

sudo systemctl enable --now certbot.timer  # 启用自动续期定时器

4.1.2 强化Web服务器安全#

  • Apache:禁用目录列表(Options -Indexes)、禁用.htaccessAllowOverride None);
  • Nginx:禁用自动索引(autoindex off;)、添加安全响应头:
    add_header X-Frame-Options "SAMEORIGIN";  # 防止点击劫持
    add_header X-XSS-Protection "1; mode=block";  # 防止XSS攻击
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";  # 强制HTTPS

4.1.3 数据库安全#

  • 避免使用root用户连接应用,创建专用数据库用户
    CREATE DATABASE wordpress;  # 创建WordPress数据库
    CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'strong_password';  # 创建用户
    GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';  # 授权
    FLUSH PRIVILEGES;  # 刷新权限
  • 定期备份数据库(见4.4节)。

4.2 性能优化#

4.2.1 PHP-FPM调优(LNMP关键)#

编辑PHP-FPM配置文件(www.conf),调整进程数(根据服务器RAM调整):

# Ubuntu/Debian(PHP 8.1)
sudo nano /etc/php/8.1/fpm/pool.d/www.conf
 
# RHEL/CentOS
sudo nano /etc/php-fpm.d/www.conf

修改以下参数:

pm = dynamic  # 动态进程管理(推荐)
pm.max_children = 50  # 最大进程数(根据RAM调整,每进程约20-30MB)
pm.start_servers = 5   # 启动时的进程数
pm.min_spare_servers = 5  # 最小空闲进程数
pm.max_spare_servers = 10 # 最大空闲进程数

重启PHP-FPM使配置生效:

# Ubuntu/Debian
sudo systemctl restart php8.1-fpm
 
# RHEL/CentOS
sudo systemctl restart php-fpm

4.2.2 缓存静态资源#

  • Apache:启用mod_cachemod_cache_disk模块,缓存静态文件(如.css.js.jpg);
  • Nginx:使用proxy_cachefastcgi_cache缓存静态资源,示例:
    http {
        # 定义缓存目录:/var/cache/nginx,10MB内存区,10GB最大容量
        proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=10g inactive=60m use_temp_path=off;
     
        server {
            ...
            # 缓存静态资源(有效期1天)
            location ~* \.(css|js|jpg|jpeg|png|gif|ico|svg)$ {
                proxy_cache static_cache;
                proxy_cache_valid 200 1d;
                expires 1d;  # 设置缓存过期时间
                add_header X-Cached $upstream_cache_status;  # 显示缓存状态
            }
        }
    }

4.3 监控与日志管理#

4.3.1 监控服务器状态#

  • 资源监控:使用htop(查看CPU/内存)、df -h(查看磁盘空间);
  • Web服务器日志
    • Apache日志:/var/log/apache2/
    • Nginx日志:/var/log/nginx/
  • PHP-FPM日志/var/log/php8.1-fpm.log(Ubuntu)或/var/log/php-fpm/(RHEL);
  • 数据库日志/var/log/mariadb/mariadb.log

4.3.2 启用PHP-FPM状态页#

编辑www.conf,启用状态页:

pm.status_path = /fpm-status  # 状态页路径

在Nginx配置中添加访问规则(仅允许本地访问):

location /fpm-status {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    allow 127.0.0.1;  # 仅允许本地访问
    deny all;
}

访问http://your-server-ip/fpm-status查看PHP-FPM状态。

4.4 备份与恢复#

4.4.1 数据库备份#

使用mysqldump工具备份数据库,示例:

# 备份所有数据库(压缩)
mysqldump -u root -p --all-databases | gzip > /backups/db_backup_$(date +%F).sql.gz
 
# 备份指定数据库(如wordpress)
mysqldump -u root -p wordpress | gzip > /backups/wordpress_backup_$(date +%F).sql.gz

4.4.2 自动备份(Cron)#

创建 cron 任务,每天凌晨2点备份数据库:

crontab -e  # 编辑cron任务

添加以下内容(替换YOUR_PASSWORD为root密码,或使用.my.cnf文件存储凭证):

0 2 * * * mysqldump -u root -pYOUR_PASSWORD --all-databases | gzip > /backups/db_backup_$(date +%F).sql.gz

4.4.3 文件备份#

备份网站文件(如/var/www/html):

tar -czf /backups/web_backup_$(date +%F).tar.gz /var/www/html

4.5 容器化部署(Docker Compose)#

容器化可确保环境一致性(开发/测试/生产环境一致),简化部署。

4.5.1 LAMP Docker Compose示例#

创建docker-compose.yml

version: '3.8'
services:
  web:
    image: httpd:2.4  # Apache镜像
    volumes:
      - ./html:/usr/local/apache2/htdocs/  # 网站文件映射
      - ./httpd.conf:/usr/local/apache2/conf/httpd.conf  # 自定义Apache配置
    ports:
      - "80:80"  # 端口映射(主机:容器)
  db:
    image: mariadb:10.6  # MariaDB镜像
    environment:
      MYSQL_ROOT_PASSWORD: root_password  # root密码
      MYSQL_DATABASE: lamp_db  # 初始化数据库
      MYSQL_USER: lamp_user  # 初始化用户
      MYSQL_PASSWORD: lamp_password  # 用户密码
    volumes:
      - db_data:/var/lib/mysql  # 数据库数据持久化
  php:
    build: ./php  # 自定义PHP镜像(安装mod_php)
    volumes:
      - ./html:/usr/local/apache2/htdocs/  # 网站文件映射
volumes:
  db_data:  # 持久化卷

4.5.2 LNMP Docker Compose示例#

创建docker-compose.yml

version: '3.8'
services:
  web:
    image: nginx:1.23  # Nginx镜像
    volumes:
      - ./html:/var/www/html  # 网站文件映射
      - ./nginx.conf:/etc/nginx/conf.d/default.conf  # 自定义Nginx配置
    ports:
      - "80:80"  # 端口映射
  db:
    image: mariadb:10.6  # MariaDB镜像
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: lnmp_db
      MYSQL_USER: lnmp_user
      MYSQL_PASSWORD: lnmp_password
    volumes:
      - db_data:/var/lib/mysql
  php-fpm:
    image: php:8.1-fpm  # PHP-FPM镜像
    volumes:
      - ./html:/var/www/html  # 网站文件映射
volumes:
  db_data:

4.5.3 运行容器#

docker-compose.yml目录下执行:

docker-compose up -d  # 后台启动容器

访问http://localhost验证。

5. 示例:部署WordPress应用#

WordPress是全球最流行的CMS,以下是LAMP和LNMP的部署步骤。

5.1 在LAMP上部署WordPress#

步骤1:下载WordPress#

cd /tmp
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz  # 解压

步骤2:移动到网站根目录#

sudo mv wordpress /var/www/html/  # 若使用虚拟主机,移动到对应目录(如/var/www/example.com/public_html)

步骤3:设置文件权限#

sudo chown -R www-data:www-data /var/www/html/wordpress

步骤4:创建WordPress数据库#

sudo mysql -u root -p

执行以下SQL:

CREATE DATABASE wordpress;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'wp_password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

步骤5:配置WordPress#

复制wp-config-sample.phpwp-config.php,编辑数据库信息:

cd /var/www/html/wordpress
sudo cp wp-config-sample.php wp-config.php
sudo nano wp-config.php

修改以下内容:

define('DB_NAME', 'wordpress');
define('DB_USER', 'wp_user');
define('DB_PASSWORD', 'wp_password');
define('DB_HOST', 'localhost');

步骤6:完成安装#

访问http://your-server-ip/wordpress,按提示设置站点标题、管理员账号,完成安装。

5.2 在LNMP上部署WordPress#

步骤与LAMP基本一致,仅需调整Nginx配置

步骤1:修改Nginx服务器块#

确保root指向WordPress目录(如/var/www/html/wordpress),并配置try_files处理WordPress固定链接:

server {
    listen 80;
    server_name example.com;
    root /var/www/html/wordpress;
    index index.php index.html;
 
    location / {
        try_files $uri $uri/ /index.php?$args;  # 处理固定链接
    }
 
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }
}

步骤2:重启Nginx#

sudo systemctl restart nginx

后续步骤同LAMP,访问http://example.com完成安装。

6. LAMP vs LNMP:核心差异与场景选择#

维度LAMPLNMP
Web服务器Apache(重型,功能丰富)Nginx(轻量,高并发)
PHP处理方式mod_php(嵌入Apache,性能一般)PHP-FPM(独立进程,性能优)
静态内容处理一般优秀(Nginx擅长静态资源)
并发能力中等(适合中小流量)高(适合高并发、大流量)
配置复杂度较高(.htaccess灵活但复杂)较低(配置文件简洁)
资源占用较高(Apache进程占用内存多)较低(Nginx/PHP-FPM内存占用少)
适用场景传统PHP应用(如WordPress、Drupal)高流量网站、API服务、静态站点

7. troubleshooting常见问题#

7.1 404 Not Found(找不到页面)#

  • 检查DocumentRoot(Apache)或root(Nginx)路径是否正确;
  • 确保文件存在于网站根目录;
  • 若使用WordPress固定链接,检查try_files配置(LNMP)或mod_rewrite模块(LAMP,a2enmod rewrite)。

7.2 500 Internal Server Error(内部服务器错误)#

  • 检查PHP语法错误:php -l /path/to/file.php
  • 查看Web服务器错误日志(如/var/log/apache2/error.log);
  • 确保文件权限正确(避免777权限)。

7.3 502 Bad Gateway(错误网关)#

  • 检查PHP-FPM状态:systemctl status php8.1-fpm
  • 确保fastcgi_pass指向正确的套接字或端口(如unix:/run/php/php8.1-fpm.sock);
  • 检查PHP-FPM日志(/var/log/php8.1-fpm.log)。

7.4 503 Service Unavailable(服务不可用)#

  • 检查服务器负载(htop),是否CPU/内存耗尽;
  • 检查Web服务器是否运行(systemctl status apache2/nginx);
  • 检查数据库是否运行(systemctl status mariadb)。

7.5 PHP不解析(下载.php文件)#

  • LAMP:确保mod_php模块启用(a2enmod php8.1);
  • LNMP:确保Nginx配置中location ~ \.php$块正确,且fastcgi_pass指向PHP-FPM。

8. 参考资料#


通过本文,你已掌握LAMP和LNMP环境的搭建、配置、优化及故障排查。选择合适的环境取决于你的业务需求:若追求稳定和灵活性,选LAMP;若追求高性能和高并发,选LNMP。建议在生产环境中结合容器化(Docker)和监控工具(如Prometheus+Grafana),提升运维效率。