Docker Compose 构建 LNMP 环境:一站式 PHP 网站部署指南

Docker Compose 构建 LNMP 环境:一站式 PHP 网站部署指南

    • 简介
    • 环境准备和安装
      • 安装 Docker
      • 安装 Docker Compose
      • 准备项目目录结构
    • 编写 Docker Compose 文件
      • 基础结构
      • 配置 Nginx 服务
      • 配置 PHP 服务
      • 配置 MySQL 服务
      • 完整的 `docker-compose.yml` 示例
    • Nginx 容器配置
      • 创建 Nginx 配置文件
      • 设置虚拟主机和端口映射
      • 配置文件放置
      • 优化和安全设置
      • 测试配置
    • PHP 容器配置
      • 编写 PHP Dockerfile
      • 配置 PHP 容器
      • 连接 Nginx 和 PHP 容器
      • 测试 PHP 配置
    • MySQL 容器配置
      • 基本配置
      • 数据持久化
      • 网络和安全性配置
      • 测试数据库连接
      • 维护和备份
    • 部署网站代码
      • 将 PHP 代码放置在 ./www 目录
      • 确保代码和容器的正确关联
      • 配置文件和目录权限
      • 测试网站功能
      • 调试和问题解决
    • 运行和测试
      • 启动 Docker Compose 服务
      • 测试网站可访问性
      • 性能调优和监控
      • 问题诊断和解决
    • 维护和更新
      • 容器和代码的更新流程
      • 安全性维护
      • 故障排除和问题解决

在这里插入图片描述

简介

在现代网站开发中,LNMP(Linux, Nginx, MySQL, PHP)架构因其高效能和稳定性而备受青睐。本教程旨在引导您使用 Docker 和 Docker Compose 在 LNMP 架构上搭建 PHP 网站。Docker 作为一种流行的容器化技术,提供了一种轻量级、一致的环境来部署和运行应用,而 Docker Compose 则进一步简化了多容器 Docker 应用的定义和共享过程。

本教程假设您已具备基本的 Docker 知识和网站开发经验,重点放在实际的操作和配置上。我们将一步步通过编写 docker-compose.yml 文件来定义所需的服务,配置 Nginx 和 PHP 容器,实现它们之间的关联,并确保网站程序文件正确部署在 ./www 目录下。同时,Nginx 的虚拟机配置文件将被放置在 ./nginx/conf.d 目录下。

我们将采用实践导向的方法,通过具体的示例代码来展示每个步骤。通过本教程的学习,您不仅能够掌握使用 Docker 和 Docker Compose 搭建 LNMP 环境的技能,还能获得一些关于容器化应用开发的实用经验。让我们开始这趟学习之旅吧。

环境准备和安装

在开始搭建 LNMP 网站之前,首先需要确保您的开发环境中安装有 Docker 和 Docker Compose。这些工具是构建和管理您的应用的基础。

安装 Docker

Docker 是一个开源容器化平台,它允许您在隔离的容器中运行应用。安装 Docker 的步骤因操作系统的不同而略有差异。

  1. Linux系统: 大多数现代 Linux 发行版都可以直接从官方仓库安装 Docker。例如,在 Ubuntu 上,您可以使用以下命令安装 Docker:
    sudo apt update
    sudo apt install docker.io
    
  2. Windows 和 macOS 系统: 对于 Windows 和 macOS 用户,Docker 提供了 Docker Desktop,可以从 Docker 官网 下载并安装。

安装完成后,您可以运行 docker --version 来检查 Docker 是否正确安装。

安装 Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。安装 Docker Compose 通常需要下载其二进制文件并赋予执行权限。

  1. 下载最新版本的 Docker Compose:
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    
  2. 使二进制文件可执行:
    sudo chmod +x /usr/local/bin/docker-compose
    
  3. 验证安装,运行 docker-compose --version

准备项目目录结构

LNMP 应用的文件和配置需要组织在一个结构化的目录中。为此,我们将创建以下目录结构:

  • www/:存放 PHP 网站代码。
  • nginx/:存放 Nginx 相关配置。
    • conf.d/:存放 Nginx 的虚拟主机配置文件。

您可以使用以下命令来创建这些目录:

mkdir -p ./www
mkdir -p ./nginx/conf.d

通过上述步骤,您已经成功设置了运行 LNMP 应用所需的基础环境。接下来,我们将进入 docker-compose.yml 文件的编写,这是搭建和运行您的 LNMP 应用的关键步骤。

