动态网站架构

20次阅读
没有评论

动态网站架构是支撑内容动态生成、用户交互、数据实时更新的系统框架,核心目标是高效处理用户请求(如登录、下单、评论等),并根据业务逻辑动态返回内容(而非静态文件)。其架构设计需兼顾高性能、高可用、可扩展性,通常按 “分层协作” 模式构建。

常见动态网站架构

常见动态网站架构 说明
lnmp linux系统,nginx(web服务),mysql(数据库,postgresql),php环境(动态语言)
lnmt linux系统,nginx(web服务),mysql(数据库,postgresql),tomcat(java)
lnm? linux系统,nginx(web服务),mysql(数据库,postgresql),什么语言(python,golang)
  • l-Linux系统 w->windows系统
  • n-nginx a->apache

三者核心差异对比

维度 LNMP LNMT LNM?(Python/Golang)
核心语言 PHP Java Python/Golang
典型场景 中小型网站、博客 企业级系统、大型电商 数据服务、高并发 API
性能特点 中规中矩,依赖 Nginx 优化 稳定可靠,适合复杂业务 Python 偏灵活,Golang 偏高性能
学习成本 低(PHP 语法简单) 中(Java 生态庞大) Python 低,Golang 中

基于Golang的LNM架构应用

高并发 API 服务

  • 技术栈:Linux + Nginx + MySQL + Gin(轻量高性能框架)。
  • 案例:直播平台用户接口(支持百万级并发的用户登录、礼物发送、弹幕实时推送)、电商秒杀系统(库存实时扣减,防止超卖,数据持久化到 MySQL)。
  • 动态特性:用户操作(如点击 “秒杀” 按钮)后,后台实时校验库存并更新 MySQL,前端实时响应操作结果。

微服务架构系统

  • 技术栈:Linux + Nginx + MySQL + Golang + gRPC/Kitex(微服务框架)
  • 案例:多模块电商系统(拆分 “用户服务”“订单服务”“商品服务”,各服务独立部署,通过 Nginx 做 API 网关转发请求)、企业内部管理系统(如 OA 系统拆分 “考勤服务”“审批服务”,数据最终同步到 MySQL 统一存储)。
  • 动态特性:各服务间通过 RPC 实时通信,用户提交审批后,“审批服务” 实时更新状态并同步到 MySQL,前端实时刷新流程进度。

云原生与 DevOps 类应用

  • 技术栈:Linux + Nginx + MySQL + Golang + Kubernetes SDK
  • 案例:自定义 CI/CD 平台(支持代码提交后自动构建、部署,状态实时存储到 MySQL)、服务器资源监控系统(实时采集服务器 CPU / 内存数据,动态生成监控报表)。
  • 动态特性:用户触发构建任务后,后台实时执行命令并返回日志,资源数据变化时监控图表自动刷新。

LNM?架构的灵活性很强:

  • Python 适合快速迭代、数据处理密集的场景(如 CMS、数据分析);
  • 选Golang适合高并发、微服务、性能敏感的场景(如电商 API、云原生工具)。 两者均能基于 Linux、Nginx、MySQL 构建动态交互强、数据实时更新的网站或服务,具体选型可根据团队技术栈和业务需求决定。

什么是动态网站?

动态网站是指内容会根据用户请求、时间、数据库数据或交互操作实时生成和变化的网站,而非直接返回固定不变的静态文件(如 HTML)。其核心特点是 “活的内容”—— 用户看到的页面内容会动态调整,比如登录后的个性化信息、实时更新的商品库存、提交表单后的反馈等。

动态vs静态

对比维度 静态网站 动态网站
内容生成方式 由固定的 HTML/CSS/JS 文件组成,内容预先写死。 由服务器端程序(如 PHP、Python)实时生成,内容从数据库 / 缓存中动态获取。
交互能力 仅支持简单交互(如点击跳转),无法响应用户输入(如登录、提交表单)。 支持复杂交互(登录、注册、下单、评论等),能根据用户操作返回不同结果。
内容更新 需手动修改 HTML 文件,适合内容极少变动的场景(如企业官网简介页)。 通过后台管理系统(如 CMS)更新数据库,内容自动同步到前端,适合高频更新场景(如新闻、电商)。
技术依赖 仅需 Web 服务器(如 Nginx),无需编程语言或数据库。 依赖后端编程语言(Java/Python/PHP 等)、数据库(MySQL/Redis 等)和 Web 框架(Django/SpringBoot 等)。
  • 部署的nginx小游戏:静态网站
  • 工作场景

