Linux实务问答与操作-软件篇

177 阅读27分钟

本篇是《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.org

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管理界面

haproxy-stats.png

安装和配置

在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 


借一张图来说明帮助理解:

GitWorkflow-4.png

git操作理论上可以只使用命令行来完成,但用于其功能和配置过于庞杂,通常我们使用一些GUI工具来帮助我们完成这些工作。比如内置在vscode中的版本管理、githut Desktop等等。