从 LAMP 到前后端分离:架构演进与技术实践

目录

  1. 1. LAMP 架构:传统 Web 开发的基石
  2. 2. 前后端分离的诞生:解耦与协作的必然
  3. 3. 前后端分离的实践要点
    1. 3.1. 接口规范与协作模式
    2. 3.2. 技术架构设计
    3. 3.3. 性能优化
  4. 4. 从 LAMP 到分离架构的演进示例
  5. 5. 挑战与解决方案
  6. 6. 总结
  7. 7. 拓展:CentOS快速部署LAMP
    1. 7.1. 1. 更新系统组件
    2. 7.2. 2. 安装 Apache
      1. 7.2.1. 配置防火墙(若开启)
    3. 7.3. 3. 安装 MySQL/MariaDB
      1. 7.3.1. 方案 1:安装 MariaDB(推荐)
      2. 7.3.2. 方案 2:安装 MySQL 8.0(需添加官方仓库)
    4. 7.4. 4. 安装 PHP
      1. 7.4.1. 安装基础 PHP 版本
      2. 7.4.2. 验证 PHP
    5. 7.5. 5. 验证 LAMP 环境
      1. 7.5.1. 测试数据库连接
    6. 7.6. 6. 可选优化
      1. 7.6.1. 配置虚拟主机
    7. 7.7. 常见问题解决
    8. 7.8. 总结

LAMP 架构传统 Web 开发的基石

在早期的 Web 开发领域LAMP 架构犹如一座坚固的基石支撑起无数动态网站的构建LAMP即 Linux + Apache + MySQL + PHP/Perl/Python是一组开源软件的组合它们协同工作为 Web 应用提供了完整的运行环境

随着移动互联网的迅猛发展用户对于应用的体验和功能需求变得更加多样化和复杂在这个背景下传统的 LAMP 架构逐渐显得力不从心其局限性愈发凸显这也促使了前后端分离模式的诞生成为 Web 开发领域的一次重要变革

以一个简单的聊天室系统为例我们可以清晰地看到 LAMP 架构的工作原理Linux 作为操作系统为整个系统提供了稳定可靠的运行基础管理着硬件资源和进程调度Apache 则充当着 Web 服务器的角色负责接收来自客户端的 HTTP 请求当用户在浏览器中输入聊天室的网址并发送请求时Apache 首先接收到这个请求如果请求的是静态页面比如聊天室的 HTML 页面布局CSS 样式文件或者图片等Apache 会直接从服务器的文件系统中读取这些文件并将其返回给浏览器以展示给用户

LAMP 架构之所以在早期广受欢迎是因为它具有诸多显著的优势从成本角度来看由于其所有组件均为开源软件这意味着开发者无需支付高昂的软件授权费用大大降低了开发成本尤其适合预算有限的中小型项目开发速度也是 LAMP 的一大亮点其成熟的生态系统提供了丰富的开发工具框架和大量的开源代码库开发者可以借助这些资源快速搭建项目框架减少从头开发的工作量提高开发效率例如使用 PHP 的一些框架如 LaravelYii 等可以更方便地进行数据库操作路由管理和视图渲染

然而随着技术的发展和应用场景的日益复杂LAMP 架构的局限性也逐渐暴露出来最明显的问题就是前后端代码耦合严重在 LAMP 架构中PHP 代码常常直接嵌入 HTML 中这使得前端页面的展示逻辑和后端的业务逻辑混合在一起代码结构不清晰维护和扩展难度较大当需要修改页面的某个功能时可能需要同时在 PHP 代码和 HTML 代码中进行查找和修改容易出现错误而且职责划分不够明确后端不仅要处理复杂的业务逻辑还要负责页面的渲染工作这使得后端的负担较重不利于系统的性能优化和功能扩展

在如今多终端设备共存的时代LAMP 架构难以适应多终端需求的问题也愈发突出不同终端设备如移动端和 PC 端具有不同的屏幕尺寸分辨率和交互方式需要独立开发适配的页面但在 LAMP 架构下前后端紧密耦合很难实现一套代码在不同终端上的高效复用往往需要为每个终端单独开发和维护一套代码增加了开发成本和维护难度

前后端分离的诞生解耦与协作的必然

