集群平台#DOCKER#005#容器nginx-ubuntu日志管理
nginx容器访问日志和错误日志的查看方法。
nginx容器访问日志和错误日志的查看方法。
前文我们使用官方提供的hello world镜像作为验证例子,本文我们将基于Nginx+Ubuntu,根据我们的需求定制Docker镜像,并将其上传到DockerHub上,供以后多次使用。
上文我们使用apt以及docker提供的源,安装了docker相关软件。生产环境的有些机器无法访问外网,所以上述方法不适用。Docker官方给我们提供了除apt在线安装之外,基于deb包离线安装Docker的方法。
本文记录使用apt以及docker提供的源,安装docker相关软件的方法。
Docker是一种容器,容器就是将软件打包成标准化单元,以用于开发、交付和部署,它是业界领先的软件容器平台。
本文记录学习和研究K8s中的参考资料。
本文记录学习和研究集群系统中的参考资料。
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| Kafka权威指南(第2版) | 9787115601421 | [美]格温·沙皮拉 | 人民邮电出版社 | 2022年11月 | W |
| 深入理解Kafka:核心设计与实践原理 | 9787121359026 | 朱忠华 | 电子工业出版社 | 2019年01月 | P,W |
本文介绍PostgreSQL客户端常用的操作命令。
前面几篇博文,我们成功安装了数据库,本文开始我们介绍使用C和C++的开发接口,连接数据库和读取数据的方法。
出了使用apt包管理器安装PostgreSQL之外,我们还可以自己手工编译源代码来安装。虽然自己编译,比较复杂,但我们却可以使用最新的版本。
本文记录使用源码编译的方法,安装PostgreSQL的过程。
使用apt安装PostgreSQL是Ubuntu上最为简便的方式,但安装的版本却不一定是最新版本。比如当前PostgreSQL最新版本为16.1,而Ubuntu的仓库中为14.2。如果对版本没有严格的要求,我们最好使用apt来帮忙安装,如果确实需要最新版本,请参考后续博文,教大家如何使用最新版本源代码编译安装。
PostgreSQL是以加州大学计算机系开发的POSTGRES4.2版本为基础的对象关系型数据库管理系统。PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。因为许可证的灵活,任何人都可以以任何目的免费使用、修改和分发PostgreSQL。
记录安装MySQL的初级使用指南。
记录下安装MySQL-8.2.0到Ubuntu22.04服务器上。
记录在Ubuntu22.04服务器上,使用apt安装mysql-server、mysql-client、mysql-dev开发库等组件的方法。
MySQL由瑞典MySQL AB公司开发,属于Oracle旗下产品。其具有体积小、速度快、成本低、开放源码等众多特点,无疑是当下互联网企业最为流行的关系型数据库。
它采用双授权政策,分为社区版和商业版。
后续将深度学习MySQL的使用、管理以及源代码等相关知识。按照管理,我们先梳理MySQL的重要学习资料。
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| 高性能MySQL(第4版) | 9787121442575 | [美]Silvia Botros | 电子工业出版社 | 2022-09-01 | P,W |
| MySQL技术内幕(第5版) | 9787115388445 | [美]Paul DuBois | 人民邮电出版社 | 2015-07-01 | P,W |
| MySQL高可用解决方案——从主从复制到InnoDB Cluster架构 | 9787121441417 | 徐轶韬 | 电子工业出版社 | 2022-09-01 | P,W |
| MySQL技术内幕:InnoDB存储引擎(第2版) | 9787111422068 | 姜承尧 | 机械工业出版社 | 2021-10-01 | P,W |
| MySQL是怎样运行的 从根儿上理解MySQL | 9787115191120 | 小孩子4919 | 人民邮电出版社 | 2020-11-01 | |
| MySQL是怎样使用的 快速入门MySQL | 9787115574961 | 小孩子4919 | 人民邮电出版社 | 2021-12-01 | P,W |
| 跟老男孩学Linux运维:MySQL入门与提高实践 | 9787111613671 | 老男孩 | 机械工业出版社 | 2019-01-01 | P,W |
| MySQL必知必会 | 9787115191120 | [英]Ben Forta | 人民邮电出版社 | 2020-03-01 | P,W |
上文我们介绍了基于Linux系统的SQLCipher的基本使用方法,本文介绍基于Windows的编译、使用和测试等基本操作。
我们知道SQLite不对数据加密,如需加密数据,通常采用SQLCipher方案。
SQLCipher在SQLite基础上,基于AES-256算法对数据库文件整体加密,包括数据页和元数据。通过SQLite的hooks功能注入加密逻辑,实现数据写入磁盘前加密、读取时自动解密,开发者无需大幅修改现有SQL逻辑即可增强数据安全性。
本文描述SQLCipher下载、编译、安装、命令行、编码开发等简单操作和基础知识。
SQLite开发库在Ubuntu/Debian系统上可以使用apt安装,也可以使用源代码编译安装。apt仓库一般并非最新版本,采用源码可按需定制编译,亦可使用最新版本特性。
本文主要记录apt安装方法。
毫无疑问,世界上使用最为广泛的数据库应该是SQLite。它是一个嵌入式数据库,常被各种应用比如安卓或者iOS应用用作本地数据库,所以最为广泛实至名归。SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。
如果要学习一个工业级数据库的实现原理,SQLite是一个非常不错的入手对象。
在Linux系统上我们可以采用编译源代码或者使用Ubuntu软件源的方式来安装Redis,本文主要记录编译安装的方法。
该地址 https://redis.io/download 提供了Redis最新版本,如果要安装历史版本,可以到 https://download.redis.io/releases 下载。
我们使用截止当前最新的7.2.3版本演示安装。
使用如下命令下载Redis到本地服务器。
| |
上文提到Redis可以采用编译源代码或者使用Ubuntu软件源的方式来安装Redis,我们已就Redis源码编译安装方法做了分析,本文我们采用APT源的方式来安装官方为我们编译好的deb包。
Ubuntu默认的Redis包,并不在main仓库,而是在universe仓库中,并不是Redis官方发布的最新版本。
Redis官方也是建议我们使用官方源来安装,所以首先我们将官方源加入APT中。
You can install recent stable versions of Redis from the official packages.redis.io APT repository.
在添加APT源之前,首先安装相关依赖:
| |
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| Redis设计与实现 | 9787111464747 | 黄健宏 | 机械工业出版社 | 2014-06-01 | P,W |
| Redis开发与运维 | 9787111557975 | 付磊 | 机械工业出版社 | 2022-09-01 | P |
| Redis深度历险:核心原理与应用实践 | 9787111557975 | 钱文品 | 电子工业出版社 | 2018-12-01 | P |
| Redis5设计与源码分析 | 9787111632788 | 陈雷 | 机械工业出版社 | 2019-08-01 | P |
| Redis核心原理与实践 | 9787121415487 | 梁国斌 | 电子工业出版社 | 2021-08-01 | P |
| Redis入门指南 第3版 | 9787115569899 | 李子骅 | 人民邮电出版社 | 2021-10-01 | W |
| Redis使用手册 | 9787111636526 | 黄健宏 | 机械工业出版社 | 2019-09-01 | P,W |
| 深入理解Redis | 9787121312014 | [美]Jeremy Nelson | 电子工业出版社 | 2017-04-01 |
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| SQL必知必会(第5版) | 9787115539168 | [美]本·福达 | 人民邮电出版社 | 2020-08-01 | P |
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| 数据库查询优化器的艺术:原理解析与SQL性能优化 | 9787111447467 | 李海翔 | 机械工业出版社 | 2014-01-01 | W |
| 事务处理:概念与技术 | 9787111126416 | [美]Jim Gray,Andreas Reuter | 机械工业出版社 | 2004-01-01 | P |
| 数据库索引设计与优化 | 9787121260544 | [美]拉赫登迈奇 | 电子工业出版社 | 2015-06-01 | P |
| 数据库系统内幕 | 9787111655169 | Alex Petrov | 机械工业出版社 | 2020-06-01 | P,Z |
本文记录学习和研究VPN技术过程中,所需要的资料和相关网站。
本文记录将Chrome扩展程序下载到本地的方法。
图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。图像处理一般指数字图像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效:由一系列C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令。
在使用VS2017编译代码时,有个如下的警告:
创建Windows可执行程序之后,在有些使用场景下不需做成安装包,而是期待直接双击即可运行。
我们可以将exe、dll等资源打包成压缩包,用户解压之后再运行exe文件;或者使用WinRAR软件将所有资源打包成自解压可执行程序。
本文记录学习和研究Windows桌面开发中的参考资料。
本文记录安卓开发重点参考的图书和各种资料。
系统编程是指编写系统软件,其代码在底层运行,直接跟内核和核心系统库对话。
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| Linux/UNIX系统编程手册 上下册 | 9787115328670 | [德]Michael Kerrisk | 人民邮电出版社 | 2022年04月 | P |
| Linux系统编程 第2版 | 9787115346353 | [美]Robert Love | 人民邮电出版社 | 2022年03月 | P |
| Linux系统编程 | 9787111716617 | [瑞]Jack-Benny Persson | 机械工业出版社 | 2023年01月 | |
| Linux内核编程指南 第三版 | 9787302092940 | [美]拜克/鲍姆 | 清华大学出版社 | 2004年11月 | P |
| Linux内核编程 | 9787115251947 | [美]罗德里格斯 | 人民邮电出版社 | 2011年05月 | P |
| Linux环境编程:从应用到内核 | 9787111536109 | 高峰 | 机械工业出版社 | 2016年06月 | P |
我们知道一个程序可以包含多个进程,每个进程中可以创建多个线程,在线程中又可以创建成千上万甚至更多个协程。进程和线程的创建以及调度需要在内核态和用户态之间切换;而协程的创建和调度都在用户态,不需要和内核态进行交互。所以这就注定创建和维持协程运行所牺牲的性能,要远小于进程和线程。另外,协程都是以一组的形态存在于一个特定的线程内,那么对于数据的共享,不必使用互斥锁或者条件变量,来保证互斥和同步,应用程序性能上也有了很大的提升。这就是我们使用协程的原因。
协程适用于IO密集型,而不适用于计算密集型的程序。对于IO密集型程序,无论是读取socket还是硬盘,这些操作基本上都是阻塞式调用,当协程遇到阻塞时,当前协程显式或者隐式主动放弃控制权,保存当前协程的硬件上下文和栈,然后调度器切换到其他就绪的协程继续执行,而当阻塞IO完成后,调度器获得通知,恢复原来协程的硬件上下文以及栈,再切换回来运行。而对于计算密集型的程序,当前协程除非显式切换协程或者设置定时器,由定时器主动引起切换,否则通常不会主动放弃控制权,其他协程可能会一直等待调度,得不到运行。
一组协程运行在一个线程内,它们是串行运行的,而非并行,即是运行在一个CPU核上,那么协程就无法利用多核CPU资源。如果我们既想使用协程,又想利用多核CPU,一般我们就采用”多进程+协程“的方式。
目前网上有很多协程的实现例子,本文主要分析云风的协程库,来探究协程的实现原理。大家也可以直接看协程库的 注释版 。
信号是一种软件中断。常驻程序尤其需要注意处理这些信号,如果没有处理,同时也没有了解信号的默认动作,进程可能会莫名其妙的退出或者core。信号早已有之,但在老的操作系统中,可能会出现信号丢失。4.3BSD和SVR3之后增加了可靠信号机制,我们可以放心使用信号机制。本文根据阅读Nginx代码,参考其信号处理机制,总结了信号使用方法和注意事项。
| |
得到manual中的描述:
A condition (short for ‘‘condition variable’’) is a synchronization device that allows threads to suspend execution and relinquish the processors until some predicate on shared data is satisfied. The basic operations on conditions are: signal the condition(when the predicate becomes true), and wait for the condition, suspending the thread execution until another thread signals the condition.
条件变量是同步线程的一种机制,它允许线程挂起,让出处理器等待其他线程向它发送信号,该线程收到该信号后被唤醒继续执行程序。对条件变量基本的操作就是:a)向条件变量发送信号,唤醒等待的线程;b)等待条件变量并挂起直至其他线程向该条件变量发送信号。为了防止竞争,条件变量总是和一个互斥锁同时使用。
关于Thrift和OpenSSL的安全通信,上篇我们描述了数字证书的生成方法,本文在此基础上编写单向验证的测试代码。
关于Thrift和OpenSSL的安全通信,上篇我们描述了zlib的编译方法,本文编译libevent库。
我们知道x509数字证书有V1和V3版本,对于我们来说采用V1版本即可,考虑到证书生成的便捷性,推荐使用如下的第二种方法生成我们需要的证书。
关于Thrift和OpenSSL的安全通信,上篇我们描述了zlib的编译方法,本文编译libevent库。
关于Thrift和OpenSSL的安全通信,上篇我们描述了Boost的编译方法,本文编译zlib库。
最近对基于Thrift和OpenSSL的安全通信比较感兴趣,根据自己的研究情况,我将其中的研究过程总结下来,作为备忘。
首先,我们明确一下为达成上述目标,需要做哪些工作?
明确了安全通信所需要的执行步骤,我们从OpenSSL的编译开始本系列之旅。
头文件:
| |
| |
| |
| |
connect是socket套接口编程中非常重要的一个函数,它用于客户机连接使用TCP协议打开的服务机。
connect有同步连接和异步连接两种模式:
| 书名 | ISBN | 作者 | 出版社 | 出版日期 | 备注 |
|---|---|---|---|---|---|
| UNIX网络编程 卷1 套接字联网API 第3版 | 9787115517791 | [美]W.理查德.史蒂文斯 | 人民邮电出版社 | 2019-10-01 | P |
| UNIX网络编程 卷2 进程间通信 第2版 | 9787115517807 | [美]W.理查德.史蒂文斯 | 人民邮电出版社 | 2019-10-01 | P |
| TCP/IP高效编程:改善网络程序的44个技巧 | 9787115249371 | [美]斯纳德 | 人民邮电出版社 | 2011-04-01 | P |
| Linux高性能服务器编程 | 9787111425199 | 游双 | 机械工业出版社 | 2013-06-01 | P |
编程时,有时需要打印版本号或者根据版本号来判断逻辑分支走向,前者一般是字符串形式的版本号,后者一般是整型数表达的版本号。
所以需要设计一个相对通用的版本号定义、升级和生成方法,来方便我们使用。
(extern 变量) (extern 函数) 解析
这种情况下的extern说明变量或者函数声明在其他的源文件里,而不用include头文件的方式来引用该函数,在链接时,链接器在各个模块中搜索这个变量或者函数来进行最终链接。
(extern “C”) 解析
使用这种extern的情况多发生在使用C++调用由C写成的函数库时,此时编译过程中常发生编译器找不到C函数的问题,从而导致链接失败。为了解决这种情况,才引用了extern “C”这种用法。
那为什么又会出现这种链接失败的情况呢?简单来是由于g++和gcc生成函数名称方式的不同造成的。C++语言在编译的时候为了解决函数的多态问题,不会直接使用程序中书写的函数名称,而会使用一种特别的方法经过中间变换过程生成一个全局唯一函数名。C库函数是没有经过函数名称变换得来的,当C++使用经过变换的函数名称去调没有变换过的函数时,肯定会出现链接失败的情况。
这种特殊的转换方法叫做“名称的特殊处理(Name Mangling)”,比如C++将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,这是一个用C写成的库文件,请用C的方式来链接它们。
printf是一套家族函数,是C语言标准库函数,定义于头文件stdio.h,其定义如下所示:
| |
printf的format参数是格式控制字符串,它包含两种字段:一是普通字符串,打印时原样输出;二是控制字段,打印时使用可变变量…指定的参数数据,来替换对应的控制字段。两种字段相结合,形成结果字符串,然后printf将结果字符串打印到标准输出。