“LAMP” 是一个经典的开源 Web 开发平台组合,由以下四个核心组件首字母缩写而成,常用于搭建动态网站或 Web 应用程序。以下是对每个组件的详细介绍:
L - Linux(操作系统)
- 定位:作为整个架构的底层操作系统,提供稳定、安全、高效的运行环境。
- 特点:
- 开源免费,可定制性强,支持多种硬件架构。
- 常见发行版包括 Ubuntu、CentOS、Debian 等,适用于服务器和开发环境。
- 具备出色的稳定性和安全性,适合长时间运行服务。
A - Apache(Web 服务器)
- 定位:负责处理客户端的 HTTP 请求,将网页内容返回给浏览器。
- 特点:
- 世界上使用最广泛的 Web 服务器之一,性能稳定,兼容性强。
- 支持模块化设计,可通过插件扩展功能(如 PHP 解析、负载均衡等)。
- 配置灵活,能轻松应对高并发访问场景。
M - MySQL(数据库管理系统)
- 定位:用于存储和管理网站的数据,如用户信息、文章内容、评论等。
- 特点:
- 开源关系型数据库,操作简单,性能优秀,适合中小型项目。
- 支持 SQL 语言,提供数据备份、事务处理等功能。
- 可通过主从复制、集群等方式扩展性能和可靠性。
P - PHP(编程语言)
- 定位:作为服务器端脚本语言,负责处理业务逻辑、动态生成网页内容。
- 特点:
- 语法简洁,易于学习,特别适合 Web 开发。
- 与 Apache 和 MySQL 深度集成,开发效率高。
- 拥有丰富的框架和类库(如 Laravel、Symfony 等),可快速构建复杂应用。
LAMP 的优势
- 开源免费:所有组件均为开源软件,降低开发和部署成本。
- 成熟稳定:经过多年发展,生态完善,社区资源丰富,问题排查和解决方案容易获取。
- 灵活性高:各组件可独立升级或替换(如用 Nginx 替代 Apache,用 MariaDB 替代 MySQL),适应不同场景需求。
- 开发高效:适合快速迭代的 Web 项目,尤其在早期开发和中小型业务中应用广泛。
应用场景
- 传统动态网站:如博客、论坛、企业官网等。
- 内容管理系统(CMS):如 WordPress、Drupal 等通常基于 LAMP 架构。
- 中小型 Web 应用:如电商平台、社交网站的早期版本。
扩展与替代方案
- 技术栈升级:随着技术发展,衍生出 LEMP(Linux + Nginx + MySQL + PHP),利用 Nginx 的高性能处理静态资源和反向代理。
- 语言扩展:PHP 可替换为 Python、Ruby 等其他语言(如 LAMP 变为 LAMP with Python 或 MEAN/MERN 等新兴栈)。
LAMP 架构的工作原理如下:
- 客户端发送请求:用户通过浏览器等客户端应用程序,向服务器发送 HTTP 请求,请求中包含要访问的资源路径等信息。例如,用户在浏览器中输入网址并回车,就会触发一个 HTTP 请求,该请求会基于 TCP/IP 协议通过网络发送到服务器端1。
- Apache 接收请求并处理1:
- 静态资源请求:Apache 服务器接收到请求后,会首先判断请求的资源是静态资源还是动态资源。如果是静态资源,如 HTML 文件、CSS 样式表、图片、视频等,Apache 会直接从服务器的文件系统中读取相应的资源文件,然后将其封装成 HTTP 响应报文,发送回客户端。
- 动态资源请求:如果请求的是动态资源,例如以.php 为后缀的文件,Apache 会根据配置将请求转发给 PHP 解释器进行处理。如果 PHP 是以模块形式与 Apache 联系,它们会通过内部共享内存的方式通信;如果 PHP 单独放置在一台服务器上,那么它们是通过套接字监听的方式通信。
- PHP 解析与处理:PHP 解释器接收到 Apache 转发的请求后,会对 PHP 代码进行解析和执行1。在执行过程中,如果 PHP 代码需要与数据库进行交互,例如查询、插入、更新或删除数据,它会通过 PHP - MySQL 驱动,使用 SQL 语句向 MySQL 数据库服务器发送请求1。
- MySQL 数据库处理:MySQL 数据库服务器接收到 PHP 发送的请求后,会对 SQL 语句进行解析和执行,完成相应的数据操作,如从数据库表中查询数据、将数据插入到表中、更新表中的数据或删除表中的数据等。然后,将操作结果返回给 PHP 解释器1。
- PHP 生成响应内容:PHP 解释器在获取到 MySQL 数据库返回的结果后,会根据业务逻辑生成相应的 HTML 内容(也可以是其他格式,如 JSON 等)。这个 HTML 内容可能是一个完整的网页,也可能是网页中的一部分动态数据。
- Apache 发送响应:PHP 将生成的 HTML 内容返回给 Apache 服务器,Apache 再将其封装成 HTTP 响应报文,发送回客户端浏览器1。
- 客户端展示结果:客户端浏览器接收到 Apache 发送的响应后,会对 HTML 内容进行解析、渲染和展示,最终呈现给用户一个完整的网页或相关数据。如果响应中包含 JavaScript 代码,浏览器还会执行 JavaScript 代码,实现网页的动态效果和交互功能。
总结成一句话就是:客户端通过浏览器发送 HTTP 请求至 Apache 服务器,Apache 判断请求资源类型,静态资源直接返回,动态资源(如 PHP 文件)由 PHP 解析执行,期间如需数据交互则通过 MySQL 数据库处理,最终 PHP 生成响应内容经 Apache 返回给客户端浏览器展示。
一、LAMP环境搭建(Linux+Apache+MySQL+PHP)
1、Linux系统安装部署
Linux服务端发行版:Redhat系列(CentOS),Debian系列(Ubuntu),SUSE系列(opensUsE)
2、源码包安装部署Apache网站服务
# yum -y install apr-devel apr-util-devel pcre-devel zlib-devel openssl-devel
# mkdir -pv /root/tools
# cd /root/tools/
# rz-E //上传httpd-*.tar.g2
# tar xf httpd-*.tar.gz
# cd httpd-*
# ./configure --prefix=/usr/local/httpd-2.4.56 --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-ssl --enable-deflate --with-z --with-pcre
# make
# make install
# ln -s /usr/local/httpd-* /usr/local/httpd
# /usr/local/httpd/bin/httpd -h
# /usr/local/httpd/bin/httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.98.13. Set the 'ServerName' directive globally to suppress this message
上面这个错误是:Apache 在启动时需要确定服务器的完整域名(FQDN),用于生成正确的 URL、重定向或 SSL 证书校验当服务器无法通过 DNS 解析获取自身域名时,会默认使用 IP 地址(如 192.168.98.13
),并提示你设置 ServerName
指令。
更通俗一点说:它不知道自己叫啥名字(域名),只能用 IP 地址(192.168.98.13)代替了。
举个例子:就像你去快递站取件,快递站得知道你的真实姓名(域名)才能准确找包裹,光记门牌号(IP)容易乱。Apache 需要域名来确保网址、跳转这些功能正常,现在没域名,只能先用 IP 凑合,但它觉得 “这样不太对”,所以提醒你设置一下。
# cp /usr/local/httpd/conf/httpd.conf /usr/local/httpd/conf/httpd.conf-bak
# vim /usr/local/httpd/conf/httpd.conf
ServerName www.qm.com:80 //取消注释并自定义域名
# /usr/local/httpd/bin/httpd -t
Syntax OK
# /usr/local/httpd/bin/apachectl configtest //用于测试 Apache 服务器配置文件是否存在语法错误的命令
# vim /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)[Service]
Type=forking
ExecStartPre=/usr/local/httpd/bin/apachectl configtest
ExecStart=/usr/local/httpd/bin/apachectl start
ExecReload=/usr/local/httpd/bin/apachectl graceful
ExecStop=/usr/local/httpd/bin/apachectl graceful-stop
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl enable --now httpd.service
# systemctl status httpd.service
# ps -ef|grep httpd
# ss -Input|grep httpd
# curl http://localhost
<html><body><h1>It works!</h1></body></html>
3、二进制安装部署MySQL数据库服务
# mv /etc/my.cnf /etc/my.cnf-bak
# useradd -s /bin/false -M mysql
# cd /root/tools/
# rz-E //上传mysql-*.tar.gz
# tar -xvf mysql-*.tar.gz
# mv mysql-*-el7-x86_64 /usr/local/mysql-5.7.32
# ln -s /usr/local/mysql-5.7.32 /usr/local/mysql
# chown -R mysql:mysql /usr/local/mysql
# vim /etc/my.cnf
# https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html
[client]
#password = your_password
port = 3306
socket = /usr/local/mysql/tmp/mysql.sock
default-character-set = utf8mb4# Here follows entries for some specific programs
[mysqld]
port = 3306
bind-address = 0.0.0.0
basedir = /usr/local/mysql
datadir = /data/mysql
socket = /usr/local/mysql/tmp/mysql.sock
log-error = /usr/local/mysql/logs/mysqld.log
pid-file = /usr/local/mysql/tmp/mysqld.pid
tmpdir = /usr/local/mysql/tmp
user = mysql
server-id = 5
character-set-server = utf8mb4
init-connect = "SET NAMES utf8mb4"
collation-server = utf8mb4_general_ci
skip-name-resolve
log_timestamps = SYSTEM
max_connections = 4000
# mkdir -pv /data/mysql
# mkdir -pv /usr/local/mysql/{logs,tmp}
# chown -R mysql:mysql /usr/local/mysql*
# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize
# echo $?//确认初始化是否成功
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# systemctl daemon-reload
# systemctl start mysqld.service
# systemctl enable mysqld.service
# systemctl status mysqld.service
# ps -ef|grep mysql
# ss -Input|grep mysql
# grep 'temporary password' /usr/local/mysql/logs/mysqld.log
# /usr/local/mysql/bin/mysql -hlocalhost -P3306 -uroot -p
mysql> ALTER USER root@localhost IDENTIFIED BY 'class@qm.com';
mysql> SHOW DATABASES;
mysql> SELECT user,host FROM mysql.user;
mysql> CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'class@qm.com';
mysql> SELECT user,host FROM mysql.user;
mysql> GRANT ALL ON *.* To 'root'@'127.0.0.1';
mysql> SHOW GRANTS FOR root@'127.0.0.1';
mysql> SHOW GRANTS FOR root@'localhost';
mysql> exit
# /usr/local/mysql/bin/mysql -h127.0.0.1 -P3306 -uroot -p
4、PHP环境安装部署
# yum -y install libxml2-devel curl-devel zlib-devel
# cd /root/tools/
# rz-E//上传php-*.tar.gz
# tar -xvf php-*.tar.gz
# cd php-*
# ./configure -help
# ./configure --help|grep apx
# ./configure --prefix=/usr/local/php-7.3.9 --with-mysqli --enable-mysqlnd --with-pdo-mysql=mysqlnd --enable-bcmath --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --enable-mbstring --enable-phpdbg --enable-shmop --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --with-zlib --with-curl --with-pear --with-openssl --enable-pcntl --with-apxs2=/usr/local/httpd/bin/apxs
# echo $?
# make
# echo $?
# make install
# echo $?
# In -s /usr/local/php-* /usr/local/php
# /usr/local/php/bin/php -config
# /usr/local/php/bin/php -h
5、配置Apache支持PHP
# vim /usr/local/httpd/conf/httpd.conf
添加index.php (添加php主页)
添加后两段 (Apache支持PHP模块)
# /usr/local/httpd/bin/httpd -t
# systemctl reload httpd.service
# systemctl status httpd.service
# vim /usr/local/httpd/htdocs/index.php
<?php
phpinfo();
?>
# curl http://localhost/index.php
# curl -l http://localhost/index.php
# vim /usr/local/php/lib/php.ini //隐藏PHP版本
expose_php = off
# systemctl reload httpd.seryice
# systemctl status httpd.service
# curl - http://localhost/index.php
6、PHP连接MySQL验证
# vim /usr/local/httpd/htdocs/testdb.php
<?php
$conn=mysqli_connect('127.0.0.1','root','class@qm.com','mysql',3306);
if($conn) echo "连接成功!";
else die("连接失败: " . mysqli_connect_error());
?>
# curl http://localhost/testdb.php //连接成功!
7、LAMP应用phpMyAdmin部署
phpMyAdmin是一个使用PHP语言编写,用来管理MYSQL数据库的Web应用系统
# cd /root/tools/
# rz-E //上传phpMyAdmin-*.zip
# unzip phpMyAdmin-*.zip
# mv phpMyAdmin-* /usr/local/httpd/htdocs/phpMyAdmin
# cd /usr/local/httpd/htdocs/phpMyAdmin/
#ll
#cp config.sample.inc.php config.inc.php
# vim config.inc.php
$cfg['Servers'][$i]['host']='127.0.0.1';
# curl http://localhost/phpMyAdmin/
用户名:root
密 码:class@qm.com