在移动互联网时代各种智能设备层出不穷如智能手机平板电脑等用户期望在不同终端上都能获得一致且优质的应用体验然而LAMP 架构中前后端代码的紧密耦合以及职责不清的问题使得开发和维护多终端适配的应用变得异常困难例如当需要为移动端开发一个适配版本的聊天室应用时由于 LAMP 架构下前后端代码的混合可能需要对整个代码库进行大规模的修改和调整不仅工作量巨大而且容易引入新的问题而且随着业务的增长和功能的不断增加LAMP 架构下的项目代码变得越来越臃肿开发和维护的难度呈指数级上升开发效率大幅降低

前后端分离模式正是为了解决这些问题而应运而生其核心思想在于更加清晰明确的职责划分前端专注于视图View和交互逻辑Controller负责与用户进行直接交互提供直观流畅的用户体验它通过各种前端技术和框架如 ReactVueAngular 等构建出丰富多样的用户界面实现页面的动态展示和交互效果后端则专注于数据接口Model负责处理业务逻辑数据存储和管理以及提供稳定可靠的数据接口后端通过使用各种服务器端技术和框架如 Spring BootDjangoFlask 等高效地处理大量的业务请求保障数据的安全和完整性

这种模式还实现了技术栈的独立前端团队可以根据项目需求和自身技术优势自由选择适合的前端框架和工具不断追求更好的用户界面和交互效果后端团队也能够专注于后端技术的优化和业务逻辑的实现选择最适合的服务器端语言数据库和框架以提高系统的性能和稳定性前后端之间通过标准的接口进行通信通常是 RESTful API这种方式使得前后端的交互更加规范清晰也便于维护和扩展

以电商平台为例这种前后端分离模式的优势体现得淋漓尽致在前端使用 React 或 Vue 等框架构建用户界面能够快速实现商品列表的展示购物车的交互以及用户订单的管理等功能用户在浏览商品时能够感受到流畅的页面切换和实时的交互反馈大大提升了购物体验后端采用 Spring Boot 等框架搭建服务提供商品查询订单处理库存管理等各种 API 接口这些接口能够高效地处理大量的请求保障数据的准确性和一致性

引入 Node.js 中间层进一步优化了整个架构Node.js 可以聚合多个后端接口例如将物流信息接口促销信息接口等进行整合减少前端与后端之间的多次请求优化无线端性能当用户查看商品详情时Node.js 中间层可以一次性获取商品的基本信息物流信息以及当前的促销活动信息然后统一返回给前端减少了 HTTP 请求次数提高了页面的加载速度为用户提供了更好的购物体验

前后端分离的实践要点

接口规范与协作模式

在前后端分离的架构中接口规范与协作模式是确保项目顺利进行的关键环节其中RESTful API 以其简洁规范的设计风格成为了前后端通信的首选方式它严格遵循 HTTP 协议使用标准的 HTTP 方法来操作资源使得接口的语义更加清晰易于理解和维护例如对于一个电商平台的商品管理模块我们可以通过GET /api/products来获取所有商品的列表GET /api/products/{id}获取特定商品的详细信息POST /api/products用于创建新的商品PUT /api/products/{id}则用于更新指定商品的信息DELETE /api/products/{id}用于删除商品这种统一的接口设计方式使得前端开发者能够清晰地知道每个接口的功能后端开发者也能更方便地实现和维护这些接口

**前后端分离架构图**

在开发过程中由于前端和后端的开发进度可能不一致为了避免前端开发因等待后端接口而受阻Mock 数据就发挥了重要作用前端可以通过 Mock Server如 Postman 等工具模拟后端接口返回的数据在开发商品详情页面时后端的商品数据接口可能还未完成但前端可以使用 Mock Server 创建一个模拟接口返回预设的商品数据包括商品名称价格描述图片等信息这样前端开发者就可以按照正常的流程进行页面开发和交互逻辑的实现提高开发效率当后端接口开发完成后只需将 Mock 数据替换为真实的接口数据进行简单的联调即可

为了确保前后端对接口的理解一致使用专业的文档工具来生成接口文档是必不可少的Swagger 和 OpenAPI 就是这样的工具它们能够根据后端的代码或配置自动生成详细的接口文档这些文档不仅包含了接口的 URL请求方法请求参数响应数据格式等基本信息还能以直观的界面展示出来方便前后端开发者查阅和使用例如Swagger 生成的接口文档可以在浏览器中直接访问通过可视化的界面开发者可以清晰地看到每个接口的详细说明甚至可以直接在文档页面中进行接口测试大大提高了前后端协作的效率和准确性

