深入解析 Apache Tomcat 配置文件

前言

Apache Tomcat 作为最流行的开源 Java Web 应用服务器之一,其强大功能的背后离不开一系列精心设计的配置文件。正确理解和配置这些文件,是部署、管理和优化 Web 应用的关键。本篇博客将深入探讨 Tomcat 的核心配置文件,涵盖其结构、关键元素、最佳实践以及常见配置场景,力求为读者提供一份详尽的参考指南。

目录

  1. Tomcat 目录结构概览
  2. 核心配置文件详解
    • server.xml: 服务器主配置
    • web.xml: 全局 Web 应用配置
    • context.xml: 上下文配置
    • tomcat-users.xml: 用户与角色管理
    • catalina.policy: 安全策略
    • catalina.properties: 系统属性与类加载
    • logging.properties: 日志系统配置
  3. 配置文件位置与优先级
  4. 高级配置与最佳实践
  5. 常见配置场景示例
  6. 总结

1. Tomcat 目录结构概览

在深入配置文件之前,了解 Tomcat 的标准目录结构至关重要:

  • bin/: 启动、停止脚本 (startup.sh, shutdown.sh, catalina.sh)。
  • conf/: 所有配置文件的核心存放目录,本文重点。
  • lib/: Tomcat 服务器自身及所有 Web 应用共享的 JAR 文件。
  • logs/: 服务器运行日志(catalina.out, localhost.log 等)。
  • temp/: 临时工作目录。
  • webapps/: 部署 Web 应用程序(WAR 文件或解压后的目录)的默认位置。
  • work/: JSP 编译后生成的 Servlet 源码和字节码文件存放目录。

2. 核心配置文件详解

2.1 conf/server.xml - 服务器主配置文件

这是 Tomcat 的心脏,定义了服务器的整体架构和主要服务组件。其结构遵循一个 Server 元素包含一个 Service 元素,Service 包含 ConnectorEngineEngine 包含 HostHost 包含 Context 的层级关系。

核心元素解析:

  • <Server>: 根元素。

    • port: 指定用于关闭服务器的监听端口(如 8005)。设置为 -1 可禁用此端口。
    • shutdown: 发送到该端口的字符串,用于触发关闭(如 SHUTDOWN)。
  • <Service>: 定义一个服务,通常包含一个 Engine 和一个或多个 Connector

    • name: 服务名称(如 Catalina)。
  • <Connector>: 定义客户端与 Tomcat 之间的连接方式。这是最常修改的配置之一。

    • HTTP/HTTPS Connector:
      <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"maxThreads="200"minSpareThreads="10"maxSpareThreads="75"acceptCount="100"enableLookups="false"URIEncoding="UTF-8"compression="on"compressionMinSize="2048"compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json"/>
      
      • port: 监听端口(HTTP 默认 8080)。
      • protocol: 协议(HTTP/1.1org.apache.coyote.http11.Http11NioProtocol 启用 NIO)。
      • connectionTimeout: 连接超时时间(毫秒)。
      • redirectPort: 当需要安全连接时,重定向到的端口(通常用于 HTTPS)。
      • maxThreads: 最大工作线程数,处理请求。
      • minSpareThreads / maxSpareThreads: 最小/最大空闲线程数。
      • acceptCount: 当所有线程忙时,等待队列的最大长度。
      • enableLookups: 是否启用反向 DNS 查找(设为 false 提升性能)。
      • URIEncoding: URI 编码格式(强烈建议设为 UTF-8)。
      • compression: 启用 GZIP 压缩(on),减少传输数据量。
      • compressionMinSize: 启用压缩的最小响应大小(字节)。
      • compressableMimeType: 指定哪些 MIME 类型的响应可被压缩。
    • HTTPS (SSL/TLS) Connector:
      <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true"><SSLHostConfig><Certificate certificateKeystoreFile="conf/keystore.jks"certificateKeystorePassword="changeit"type="RSA" /></SSLHostConfig>
      </Connector>
      
      • SSLEnabled="true": 启用 SSL。
      • certificateKeystoreFile: 指向包含服务器证书和私钥的 Keystore 文件(如 JKS 格式)。
      • certificateKeystorePassword: Keystore 的密码。
      • type: 证书密钥类型(RSA, EC 等)。
      • 注意:现代 Tomcat 版本推荐使用 <SSLHostConfig> 子元素进行更灵活的配置。
  • <Engine>: 请求处理引擎,负责将请求路由到适当的 Host

    • name: 引擎名称(通常为 Catalina)。
    • defaultHost: 默认的 Host 名称(当请求的 Host 头不匹配任何 Host 时使用)。
  • <Host>: 虚拟主机,代表一个域名或 IP 地址。

    • name: 主机名(如 localhost, www.example.com)。
    • appBase: 该主机下 Web 应用存放的目录(相对于 CATALINA_HOME 或绝对路径,如 webapps)。
    • unpackWARs: 是否自动解压 WAR 文件(true/false)。
    • autoDeploy: 是否自动部署新应用或检测到应用更新(true/false)。
    • xmlValidation: 是否验证 context.xml 文件(通常 false 提升性能)。
    • xmlNamespaceAware: 是否启用 XML 命名空间感知(通常 false)。
    • <Valve>: 阀门,用于拦截请求/响应,实现日志、访问控制等功能。
      • AccessLogValve: 记录访问日志。
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b %D" />
        
        • pattern: 日志格式(%h=客户端 IP, %t=时间, %r=请求行, %s=状态码, %b=响应字节数, %D=处理时间毫秒)。
      • RemoteAddrValve / RemoteHostValve: 基于 IP 或主机名进行访问控制。
        <Valve className="org.apache.catalina.valves.RemoteAddrValve"allow="127\.0\.0\.1,192\.168\.1\.\d+" />
        
  • <Context>: 不推荐server.xml 中全局定义。应使用 conf/context.xmlMETA-INF/context.xml。如果在此定义,docBase 指向应用的物理路径。

