本篇是《Linux实务问答与操作》系列文章的软件篇。主要讨论在系统开发和使用中常用软件的相关信息。本篇主要例举了Linux作为Web和网络应用软件运行环境、数据和文件存储和管理、Web和网络应用软件开发等相关的支撑系统和软件等方面的内容。典型的包括Web服务器、数据库系统、开发工具、代码和版本管理工具、文件和存储服务、运行环境和语言等。由于相关具体的软件和系统众多,这里只列举主流和常用的软件和系统进行说明。此外,本文主要专注在开发相关的服务类或者工具类软件,普通GUI类型的桌面、办公和设计类软件,不在本文讨论的范围之内。
就像本系列前言所表述的那样,这里并不是一个操作手册。对于相关应用和支撑软件也是如此,在例举常用业务流程和命令的基础上,来试图理解这个软件的工作和设计逻辑,可以指导用户更好的使用软件和排除在使用中遇到的问题。
软件选型方法论
笔者选择相关支撑软件的原则和方法论如下:
- 开源
Linux系统本身是开源的,与之配套的软件最好也是开源或者至少有开源免费的版本(一般叫社区版)
- 跨平台
软件可以在主流的Linux、Windows等操作系统上运行,最好也能在Mac OS系统上运行(通常用作开发环境)
- 社区成熟活跃、文档和支持丰富
发展良好的开源软件,一般情况下它的技术社区发展的都比较好,能够构成一个相对稳定、活跃的技术生态体系。围绕核心概念、开发者(或者主要支持的公司和机构),配套一个活跃而广泛的用户群体,能够构成一个良性的软件发展生态环境,使技术、软件和应用能够一起向前发展。
这方面的典范包括Linux系统、Postgres和Nodejs等。
- 使用日益广泛,成熟稳定,轻量、高效,和Linux哲学匹配
本文要讨论的相关应用软件包括以下内容,主要都是现在工作中使用或者相关联的,随着工作开展,这些内容会不断补充和完善:
- Nginx - Web服务器
- Caddy - Web服务器
- Haproxy - 负载均衡
- Nodejs - 应用服务
- Postgres - 关系型数据库
- Redis - 网络对象键值库(编写中)
- Git - 版本和开发管理
- MinIO - 网络数据块服务(编写中)
- ytdlp - 音视频下载器(编写中)
读者可能会奇怪,这里好像缺乏了很多主流的软件,所以下面另外还有一个列表,就是由于各种原因(主要原因是不在笔者的技术栈和工具链上,或者不满足笔者技术选择的一些原则),笔者不打算讨论的内容如下:
- Apache - Web服务
- Java(JDK、JRM) - 应用服务
- Oracle - 关系性数据库
- MySQL - 关系型数据库
- Tomcat/Jetty... - Java Web容器
- PHP - 应用服务
Nginx - Web服务
概述和特点
Nginx(发音为"Engine-X")是一个开源的高性能的Web服务器和反向代理服务器。它由Igor Sysoev于2004年编辑创建,目前由Nginx公司进行维护和支持。其公司和产品主页在:
Nginx通常被认为是被广泛使用的,高性能和高可靠的Web应用和服务器。和传统产品和其竞争产品相比,其特性和功能包括:
- 高性能
Nginx被设计为高性能的服务器,具有出色的吞吐量和响应时间。它采用异步、事件驱动的架构,可以处理大量的并发连接,适合处理高负载的网络流量。
- 轻量级
Nginx的设计目标之一是占用更少的系统资源。它具有较低的内存消耗和更高的并发连接能力,适合在资源受限的环境中运行。
- 反向代理和负载均衡
Nginx不仅仅是一个Web文件服务器,它还可以作为反向代理服务器,将客户端的请求转发给后端的多个服务器,以实现负载均衡和高可用性。它可以根据预先定义的策略将请求分发到不同的后端服务器上,提高系统的可伸缩性和可靠性。这是现代化Web应用系统提升处理能力和扩展能力的典型方式。
- 静态文件服务
Nginx可以快速、高效地提供静态文件服务,如HTML、CSS、JavaScript、图像和视频文件。它通过使用内存缓存和异步I/O等技术,可以快速地响应客户端的请求。
- 可扩展性
Nginx支持丰富的模块化架构,可以通过添加各种第三方模块来扩展其功能。它支持HTTP、HTTPS、SMTP、POP3等多种协议,还可以通过Lua脚本进行定制化开发。
由于其出色的性能和可靠性,Nginx被广泛用于各种Web应用和服务器环境中,包括大型网站、应用程序负载均衡、内容传输网络(CDN)等。它已成为互联网基础设施中的重要组成部分,并受到许多开发者和系统管理员的青睐。
安装和配置
可以使用常规的软件包管理工具,在线安装nginx系统:
sudo apt install nginx
安装完成后,正常情况下,其全局配置文件在 /etc/nginx/nginx.conf中,它可以支持分站点配置,其分站点配置文件在 /etc/nginx/conf.d 目录中,通常为default-site文件。
典型的Web文件服务,配置信息如下:
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html;
autoindex on;
}
}
这里nginx配置了一个端口为80的web服务,它的根目录在 /var/www/html,默认的静态文件为index.html。这里打开了浏览模式; 可以在网页中浏览所服务的文件。
启动和服务
配置无误之后,正常情况下,nginx是作为服务安装的,可以直接使用服务方式启动。
// 检查存在性和配置信息
which nginx
sudo nginx -t
// 启动、关闭、重启服务
sudo systcmctl start|stop|restart nginx
// 加载配置
sudo systemctl reload nginx
// 配置开机自启
sudo systemctl enable nginx
// 检查状态和网络监听
sudo systemctl status nginx
sudo netstat -lpnt | grep nginx
错误排查
如果nginx不能正常启动,一般的原因就是配置错误,它会在启动过程中明确展示。或者也可以查看日志来检查和定位错误。
nginx作为Web文件服务使用过程中,最常见的错误就是403 forbidon 或者 404 notfound了。 这些情况,通常都是由于在配置文件中,配置的文件夹错误,或者相关在文件系统中的权限配置错误问题。 一定要在逻辑上理清 Web服务的目录关系,和实际文件系统内的目录之间有明确的对应或者关联。
负载均衡
nginx内置支持HTTP协议的负载均衡,它通过协调定义upstream区块和server配置来实现:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
server_name example.com;
location / {
ip_hash; ## 定义负载均衡策略
proxy_pass http://backend;
}
}
nginx负载均衡可选的负载均衡策略包括:
- 轮询(Round Robin)
默认的负载均衡策略。每个请求依次分发给后端服务器,按照定义的顺序进行轮询分发。
- IP哈希(IP Hash),配置指令为 ip_hash;
根据客户端的IP地址将请求分发给后端服务器。同一IP地址的请求将始终发送到同一个后端服务器,确保会话的一致性。
- 最少连接(Least Connections),配置指令为 least_conn;
将请求发送到当前连接数最少的后端服务器。
- 最快响应时间(Least Time), 配置指令为least_time header;
根据后端服务器的平均响应时间将请求发送到最快的服务器。这个设置需要在Nginx编译时启用ngx_http_upstream_least_time_module 模块。
Caddy - Web服务
概述和特点
与Nginx类似,Caddy同样是一个Web服务器。所以我们为什么还需要它?
在其官网 caddyserver.com/ 上这样描述:
Caddy 2 is a powerful, enterprise-ready, open source web server with automatic HTTPS written in Go。 Caddy 2是使用Go语言编写的,一个强大的、企业级的、支持自动HTTPS配置的开源Web服务器。
这里面的几个关键字是:
- Go语言编写
笔者觉得,这个其实才是Caddy的核心,它是为云计算时代设计的。 首先Go程序一般都是所谓的“单体”应用,没有依赖、没有libc,直接运行。另外go程序的启动可以不使用配置信息,可以通过参数或者配置API来控制其运行;这些特性非常适合于部署在虚拟机或者容器当中,大大简化了运维和管理。
使用Go语言开发,Caddy可以提供其语言平台提供的轻量化、高性能、多CPU支持、跨平台编译等特性。
- 自动HTTPS
确实是这样,在理想的情况下,你只需要指定使用https服务,caddy会在启动时自动的进行相关https的配置,如SSL证书的申请,配置和更小,完全不需要额外的人工操作。
- 文件服务和反向代理
在功能方面,Caddy倒是和nginx类似,可以提供标准的静态文件服务和反向代理。
除此之外,Caddy内置支持HTTP2和HTTP3、WebSocket、IPV6等现代化协议和技术。
- 动态配置
Caddy提供了一个动态配置的API接口,使可编程和自动化配置和运维成为可能。
安装和使用
Caddy是单一可执行的文件,所以无所谓安装的过程。只需要先确定一个工作文件夹,如 /opt/caddy,然后将其下载到这个文件中,修改执行权限,就可以直接使用命令行方式启动了。
虽然Caddy支持动态配置,但我们一般还是习惯编写一个配置文件,来对caddy的运行简单的配置一下,这个配置文件名为Caddyfile,放在同一个目录中。
如果你是一个标准的互联网Web文件服务,可以使用如下配置方式:
{
auto_https disable_redirects
https_port 8700
}
txyanjh.duckdns.org:8700 {
file_server {
browse
root /opt/webroot
}
basicauth /share/* {
share dReHVMQjltLjVweGF2MFVCZ0FEb2hTbEoyTC9GbWNpeVZL
}
}
当使用https时,Caddy可能会自动重定向到默认的端口(443),我们这里不使用默认端口,所以要设置禁用自动重定向,并指定特定的https端口。在服务定义中,指定作为文件服务,打开浏览功能,指定根目录。可以使用基本验证方式,并定义用户名和密码来保护特定的文件夹。这里这个密码使用caddy相关命令生成。
配置文件写好后,可以启动caddy了(使用当前目录中的Caddyfile作为配置信息),:
caddy run ## 启动caddy
caddy start ## 作为守护进程启动caddy, stop结束
caddy reload ## 重新加载配置
// 如果不使用配置文件
caddy fileserver --listen :8080 --browser --root ~/mysite
Haproxy - 负载均衡
Haproxy的官方网站是: haproxy.org
按照其官网的说法,Haproxy是一个可信的,高性能的TCP/HTTP负载均衡器(The Reliable, High Performance TCP/HTTP Load Balancer)。从这个描述,我们可以看到,和Nginx相比,它的定位主要是四层(TCP)和七层(HTTP)负载均衡器,专注于网络负载均衡的性能和稳定性,而不是普通的Web服务程序。经过一段时间的评估和使用,笔者认为Haproxy的优势和特点是:
- 高性能
就原理和设计(事件驱动、多处理器支持、任务规划)而言,它能够专注于提供更高的网络IO性能。按照其网站的说法,其在一个AWS ARM Graviton2(64CPU/100GE/SSL)实例上,可以提供2M QPS。
- 简易直观的配置
相对而言其配置和使用逻辑作为负载均衡软件更加清晰和直观
- 支持TCP/UDP协议
这样就可以支持任意一种类型的网络应用,从而提供了很大的灵活性
- ACL 访问控制
Haproxy提供了强大而灵活的访问控制,可以方便构造复杂的网络应用架构。
- 可视化管理
haproxy内置提供了一个图形界面(stats),方便管理人员查看配置信息和系统状态。
图为haproxy管理界面
安装和配置
在Debian上,haproxy可以直接通过apt来安装:
sudo apt install haproxy
安装完成之后,通常使用编辑 /etc/haproxy/haproxy.cfg 文件来进行配置。下面以一个实例来说明如何进行配置:
# global config
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# admin status 9100
listen admin_stats
bind 192.168.10.201:9100
mode http
stats refresh 30s
stats uri /admin
stats realm welcome login\ Haproxy
stats auth admin:admin123
stats admin if TRUE
# Tcp forward 9101~9105
listen tcp_9101
bind 192.168.10.201:9101
mode tcp
balance roundrobin
server p9101 192.168.10.201:9201 check
# For John web main server 9.135
frontend johnwebf
bind 192.168.10.201:9102
mode http
option httplog
option forwardfor
use_backend ulauth if { url_beg /ulauth }
use_backend ulpublish if { url_beg /ulpublish }
# Default
default_backend johnweb
backend johnweb
mode http
balance roundrobin
server srv8100 192.168.9.135:8100 check
backend ulauth
mode http
balance roundrobin
server srv8202 192.168.9.135:8202 check
....
要点和说明:
- 配置区段可以使用的关键字包括 global, default, listen, frondend, backend等
- 简单定义可以使用listen,如admin管理模块
- 对于常用的webapp,通常结合使用前端定义和后端定义
- 一个前端可以对应多个后端,如使用url匹配规则,可以指定使用那个后端
- 后端定义可以指定负载均衡规则和服务列表
- 最后应该定义一个默认后端
- 对于一般前后端分离的Web应用,也应当区别定义前端Web服务和后端API
NodeJS - 应用服务器
Node.js® is an open-source, cross-platform JavaScript runtime environment.
Nodejs是一个开放源代码,跨平台的Javascript运用时环境。
这个说明其实有点平淡无奇,但在学习、使用、体会过它的强大和丰富之后,笔者觉得这个描述远没有体现出它的特色,但又觉得这可能确实应该这样,让技术自己来展示和表达,让使用者自己来体会其深刻和内含,不需要那些市场化的华丽而浮夸的词汇。
笔者理解,它更像一个架构,基于现代化的软硬件系统,针对现代化的应用开发和运行的场景,将编程语言、执行方式、处理范式、通用模型和算法集成起来,其目的就是帮助开发者和用户快速的建构和部署高性能、可靠和高效的网络应用程序,最终来满足现实生活中的各种业务和数据处理的需求。
向没有或者缺乏Web应用开发基础和经验的人来解释nodejs不是一件容易的事,因为它有非常多的面向。最直观的理解是将其作为一个应用服务器和.NET、Tomcat、PHP等技术进行简单的类比,当然Nodejs肯定有其独特之处,下面我们就尝试列举几个要点,来帮助大家来更高效和准确进行理解:
- Javascript语言和V8执行引擎
Nodejs使用Javascript作为其基础语言。
JS语言的历史几乎和浏览器一样长久,但在很长的时间内,它却是作为配角和无关紧要的功能,在浏览器里面存在的。 原因很简单,它本来就不是为复杂任务设计的,语法比较简单,执行方式也不是很严谨,脚本化的形态也注定不要指望它能够提供很高的执行性能。直到google准备彻底重新发明浏览器,从而推出了chrome浏览器,其中最重要的创新就是集成了名为“V8”的JS执行引擎,大幅度的改进了JS代码运行的性能和可靠性,可以支持复杂的浏览器应用如gmail等,进而彻底打败了包括Java Applet、ActiveX、Flash等前端技术,使JS成为浏览器端编程的事实标准。
看到V8和JS在前端如此好用,就有天才的
Nodejs出现后,历史上第一次人们发现可以用几乎相同的方式
- V8执行引擎
Node.js是建立在Chrome V8 JavaScript引擎之上的。V8是谷歌开发的高性能JS执行引擎,是Chrome浏览器的核心。
- 事件驱动和非阻塞I/O模型
与传统的服务器端技术相比,Node.js采用了事件驱动和非阻塞I/O模型,使得它非常适合处理大量并发请求和实时应用程序。这种模型允许开发者编写高效的、可扩展的网络应用,可以轻松地构建实时聊天应用、实时协作工具、推送通知服务器等。
- 通用公共模块
在远古的Web开发环境和技术栈中。虽然也考虑到了模块化
该引擎用于解析和执行JavaScript代码。Node.js还提供了一系列内置模块,包括文件系统操作、网络通信、加密、流处理等功能,使得开发者能够快速构建各种类型的应用程序。
- 生态系统和包管理
Node.js的生态系统非常丰富,有大量的第三方模块和框架可供使用,例如Express.js、Fastify、Socket.IO、PG、Mongoose等。这些模块和框架使得开发者能够更加高效地构建复杂的应用程序,并提供了许多常用功能的抽象和封装。
Nodejs内置了包管理系统npm,并架构了一个在线的标准包文件库体系。开发人员可以方便的对第三库进行引用和管理。
总之,Node.js是一种基于JavaScript的服务器端运行环境,它使得开发者能够使用同一种语言进行前端和后端开发,提供了高性能和可扩展的网络应用程序开发能力。
安装和配置
主流的Linux发行版,都内置支持了Nodejs的软件仓库和安装。唯一需要小心的是Nodejs技术发展比较块,一些老旧的Linux系统上,默认安装的Nodejs系统也比较老旧,需要升级和更新。
以Debian 10系统为例,安装一个比较新的Nodejs系统的过程如下:
sudo -i
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
apt-get install -y nodejs
// 检查安装
node -v
npm -v
// 升级npm
npm i npm -g
// node执行环境
node
这个命令会下载一个安装脚本,并引导完成相关的配置和nodejs的安装。安装完成后,可以使用node和npm命令检查现在安装是否成功和版本。
安装后配置
对于开发和部署,在默认安装完成后,可能还需要做一些配置工作,或者安装一些常用的库。
- 淘宝镜像和cnpm
由于主要的nodejs软件仓库服务器都在国外,所以一般情况下,直接使用npm进行软件包的管理的网络操作是比较慢的,所以我们可以使用淘宝提供的软件包镜像,来加快npm操作。
原来的淘宝镜像需要重新配置仓库地址,现在推荐使用一个中国定制版包管理器: cnpm,它可以直接使用淘宝镜像,并且可以基本上作为npm的替代命令来使用。
// 安装cnpm 全局
npm i cnpm -g
// 同样的方式使用cnpm
cnpm - pm2 -g
// 应用程序
cd test
// 初始化应用
cnpm init -y
// 安装软件包
cnpm i pg fastify --save
- PM2
pm2是一个运行管理器,通常在部署环境中使用,可以方便的控制nodejs应用程序的运行。比如启动,停止,重启等等。使用pm2,你可以向操作系统管理服务程序一样,来创建和管理多个nodejs应用程序。
- REPL交互解释器
Nodejs支持REPL(Read-Eval-Print-Loop)技术,可以在命令行中直接执行JavaScript代码。这个名词,其实是一个工作流程:
. Read - 读取用户输入的JavaScript代码
. Eval - 对输入的代码进行求值和执行
. Print - 打印出执行代码的结果
. Loop - 循环这个过程,持续读取、执行、打印用户输入的代码
这个功能对于开发工作非常有用,你可以不使用标准执行和调试环境,快速验证一些代码片段和想法。启动Node.js REPL的方法很简单,在终端直接输入node命令即可进入交互式解释器界面。然后可以在终端中直接输入JavaScript代码,立即看到运行结果,非常方便的测试代码片段、观察数据对象等。REPL支持自动补全、保存历史记录、使用underscore变量获取上次结果等高级功能。
Postgres
Postgres(以下简称为PG)是现今世界上最先进,特性最完善的开源关系型数据库系统。PG源自伯克利的Postgres软件包(关系型数据库模型设计和实现,1986年)项目,具有相对独立、稳定和长期的技术发展过程。经过长期的发展,PG在开源社区和信息技术行业内得到了非常广泛认同和应用,已经成为整个开源软件世界中一个重要的组成部分。
PG诞生之初就定位于企业级的数据库系统,非常注重设计严谨规范,系统稳定健壮,容易管理和使用,功能丰富,容易开发和扩展。PG对于SQL标准的支持是在所有数据库系统中最完备的。PG技术社区也非常活跃,开放性也非常好,技术发展也比较快,从而能够尽早提供丰富和先进的功能特性,帮助程序员快速开发和改进他们的应用程序。
PG系统的直接对标产品包括Oracle Dababase,MySQL,SQL Server等等,我们可以将其理解为一类的产品和技术。在Web应用开发的体系中,用于作为数据层,提供模型结构、数据存储和业务流程支撑等多种重要的作用。经过长期的技术演进和应用,这一方式和结构都已经相对成熟和稳定,成为Web技术体系中不可或缺的一个组成部分。
我们下面主要从应用和部署的角度来讨论如何将PG安装到Linux系统中。
系统安装
安装文档来自postgres.org,以debian系统(apt)为例,需要先将软件库信息加入系统:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
// 安装默认版本
sudo apt-get -y install postgresql
// 可以指定安装特定版本
sudo apt-get -y install postgresql-14
// 可以指定只安装客户端
sudo apt-get -y install postgresql-client
以上操作步骤包括:
- 获取当前debian版本产品代码
- 在sources.list中加入适用的软件仓库地址,方式是在其自文件夹中创建一个pgdg.list文件
- 下载并将postgres软件公钥加入软件库的公钥列表(应该是GPG公钥)
- 更新软件仓库
- 开始安装postgres软件
初始化和配置
数据库安装完成后,默认情况下,会自动初始化并且启动(好像是14版本)。但通常在这种情况下,是不能够进行网络访问的,需要进行一些相关的配置。postgres的配置信息主要是几个文件:
- 主配置文件 postgres.conf
配置文件的目录在/etc 下,具体随版本不同稍有差别,如
/etc/postgres/15/main/postgresql.conf
常见的修改项目主要内容包括特定IP地址和端口,工作用的内存(默认设置偏低,可能需要根据实际硬件配置和使用场景优化)等等,具体如下:
listen_addresses = 'xxxx' ## 侦听地址和端口,最好固定到特定地址
max_connections = 100 ## 取决于负载和使用场景
shared_buffers = 1024MB ## 共享缓存大小,建议为内存的 1/4
temp_buffers = 128MB ## 临时缓存大小
work_mem = 64MB ## 工作内存
- hba (host based authentication file) 主机访问控制文件
这个文件可以控制哪些主机可以访问数据库主机。这是一个最常见的部署场景。数据库主机应当受到严格保护,在生产环境中,应当只有应用服务器才可以发起访问。
默认情况下,只能从本机发起访问。如果需要网络访问,需要修改这个文件,增加类似如下条目:
local all postgres peer host all all 192.168.9.0/24 scram-sha-256
每一行可以看成一个访问控制条目。条目内容分别是类型(主机方式)、可用数据库(所有数据库)、用户(所有用户)、来源地址(9.0网段)、验证方式(scram-sha-256)。比如第一条的内容就是在本机,可以使用postgres(Linux账户)访问。
一般会编辑访问的网段,甚至控制到特定主机。验证方式是新型的scram认证,如果客户端过于老旧可能需要注意(老版本使用MD5)。
一般情况下,修改相关重要配置后,需要重新启动pg服务:
systemctl restart postgresql
连接和使用
一般在开发环境下,需要进行大量SQL编写和测试,可以考虑使用图形化的数据库工具。笔者推荐和使用的软件是dbeaver,其他的软件如navicat、pgadmin也是不错的选择。但navicat是收费软件,pgadmin基于Web页面工作。用户可以按照需求选用。
在运维环境中,可能有时候不方便使用UI工具,或者有一些自动化脚本操作的场景,就可以使用标准的postgres客户端和工具软件-psql了。 其实应该没有一个独立的软件包叫psql,而是随着postgres-client包一起安装的。使用psql,可以使用交换的方式对数据库进行操作,也可以使用命令脚本的方式,再结合SSH或者堡垒机系统,大大方便了远程的数据库运维工作。
使用psql连接数据库的一些基本操作如下:
// 切换到postgres用户,并连接本地数据库
su - postgres
psql
// 连接远程数据库 U:用户 h:主机地址 d:数据库
psql -h urldb -U dbuser -d dbdata
// 在数据库连接提示符下
// 列出当前数据库表、视图和实体化视图
\d
// 启用查询计时
\timing
常用运维命令
PG经常使用的数据库运维命令总结如下:
-- 创建用户
create user uldata with password 'password';
-- 创建数据库,并指定属主
create database mteacher owner uldata;
-- 设置只读用户
create user reader with password 'imreader';
GRANT CONNECT ON DATABASE mydb TO reader;
\d mydb
GRANT USAGE ON SCHEMA public TO reader;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO reader;
Git
概述
Git是主流的软件版本管理和控制工具(其实更是一套思维和工作方式)。一般认为它的竞争技术是cvs或者svn。但其实作为后来者和开源软件,它在很多方面有其独特的想法和构思:
- 分布式版本控制
Git 是一个分布式的版本控制系统,每个开发者都可以在本地完整地拥有代码仓库的副本。这意味着开发者可以在离线状态下进行版本控制和代码提交,而不需要实时连接到中央服务器。
- 高效性
Git 的设计目标之一是追求高效性能。由于每个开发者都可以在本地操作,减少了对中央服务器的依赖,可以快速进行代码提交、切换分支、合并等操作。
- 强大的分支和合并功能
Git 的分支和合并机制非常强大和灵活。开发者可以轻松创建、合并、删除分支,这使得团队协作变得更加高效,并且不会破坏主线开发。
- 数据完整性
Git 采用了哈希值来对存储的每个文件和版本进行标识,确保数据的完整性。这使得在传输过程中或者在存储时出现故障时,能够及时发现和修复问题。
- 支持大型项目
Git 被广泛用于管理大型项目,如 Linux 内核等。由于其高效性和强大的分支合并功能,使得处理大量代码文件和版本变得更加可行。
- 网络协议
Git没有自己的网络协议,而是直接支持http和ssh协议。
- 开放源代码
Git 是一个开源的版本控制系统,任何人都可以查看其源代码,自由地使用、修改和分享。
- 兼容性
Git 可以在多种操作系统(Windows、macOS、Linux 等)上运行,并且能够与其他版本控制系统(如 SVN)进行集成。
- 社区支持
Git 拥有庞大的社区,用户可以通过社区获得支持、学习新的技巧和分享经验。
Git的作者是Linus,它也是Linus除了Linux系统之外,对开发者群体甚至是整个世界的另一大贡献(git本来就是为了Linix的项目和代码管理需求而设计的)。比如以其技术为核心的github,已经成为世界上最大的开发者社区。
git不是默认的Linux软件,所以在Linux系统上需要安装,安装可以使用常规的软件包管理工具和过程。安装完成后,一般还需要一些简单的设置,包括当前用户和电子邮件,全局忽略信息等等。
全局设置
我们一般使用两个文件来管理git的用户全局设置。
- 全局忽略文件 .gitignore
典型的内容如下:
logs/
node_modules/
build/
- 全局设置 .gitconfig
[core]
excludesfile = ~/.gitignore
[user]
name = gituser
email = user@gmail.com
一般流程和命令
简单而言,git的使用流程和要点如下:
如果不打算使用诸如gitlab这种平台化的软件系统,只是想建立一个git文件存储和版本服务的话,可以不需要安装其他的软件。只需要找一台可以远程SSH连接的linux系统,安装git软件,使用一个文件夹来保存和管理git文件就可以了。
比如,我们现在有一个开发项目,可能有几个开发人员要参与,笔者的建议就是先在git服务器上,创建一个项目文件夹(mteacher.git),按照一个空库初始化后,其他人员就可以检出这个git项目,在自己的系统上开发了。
## git服务器, 连接用户都是guser
cd /git
mkdir mteacher.git
cd mteacher.git
git init --bare
## 工作桌面 克隆项目并开始工作
cd /work/dev
git clone guser@192.168.9.35:/git/mteacher.git
cd mteacher
npm init -y
## 添加修改文件到暂存区
git add .
## 提交暂存区内容到本地仓库
git commit -m "Your commit message here"
## 推送到远端仓库
git push
## 从远端拉取
git pull
借一张图来说明帮助理解:
git操作理论上可以只使用命令行来完成,但用于其功能和配置过于庞杂,通常我们使用一些GUI工具来帮助我们完成这些工作。比如内置在vscode中的版本管理、githut Desktop等等。