技术架构设计

前端架构在前后端分离模式下单页面应用SPA成为了主流的选择SPA 通过在客户端动态加载和渲染页面内容实现了页面的无刷新切换极大地提升了用户体验SPA 在搜索引擎优化SEO方面存在一定的局限性由于 SPA 的页面内容是通过 JavaScript 动态生成的搜索引擎爬虫在抓取页面时可能无法执行这些 JavaScript 代码导致页面内容无法被正确索引为了解决这个问题服务端渲染SSR技术应运而生SSR 是在服务器端生成完整的 HTML 页面然后将其发送给客户端这样搜索引擎爬虫就能够直接抓取到页面的内容提高了页面的 SEO 性能像 Next.js基于 React和 Nuxt.js基于 Vue等框架就提供了很好的 SSR 支持使得开发者可以方便地实现 SPA 与 SSR 的结合

SPA/SSR渲染流程对比

后端架构则趋向于微服务化微服务架构将一个大型的应用程序拆分成多个小型的独立的服务每个服务都专注于实现单一的业务功能并且可以独立部署和扩展在一个大型的电商系统中订单服务负责处理订单的创建修改查询等操作商品服务负责商品的管理用户服务负责用户信息的管理等这些服务之间通过轻量级的通信机制如 RESTful API 进行交互通过微服务化后端架构的可维护性可扩展性和灵活性都得到了极大的提升每个服务可以根据自身的业务需求选择最合适的技术栈和框架独立进行开发测试和部署不会相互影响

微服务架构示例

在部署方案上Nginx 作为一款高性能的 Web 服务器和反向代理服务器发挥着重要的作用它可以反向代理前端的静态资源如 HTMLCSSJavaScript 文件等将这些资源快速地返回给客户端提高页面的加载速度Nginx 还可以反向代理后端的 API实现负载均衡当有大量的客户端请求到达时Nginx 可以将这些请求均匀地分发到多个后端服务器上避免单个服务器因负载过高而出现性能问题从而保证整个系统的稳定性和可靠性

性能优化

性能优化是前后端分离架构中不可忽视的重要环节它直接影响着用户体验和系统的可用性在前端优化方面代码分割是一种有效的手段随着前端应用的功能不断增加代码量也会越来越大这会导致页面加载时需要下载大量的代码从而影响加载速度通过代码分割可以将代码按照功能模块进行拆分只有在需要的时候才加载相应的代码在一个电商应用中商品详情页面和购物车页面的功能相对独立我们可以将它们的代码分别进行打包当用户访问商品详情页面时只加载商品详情页面所需的代码而购物车页面的代码在用户进入购物车时才进行加载这样可以显著减少首屏加载的时间

前后端优化架构图

CDN内容分发网络加速也是前端优化的常用方法CDN 通过在全球各地部署节点服务器将前端的静态资源缓存到离用户最近的节点上当用户请求这些资源时CDN 服务器可以快速地将资源返回给用户大大提高了资源的加载速度对于一些常用的前端库如 Vue.jsReact.js 等我们可以将它们托管到 CDN 上而不是放在自己的服务器上这样用户在访问应用时就可以从离自己最近的 CDN 节点获取这些库减少了网络传输的延迟

懒加载技术则是针对页面中的图片组件等元素进行优化在页面加载时只加载当前可见区域的元素而对于那些暂时不可见的元素等到用户滚动页面使其可见时再进行加载在一个图片展示页面中可能有大量的图片如果一次性全部加载会导致页面加载缓慢通过懒加载技术只有当用户滚动到图片所在区域时图片才会被加载这样可以有效地减少页面初始加载的资源量提高页面的加载速度

后端优化同样至关重要缓存策略是提高后端性能的关键Redis 作为一种高性能的内存缓存数据库被广泛应用于后端缓存我们可以将一些经常被查询且不经常变化的数据如商品的基本信息热门文章等缓存到 Redis 中当有请求到来时后端首先从 Redis 中查询数据如果缓存中存在数据则直接返回给前端避免了重复查询数据库大大提高了响应速度只有当缓存中没有数据时才去查询数据库并将查询结果存入缓存中以便下次查询使用