2.2 conf/web.xml - 全局 Web 应用配置

此文件定义了所有部署在该 Tomcat 实例上的 Web 应用的默认行为。它遵循 Servlet 规范。

关键配置:

  • <servlet> / <servlet-mapping>: 定义内置 Servlet 及其映射。

    • default: 处理静态资源(HTML, CSS, JS, 图片)。
    • jsp: 处理 JSP 文件。
    • 例如,可以配置 default servlet 的 sendfileSize(启用 sendfile 优化大文件传输)或 listings(是否允许目录浏览,生产环境务必设为 false)。
  • <mime-mapping>: 定义文件扩展名与 MIME 类型的映射(如 .css -> text/css)。

  • <welcome-file-list>: 定义欢迎文件列表(如 index.html, index.jsp)。

  • <session-config>: 配置会话。

    • <session-timeout>: 会话超时时间(分钟)。
    • <cookie-config>: 配置会话 Cookie。
      • <http-only>: 防止 JavaScript 访问 Cookie(推荐 true)。
      • <secure>: 仅通过 HTTPS 传输 Cookie(HTTPS 环境下推荐 true)。
      • <same-site>: 防止 CSRF(可设为 LaxStrict)。
  • <security-constraint>: 定义安全约束(如需要认证的角色)。

  • <error-page>: 定义全局错误页面(如 404, 500 错误码对应的页面)。

2.3 conf/context.xml - 上下文配置

此文件为所有 Web 应用提供默认的 Context 配置。也可以在 META-INF/context.xml(应用内)或 conf/[enginename]/[hostname]/ 目录下创建 [appname].xml 文件进行更细粒度的配置。

常用配置:

  • <WatchedResource>: 指定 Tomcat 监控的文件,当文件改变时自动重新加载应用(开发环境有用)。

    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
    
  • <Resources>: 配置静态资源处理(如启用缓存、设置缓存时间)。

    <Resources cachingAllowed="true" cacheMaxSize="100000" />
    
  • <JarScanner>: 配置 JAR 包扫描(可跳过某些 JAR 以加快启动)。

    <JarScanner scanClassPath="false" />
    
  • <Manager>: 配置会话管理器(如持久化会话到文件或数据库)。

  • <Environment>: 定义 JNDI 环境条目(可在应用中通过 JNDI 查找)。

  • <ResourceLink>: 创建对全局资源的链接(见 GlobalNamingResources)。