编写 Docker Compose 文件

docker-compose.yml 是 Docker Compose 的配置文件,它定义了您的应用服务、网络和卷。在本节中,我们将详细介绍如何编写此文件来设置 LNMP 环境。

基础结构

首先,创建一个名为 docker-compose.yml 的文件在项目的根目录。该文件的基础结构如下:

version: '3.8'
services:nginx:# Nginx 服务配置php:# PHP 服务配置mysql:# MySQL 服务配置

配置 Nginx 服务

docker-compose.yml 文件中,添加 Nginx 服务的配置:

services:nginx:image: nginx:latestports:- "80:80"volumes:- ./www:/var/www/html- ./nginx/conf.d:/etc/nginx/conf.ddepends_on:- php

这里,我们使用了 Nginx 的官方镜像,并映射了端口 80。同时,将 ./www 目录挂载到容器的 /var/www/html,并将 ./nginx/conf.d 目录挂载到 /etc/nginx/conf.d 以使用自定义的 Nginx 配置。

配置 PHP 服务

接下来,在 docker-compose.yml 中添加 PHP 服务配置:

services:php:image: php:fpmvolumes:- ./www:/var/www/htmldepends_on:- mysql

此处,我们使用了 PHP 的官方 fpm 镜像。PHP 服务同样挂载 ./www 目录,以便 Nginx 和 PHP 可以共享网站代码。

配置 MySQL 服务

最后,配置 MySQL 服务:

services:mysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: mydbvolumes:- mysql_data:/var/lib/mysqlvolumes:mysql_data:

这里使用了 MySQL 的官方镜像,并设置了环境变量来配置数据库密码和创建一个新的数据库。此外,我们定义了一个名为 mysql_data 的卷用于数据持久化。

完整的 docker-compose.yml 示例

version: '3.8'
services:nginx:image: nginx:latestports:- "80:80"volumes:- ./www:/var/www/html- ./nginx/conf.d:/etc/nginx/conf.ddepends_on:- phpphp:image: php:fpmvolumes:- ./www:/var/www/htmldepends_on:- mysqlmysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: mydbvolumes:- mysql_data:/var/lib/mysqlvolumes:mysql_data:

这个 docker-compose.yml 文件定义了一个基本的 LNMP 环境,包括 Nginx、PHP 和 MySQL 服务。接下来,我们将详细介绍 Nginx 容器的配置。

Nginx 容器配置

在 LNMP 架构中,Nginx 扮演着重要的角色,它不仅作为 web 服务器处理 HTTP 请求,还负责将 PHP 请求代理给 PHP-FPM。下面我们将详细介绍如何配置 Nginx 容器。

创建 Nginx 配置文件

首先,您需要在 ./nginx/conf.d 目录下创建一个配置文件。这个配置文件将定义如何处理进入 Nginx 服务器的请求。一个基本的配置文件 default.conf 可能看起来像这样:

server {listen 80;server_name localhost;root /var/www/html;index index.php index.html index.htm;location / {try_files $uri $uri/ =404;}location ~ \.php$ {fastcgi_pass php:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}

这个配置文件设定了服务器监听端口 80,定义了网站根目录为 /var/www/html,并设置了处理 PHP 文件的规则。fastcgi_pass 指令告诉 Nginx 将 PHP 请求转发到名为 php 的服务,在这里即我们的 PHP-FPM 容器。

设置虚拟主机和端口映射

docker-compose.yml 文件中,我们已经为 Nginx 容器配置了端口映射(80:80),这意味着主机的 80 端口将映射到容器的 80 端口。通过这种方式,您可以通过主机的 IP 地址或域名来访问 Nginx 服务器。

配置文件放置

如前所述,Nginx 配置文件应放置在 ./nginx/conf.d 目录下。由于这个目录被挂载到容器的 /etc/nginx/conf.d 中,因此容器内的 Nginx 将使用您提供的配置文件。

优化和安全设置

Nginx 的配置可根据需要进行优化和安全性增强。例如,您可以通过设置更有效的缓存策略、启用 gzip 压缩、配置 SSL 证书等方式提升性能和安全性。但这些配置通常取决于具体的应用需求和部署环境。

测试配置

配置完成后,您可以通过运行 docker-compose up 来启动服务,并访问主机的 IP 或域名来测试 Nginx 是否正确配置和运行。如果遇到问题,查看容器的日志通常是一个好的开始。

通过以上步骤,Nginx 容器配置基本完成。接下来的部分将涉及 PHP 容器的配置。

PHP 容器配置

PHP 容器在 LNMP 架构中负责处理 PHP 代码。通过正确配置 PHP 容器,您可以确保 PHP 代码高效运行,并与 Nginx 容器顺利协作。

编写 PHP Dockerfile

虽然您可以直接使用 PHP 的官方镜像,但为了更好地适应项目需求,通常需要定制化 PHP 容器。这可以通过创建一个 Dockerfile 来实现。例如,在 ./php 目录下创建一个 Dockerfile

FROM php:fpm# 安装 PHP 扩展
RUN docker-php-ext-install mysqli pdo pdo_mysql# 其他必要的设置或安装步骤

这个 Dockerfile 从官方的 PHP FPM 镜像开始,安装了 MySQL 相关的 PHP 扩展。您可以根据项目需要添加更多的扩展或配置。

配置 PHP 容器

docker-compose.yml 中,您需要对 PHP 容器进行配置。假设您已创建了上述的 Dockerfile,配置看起来可能是这样的:

services:php:build: ./phpvolumes:- ./www:/var/www/html

这里的 build 指令告诉 Docker Compose 在哪里找到 Dockerfile 并构建 PHP 容器。同时,我们挂载了 ./www 目录,以便 PHP 容器可以访问您的 PHP 代码。

连接 Nginx 和 PHP 容器

在 LNMP 架构中,Nginx 通常用作前端服务器,它会将 PHP 请求代理给 PHP-FPM。在 docker-compose.yml 文件中,通过在 Nginx 容器的配置中设置 depends_on,我们已经定义了 Nginx 依赖于 PHP 容器,这确保了容器间的正确启动顺序。

测试 PHP 配置

一旦配置完成,您可以通过运行 docker-compose up 来启动所有服务。为了测试 PHP 容器是否正常工作,您可以创建一个简单的 PHP 脚本,例如 info.php,包含以下内容:

<?php
phpinfo();
?>

将此文件放置在 ./www 目录下,然后通过浏览器访问此页面(例如,http://localhost/info.php)。如果一切设置正确,您应该能看到 PHP 的配置信息。

至此,PHP 容器的配置部分已经完成。接下来,我们将深入 MySQL 容器的配置。

MySQL 容器配置

MySQL 是 LNMP 架构中的关键组件,负责数据存储和管理。在 Docker 环境中配置 MySQL 容器需要确保数据的安全性和持久性。

基本配置

docker-compose.yml 文件中,MySQL 服务的配置主要涉及镜像选择、环境变量设置以及卷的配置。下面是一个基本的 MySQL 服务配置示例:

services:mysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: rootpasswordMYSQL_DATABASE: exampledbMYSQL_USER: userMYSQL_PASSWORD: passwordvolumes:- mysql_data:/var/lib/mysqlrestart: always

在这个配置中,我们使用了 MySQL 5.7 版本的官方镜像,并通过环境变量设置了 root 密码、创建了一个数据库以及指定了数据库用户和密码。同时,定义了一个名为 mysql_data 的卷来持久化存储 MySQL 数据。

数据持久化

数据持久化是配置数据库容器时的一个关键考虑因素。在上述配置中,volumes 部分确保了 MySQL 数据库的数据不会随容器的重新创建而丢失。mysql_data 卷映射到了容器内的 /var/lib/mysql 目录,这是 MySQL 存储数据的默认位置。

网络和安全性配置

尽管在简单示例中我们没有显式定义网络,Docker Compose 默认创建了一个网络并使得同一 docker-compose.yml 文件中定义的容器能够互相通信。对于更高级的配置,您可能需要配置网络安全规则或端口映射。

测试数据库连接

为了验证 MySQL 容器是否正常工作,您可以尝试从 PHP 容器连接到 MySQL 容器。例如,您可以在 PHP 脚本中使用之前设置的数据库用户和密码进行连接测试。

维护和备份

对于生产环境,还需要考虑数据库的维护和备份策略。虽然这些内容超出了本教程的范围,但它们对于确保数据安全和可靠性至关重要。

通过以上步骤,您已经完成了 MySQL 容器的基本配置。接下来,我们将进入网站代码的部署阶段。

部署网站代码

部署网站代码是设置 LNMP 环境的最后一步。这一步涉及将您的 PHP 网站代码放置在正确的位置,并确保它可以被 Nginx 和 PHP 容器正确处理。

将 PHP 代码放置在 ./www 目录

您的 PHP 网站代码应该放置在项目结构中的 ./www 目录下。这个目录被配置为挂载到 Nginx 和 PHP 容器的相应位置,以便两个容器都可以访问到这些文件。

例如,您可以将网站的首页 index.php 放置在 ./www 目录中:

// ./www/index.php
<?php
echo "欢迎来到我的 PHP 网站!";
?>

确保代码和容器的正确关联

由于 ./www 目录被挂载到了 Nginx 容器的 /var/www/html 以及 PHP 容器的同一路径下,因此任何放置在 ./www 的文件都将自动出现在两个容器中。这种设置确保了 Nginx 可以将对 PHP 文件的请求传递给 PHP 容器。

配置文件和目录权限

确保您的代码文件和目录具有适当的权限,以便 Docker 容器中的服务能够正确地读取和执行这些文件。通常,文件权限应设置为 644,而目录权限则设置为 755。

测试网站功能

完成代码部署后,您应该测试网站的功能性。启动所有服务(使用 docker-compose up 命令),然后在浏览器中访问您的网站(通常是 http://localhost)。如果一切配置正确,您应该能看到您的 PHP 网页。

调试和问题解决

如果网站没有按预期工作,检查以下几点:

  • 确保 docker-compose.yml 文件中的所有服务都正确配置。
  • 检查 Nginx 和 PHP 容器的日志以查找可能的错误信息。
  • 确认您的 PHP 代码对于容器环境是兼容的。

至此,您已经成功完成了基于 Docker Compose 的 LNMP 环境搭建和 PHP 网站代码的部署。下一步是运行和测试整个应用。

运行和测试

成功部署网站代码后,下一步是运行整个 LNMP 环境,并对网站进行测试,以确保一切按预期工作。

启动 Docker Compose 服务

  1. 启动服务: 在项目根目录下,运行以下命令来启动所有定义在 docker-compose.yml 文件中的服务:

    docker-compose up -d
    

    这将以守护进程模式启动所有服务,使其在后台运行。

  2. 检查服务状态: 为了确认所有容器都正确运行,您可以使用:

    docker-compose ps
    

    这个命令将列出所有正在运行的容器及其状态。

测试网站可访问性

  1. 访问网站: 在浏览器中输入 http://localhost 或您配置的域名。如果配置正确,您应该能够看到您的 PHP 网站的首页。

  2. 测试页面功能: 确保测试网站的所有功能,包括数据库连接、表单提交等,以确保所有部分均正常工作。

性能调优和监控

  1. 性能调优: 根据网站的响应和资源使用情况,您可能需要调整 Nginx 和 PHP 的配置,例如增加 worker 进程数量或调整内存限制。

  2. 日志监控: 检查 Nginx 和 PHP 容器的日志可以帮助您识别任何潜在问题。日志通常可以通过以下命令查看:

    docker-compose logs [service_name]
    

问题诊断和解决

如果在测试过程中遇到问题,以下是一些常见的诊断步骤:

  • 检查容器日志: 日志通常会包含错误信息和警告。
  • 进入容器进行调试: 使用 docker exec 命令进入特定的容器进行更深入的调试。
  • 网络连接测试: 确保容器之间的网络连接正常,特别是 Nginx 与 PHP 容器之间。

完成这些步骤后,您的 LNMP 环境和 PHP 网站应该能够正常运行和服务于访问者。

至此,整个 LNMP 环境的搭建、网站代码部署、运行和测试部分已经完成。下一步将是关于容器和代码的维护更新,以及安全性维护和备份策略的讨论。

维护和更新

维护和更新是确保网站长期稳定运行的重要环节。这包括对 Docker 容器的更新、代码的维护,以及确保整体系统的安全性。

容器和代码的更新流程

  1. 更新 Docker 镜像: 定期检查并更新您的 Nginx、PHP 和 MySQL 镜像到最新版本。使用以下命令拉取最新镜像:

    docker-compose pull
    
  2. 重建并重启服务: 在更新了 Docker 镜像或进行了代码更改后,需要重建并重启服务:

    docker-compose up -d --build
    
  3. 代码版本控制: 为您的代码使用版本控制系统,如 Git,以跟踪更改和快速回滚。

安全性维护

  1. 定期更新: 定期更新所有服务的镜像,以包含最新的安全修复和更新。

  2. 备份策略: 设定定期备份数据库和重要数据的策略。可以使用如下命令备份 MySQL 数据库:

    docker exec [mysql_container_name] mysqldump -u [username] -p[password] [database_name] > backup.sql
    
  3. 监控系统安全: 实施监控系统以便及时发现异常行为或安全威胁。

故障排除和问题解决

  1. 日志审查: 定期审查容器日志以识别潜在问题。

  2. 资源监控: 使用工具监控服务器资源使用情况,如 CPU 和内存使用率,以便及时调整配置。

  3. 社区和支持: 利用社区支持和官方文档来帮助解决遇到的问题。

通过上述步骤,您可以保持您的 LNMP 环境和 PHP 网站的长期健康和安全性。定期维护和适时更新是确保网站稳定性和安全性的关键。

至此,我们已经完成了关于使用 Docker Compose 搭建基于 LNMP 架构的 PHP 网站的全面指南。从环境准备到部署、运行、测试以及维护更新,我们已经涵盖了整个流程的每一个关键步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2773931.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

微信自动预约小程序开发指南:从小白到专家

随着互联网的发展&#xff0c;小程序已经成为了一个备受欢迎的在线预约平台。本文将详细介绍如何使用第三方制作平台&#xff0c;如乔拓云网&#xff0c;来搭建一个从入门到精通的预约小程序。 首先&#xff0c;我们需要登录乔拓云网&#xff0c;并选择一个适合自己的小程序模板…

PdfFactory Pro软件下载以及序列号注册码生成器

PdfFactory Pro注册机是一款针对同名虚拟打印机软件所推出的用户名和序列号生成器。PdfFactory Pro是一款非常专业的PDF虚拟打印软件&#xff0c;通过使用这款注册机&#xff0c;就能帮助用户免费获取注册码&#xff0c;一键激活&#xff0c;永久免费使用。 pdffactory7注册码如…

Node.js之npm单独与批量升级依赖包的方式

Node.js之npm单独与批量升级依赖包的方式 文章目录 Node.js之npm单独与批量升级依赖包的方式npm查看与升级依赖包1. 单独安装或升级最新版本2. 查看依赖但不升级1. npm outdated2. npm update 3. 批量升级新版本4. npm-check-updates1. 全局安装2. ncu查看可升级的版本3. 升级依…

购物车商品数量为0判断是否删除

当编辑商品的数量为1&#xff0c;再减的话&#xff0c;我们搞个模态提示&#xff0c;让用户决定是否要删除这个商品&#xff1f; //商品数量的编辑功能handleItemNumEdit(e){const {operation,id}e.currentTarget.dataset;console.log(operation,id);let {cart}this.data;let …

特征工程:特征提取和降维-下

目录 一、前言 二、正文 Ⅰ. 流形学习 Ⅱ.t-SNE Ⅲ.多维尺度分析 三、结语 一、前言 通过上篇对线性与非线性的数据的特征提取和降维的学习之后&#xff0c;我们来介绍其他方法&#xff0c;分别有流行学习、多维尺度分析、t-SNE。 二、正文 Ⅰ. 流形学习 流形学习是借鉴拓…

《向量数据库指南》——Milvus Cloud「删除」:眼见未必为实

“执行 Collection 中的 delete 操作后,再次调用 num_entities 检查集合中的数据的条数,和删除前一致, delete 不能从物理层面上删除数据吗?”“删除的数据还能被查到是为什么?”“请问下删除 collection 后,磁盘大小没有恢复,该怎么处理?”社区中关于“删除”讨论最多…

MyBatisPlus基础操作之增删改查

目录 一、基本使用 1.1 插入数据 1.2 删除操作 1.3 更新操作 二、条件构造器Wrapper 2.1 常用AbstractWrapper方法 2.1.1 示例一 2.2.2 示例二 2.2.3 示例三 2.2 常用QueryWrapper方法 2.2.1 示例一 2.2.2 示例二 2.2.3 示例三&#xff08;常用&#xff09; 2.3 常…

浅谈垃圾回收、内存泄漏与闭包

什么是垃圾&#xff1f; 在js中&#xff0c;垃圾通常指的是不再被程序使用的内存或对象。也就是说&#xff0c;垃圾是指程序中分配的内存空间或对象&#xff0c;但不再被程序使用或无法被访问到的内容 function createIncrease() {const doms new Array(100000).fill(0).map((…

形态学算法之边界提取的简单python实现——图像处理

原理 图像处理中的边界提取是一项基本而重要的任务&#xff0c;主要用于识别和提取图像中物体的轮廓或边界。 具体流程 1.边缘检测 边界提取的第一步通常是边缘检测。边缘是图像亮度变化显著的地方&#xff0c;是物体与背景或不同物体间的分界线。边缘检测算法通过识别图像中…

EMC学习笔记(二十一)降低EMI的PCB设计指南(一)

降低EMI的PCB设计指南&#xff08;一&#xff09; 1.概述2.射频3.连接器与过孔元件4.静态引脚和动态引脚和输入5.基本回路6.差模与共模 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 1.概述 印刷电路板(PCB)的一般布局准则&#xff0c;基本上都有相对的文件进…

2024.02.07作业

请编程实现二叉树的操作 1.二叉树的创建 typedef struct a {char data;struct a* lchild;struct a* rchild; } *Node;Node create_node() {Node node (Node)malloc(sizeof(struct a));if (NULL node){return NULL;}node->lchild NULL;node->rchild NULL;return …

springboot165科研工作量管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

Java图形化界面编程——Container容器 笔记

2.3 Container容器 2.3.1 Container继承体系 Winow是可以独立存在的顶级窗口,默认使用BorderLayout管理其内部组件布局;Panel可以容纳其他组件&#xff0c;但不能独立存在&#xff0c;它必须内嵌其他容器中使用&#xff0c;默认使用FlowLayout管理其内部组件布局&#xff1b;S…

CPP项目:Boost搜索引擎

1.项目背景 对于Boost库来说&#xff0c;它是没有搜索功能的&#xff0c;所以我们可以实现一个Boost搜索引擎来实现一个简单的搜索功能&#xff0c;可以更快速的实现Boost库的查找&#xff0c;在这里&#xff0c;我们实现的是站内搜索&#xff0c;而不是全网搜索。 2.对于搜索…

寒假漫游记之CSS

一&#xff0c;CSS 1.CSS语法规范 CSS规则由两个主要的部分构成&#xff1a;选择器及一条或多条声明。 &#xff08;选择器是用于指定CSS样式的HTML标签&#xff09; 注&#xff1a;CSS是写在<style></style>里 (style在<head></head>),具体可以书写…

STM32——LCD(1)认识

目录 一、初识LCD 1. LCD介绍 2. 显示器的分类 3. 像素 4. LED和OLED显示器 5. 显示器的基本参数 &#xff08;1&#xff09;像素 &#xff08;2&#xff09;分辨率 &#xff08;3&#xff09;色彩深度 &#xff08;4&#xff09;显示器尺寸 &#xff08;5&#xff…

【漏洞复现】多语言药房管理系统MPMS文件上传漏洞

Nx01 产品简介 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0c;并根据到期、产品等各种参数提供各种报告。 Nx02 漏洞描述 …

进程状态 | 僵尸进程 | 孤儿进程 | 前台后台进程 | 守护进程

文章目录 1.进程的三种基本状态2.Linux中进程状态查看2.1.进程检测脚本2.2.各种状态查看 3.孤儿进程4.前台、后台、守护进程 1.进程的三种基本状态 进程的在系统当中是走走停停的&#xff0c;「运行 - 暂停 - 运行」的活动规律&#xff1b;进程在活动期间的三种状态&#xff1…

DevOps落地笔记-20|软件质量:决定系统成功的关键

上一课时介绍通过提高工程效率来提高价值交付效率&#xff0c;从而提高企业对市场的响应速度。在提高响应速度的同时&#xff0c;也不能降低软件的质量&#xff0c;这就是所谓的“保质保量”。具备高质量软件&#xff0c;高效率的企业走得更快更远。相反&#xff0c;低劣的软件…

Java面向对象 封装

目录 封装的概念“高内聚&#xff0c;低耦合”封装的好处实例案例测试 封装的概念 封装是把过程和数据包围起来&#xff0c;对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念&#xff0c;即现实世界可以被描绘成一系列完全自治、封装的对象&#xff0c;这些对…