随着数据量的不断增加数据库分库分表也是后端优化的重要手段当一个数据库中的数据量过大时查询和写入的性能都会受到影响通过分库分表可以将数据分散存储到多个数据库或表中减轻单个数据库或表的压力在一个电商系统中订单数据量可能非常大我们可以按照时间或订单 ID 等条件将订单数据分表存储每个表只存储一定时间段或一定范围内的订单数据这样在进行订单查询时可以根据查询条件快速定位到对应的表提高查询效率

Node.js 中间层在性能优化方面也有着独特的作用它可以合并接口请求减少前端与后端之间的 HTTP 请求次数以淘宝详情页为例页面中可能需要展示商品的基本信息价格库存评论促销活动等多种数据这些数据可能来自不同的后端接口通过 Node.js 中间层可以将这些接口请求进行合并一次性获取所有需要的数据然后统一返回给前端这样不仅减少了 HTTP 请求次数降低了网络传输的开销还提高了页面的加载速度为用户提供了更好的购物体验

从 LAMP 到分离架构的演进示例

为了更直观地理解从 LAMP 到前后端分离架构的演进我们以聊天室系统为例对比这两种架构下的实现方式及其带来的价值

在 LAMP 架构中以 PHP 语言为例实现聊天室系统时代码往往呈现出前后端紧密耦合的状态PHP 直接生成 HTML 的方式在早期聊天室开发中较为常见以下是一段简单的示例代码

<?php
// 连接数据库
$conn = mysqli_connect("localhost", "username", "password", "chat_database");

// 查询聊天记录
$messages = mysqli_query($conn, "SELECT * FROM chat");

// 循环输出聊天记录
while ($row = mysqli_fetch_array($messages)) {
    echo "<div>{$row['content']}</div>";
}

// 关闭数据库连接
mysqli_close($conn);
?>

在这段代码中PHP 不仅负责从 MySQL 数据库中查询聊天记录还直接将这些记录渲染成 HTML 格式输出到浏览器这种方式虽然简单直接但存在诸多问题当需要修改前端的显示样式或交互逻辑时可能需要深入到 PHP 代码中进行修改增加了开发和维护的难度而且这种架构下前端和后端的开发相互依赖开发效率较低

而在前后端分离架构下聊天室系统的实现方式有了很大的不同前端可以使用 Vue 框架通过 Axios 库来调用后端提供的接口获取聊天数据以下是前端 Vue 代码的示例

<template>
  <div>
    <div v-for="message in messages" :key="message.id">{{ message.content }}</div>
    <form @submit.prevent="sendMessage">
      <input v-model="newMessage" placeholder="输入消息">
      <button type="submit">发送</button>
    </form>
  </div>
</template>

<script>
import axios from 'axios';
export default {
  data() {
    return { messages: [], newMessage: '' };
  },
  mounted() { this.fetchMessages(); },
  methods: {
    async fetchMessages() {
      try {
        const response = await axios.get('/api/messages');
        this.messages = response.data;
      } catch (error) {
        console.error('获取聊天记录失败', error);
      }
    },
    async sendMessage() {
      try {
        await axios.post('/api/messages', { content: this.newMessage });
        this.newMessage = '';
        this.fetchMessages();
      } catch (error) {
        console.error('发送消息失败', error);
      }
    }
  }
};
</script>

在后端使用 Spring Boot 框架来处理业务逻辑和提供数据接口Spring Boot 可以方便地与数据库进行交互查询和存储聊天记录并将数据以 JSON 格式返回给前端以下是后端 Spring Boot 的示例代码

import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/api")
public class ChatController {
    private final ChatService chatService;

    public ChatController(ChatService chatService) {
        this.chatService = chatService;
    }

    @GetMapping("/messages")
    public List<Message> getMessages() {
        return chatService.getMessages();
    }

    @PostMapping("/messages")
    public Message sendMessage(@RequestBody Message message) {
        return chatService.sendMessage(message);
    }
}