2.4 conf/tomcat-users.xml - 用户与角色管理

用于配置访问 Tomcat Manager 和 Host Manager 应用的用户凭据。

<tomcat-users xmlns="http://tomcat.apache.org/xml"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"version="1.0"><role rolename="manager-gui"/><role rolename="admin-gui"/><user username="admin" password="s3cr3tP@ssw0rd!" roles="manager-gui,admin-gui"/>
</tomcat-users>
  • 角色 (Roles):
    • manager-gui: 访问 Manager Web 应用(部署、启动、停止应用)。
    • manager-script: 访问 Manager 的文本接口(用于脚本)。
    • manager-jmx: 通过 JMX 访问 Manager。
    • manager-status: 仅查看服务器状态。
    • admin-gui: 访问 Host Manager Web 应用(管理虚拟主机)。
    • admin-script: 访问 Host Manager 的文本接口。
  • 重要安全提示生产环境必须修改默认密码,并考虑使用更安全的身份验证机制(如集成 LDAP)。
2.5 conf/catalina.policy - 安全策略文件 (Java Security Manager)

当启用 Java Security Manager 时(通过 catalina.sh-security 参数),此文件定义了代码权限。配置复杂且可能影响性能,生产环境较少使用,但了解其结构很重要。

  • 基于 grant 语句,为代码库 (codeBase) 或签名者 (signedBy) 授予特定权限 (java.io.FilePermission, java.net.SocketPermission 等)。
  • 通常包含对 Tomcat 自身和 webapps 目录的广泛授权。
2.6 conf/catalina.properties - 系统属性与类加载

定义 Tomcat 运行时的系统属性和类加载器行为。