开发书写了一个php代码,java,Python,Golang,发给我们部署下

  1. 测试能否直接部署到nginx中?
  2. 需要什么服务,是什么原理?
  3. 准备服务并测试。
  4. 部署代码

LNMP架构

  • Nginx处理动态请求与静态请求流程概述
动态网站架构
  • LNMP处理动态请求流程概述
动态网站架构

PHP的工作原理(以LNMP架构为例)

用户请求通过HTTP 协议发送到 Web 服务器(如 Nginx)后,PHP 的处理流程如下:

  1. 静态请求处理:若请求是静态资源(如图片、CSS、JS),Nginx 直接读取文件并返回,无需 PHP 参与。
  2. 动态请求处理:若请求是动态逻辑(如用户登录、数据查询),Nginx 通过 FastCGI 协议 将请求转发给 PHP 进程。
  3. PHP 执行业务逻辑:PHP 解析代码,若需数据支持,通过数据库扩展(如 mysqliPDO)连接 MySQL,执行查询或写入操作。
  4. 返回响应:PHP 生成动态内容(如 HTML 页面、JSON 数据),通过 Nginx 最终返回给客户端。

php是什么?

PHP(全称:Hypertext Preprocessor,超文本预处理器)是一门开源的服务器端脚本语言,主要用于动态 Web 应用开发,是构建 LNMP(Linux + Nginx + MySQL + PHP)等经典动态网站架构的核心技术之一。以下从多个维度详细解析:

PHP 的核心定位与特点

  1. 服务器端执行 PHP 代码运行在服务器端,而非客户端浏览器。它接收用户请求后动态生成 HTML、JSON 等响应内容,再通过 Web 服务器(如 Nginx、Apache)返回给用户,保障了代码和数据的安全性。
  2. 开源免费 & 跨平台 完全开源且免费,支持 Linux、Windows、macOS 等主流操作系统,可无缝部署在各类服务器环境中。
  3. 与 HTML 高度集成 可直接在 HTML 中嵌入 PHP 代码,实现 “静态页面结构 + 动态逻辑” 的混合开发,例如:
   <!DOCTYPE html>
   <html>
   <body>
       <?php echo "当前时间:" . date("Y-m-d H:i:s"); ?>
   </body>
   </html>
  1. 原生数据库支持 内置对 MySQL、PostgreSQL 等关系型数据库的支持,通过简单函数即可完成数据读写。例如连接 MySQL 并查询数据:
   <?php
   $conn = mysqli_connect("localhost", "user", "pass", "dbname");
   $result = mysqli_query($conn, "SELECT * FROM users");
   while ($row = mysqli_fetch_assoc($result)) {
       echo $row['username'];
   }
   mysqli_close($conn);
   ?>

PHP 的应用场景

  1. 中小型动态网站:企业官网、个人博客、资讯平台(如 WordPress 搭建的博客)。
  2. 电商平台:从中小商家网店(OpenCart)到大型跨境电商(Magento 定制化开发)。
  3. 企业内部系统:OA 办公系统、客户关系管理(CRM)、数据报表平台(通过 PHP 连接数据库生成动态报表)。
  4. API 服务:为移动端 App、小程序提供数据接口(如通过 PHP 开发 RESTful API,返回 JSON 数据)。

什么是FastCGI 协议?

FastCGI 是一种用于 Web 服务器与后端动态语言(如 PHP、Python)之间的高性能通信协议,核心目标是解决传统 CGI 协议的性能瓶颈,支撑动态网站的高效请求处理。以下从协议定位、工作原理、技术特点、应用场景等维度详细解析:

FastCGI 的核心工作原理

FastCGI 架构由三部分组成:

  • Web 服务器(FastCGI 客户端):如 Nginx、Apache,负责接收客户端 HTTP 请求,并将动态请求通过 FastCGI 协议转发。
  • FastCGI 进程管理器:如 PHP-FPM(PHP FastCGI Process Manager),负责管理 FastCGI 进程池(Worker 进程),分配请求给空闲进程。
  • FastCGI 应用程序:如 PHP 解释器,实际执行业务逻辑(解析脚本、操作数据库等)。