在前后端分离架构中Node.js 可以发挥重要作用特别是在处理 WebSocket 实时通信方面通过 Node.js 和 WebSocket 库socket.io可以实现聊天室的实时消息推送当有新的聊天消息时后端可以通过 WebSocket 将消息实时推送给所有在线的前端客户端而不需要前端频繁地发起请求获取最新消息以下是使用 Node.js 和 socket.io 实现 WebSocket 实时通信的简单示例

const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);

// 模拟聊天消息存储
let messages = [];

io.on('connection', (socket) => {
    console.log('用户已连接');
    // 发送历史消息给新连接的用户
    socket.emit('history-messages', messages);

    socket.on('send-message', (message) => {
        messages.push(message);
        io.emit('receive-message', message);
    });

    socket.on('disconnect', () => {
        console.log('用户已断开连接');
    });
});

const port = 3000;
http.listen(port, () => {
    console.log(`服务器正在运行<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>端口号: ${port}`);
});

从 LAMP 架构演进到前后端分离架构带来了诸多显著的价值前端可以独立进行 UI 的迭代和优化根据用户需求和设计理念自由地调整页面布局样式和交互效果而无需担心影响后端的业务逻辑后端则可以专注于处理高并发请求优化数据库查询性能保障系统的稳定性和可靠性前后端分离使得同一套后端 API 可以被多个终端复用无论是 Web 端还是 App 端都可以通过调用相同的 API 获取数据大大提高了开发效率和代码的复用性据相关实践统计采用前后端分离架构后开发效率通常可以提升 30% 以上这使得项目能够更快地迭代和上线满足市场的需求

挑战与解决方案

在从 LAMP 架构向前后端分离架构演进的过程中虽然带来了诸多优势但也不可避免地面临一些挑战需要我们找到相应的解决方案来确保项目的顺利推进

跨域问题是前后端分离架构中常见的挑战之一由于前后端通常部署在不同的域名或端口下当前端通过 AJAX 请求后端接口时浏览器会出于安全考虑遵循同源策略阻止这种跨域请求这就导致前端无法正常获取后端的数据影响应用的功能实现为了解决这个问题一种常见的方法是在后端进行 CORS跨域资源共享配置以 Spring Boot 为例可以通过添加 CorsConfig 配置类来实现在配置类中通过addCorsMappings方法定义允许跨域的路径允许的源允许的方法等这样后端在接收到前端的跨域请求时会在响应头中添加Access-Control-Allow-Origin等相关字段告诉浏览器该请求是被允许的从而解决跨域问题

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOriginPatterns("*")
                        .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                        .allowCredentials(true)
                        .maxAge(3600);
            }
        };
    }
}```

也可以通过 Nginx 代理来解决跨域问题<span class="bd-box"><h-char class="bd bd-beg"><h-inner>。</h-inner></h-char></span>Nginx 作为反向代理服务器<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>可以将前端的请求转发到后端服务器<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>并在转发过程中对请求和响应进行处理<span class="bd-box"><h-char class="bd bd-beg"><h-inner>。</h-inner></h-char></span>在 Nginx 的配置文件中<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>通过proxy_pass指令将前端的请求代理到后端的真实地址<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>同时可以添加add_header指令来设置响应头<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>允许跨域请求<span class="bd-box"><h-char class="bd bd-beg"><h-inner>。</h-inner></h-char></span>这样<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>前端通过访问 Nginx 的地址<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>就可以间接访问后端接口<span class="bd-box"><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>避免了跨域问题<span class="bd-box"><h-char class="bd bd-beg"><h-inner>。</h-inner></h-char></span>

```java
server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass http://backend_server;
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

        if ($request_method = 'OPTIONS') {
            return 204;
        }
    }
}

在前后端分离的开发模式下团队协作也面临一些挑战由于前后端职责划分更加明确团队成员需要更加清晰地了解自己的工作边界和与其他成员的协作方式如果职责边界不明确可能会出现前后端在数据校验接口定义等方面的不一致导致开发进度受阻为了解决这个问题团队需要在项目开始前明确前后端的职责边界一般来说后端负责数据的存储业务逻辑的处理以及数据的校验确保数据的准确性和完整性前端则负责用户界面的展示和交互逻辑的实现同时对用户输入的数据进行格式提示和初步的校验但不承担数据的核心校验职责团队可以通过制定详细的接口文档和开发规范明确前后端之间的数据交互格式接口的使用方法等减少沟通成本提高协作效率

