作者文章

fwq

FWQ
网站开发
PostgreSQL的pg_hba.conf 客户端认证
认证是数据库服务器对客户端用户身份鉴别的过程,并且确定客户端以该用户是否可以连接数据库服务器。PostgreSQL提供多种不同的客户端认证方式,而pg_hba.conf就是客户端认证的配置文件,pg_hba即PostGreSQL host-base authentication的简称。 一、语法格式 TYPE  DATABASE  USER  CIDR-ADDRESS  METHOD local      database  user  auth-method  [auth-options] host       database  user  address  auth-method  [auth-options] hostssl    database  user  address  auth-method  [auth-options] hostnossl  database …
2024-11-17 阅读全文 →
FWQ
网站开发
PostgreSQL中的系统环境变量
在学习PostgreSQL的过程中,发现PgSQL中可以设置一些系统环境变量,以及同名的数据库、同名的数据库用户,对于新手来说可能回产生一些困扰。 一、系统用户、角色、数据库 系统用户:指操作系统用户,在cat /etc/passwd中可以查看的用户。比方说超级用户 root 、执行PgSQL的用户postgre、执行mysql的用户mysql等。 角色:数据库中的用户,在psql的 shell 中可以通过 select rolname from pg_roles; 查看到的用户。 数据库:数据库名,可以通过psql -l 查看。   二、可设置的系统环境变量 PGDATABASE:默认的数据库 PGHOST:默认host PGPORT:默认port PGUSER:默认user PGDATA:默认的data目录 三、实际中的应用 # initdb #…
2024-11-17 阅读全文 →
FWQ
Docker教程
理解OAuth 2.0
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。 一、应用场景 为了理解OAuth的适用场合,让我举一个假设的例子。 有一个”云冲印”的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让”云冲印”读取自己储存在Google上的照片。   问题是只有得到用户的授权,Google才会同意”云冲印”读取这些照片。那么,”云冲印”怎样获得用户的授权呢? 传统方法是,用户将自己的Google用户名和密码,告诉”云冲印”,后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。 “云冲印”为了后续的服务,会保存用户的密码,这样很不安全。 Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。 “云冲印”拥有了获取用户储存在Google所有资料的权力,用户没法限制”云冲印”获得授权的范围和有效期。 用户只有修改密码,才能收回赋予”云冲印”的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。 OAuth就是为了解决上面这些问题而诞生的。 二、名词定义 在详细讲解OAuth 2.0之前,需要了解几个专用名词。它们对读懂后面的讲解,尤其是几张图,至关重要。 Third-party application:第三方应用程序,本文中又称”客户端”(client),即上一节例子中的”云冲印”。 HTTP service:HTTP服务提供商,本文中简称”服务提供商”,即上一节例子中的Google。 Resource Owner:资源所有者,本文中又称”用户”(user)。 User Agent:用户代理,本文中就是指浏览器。 Authorization…
2024-11-17 阅读全文 →
FWQ
Docker教程
Redis中的Lua脚本
使用Lua脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。 复用。客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。 调用Lua脚本的语法:   $ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ... –eval,告诉redis-cli读取并运行后面的lua脚本 path/to/redis.lua,是lua脚本的位置 KEYS[1] KEYS[2],是要操作的键,可以指定多个,在lua脚本中通过KEYS[1], KEYS[2]获取 ARGV[1] ARGV[2],参数,在lua脚本中通过ARGV[1], ARGV[2]获取。 Tips 01:KEYS和ARGV中间的 ‘,’ 两边的空格,不能省略。…
2024-11-17 阅读全文 →
FWQ
Docker教程
BeansTalkd的使用与安装
一、Beanstalkd的特点 Beanstalkd 是一个轻量级、高性能的消息队列中间件,它最大特点是将自己定位为基于管道  (tube) 和任务 (job) 的工作队列 (work-queue)。 Beanstalkd 支持任务(job)优先级 (priority), 延时 (delay), 超时重发 (time-to-run) 和预留 (buried), 能够很好的支持分布式的后台任务和定时任务处理。 Beanstalkd的内部实现采用 libevent, 服务器-客户端之间用类似 memcached 的轻量级通讯协议,具有有很高的性能。 尽管是内存队列, beanstalkd 提供了 binlog 机制,…
2024-11-17 阅读全文 →
FWQ
Docker教程
BeansTalkd的命令
一、BeanstalkD协议 Beanstalk协议使用ASCII编码,运行在TCP协议之上。客户端负责主动建立连接,发送命令和数据,等待响应以及关闭连接。对于每个连接,服务端以接收请求的顺序串行地处理命令,并按相同的顺序发送响应。协议中所有的数字都是十进制并且非负的(除非有明确说明)。 协议中的名字都是ASCII字符串。名字可以包含字母(A-Z和a-z)、 数字(0-9)、连字符(”-“)、 加(”+”)、 斜线(”/”)、 分号(”;”)、 点(”.”)、 美元符号(”$”)、下划线(”_”)和括号(“(”和”)”),但是不能以连字符开头。名字以空格或换行结束。每个名字至少要有一个字符的长度。   协议中包含两类数据:文本行和非结构化的块数据。文本行用来传输客户端的命令和服务端的响应。块数据用来传输job体和统计信息。每个job体是一个不透明的字节序列。服务端从不检查或修改job体,直接按其原有的格式返回。job体的解释是有客户端来进行的。 当不再需要使用服务端时,客户端可以选择发送 ”quit” 命令或直接关闭TCP连接。然而,beanstalkd可以很好处理和维护大量打开的连接,所以,客户端应该尽可能包括连接的打开和重用。这同样也可以省去建立TCP连接的开销。 如果客户端违背了协议(比如发送错误格式的请求或者不存在的命令)或者服务端出错,服务端将返回下面信息的一种 OUT_OF_MEMORY:表示服务端不能为job分配足够的内存。客户 端应该稍后重试。 INTERNAL_ERROR:表示服务端的bug。这种情况不应该发生。如果 发生了,可以报给http://groups.google.com/group/beanstalk-talk。 BAD_FORMAT:表示客户端发送了一个错误格式的命令行。可能呢 导致这种错误发生的情况有:行没有以\r\n结尾、在需要整数的地方出现了非数字字符、参数的数目错误、或者其他格式的命令行错误。 UNKNOWN_COMMAND:表示客户端发送了一个服务端不认识的 命令。  这些错误响应不会在本文以下各节的命令列出,但都隐含在所有命令的说明里。客户端在发送命令之后都要准备好接收错误响应。  最后,如果服务端发生了严重的错误不能继续服务,服务端将会主动关闭连接。  二、Producer命令 2.1 put…
2024-11-17 阅读全文 →
FWQ
Docker教程
openResty学习中的知识点(一)
1、变量申明后,默认的值是nil;将 nil 赋给变量后,相当于删除变量。注意nil 和 ngx.null的区别。 2、在 lua中只有 false和 nil 值为 false ,其他值都为 true ,包括0,””等 3、lua中的数字(一切数字)都是 number类型。 4、table 的下标从 1 开始。 5、逻辑运算法 and 、or 、not的用法。   6 、字符串的连接可使用string.format ,或者…
2024-11-17 阅读全文 →
FWQ
Docker教程
openResty中ngx_lua模块提供的指令
ngx_lua模块的原理: 每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM; 将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问; 每个外部请求都由一个Lua协程处理,协程之间数据隔离; Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker; I/O等异步操作完成时还原相关协程上下文数据,并继续运行 系列文章: 指令:openResty中ngx_lua模块提供的指令 常量:openResty中ngx_lua模块提供的常量 API:openResty中ngx_lua模块提供的API   要学会openResty必须要熟记的一张图,熟记!熟记!!熟记 !!! 一、指令 1.1 lua_capture_error_log  <未知> 语法: lua_capture_error_log size 默认: none 模块: http 1.2 lua_use_default_type 语法: lua_use_default_type on…
2024-11-17 阅读全文 →
FWQ
Docker教程
openResty中ngx_lua模块提供的常量
ngx_lua模块的原理: 每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM; 将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问; 每个外部请求都由一个Lua协程处理,协程之间数据隔离; Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker; I/O等异步操作完成时还原相关协程上下文数据,并继续运行 系列文章: 指令:openResty中ngx_lua模块提供的指令 常量:openResty中ngx_lua模块提供的常量 API:openResty中ngx_lua模块提供的API   二、常量 2.1 Core constants 作用域: init_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, *log_by_lua*, ngx.timer.*,…
2024-11-17 阅读全文 →
FWQ
Docker教程
openResty中ngx_lua模块提供的API
ngx_lua模块的原理: 每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM; 将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问; 每个外部请求都由一个Lua协程处理,协程之间数据隔离; Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker; I/O等异步操作完成时还原相关协程上下文数据,并继续运行 系列文章: 指令:openResty中ngx_lua模块提供的指令 常量:openResty中ngx_lua模块提供的常量 API:openResty中ngx_lua模块提供的API   三、API 3.1 print 语法: print(…) 模块: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*,…
2024-11-17 阅读全文 →