处理流程(以 Nginx + PHP-FPM 为例):

  1. 用户发起动态请求(如访问 http://example.com/index.php)。
  2. Nginx 识别到是 PHP 动态请求,通过 FastCGI 协议 将请求转发给 PHP-FPM(通常监听 127.0.0.1:9000)。
  3. PHP-FPM 的进程管理器从进程池中分配一个空闲的 Worker 进程,处理该请求。
  4. Worker 进程执行 PHP 脚本,操作 MySQL 等数据库,生成动态内容(如 HTML、JSON)。
  5. 处理结果通过 FastCGI 协议返回给 Nginx,Nginx 最终将响应返回给用户。
  6. Worker 进程处理完请求后,不会销毁,而是回到进程池等待下一个请求(进程复用)。

部署wordpress

下载地址:

下载 – WordPress.org China 简体中文

环境准备

角色 主机与ip
nginx+php web01 10.0.0.7/172.16.1.7
数据库 db01 10.0.0.5/172.16.1.51

版本选择?

nginx一般没有版本要求,稳定即可 nginx 1.26或1.28

php的版本要求,根据代码来定,php7.2 ,php7.4最新

数据库:用什么与什么版本也要根据代码要求,mariadb

部署wordpress

nginx 1.26.1

php 7.2

mariadb 10.3

节点db01部署数据库

  • 安装mariadb
yum install -y mariadb-server
#mariadb-server 服务端
#mariadb 客户端


apt install -y mariadb-server

#ubt配置
vim /etc/mysql/mariadb.conf.d/50-server.cnf
#找到 [mysqld] 区块下的 bind-address,默认是 127.0.0.1(仅本地监听),改为:
bind-address = 0.0.0.0  # 允许所有IP连接(适合内网环境)
# 或更安全的方式:仅监听本机的172.16.1.151IP(推荐)
# bind-address = 172.16.1.151
systemctl restart mariadb



systemctl enable --now mariadb


#检查
[root@db01 ~]# ps -ef | grep mysql
mysql       2051       1  0 20:21 ?        00:00:00 /usr/libexec/mysqld
root        2085    1278  0 20:22 pts/0    00:00:00 grep --color=auto mysql
[root@db01 ~]# ss -lntup | grep mysql
tcp     LISTEN   0        80                     *:3306                *:*       users:(("mysqld",pid=2051,fd=21)) 


#ubt查看端口3306
ss -lntup | grep mariadbd
  • 数据库安全配置(SQL语句实现,现在通过mysql SQL语句实现)
mysql_secure_installation #运行一次即可
#用于设置root密码,清理用户和清理临时库


[root@db01 ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 回车enter
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y设置密码
New password: 输入密码
Re-enter new password: 再次输入 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y删除数据库中的匿名用户(没有用户名的用户,容易导致安全问题)
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y 是否禁止root远程登录
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y 是否删除test测试用的数据库
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y 是否更新权限信息表
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
  • 注意事项
linux系统的root与数据库的root
1.2个独立的用户
2.Linux的root用户用于进入和管理整个Linux系统
3.数据库的root用户仅用于管理MYSQL数据库
  • 进入数据库
mysql -uroot -p123
#-u用户  -p密码 -h10.0.0.51(ip)(用于远程登录)

[root@db01 ~]# mysql -uroot -p123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 16
Server version: 10.3.39-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)]>

#创建wordpress的库
create database blog;
#添加用户wp用户管理wordpress数据库,白名单只能从内网172.16.1.0/24登录并设置权限
grant all on blog.* to 'blog'@'172.16.1.%' identified by '123';
#添加用户本地登录
grant all on blog.* to 'blog'@'localhost' identified by '123';

#GRANT ALL PRIVILEGES ON blog.* TO 'blog'@'172.16.1.%';

#更新权限信息
flush privileges;
  • 测试
#测试本地连接
mysql -ublog -p123
#测试远程连接
mysql -ublog -p123 -h 172.16.1.51
动态网站架构

节点web01部署php+nginx

kylin-v10

  • mariadb
#mariadb客户端
yum install -y mariadb
  • php7.2
#清理已有的php软件包
systemctl stop php-fpm
yum -y remove php*

#安装软件包
yum -y install php php-bcmath php-cli php-common php-devel php-embedded php-fpm php-gd php-intl php-mbstring php-mysqlnd php-opcache php-pdo   php-process php-xml php-json



#查看服务名称
find /usr/lib/systemd/system/ -name "php*.service"
#设置开机自启
systemctl enable --now php-fpm