前后端分离架构还带来了学习成本的挑战对于前端开发人员来说需要掌握更多的技术如 Node.js现代前端框架ReactVueAngular 等以及相关的工具和库对于后端开发人员也需要了解一些前端的基本知识以便更好地与前端协作为了降低学习成本可以通过组织内部培训来提升团队成员的技术能力邀请公司内部的技术专家或者外部的讲师针对前后端分离架构中的关键技术和开发流程进行培训帮助团队成员快速掌握相关知识和技能也可以引入全栈工程师来缓解团队在技术转型过程中的压力全栈工程师具备前后端开发的能力能够在前后端之间起到桥梁的作用帮助解决开发过程中遇到的技术难题同时也可以带动团队成员学习新的技术促进团队的技术提升

总结

从 LAMP 到前后端分离无疑是 Web 开发领域一次具有深远意义的重要演进这一转变不仅体现了技术的发展和进步更是从根本理念上实现了从单纯 功能实现 到追求 高效协作 的深刻变革

解耦作为前后端分离架构的核心价值之一具有不可忽视的重要性在 LAMP 架构中前后端代码紧密耦合如同交织在一起的乱麻牵一发而动全身这给开发和维护带来了极大的困扰而前后端分离后前端和后端的技术栈实现了独立发展前端能够专注于打造更加优质的用户界面运用各种先进的前端技术和框架不断提升用户体验后端则可以全身心投入到业务逻辑的优化和数据处理中选择最适合的技术和架构提高系统的性能和稳定性这种解耦的方式使得前后端能够根据自身的发展需求进行灵活调整和升级有效降低了系统的复杂度提高了系统的可维护性和可扩展性

前后端分离模式极大地提高了开发效率在传统的 LAMP 架构下前后端的开发相互依赖一个环节的延迟或变更可能会导致整个项目进度的受阻而在前后端分离的模式下前后端团队可以并行开发前端团队可以根据 Mock 数据或 API 文档进行独立开发后端团队也能专注于接口的实现和业务逻辑的处理这样一来大大减少了前后端之间的等待时间和沟通成本提高了整体的开发效率使得项目能够更快地迭代和上线更好地满足市场的需求

前后端分离架构还为系统的扩展性提供了有力支持随着业务的不断发展和用户需求的日益多样化系统需要不断扩展新的功能和模块在前后端分离的架构下通过微服务化的设计后端可以将不同的业务功能拆分成独立的服务每个服务可以独立部署和扩展这样当系统需要增加新的功能时只需对相应的服务进行扩展而不会影响到其他部分引入 Node.js 中间层等技术能够更好地聚合和处理多个后端接口优化系统的性能和响应速度进一步提升系统的扩展性使其能够更好地应对复杂的业务场景

展望未来随着 Serverless 和低代码技术的不断发展和普及Web 开发的架构模式有望进一步简化Serverless 架构让开发者无需关注服务器的管理和运维只需专注于业务逻辑的实现大大降低了开发和运维的成本低代码技术则通过可视化的操作和模块组装使得非专业的开发者也能够参与到应用的开发中提高了开发的效率和灵活性然而无论技术如何发展职责清晰协作高效 的原则都将始终贯穿于 Web 开发的架构设计中成为指导我们构建更加优秀的 Web 应用的核心准则

拓展CentOS快速部署LAMP


CentOS 快速部署 LAMP 环境Linux + Apache + MySQL/MariaDB + PHP

以下是为 CentOS 7/8/Stream 系统设计的快速部署步骤全程使用命令行操作适用于生产环境和本地测试


1. 更新系统组件

# 更新系统软件包
sudo yum update -y

# 安装常用工具<span class="bd-box"><h-char class="bd bd-end"><h-inner>(</h-inner></h-char></span>可选<span class="bd-box"><h-char class="bd bd-beg"><h-inner>)</h-inner></h-char></span>
sudo yum install -y wget vim net-tools

2. 安装 Apache

# 安装 Apache
sudo yum install -y httpd

# 启动 Apache 并设置开机自启
sudo systemctl start httpd
sudo systemctl enable httpd

# 验证 Apache 状态
systemctl status httpd

配置防火墙若开启

# 允许 HTTP/HTTPS 流量
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

3. 安装 MySQL/MariaDB