关键属性:

  • shared.loader / common.loader: 定义类加载器的搜索路径。
    • common.loader: Tomcat 内部类和所有应用共享的类($CATALINA_HOME/lib/*.jar)。
    • shared.loader: Tomcat 内部类不使用,但所有应用共享的类($CATALINA_BASE/lib/*.jar)。可用于放置所有应用共用的第三方库。
  • tomcat.util.scan.StandardJarScanFilter.jarsToSkip: 指定在扫描 JAR 包以查找 TLD、注解等时要跳过的 JAR 列表,显著加快启动时间
  • tomcat.util.scan.StandardJarScanFilter.jarsToScan: 指定必须扫描的 JAR(即使在 jarsToSkip 中)。
  • log4j.configurationFile: (如果使用 Log4j) 指定 Log4j 配置文件位置。
2.7 conf/logging.properties - JULI 日志配置

Tomcat 使用其增强版的 Java Util Logging (JULI)。此文件配置日志记录器、处理器和格式。

结构:

  • handlers: 定义全局处理器(如 java.util.logging.ConsoleHandler, org.apache.juli.FileHandler)。
  • .level: 根日志记录器的级别(FINE, INFO, WARNING, SEVERE)。
  • org.apache.catalina.core.ContainerBase.[enginename].[hostname].level: 为特定组件设置日志级别。
  • org.apache.catalina.core.ContainerBase.[enginename].[hostname].handlers: 为特定组件指定处理器。
  • java.util.logging.FileHandler.pattern: 定义日志文件命名模式(如 %h/catalina.%g.log)。
  • java.util.logging.FileHandler.limit / count: 单个日志文件大小限制和循环文件数量。
  • java.util.logging.SimpleFormatter.format: 定义日志输出格式。

3. 配置文件位置与优先级

Tomcat 遵循特定的配置覆盖优先级:

  1. conf/server.xml: 最高优先级,直接定义全局服务和连接器。
  2. conf/[enginename]/[hostname]/[appname].xml: 为特定主机上的特定应用提供 Context 配置,优先级高于 conf/context.xml
  3. conf/context.xml: 为所有应用提供默认 Context 配置。
  4. WEB-INF/web.xml (应用内): 定义应用自身的 Servlet、Filter、Listener 等,优先级高于 conf/web.xml 的全局默认值
  5. conf/web.xml: 提供所有应用的全局默认 Servlet 映射、MIME 类型等。

关键点Context 配置可以从多个来源组合。例如,conf/context.xml 提供基础,[appname].xml 可以覆盖或添加特定设置,应用内的 META-INF/context.xml 也可以提供配置(但通常不推荐,因为它随应用部署)。


4. 高级配置与最佳实践

  • 性能调优:
    • 线程池: 根据应用负载调整 ConnectormaxThreads, minSpareThreads
    • 连接器: 优先使用 NIOAPR/native 协议。
    • 压缩: 启用 compression 减少带宽。
    • JAR 扫描: 在 catalina.properties 中合理配置 jarsToSkip
    • 会话超时: 根据业务需求设置合理的 session-timeout
  • 安全性:
    • 禁用默认管理应用: 生产环境删除或重命名 webapps/managerwebapps/host-manager,或严格限制访问 IP。
    • 强密码: 为 tomcat-users.xml 中的用户设置强密码。
    • HTTPS: 生产环境务必使用 HTTPS,正确配置 SSL/TLS(考虑使用 Let’s Encrypt 证书)。
    • 安全头: 使用 FilterValve 添加安全头(如 X-Content-Type-Options, X-Frame-Options, Content-Security-Policy)。
    • 最小权限: 避免使用 root 用户运行 Tomcat。
  • 高可用与监控:
    • 集群: 使用 mod_jk/mod_proxy 与 Apache/Nginx 配合实现负载均衡和故障转移。
    • JMX: 启用 JMX 远程监控(注意安全配置)。
    • 健康检查: 配置 manager/status 端点用于健康检查。
  • 外部化配置: 将数据库连接等敏感信息通过 JNDI (context.xml) 或环境变量注入,避免硬编码。

5. 常见配置场景示例

场景 1: 配置 HTTPS

  1. 生成或获取 SSL 证书(.crt, .key)并导入 Keystore (keystore.jks)。
  2. server.xml 中添加或修改 HTTPS Connector,指向 Keystore。
  3. (可选)在 web.xml 中添加 <security-constraint> 强制重定向 HTTP 到 HTTPS。

场景 2: 数据库连接池 (JNDI)

  1. 将数据库驱动 JAR 放入 lib/ 目录。
  2. conf/context.xml[appname].xml 中定义 Resource:
    <Resource name="jdbc/MyDB" auth="Container" type="javax.sql.DataSource"maxTotal="100" maxIdle="30" maxWaitMillis="10000"username="dbuser" password="dbpass" driverClassName="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://localhost:3306/mydb"/>
    
  3. 在应用的 WEB-INF/web.xml 中添加 resource-ref:
    <resource-ref><description>DB Connection</description><res-ref-name>jdbc/MyDB</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth>
    </resource-ref>
    
  4. 在代码中通过 JNDI 查找: Context ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyDB");

场景 3: 自定义错误页面

  1. conf/web.xml 或应用的 web.xml 中添加:
    <error-page><error-code>404</error-code><location>/error/404.html</location>
    </error-page>
    <error-page><exception-type>java.lang.Exception</exception-type><location>/error/500.jsp</location>
    </error-page>
    
  2. 确保 /error/404.html/error/500.jsp 文件存在于应用的根目录下。

6. 总结

深入理解 Tomcat 的配置文件是驾驭这头“猫”的关键。server.xml 勾勒出服务器的骨架,web.xmlcontext.xml 定义了应用的默认行为,tomcat-users.xml 管理着访问的钥匙。通过合理配置这些文件,不仅能确保应用稳定运行,更能实现性能优化、安全保障和灵活部署。

核心要点回顾

  • 理解层级与优先级:清楚不同配置文件的作用范围和覆盖关系。
  • 安全第一:及时修改默认密码,禁用不必要的管理应用,优先使用 HTTPS。
  • 性能调优:根据实际负载调整线程、连接器和缓存设置。
  • 日志清晰:配置有意义的访问日志和应用日志,便于问题排查。
  • 外部化敏感信息:使用 JNDI 或环境变量管理数据库密码等。

希望本篇详尽的指南能帮助您更自信地配置和管理您的 Tomcat 服务器。实践是掌握的最佳途径,建议在测试环境中大胆尝试各种配置。祝您配置顺利!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThinkPHP8学习篇(一):安装与配置

ThinkPHP有非常多的功能库&#xff0c;我的学习策略很明确&#xff1a;不贪多求全&#xff0c;只掌握最核心的20%功能&#xff0c;解决80%的业务需求。所有学习都围绕一个目标&#xff1a;够用就行。遇到复杂问题时&#xff0c;再具体学习对应的内容。 作为ThinkPHP学习的第一…

【Python练习】075. 编写一个函数,实现简单的语音识别功能

075. 编写一个函数,实现简单的语音识别功能 075. 编写一个函数,实现简单的语音识别功能 安装依赖库 示例代码 代码说明 示例输出 注意事项 使用 PocketSphinx 进行离线语音识别 注意事项 实现方法 使用SpeechRecognition库实现语音识别 使用PyAudio和深度学习模型 使用Vosk离…

chrome的数据采集插件chat4data的使用

简介&#xff1a; Chat4Data是一款Chrome扩展插件&#xff0c;支持AI网页数据采集与分析。用户可通过Chrome应用商店安装后&#xff0c;在网页上选择区块和字段进行数据抓取&#xff0c;设置采集页数后导出结果。该工具适用于结构化数据提取&#xff0c;操作简便&#xff0c;为…

《人形机器人的觉醒:技术革命与碳基未来》——类人关节设计:人工肌肉研发进展及一款超生物肌肉Hypermusclet的设计与制造

目录&#xff1a;一、人工股肉的不同种类及工作原理和比较优势二、人工肌肉研发的重点难点及成果进展和趋势三、人工肌肉主要研发机构及其研发成果四、人工肌肉主要性能检测表征能力及标准体系建设五、人工肌肉主要制造商及其产品性能优势和供应能力六、人工肌肉在机器人市场应…

【人工智能】AI代理的伦理迷局:自主智能体的责任归属之谜

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在人工智能时代,AI代理作为自主决策的代表,正深刻改变着人类社会。然而,其伦理困境日益凸显:当AI代理做出自主决策时,谁应为其后果负责…

C语言数据结构(6)贪吃蛇项目1.贪吃蛇项目介绍

1. 游戏背景 贪吃蛇是久负盛名的游戏&#xff0c;它也和俄罗斯方块&#xff0c;扫雷等游戏位列经典游戏的行列。 在编程语言的教学中&#xff0c;我们以贪吃蛇为例&#xff0c;从设计到代码实现来提升学生的编程能力和逻辑能力。 2. 游戏效果演示 3. 项目目标 使用C语言…

神经网络的并行计算与加速技术

神经网络的并行计算与加速技术一、引言随着人工智能技术的飞速发展&#xff0c;神经网络在众多领域展现出了巨大的潜力和广泛的应用前景。然而&#xff0c;神经网络模型的复杂度和规模也在不断增加&#xff0c;这使得传统的串行计算方式面临着巨大的挑战&#xff0c;如计算速度…

工厂方法模式:从基础到C++实现

引言 在软件开发中&#xff0c;设计模式是解决常见问题的经过验证的方案。其中&#xff0c;工厂方法模式是一种创建型设计模式&#xff0c;广泛应用于需要动态创建对象的场景。本文将详细介绍工厂方法模式的核心概念、应用场景&#xff0c;并通过C代码示例展示其具体实现。 核心…

我的世界进阶模组开发教程——伤害(2)

上一篇文章简要的讲述了伤害,这一篇文章就来讲一下机械动力的伤害 机械动力源码 DamageTypeBuilder 类定义与成员变量 public class DamageTypeBuilder {protected final ResourceKey<DamageType> key; // 伤害类型的唯一资源标识符

web前端第一次作业

一、用户注册界面作业要求: 1.用户名为文本框&#xff0c;名称为 UserName&#xff0c;长度为 15&#xff0c;最大字符数为 20 2.密码为密码框&#xff0c;名称为 UserPass&#xff0c;长度为 15&#xff0c;最大字符数为 20 3.性别为两个单选按钮&#xff0c;名称为 sex&#…

Jenkins 节点连接故障定位及解决方案总结 - PKIX path validation failed

一、故障现象 Jenkins 节点通过 Java Web 方式连接时&#xff0c;报错&#xff1a; java.io.IOException: Failed to connect to https://xxxx.zte.com.cn/yyyy/tcpSlaveAgentListener/: PKIX path validation failed: java.security.cert.CertPathValidatorException: validit…

c++ --- priority_queue的使用以及简单实现

C --- priority_queue前言一、priority_queue的使用二、priority_queue的简单实现1.整体结构2.主要方法pushpoptopemptysize三、构造迭代器区间构造默认构造四、仿函数前言 priority_queue是C容器之一&#xff0c;意为优先级队列&#xff0c;虽说叫做队列&#xff0c;但是其底…

MySQL梳理三:查询与优化

MySQL查询优化完整指南&#xff1a;从理论到实践 本文从MySQL查询的基础机制出发&#xff0c;深入探讨单表查询访问方法、联表查询策略、成本计算原理、基于规则的优化技术&#xff0c;最后通过实际案例展示慢SQL的诊断和优化过程。 目录 一、单表查询的访问方法二、联表查询机…

从零开始的python学习(九)P129+P130+P131+P132+P133

本文章记录观看B站python教程学习笔记和实践感悟&#xff0c;视频链接&#xff1a;【花了2万多买的Python教程全套&#xff0c;现在分享给大家&#xff0c;入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…

LCL滤波器及其电容电流前馈有源阻尼设计软件【LCLAD_designer】

本文主要介绍针对阮新波著《LCL型并网逆变器的控制技术》书籍 第二章&#xff08;LCL滤波器设计&#xff09;及第五章&#xff08;LCL型并网逆变器的电容电流反馈有源阻尼设计&#xff09;开发的一款交互式软件【LCL&AD_designer】&#xff0c;开发平台MATLAB_R2022b/app d…

【Conda】配置Conda镜像源

Conda 镜像源配置指南 适用系统&#xff1a;Windows 10&#xff08;含 Miniconda / Anaconda&#xff09; & Linux&#xff08;Ubuntu / CentOS / Debian 等&#xff09;1. 为什么要设置镜像源 在中国大陆直接访问 repo.anaconda.com 经常遇到速度慢、连接超时、SSL 错误等…

八股取士--docker

基础概念类 1. 什么是Docker&#xff1f;它解决了什么问题&#xff1f; 解析&#xff1a; Docker是一个开源的容器化平台&#xff0c;用于开发、交付和运行应用程序。 主要解决的问题&#xff1a; 环境一致性&#xff1a;解决"在我机器上能跑"的问题资源利用率&#…

C++:STL中的栈和队列的适配器deque

学习完string类、容器vector和容器list&#xff0c;再去学习其他容器的学习成本就非常低&#xff0c;容器的使用方法都大差不差&#xff0c;而栈和队列的底层使用了适配器&#xff0c;去模拟实现就没有那么麻烦&#xff0c;适配器也是一种容器&#xff0c;但是这种容器兼备栈和…

9类主流数据库 - 帮你更好地进行数据库选型!

作者&#xff1a;唐叔在学习 专栏&#xff1a;数据库学习 标签&#xff1a;数据库选型、MySQL、Redis、MongoDB、大数据存储、NoSQL、数据库优化、数据架构、AI数据库 大家好&#xff0c;我是你们的老朋友唐叔&#xff01;今天咱们来聊聊程序员吃饭的家伙之一 —— 数据库。在这…

推送本地项目到Gitee远程仓库

文章目录前言前面已加学习了下载gitee软件&#xff0c;网址在上一篇文章。在gitee创建账号与仓库。现在来学习如何讲本地项目推送到Gitee远程仓库一、流程总结前言 前面已加学习了下载gitee软件&#xff0c;网址在上一篇文章。在gitee创建账号与仓库。现在来学习如何讲本地项目…