25-LNMP黄金架构
LNMP 架构是一种常见的用于搭建动态网站或 Web 应用的技术组合,由 Linux(操作系统)、Nginx(Web 服务器)、MySQL(数据库管理系统)、PHP(脚本语言)组成。以下为你描述 LNMP 黄金架构的主要组件及其交互关系,你可以依据此来绘制图示:
架构组件与交互流程概述
1. 用户请求
用户通过浏览器或其他客户端设备发起对网站的访问请求,该请求会通过互联网传输到部署了 LNMP 架构的服务器。
2. Nginx 接收请求
Nginx 作为前端的 Web 服务器,负责接收用户的 HTTP 请求。它可以高效地处理静态资源(如 HTML、CSS、JavaScript、图片等)的请求,并将动态请求(如 PHP 脚本)转发给 PHP-FPM 进行处理。
3. 静态资源处理
如果用户请求的是静态资源,Nginx 会直接从服务器的文件系统中读取相应的文件,并将其返回给用户。
4. 动态资源处理
如果用户请求的是动态资源(如 .php
文件),Nginx 会将请求转发给 PHP-FPM(FastCGI 进程管理器)。PHP-FPM 会启动相应的 PHP 进程来解析和执行 PHP 脚本。
5. PHP 与 MySQL 交互
在执行 PHP 脚本的过程中,PHP 可能需要从数据库中读取数据或向数据库中写入数据。此时,PHP 会通过 MySQL 客户端库与 MySQL 数据库进行交互,执行相应的 SQL 语句。
6. MySQL 处理数据请求
MySQL 数据库接收到 PHP 发送的 SQL 请求后,会对数据库进行查询、插入、更新或删除等操作,并将结果返回给 PHP。
7. PHP 返回处理结果
PHP 接收到 MySQL 返回的结果后,会将其与 HTML 模板进行组合,生成最终的 HTML 页面,并将其返回给 Nginx。
8. Nginx 返回响应
Nginx 接收到 PHP 返回的 HTML 页面后,会将其返回给用户的浏览器,用户即可在浏览器中看到最终的网页内容。
mermaid 代码生成图示
你可以使用 mermaid 代码来生成对应的流程图,以下是相应代码:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A(用户请求):::process --> B(Nginx):::process
B -->|静态资源| C(静态文件系统):::process
C --> B
B -->|动态资源| D(PHP - FPM):::process
D --> E(PHP 脚本执行):::process
E -->|数据请求| F(MySQL 数据库):::process
F -->|数据响应| E
E --> D
D --> B
B --> A(用户响应):::process
图示解释
- 用户请求:发起对网站的访问。
- Nginx:作为入口,负责分发静态和动态请求。
- 静态文件系统:存储网站的静态资源。
- PHP - FPM:管理 PHP 进程,处理动态请求。
- PHP 脚本执行:执行 PHP 代码,与数据库交互。
- MySQL 数据库:存储和管理网站的数据。
你可以将上述 mermaid 代码复制到支持 mermaid 的工具中(如 Typora、GitLab、GitHub 等),即可生成对应的 LNMP 架构流程图。
之前于超老师是带着大家快速的学习yum工具,软件安装等,去搭建LNMP环境;
在我们学习完毕nginx,且正式学习网站上线部署环境,就得对LNMP有更深的认识。
之前学习Apache了解过LAMP(Linux、Apache、Mysql、Perl/PHP/Python)
由于上述架构,已然是一个商业版软件的代名词,后来自由软件趋势兴起,如何用开源软件替代商业软件,这是人们追求的,所有的Linux发行版几乎都会内置这样的软件。
但是由于Nginx的兴趣,卓越的性能,更简单的配置,更强大的功能,更低的资源消耗,LAMP已经渐渐被LNMP
取代。
黄金架构LNMP
LNMP是网站架构初期最合适的单体架构。因为初创型技术团队对于技术的选型,需要考虑如下因素
- 在创业初期,研发资源有限,研发人力有限,技术储备有限,需要选择一个易维护、简单的技术架构;
- 产品需要快速研发上线,并能够满足快速迭代要求,现实情况决定了一开始没有时间和精力来选择一个过于复杂的分布式架构系统,研发速度必须要快;
- 创业初期,业务复杂度比较低,业务量也比较小,如果选择过于复杂的架构,反而会增加研发难度以及运维难度;
- 遵从选择合适的技术而不是最好的技术原则,并权衡研发效率和产品目标,同时创业初期只有一个PHP研发人员,过于复杂的技术架构必然会带来比较高昂的学习成本。
基于如上的因素,LNMP架构就是最合适的。
如此架构,一般三台服务器足以,Nginx与后台系统部署在一台机器,Mysql数据库单独服务器,redis缓存一台服务器。
这样的架构优势在于
- 单体架构,架构简单,清晰的分层结构;
- 可以快速研发,满足产品快速迭代要求;
- 没有复杂的技术,技术学习成本低,同时运维成本低,无需专业的运维(开发一般忙不过来,任何大小的公司,都至少得有一个运维,除非真的是一个很烂的小作坊),节省开支。
对于初创公司而言,LNMP(Linux + Nginx + MySQL + PHP)架构是一个性价比高、性能良好且易于搭建和维护的网站或应用部署方案。下面从架构介绍、优势、搭建步骤、优化和扩展等方面为你详细介绍。
架构简介
- Linux:作为操作系统,常见选择有 CentOS、Ubuntu 等,提供稳定的运行环境和丰富的系统工具,具有开源、安全、可定制等特性。
- Nginx:轻量级、高性能的 Web 服务器和反向代理服务器,能高效处理大量并发连接,占用系统资源少。
- MySQL:开源的关系型数据库管理系统,功能强大、性能稳定,可满足初创公司大部分数据存储和管理需求。
- PHP:广泛应用于 Web 开发的脚本语言,具有简单易学、开发效率高、拥有丰富的开源框架(如 Laravel、ThinkPHP 等)的特点。
采用 LNMP 架构的优势
- 成本低:所有组件均为开源软件,无需支付高额的授权费用,能有效降低初创公司的成本。
- 性能高:Nginx 在处理高并发连接方面表现出色,配合 PHP 和 MySQL 能为网站和应用提供高效的服务。
- 易于搭建和维护:有大量的文档和社区支持,搭建和维护难度相对较低,即使是技术实力较弱的初创公司也能轻松上手。
- 扩展性强:随着业务的发展,可以方便地对架构进行扩展,如增加服务器、优化数据库等。
性能优化和扩展建议
性能优化
- Nginx 优化:调整 Nginx 的配置参数,如
worker_processes
、worker_connections
等,以提高并发处理能力。 - MySQL 优化:优化数据库表结构、创建合适的索引、调整 MySQL 的配置参数(如
innodb_buffer_pool_size
)等,以提高数据库性能。 - PHP 优化:使用 OPcache 扩展对 PHP 脚本进行缓存,减少脚本解析时间。
扩展方案
- 横向扩展:增加服务器数量,通过负载均衡器(如 Nginx 或 HAProxy)将用户请求分发到多个服务器上,提高系统的并发处理能力。
- 纵向扩展:升级服务器的硬件配置,如增加 CPU、内存、磁盘容量等,以提高单个服务器的性能。
- 数据库扩展:采用主从复制、读写分离等技术,提高数据库的读写性能和可用性。
一、LNMP架构工作原理
1.nginx无法处理动态请求(需要编程语言去解析,PHP、python)
2.但是当用户发起动态请求时,nginx的location,进行规则判断,决定后续的动作
- 静态资源,直接返回(如读取nfs等资源)
- 动态资源,通过代理参数转发给后端框架。
原理概述
LNMP(Linux + Nginx + MySQL + PHP)架构是一种经典的Web应用程序部署方案,其工作原理的核心流程是:用户发起请求,Nginx接收并处理请求,若为静态资源直接返回,若为动态资源则转发给PHP - FPM处理,PHP在执行过程中与MySQL交互获取或存储数据,最后将处理结果返回给Nginx,由Nginx返回给用户。
mermaid 代码
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([用户请求]):::startend --> B(Nginx):::process
B --> C{请求类型判断}:::decision
C -->|静态资源| D(静态文件存储):::process
D --> E(返回静态资源):::process
E --> B
C -->|动态资源| F(PHP - FPM):::process
F --> G(PHP脚本执行):::process
G -->|数据请求| H(MySQL数据库):::process
H -->|数据响应| G
G --> I(返回处理结果):::process
I --> F
F --> B
B --> J([返回响应给用户]):::startend
图示解释
- 用户请求:用户通过浏览器等客户端设备向服务器发起HTTP请求。
- Nginx接收请求:Nginx作为前端服务器,负责接收所有用户请求。
- 请求类型判断:Nginx判断请求的资源是静态资源(如HTML、CSS、图片等)还是动态资源(如PHP脚本)。
- 静态资源处理:如果是静态资源请求,Nginx直接从静态文件存储中读取相应文件,并将其返回给用户。
- 动态资源处理:如果是动态资源请求,Nginx将请求转发给PHP - FPM。PHP - FPM管理多个PHP进程,负责处理这些动态请求。
- PHP脚本执行与数据库交互:PHP脚本在执行过程中,可能需要从MySQL数据库中查询数据或向数据库中写入数据。PHP通过特定的数据库接口与MySQL进行交互。
- 返回处理结果:PHP脚本执行完毕后,将处理结果返回给PHP - FPM,再由PHP - FPM返回给Nginx。
- 返回响应给用户:Nginx将最终的响应结果返回给用户的浏览器,用户即可看到相应的网页内容。
你可以将上述 mermaid 代码复制到支持 mermaid 的环境中(如 Typora、VS Code 的 mermaid 插件、GitLab、GitHub 的 Markdown 等)来生成可视化的流程图。
二、LNMP架构原理
下面为你介绍包含 LNMP
(Linux + Nginx + MySQL + PHP)架构,以及 FastCGI
、PHP - FPM
和 NFS
(网络文件系统)的工作流程,并给出对应的 mermaid
代码来生成图示。
工作流程概述
- 用户请求:用户通过浏览器等客户端向服务器发起请求。
- Nginx 接收请求:Nginx 作为 Web 服务器接收用户请求,判断是静态资源还是动态资源。
- 静态资源处理:如果是静态资源,Nginx 直接从本地或 NFS 读取资源并返回给用户。
- 动态资源处理:如果是动态资源(如
.php
文件),Nginx 通过 FastCGI 协议将请求转发给 PHP - FPM。 - PHP - FPM 处理请求:PHP - FPM 管理多个 PHP 进程,分配一个进程来处理该请求。
- PHP 脚本执行与数据库交互:PHP 进程执行 PHP 脚本,期间可能会与 MySQL 数据库进行数据交互。
- 数据读写 NFS:在处理过程中,PHP 脚本可能会从 NFS 读写文件。
- 返回结果:PHP 处理完请求后,将结果返回给 PHP - FPM,再由 PHP - FPM 通过 FastCGI 协议返回给 Nginx,最后 Nginx 将结果返回给用户。
mermaid 代码
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([用户请求]):::startend --> B(Nginx):::process
B --> C{请求类型判断}:::decision
C -->|静态资源| D[/静态文件存储(本地或 NFS)/]:::process
D --> E(返回静态资源):::process
E --> B
C -->|动态资源| F(FastCGI 协议):::process
F --> G(PHP - FPM):::process
G --> H(PHP 进程):::process
H -->|数据请求| I(MySQL 数据库):::process
I -->|数据响应| H
H -->|文件读写| D
H --> J(返回处理结果):::process
J --> G
G --> F
F --> B
B --> K([返回响应给用户]):::startend
图示解释
- 用户请求:整个流程的起始点,代表用户发起的 HTTP 请求。
- Nginx:接收用户请求并根据请求类型进行分发。
- 请求类型判断:区分请求的是静态资源还是动态资源。
- 静态文件存储:可以是本地磁盘,也可以是 NFS,用于存储静态文件。
- FastCGI 协议:作为 Nginx 和 PHP - FPM 之间通信的桥梁。
- PHP - FPM:管理 PHP 进程池,负责分配进程处理请求。
- PHP 进程:执行 PHP 脚本,与 MySQL 数据库交互并可能读写 NFS 上的文件。
- MySQL 数据库:存储和管理应用程序的数据。
- 返回响应给用户:将最终处理结果返回给用户。
你可以将上述代码复制到支持 mermaid
的工具(如 Typora、VS Code 的 Mermaid 扩展、在线 Mermaid 编辑器等)中生成可视化的流程图。
LNMP工作流是用户通过浏览器输入域名访问Nginx web服务,Nginx判断请求是静态请求则由Nginx返回给用户。
如果是动态请求(如.php结尾),那么Nginx会将该请求通过FastCGI接口发送给PHP引擎(php-fpm进程)进行解析。(在nginx的location中设置规则)
如果该动态请求需要读取mysql数据库,php会继续向后读取数据库,最终Nginx将获取的数据返回给用户。
nginx结合php工作原理
这张图中,设计到如下几个知识点,文字描述工作流程是
1.用户发起http请求,请求到达LNMP中的nginx
2.nginx根据用户请求的url进行判断,通过location进行匹配
3.locaiton判断出url是静态请求,nginx直接查找静态资源,返回响应。
4.location判断出是动态请求,nginx反向代理转发给后端(这个架构里是fastcgi的php)程序
5.nginx通过fastcgi_pass模块把请求转发给php-fpm进程,php-fpm进行后续的处理
(php-fpm进程调用wrapper进程)
6.如果请求是xx.php文件,那么php解释器直接阅读程序,完成php脚本任务,然后返回结果。
7.如果请求需要调用数据库,php则会通过代码连接数据库,发起SQL操作。
8.最终数据库的内容返回流程。
mysql
↓
php
↓
php-fpm
↓
fastcgi
↓
nginx
↓
http
↓
浏览器
fastcgi是什么
FastCGI 是什么
FastCGI(Fast Common Gateway Interface)是一种用于在 Web 服务器和应用程序之间进行通信的协议,它是对传统 CGI(Common Gateway Interface)的改进。
传统 CGI 的问题
传统 CGI 是一种早期用于实现动态网页的技术,当 Web 服务器接收到客户端的动态请求(如访问一个 .cgi
或 .php
文件)时,会为每个请求启动一个新的 CGI 进程来处理。这会带来严重的性能问题,因为频繁地创建和销毁进程开销很大,而且每个进程都会占用系统资源,在高并发情况下,服务器很容易不堪重负。
FastCGI 的优势
FastCGI 则解决了这些问题。它通过持久化进程来处理多个请求,避免了频繁创建和销毁进程的开销。当 Web 服务器接收到动态请求时,它会将请求传递给一个已经启动并运行的 FastCGI 进程管理器(如 PHP - FPM 就是 PHP 的 FastCGI 进程管理器),由进程管理器分配一个空闲的进程来处理该请求。处理完成后,进程不会被销毁,而是继续等待下一个请求,从而大大提高了性能和效率。
工作流程图示及 mermaid 代码
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([客户端请求]):::startend --> B(Web 服务器):::process
B --> C{请求类型判断}:::decision
C -->|静态请求| D(返回静态资源):::process
D --> E([响应客户端]):::startend
C -->|动态请求| F(FastCGI 接口):::process
F --> G(FastCGI 进程管理器):::process
G --> H(空闲 FastCGI 进程):::process
H --> I(处理请求并与后端应用交互):::process
I --> J(生成响应数据):::process
J --> H
H --> G
G --> F
F --> B
B --> E
图示解释
- 客户端请求:用户通过浏览器等客户端向 Web 服务器发起 HTTP 请求。
- Web 服务器:接收客户端的请求,如 Nginx、Apache 等。
- 请求类型判断:Web 服务器判断请求的是静态资源(如 HTML、CSS、图片等)还是动态资源(如 PHP、Python 脚本等)。
- 静态请求处理:如果是静态请求,Web 服务器直接从本地磁盘读取相应的静态资源并返回给客户端。
- 动态请求处理:
- FastCGI 接口:当 Web 服务器接收到动态请求时,通过 FastCGI 接口将请求传递给 FastCGI 进程管理器。
- FastCGI 进程管理器:负责管理多个 FastCGI 进程,它会分配一个空闲的进程来处理该请求。
- 空闲 FastCGI 进程:接收请求并执行相应的脚本代码,期间可能会与后端的应用程序(如数据库)进行交互。
- 处理请求并与后端应用交互:执行脚本逻辑,可能会从数据库中查询数据或进行其他操作。
- 生成响应数据:根据处理结果生成相应的响应数据,如 HTML 页面。
- 响应客户端:最终将处理结果返回给客户端浏览器,用户即可看到相应的网页内容。
FastCGI是一个可伸缩、高速的在HTTP服务器和动态脚本之间通信的接口(在Linux环境下,FastCGI接口就是socket,这个socket可以是文件socket,也可以是IP socket。
也就意味着本地通信,远程通信两种,主要优点是把动态语言(用sock进程运行)和HTTP服务器(nginx)分离开。
- 多数主流的web服务器都可接收、识别这个协议,如apache,nginx。
- 同时诸多脚本编程语言也都实现了该协议,如php。
- fastcgi接口,以c/s结构运行。
脚本化LNMP部署
以下为你详细介绍 LNMP(Linux + Nginx + MySQL + PHP)架构的脚本化部署过程,该部署适用于基于 Debian 或 Ubuntu 的系统,脚本将依次完成 Nginx、MySQL 和 PHP 的安装与配置。
1. 创建脚本文件
首先,使用文本编辑器(如 nano
或 vim
)创建一个新的脚本文件,例如 lnmp_deploy.sh
。
nano lnmp_deploy.sh
2. 编写脚本内容
#!/bin/bash
# 检查是否以 root 用户运行
if [ "$EUID" -ne 0 ]; then
echo "请以 root 用户运行此脚本。"
exit 1
fi
# 更新系统软件包列表
echo "正在更新系统软件包列表..."
apt update -y
# 安装 Nginx
echo "正在安装 Nginx..."
apt install nginx -y
# 启动 Nginx 并设置开机自启
echo "正在启动 Nginx 并设置开机自启..."
systemctl start nginx
systemctl enable nginx
# 安装 MySQL
echo "正在安装 MySQL..."
apt install mysql-server -y
# 启动 MySQL 并设置开机自启
echo "正在启动 MySQL 并设置开机自启..."
systemctl start mysql
systemctl enable mysql
# 配置 MySQL 安全设置
echo "正在进行 MySQL 安全配置..."
mysql_secure_installation <<EOF
y
your_password
your_password
y
y
y
y
EOF
# 安装 PHP 及相关扩展
echo "正在安装 PHP 及相关扩展..."
apt install php-fpm php-mysql -y
# 配置 Nginx 支持 PHP
echo "正在配置 Nginx 支持 PHP..."
cat <<EOT > /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files \$uri \$uri/ /index.php?\$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 根据实际 PHP 版本调整
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
EOT
# 测试 Nginx 配置
echo "正在测试 Nginx 配置..."
nginx -t
# 重新加载 Nginx 配置
echo "正在重新加载 Nginx 配置..."
systemctl reload nginx
# 创建测试 PHP 文件
echo "正在创建测试 PHP 文件..."
echo "<?php phpinfo(); ?>" > /var/www/html/info.php
echo "LNMP 架构部署完成!"
3. 脚本说明
- 权限检查:脚本会首先检查是否以
root
用户运行,因为安装和配置系统软件需要管理员权限。 - 系统更新:使用
apt update
命令更新系统软件包列表。 - Nginx 安装与配置:安装 Nginx 并启动服务,同时设置开机自启。
- MySQL 安装与配置:安装 MySQL 服务器,启动服务并设置开机自启。通过
mysql_secure_installation
进行安全配置,你需要将your_password
替换为你想要设置的 MySQL root 用户密码。 - PHP 安装与配置:安装 PHP - FPM 和
php - mysql
扩展,用于处理 PHP 脚本和与 MySQL 数据库交互。 - Nginx 配置支持 PHP:修改 Nginx 的默认配置文件,使其支持 PHP 脚本的处理。
- 测试与重新加载:使用
nginx -t
测试 Nginx 配置的语法正确性,然后使用systemctl reload nginx
重新加载配置。 - 创建测试文件:在
/var/www/html
目录下创建一个简单的 PHP 文件info.php
,用于测试 PHP 是否正常工作。
4. 运行脚本
给脚本添加执行权限并运行:
chmod +x lnmp_deploy.sh
./lnmp_deploy.sh
5. 测试部署结果
打开浏览器,访问 http://your_server_ip/info.php
(将 your_server_ip
替换为你的服务器实际 IP 地址),如果能看到 PHP 信息页面,则说明 LNMP 架构部署成功。
注意事项
- 请根据实际的 PHP 版本调整 Nginx 配置文件中
fastcgi_pass
的路径。 - 在生产环境中,建议对 MySQL 的安全配置和 Nginx 的配置进行更细致的优化。
三、部署LNMP基础环境
1.创建www用户
降低nginx运行权限
[root@web-7 ~]#groupadd www -g 666
[root@web-7 ~]#useradd www -s /sbin/nologin -M -u 666 -g 666
[root@web-7 ~]#id www
uid=666(www) gid=666(www) groups=666(www)
2.官网nginx仓库
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
3.安装、开机启动
# 安装
yum clean all
yum install nginx -y
# 启动,开机自启
systemctl start nginx
systemctl enable nginx
4.部署php环境(配置yum源,第三方源)
# 卸载旧环境
yum remove php-mysql-5.4 php php-fpm php-common -y
# 安装第三方epel源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install -y php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb php71w-json php71w-pecl-apcu php71w-pecl-apcu-devel
5.配置php-fpm和nginx用户一致
修改php-fpm配置文件
[root@web-7 ~]#sed -i '/^user/c user = www' /etc/php-fpm.d/www.conf
[root@web-7 ~]#sed -i '/^group/c group = www' /etc/php-fpm.d/www.conf
[root@web-7 ~]#grep -E '^(user|group)' /etc/php-fpm.d/www.conf
user = www
group = www
6.启动php-fpm开机自启
[root@web-7 ~]#systemctl start php-fpm
[root@web-7 ~]#
[root@web-7 ~]#systemctl enable php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
[root@web-7 ~]#
7.部署mysql(mariadb)
[root@web-7 ~]#yum install mariadb-server mariadb -y
[root@web-7 ~]#systemctl start mariadb
[root@web-7 ~]#
[root@web-7 ~]#systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
[root@web-7 ~]#
8.mysql光速入门
1.修改密码,将默认的空密码,改为 "yuchaoit.cn"
[root@web-7 ~]#mysqladmin password 'yuchaoit.cn'
2.登录测试
[root@web-7 ~]#mysql -uroot -pyuchaoit.cn
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
3.查看mysql默认的用户,查询默认mysql库下的user表,且只查看user,host两个字段
MariaDB [(none)]> select user,host from mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| root | localhost |
| | web-7 |
| root | web-7 |
+------+-----------+
6 rows in set (0.00 sec)
4.指定账号、密码、服务端登录
[root@web-7 ~]#mysql -uroot -p'yuchaoit.cn' -h 127.0.0.1
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
5.查看有多少库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
6.查看库下有多少张表,有24行记录,就是24张表
MariaDB [(none)]> show tables from mysql;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| db |
| event |
| func |
| general_log |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| host |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| servers |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
24 rows in set (0.00 sec)
7.查看数据表中有多少个字段(查看表结构)
语法1,直接查看 "库.表"
MariaDB [(none)]> desc mysql.user;
语法2
切换数据库
MariaDB [(none)]> use mysql;
查看库下的表
MariaDB [mysql]> desc user;
四、LNMP环境架构部署
1.部署nginx支持fastcgi
ngx_http_fastcgi_module
是 Nginx 用于与 FastCGI 进程(如 PHP - FPM)进行通信的模块,以下为你详细介绍其工作原理并提供对应的 mermaid 图示代码。
工作原理概述
- 客户端请求:用户通过浏览器等客户端向 Nginx 服务器发起 HTTP 请求。
- Nginx 接收请求:Nginx 作为前端 Web 服务器接收客户端的请求。
- 请求类型判断:Nginx 检查请求的资源类型,如果是动态资源(例如
.php
文件),则需要使用ngx_http_fastcgi_module
模块将请求转发给 FastCGI 进程处理。 - FastCGI 通信:
ngx_http_fastcgi_module
模块将请求信息(如请求头、请求参数等)按照 FastCGI 协议封装,然后发送给 FastCGI 进程管理器(如 PHP - FPM)。 - FastCGI 进程处理:FastCGI 进程管理器接收到请求后,分配一个空闲的 FastCGI 进程来处理该请求。FastCGI 进程执行相应的脚本(如 PHP 脚本),在执行过程中可能会与后端数据库进行交互。
- 返回处理结果:FastCGI 进程处理完请求后,将处理结果(如生成的 HTML 页面)按照 FastCGI 协议返回给 Nginx。
- Nginx 返回响应:Nginx 接收到 FastCGI 进程返回的结果后,将其作为 HTTP 响应返回给客户端。
mermaid 代码
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([客户端请求]):::startend --> B(Nginx):::process
B --> C{请求类型判断}:::decision
C -->|静态资源| D(返回静态资源):::process
D --> E([响应客户端]):::startend
C -->|动态资源| F(ngx_http_fastcgi_module):::process
F --> G(FastCGI 协议封装):::process
G --> H(FastCGI 进程管理器):::process
H --> I(空闲 FastCGI 进程):::process
I --> J(执行脚本与后端交互):::process
J --> K(生成处理结果):::process
K --> I
I --> H
H --> L(FastCGI 协议返回):::process
L --> F
F --> B
B --> E
图示解释
- 客户端请求:整个流程的起始点,代表用户发起的 HTTP 请求。
- Nginx:接收客户端请求,并根据请求类型进行分发。
- 请求类型判断:判断请求的是静态资源还是动态资源。
- 静态资源处理:如果是静态资源,Nginx 直接返回相应资源给客户端。
ngx_http_fastcgi_module
:当请求为动态资源时,该模块负责将请求按照 FastCGI 协议进行处理。- FastCGI 协议封装:将请求信息封装成 FastCGI 协议格式。
- FastCGI 进程管理器:管理多个 FastCGI 进程,分配空闲进程处理请求。
- 空闲 FastCGI 进程:执行相应脚本,与后端数据库等进行交互。
- 执行脚本与后端交互:执行动态脚本(如 PHP 脚本),并可能从数据库获取数据。
- 生成处理结果:根据脚本执行结果生成最终的响应内容。
- FastCGI 协议返回:将处理结果按照 FastCGI 协议返回给 Nginx。
- 响应客户端:Nginx 将最终响应返回给客户端。
你可以将上述 mermaid 代码复制到支持 mermaid 的工具(如 Typora、VS Code 的 mermaid 插件、在线 mermaid 编辑器等)中,生成可视化的流程图。
fastcgi_pass 请求转发
官网文档
https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass
Syntax: fastcgi_pass address;
Default: —
Context: location, if in location
Sets the address of a FastCGI server. The address can be specified as a domain name or IP address, and a port:
用法1,转发给ip:port形式
fastcgi_pass localhost:9000;
用法2,转发给unix socket本地进程套接字
fastcgi_pass unix:/tmp/fastcgi.socket;
设置fastcgi首页,需要结合fastcgi_param。
https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_index
语法
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
2.具体配置参考
[root@web-7 /etc/nginx/conf.d]#cat php.conf
server{
listen 80;
server_name www.yuchaoit.cn;
# 静态请求,资源存放路径
root /www;
index index.php index.html;
# 动态请求处理
location ~ \.php$ {
root /code;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
参数解释
参数文档
https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
$document_root 就表示当前locatin设置的root或是alias的目录
SCRIPT_FILENAME 用于在php中确定脚本名字
fastcgi_script_name 请求的URL
整体意思是,用户发来的php相关请求,包括请求中的所有参数,全部转发给127.0.0.1:9000的php程序。
3.创建php程序目录
在上述配置中,用户的php请求,会转发给127.0.0.1:9000处理,并且去/code目录下寻找index.php
[root@web-7 ~]#mkdir -p /code
[root@web-7 ~]#chown -R www.www /code
[root@web-7 ~]#vim /code/test-phpinfo.php
[root@web-7 ~]#cat /code/test-phpinfo.php
<?php
phpinfo();
echo "welcome to yuchaoit.cn"
?>
4.检查nginx语法且启动
[root@web-7 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
启动
[root@web-7 ~]# systemctl start nginx
5.绑定hosts访问php页面。
C:\Windows\System32\drivers\etc\hosts
10.0.0.7 www.yuchaoit.cn
访问页面,访问该php资源文件
www.yuchaoit.cn/test-phpinfo.php
6.测试php和数据库的连通。
以下是关于 LNMP(Linux + Nginx + PHP + MySQL)架构中 PHP 与 MySQL 测试连接流程的 mermaid 图示代码及详细解释。
mermaid 代码
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([客户端发起测试请求]):::startend --> B(Nginx):::process
B --> C{请求类型判断}:::decision
C -->|静态资源| D(返回静态资源):::process
D --> A
C -->|PHP 脚本| E(FastCGI 接口):::process
E --> F(PHP - FPM):::process
F --> G(分配 PHP 进程):::process
G --> H(执行 PHP 连接 MySQL 脚本):::process
H --> I{连接是否成功?}:::decision
I -->|是| J(执行 SQL 查询):::process
J --> K(获取查询结果):::process
K --> L(生成响应数据):::process
I -->|否| M(生成错误响应):::process
L --> N(返回结果给 PHP - FPM):::process
M --> N
N --> F
F --> O(通过 FastCGI 返回 Nginx):::process
O --> B
B --> P([返回响应给客户端]):::startend
图示解释
1. 客户端发起请求
- 客户端发起测试请求:用户在浏览器输入包含 PHP 连接 MySQL 测试代码的页面 URL,客户端向服务器发送请求。
2. Nginx 处理请求
- Nginx:作为前端服务器接收客户端请求。
- 请求类型判断:Nginx 判断请求的是静态资源(如 HTML、图片等)还是 PHP 脚本。如果是静态资源,直接返回给客户端;如果是 PHP 脚本,则通过 FastCGI 接口将请求转发给 PHP - FPM。
3. PHP - FPM 处理请求
- FastCGI 接口:Nginx 和 PHP - FPM 之间通信的桥梁,用于传递请求信息。
- PHP - FPM:FastCGI 进程管理器,负责管理多个 PHP 进程。
- 分配 PHP 进程:PHP - FPM 从进程池中选择一个空闲的 PHP 进程来处理该请求。
4. PHP 连接 MySQL
- 执行 PHP 连接 MySQL 脚本:PHP 进程执行包含连接 MySQL 代码的脚本,尝试与 MySQL 数据库建立连接。
- 连接是否成功?:判断是否成功连接到 MySQL 数据库。
5. 根据连接结果处理
- 连接成功:
- 执行 SQL 查询:如果连接成功,PHP 进程执行预设的 SQL 查询语句。
- 获取查询结果:从 MySQL 数据库获取查询结果。
- 生成响应数据:将查询结果整理成合适的格式,生成要返回给客户端的响应数据。
- 连接失败:
- 生成错误响应:如果连接失败,PHP 进程生成包含错误信息的响应。
6. 返回结果
- 返回结果给 PHP - FPM:PHP 进程将生成的响应数据(成功结果或错误信息)返回给 PHP - FPM。
- 通过 FastCGI 返回 Nginx:PHP - FPM 通过 FastCGI 协议将结果返回给 Nginx。
7. 客户端接收响应
- 返回响应给客户端:Nginx 将最终的响应返回给客户端浏览器,客户端就能看到测试结果。
你可以将上述 mermaid 代码复制到支持 mermaid 的工具(如 Typora、VS Code 的 mermaid 插件、在线 mermaid 编辑器等)中,生成可视化的流程图。
先检查驱动是否正常,通过php-info页面,查看php的详细信息。
如果php,mysql不在同一台服务器,是需要修改配置文件,填入远程mysql的 ip:port。
代码测试连接。
[root@web-7 /code]#cat /code/mysql-test.php
<?php
$server="127.0.0.1";
$mysql_user="root";
$mysql_pwd="yuchaoit.cn";
// 创建数据库连接
$conn=mysqli_connect($server,$mysql_user,$mysql_pwd);
// 检测连通性
if($conn){
echo "mysql successful by yuchaoit.cn \n";
}else {
die( "Connection failed: " . mysqli_connect_error());
}
?>
浏览器访问该php脚本试试。
最终的流程如下
五、部署知识社区网站
这里提供的开源php网站程序,基本都是静态文件和php文件放在了一起,因此nginx定义目录统一即可。
1.创建nginx虚拟主机
[root@web-7 /etc/nginx/conf.d]#cat wecenter.conf
server{
listen 80;
server_name wecenter.yuchaoit.cn;
# 静态请求,资源存放路径
root /code/wecenter;
index index.php index.html;
# 动态请求处理
location ~ \.php$ {
root /code/wecenter;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
测试语法
[root@web-7 /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web-7 /etc/nginx/conf.d]#
重启
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx
2.获取wecenter源码
1.下载地址
cd /code/wecenter && wget http://yuchaoit.cn/data/wecenter.zip
[root@web-7 /code/wecenter]#ls /code/wecenter/wecenter.zip
/code/wecenter/wecenter.zip
2.解压缩,授权,进入php代码目录
[root@web-7 /code/wecenter]#unzip wecenter.zip
3.授权
[root@web-7 /code/wecenter]#chown -R www.www /code/
3.创建wecenter数据库
创建数据库,支持utf-8中文
MariaDB [(none)]> create database wecenter character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)
4.访问页面
新加了域名,就得做好解析
10.0.0.7 www.yuchaoit.cn wecenter.yuchaoit.cn
确保安装环境检查,全部是通过的。
填入数据库信息。
数据库导入成功后,可以进入数据库看看,是否生成了数据表。
mysql -uroot -pyuchaoit.cn
use wecenter;
show tables;
创建登录网站的管理员用户密码
yuchao01
chaoge666
yc_uuu@163.com
5.安装完毕后,删除安装程序
[root@web-7 /code/wecenter]#ls
app changelog.txt composer.lock install license.txt nginx.htaccess README.md static tmp vendor views
cache composer.json index.php language models plugins robots.txt system uploads version.php wecenter.zip
删除这个install安装目录即可
[root@web-7 /code/wecenter]#rm -rf install/
6.登录问答网站
7.可以在数据库中查询到用户信息。
MariaDB [wecenter]> select user_name,password from wecenter.aws_users;
+-----------+----------------------------------+
| user_name | password |
+-----------+----------------------------------+
| yuchao01 | 0fc98f3627b926536d42c02ecd8fae1f |
+-----------+----------------------------------+
1 row in set (0.00 sec)
六、部署wordpress
1.nginx环境搭建
1.创建虚拟主机文件
server{
listen 80;
server_name wordpress.yuchaoit.cn;
# 静态请求,资源存放路径
root /code/wordpress;
index index.php index.html;
# 动态请求处理
location ~ \.php$ {
root /code/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
2.重启nginx
[root@web-7 /etc/nginx/conf.d]#systemctl restart nginx
3.下载wordpress代码
mkdir -p /code/wordpress ; cd /code/wordpress ; wget https://cn.wordpress.org/latest-zh_CN.zip
解压缩
[root@web-7 /code/wordpress]#unzip latest-zh_CN.zip
[root@web-7 /code/wordpress]#mv wordpress/* .
授权
[root@web-7 /code/wordpress]#chown -R www.www /code/
4.创建数据库
[root@web-7 /code/wordpress]#mysql -uroot -pyuchaoit.cn
MariaDB [(none)]> create database wordpress;
Query OK, 1 row affected (0.00 sec)
2.客户端访问
dns解析
10.0.0.7 www.yuchaoit.cn wecenter.yuchaoit.cn wordpress.yuchaoit.cn
http://wordpress.yuchaoit.cn/
运行信息
yuchao01
chaoge666
3.发表新文章
4.检查数据库
[root@web-7 /code/wordpress]#!mysql
mysql -uroot -pyuchaoit.cn
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 148
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| wecenter |
| wordpress |
+--------------------+
6 rows in set (0.00 sec)
MariaDB [(none)]>
查看数据表
MariaDB [wordpress]> show tables;
查看文章表
MariaDB [wordpress]> desc wp_posts;
查看文章数据
MariaDB [wordpress]> select post_content from wp_posts;