#查看php进程用户,为apache
[root@web01 ~]# ps -ef | grep php
root        1295       1  0 20:51 ?        00:00:00 php-fpm: master process (/etc/php-fpm.conf)
apache      1296    1295  0 20:51 ?        00:00:00 php-fpm: pool www
apache      1297    1295  0 20:51 ?        00:00:00 php-fpm: pool www
apache      1298    1295  0 20:51 ?        00:00:00 php-fpm: pool www
apache      1299    1295  0 20:51 ?        00:00:00 php-fpm: pool www
apache      1300    1295  0 20:51 ?        00:00:00 php-fpm: pool www
root        1305    1041  0 20:52 pts/1    00:00:00 grep --color=auto php

#将apache修改为nginx
#修改配置文件
[root@web01 ~]# egrep -n '^(user|group|listen =)' /etc/php-fpm.d/www.conf 
24:user = apache
26:group = apache
38:listen = /run/php-fpm/www.sock


sed -i 's/^user =.*/user = nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/^group =.*/group = nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/^listen =.*/listen = 127.0.0.1:9000/g' /etc/php-fpm.d/www.conf
#修改为nginx,端口为9000
egrep -n '^(user|group|listen =)' /etc/php-fpm.d/www.conf 
24:user = nginx
26:group = nginx
38:listen = 127.0.0.1:9000

#检查语法
php-fpm -t #看看是否有successful
#重启服务
systemctl reload php-fpm
#检查进程和端口
ps -ef | grep php #看进程用户是否为nginx
ss -lntup | grep php #看端口是否为9000
动态网站架构
  • nginx配置文件
vim /etc/nginx/conf.d/blog.songhong.com.conf
------------------------------------------
server{
  listen 80;
  server_name blog.songhong.com;
  root /app/code/blog/;
  error_log /var/log/nginx/blog-error.log notice;
  access_log /var/log/nginx/blog-access.log main;

  location / {
  index index.php;
  }

  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;
  }
}
--------------------------------------
systemctl reload nginx

#创建blog目录
mkdir -p /app/code/blog/
#使用wegt下载软件包或上传
wget https://cn.wordpress.org/latest-zh_CN.zip

[root@web01 ~]# ls wordpress-6.8.3-zh_CN.zip 
wordpress-6.8.3-zh_CN.zip
#解压到当前目录
unzip wordpress-6.8.3-zh_CN.zip

mv wordpress/* /app/code/blog/

chown -R nginx:nginx /app/code/blog/

ubuntu2204

  • mariadb客户端安装
#ubt的mariadb客户端
apt install mariadb-client -y
  • 安装php8.1
apt install -y php8.1-bcmath php8.1-bz2 php8.1-cgi php8.1-cli php8.1-common php8.1-curl php8.1-fpm php8.1-gd php8.1-intl   \
php8.1-mbstring php8.1-mysql php8.1-opcache php8.1-readline php8.1-soap \
php8.1-xml php8.1-zip php8.1-apcu php8.1-redis php8.1-snmp


find /usr/lib/systemd/system/ -name "php*.service"

systemctl enable --now php8.1-fpm


egrep '^(user|group|listen)' /etc/php/8.1/fpm/pool.d/www.conf

user = www-data
group = www-data
listen = /run/php/php8.1-fpm.sock##原文件内容
#修改为listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data

sed -i 's/^listen =.*/listen = 127.0.0.1:9000/g' /etc/php/8.1/fpm/pool.d/www.conf

#查看是否修改
egrep '^(user|group|listen)' /etc/php/8.1/fpm/pool.d/www.conf
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data

#检查语法
php-fpm8.1 -t

systemctl reload php8.1-fpm.service

[root@web01 ~]#ss -lntup | grep 9000
tcp   LISTEN 0      511        127.0.0.1:9000      0.0.0.0:*    users:(("php-fpm8.1",pid=24009,fd=9),("php-fpm8.1",pid=24008,fd=9),("php-fpm8.1",pid=23604,fd=8))
[root@web01 ~]#ps -ef | grep php
root       23604       1  0 16:58 ?        00:00:00 php-fpm: master process (/etc/php/8.1/fpm/php-fpm.conf)
www-data   24008   23604  0 17:04 ?        00:00:00 php-fpm: pool www
www-data   24009   23604  0 17:04 ?        00:00:00 php-fpm: pool www
root       24020    1446  0 17:04 pts/0    00:00:00 grep --color=auto php
  • apt安装nginx