方案 1安装 MariaDB推荐

# CentOS 默认仓库包含 MariaDB
sudo yum install -y mariadb-server mariadb

# 启动并设置开机自启
sudo systemctl start mariadb
sudo systemctl enable mariadb

# 运行安全配置脚本
sudo mysql_secure_installation

提示按需设置 root 密码移除匿名用户禁止远程 root 登录等

方案 2安装 MySQL 8.0需添加官方仓库

# 下载 MySQL Yum 仓库
wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm

# 安装仓库
sudo rpm -ivh mysql80-community-release-el7-6.noarch.rpm

# 安装 MySQL
sudo yum install -y mysql-community-server

# 启动并配置
sudo systemctl start mysqld
sudo systemctl enable mysqld

# 获取临时 root 密码
grep 'temporary password' /var/log/mysqld.log

# 运行安全配置
sudo mysql_secure_installation

4. 安装 PHP

安装基础 PHP 版本

# CentOS 7 默认仓库提供 PHP 5.4<span class="bd-box"><h-char class="bd bd-end"><h-inner>(</h-inner></h-char></span>旧<span class="bd-box"><h-char class="bd bd-beg"><h-inner>)</h-inner></h-char><h-char class="bd bd-beg"><h-inner>,</h-inner></h-char></span>建议升级到新版
# 安装 EPEL 和 Remi 仓库<span class="bd-box"><h-char class="bd bd-end"><h-inner>(</h-inner></h-char></span>PHP 7.4/8.0+<span class="bd-box"><h-char class="bd bd-beg"><h-inner>)</h-inner></h-char></span>
sudo yum install -y epel-release
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

# 启用指定 PHP 版本<span class="bd-box"><h-char class="bd bd-end"><h-inner>(</h-inner></h-char></span>例如 PHP 7.4<span class="bd-box"><h-char class="bd bd-beg"><h-inner>)</h-inner></h-char></span>
sudo yum-config-manager --enable remi-php74

# 安装 PHP 及扩展
sudo yum install -y php php-mysqlnd php-gd php-opcache php-mbstring php-json php-xml

验证 PHP

# 创建测试文件
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

# 重启 Apache
sudo systemctl restart httpd

访问 http://服务器IP/info.php确认 PHP 信息页显示正常


5. 验证 LAMP 环境

测试数据库连接

创建 PHP 文件测试 MySQL 连接示例代码

<?php
$servername = "localhost";
$username = "root";
$password = "你的MySQL密码";

// 创建连接
$conn = new mysqli($servername, $username, $password);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}
echo "MySQL 连接成功<span class="bd-box"><h-char class="bd bd-beg"><h-inner>!</h-inner></h-char></span>";
?>

保存为 /var/www/html/db_test.php访问该页面确认输出结果


6. 可选优化

配置虚拟主机

# 创建网站目录
sudo mkdir /var/www/mywebsite

# 编辑 Apache 配置
sudo vim /etc/httpd/conf.d/mywebsite.conf

添加以下内容

<VirtualHost *:80>
    ServerAdmin admin@example.com
    DocumentRoot "/var/www/mywebsite"
    ServerName mywebsite.com
    ErrorLog "/var/log/httpd/mywebsite_error.log"
    CustomLog "/var/log/httpd/mywebsite_access.log" combined

    <Directory "/var/www/mywebsite">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

重启 Apache

sudo systemctl restart httpd

常见问题解决

  1. 访问被拒绝

    • 检查防火墙和 SELinux临时关闭 SELinux setenforce 0或配置规则
    • 确认文件权限sudo chown -R apache:apache /var/www/html
  2. PHP 无法连接 MySQL

    • 确认安装 php-mysqlnd 扩展
    • 检查 MySQL 用户权限GRANT ALL PRIVILEGES ON *.* TO '用户名'@'localhost' IDENTIFIED BY '密码';

总结

通过上述步骤您已完成 LAMP 环境的快速部署后续可

  • 将网站文件放入 /var/www/html 或自定义目录
  • 配置 HTTPS使用 Certbot 获取免费 SSL 证书
  • 安装 phpMyAdmin 管理数据库sudo yum install -y phpmyadmin

此架构适合传统 PHP 应用如 WordPressJoomla如需更高性能可考虑替换为 Nginx + PHP-FPM