vim /etc/apt/sources.list
#在末尾添加(jammy对应22.04,其他版本需替换代号)
deb http://nginx.org/packages/ubuntu/ jammy nginx
deb-src http://nginx.org/packages/ubuntu/ jammy nginx
#导入官方 GPG 密钥(确保包安全性)
wget https://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key

apt update
apt install -y nginx unzip



useradd -s /sbin/nologin -M nginx

vim /etc/nginx/nginx.conf 
-----------------------------------------
user nginx;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
    worker_connections 1024;
}
http {
    sendfile on;
    tcp_nopush on;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;


    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log;
    gzip on;
    include /etc/nginx/conf.d/*.conf;
}
-----------------------------------------------------


vim /etc/nginx/conf.d/blog.songhong.com.conf
------------------------------------------
server{
  listen 80;
  server_name blog.songhong.com;
  root /app/code/blog/;
  error_log /var/log/nginx/blog-error.log notice;
  access_log /var/log/nginx/blog-access.log main;

  location / {
  index index.php;
  }

  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;
  }
}
--------------------------------------
systemctl reload nginx

#创建blog目录
mkdir -p /app/code/blog/




#使用wegt下载软件包或上传
wget https://cn.wordpress.org/latest-zh_CN.zip

[root@web01 ~]# ls wordpress-6.8.3-zh_CN.zip 
wordpress-6.8.3-zh_CN.zip
#解压到当前目录
unzip wordpress-6.8.3-zh_CN.zip

mv wordpress/* /app/code/blog/

chown -R nginx:nginx /app/code/blog/


chown -R www-data:www-data /app/code/blog/

windows配置解析hosts文件

10.0.0.7 blog.songhong.com

浏览器访问blog.songhong.com

动态网站架构
动态网站架构
动态网站架构

上传主题错误排障

[root@web01 ~]# grep -En '^upload_max|^post_max' /etc/php.ini 
672:post_max_size = 20M
825:upload_max_filesize = 20M

cat /etc/nginx/nginx.conf
#添加
client_max_body_size 20m;
  • ubt2404 php8.3
[root@aliyun-ubt-2404 ~]#grep -En '^upload_max|^post_max' /etc/php/8.3/cgi/php.ini
713:post_max_size = 8M
865:upload_max_filesize = 2M

nginx处理用户流程

动态网站架构
  1. 用户请求发起

用户发起两类请求:

  • 动态请求:如 blog.oldboy.cn/wp-admin/login.php(需要 PHP 处理的业务逻辑)。
  • 静态请求:如 blog.oldboy.cn/xxoo.jpg(Nginx 可直接返回的静态资源)。
  1. TCP 三次握手建立连接

用户与服务器(10.0.0.7:80)通过三次握手建立 TCP 连接,为后续 HTTP 通信奠定基础。

  1. Nginx 接收并处理 HTTP 请求

Nginx 作为 Web 服务器,核心工作是路由请求(匹配配置文件,区分静态 / 动态请求):

  • 配置文件层级:
  • 主配置文件 nginx.conf:定义events(连接模型)、http(HTTP 请求总览)等核心区域。
  • 子配置文件(如 default.conflinux.confblog.conf):按域名(server_name 细分配置,实现多站点管理。
  • 请求匹配逻辑:
  • 先匹配server_name(如 blog.oldboy.cn 对应 blog.conf)。
  • 再匹配location(如 /wp-admin/login.php 会命中 blog.conf 中处理 PHP 的location块)。
  1. 动态请求转发至 PHP-FPM 处理

对于 PHP 动态请求,Nginx 通过FastCGI 协议转发给PHP-FPM

  • PHP-FPM监听127.0.0.1:9000端口,接收 Nginx 转发的请求。
  • 根据SCRIPT_FILENAME(如 /app/code/blog/wp-login.php)找到对应的 PHP 文件,执行业务逻辑(如用户登录验证,可能涉及 MySQL 数据库交互)。
  1. HTTP 响应返回

处理完成后,结果沿原路返回:

  • PHP-FPM 将执行结果返回给 Nginx。
  • Nginx 封装成HTTP 响应报文(如状态码200 OK表示成功,301 Found表示重定向),包含 Server 信息、内容类型、文件大小等,最终返回给用户。
正文完
 0
评论(没有评论)

这是一个shf的网站

近期评论

您尚未收到任何评论。