ORC索引页显示的Lapis实现
作者:糖果
ORC是是用LOR框架完成的,这次尝试实现用Lapis来实现,ORC索引页面的显示, 国为ORC是后端前端分开的, 实际上后端只要根据用输入返回按接口定义的JSON数据就好。
这个实验会涉及到几个最学用的点:
1.简单的用SQL对业务表进行left join,这个和语言平台无关。
2.OR的LUA框架返回JSON, JSON数据的编解码。
3.常规不使用ORM访问数据库。
4.Lapis模板,在模板中进行子模板渲染。
local lapis = require "lapis"
local app = lapis.Application()
local db = require("lapis.db")
app:enable("etlua")
app:get("/topics/all", function(self)
page_no = 1
page_size = 10
category = 3
local sql = "select t.*, c.name as category_name, u.avatar as avatar ...
用Supervisor管理Python应用
作者:糖果
Python的WEB应用框架相对比较丰富,常见的有flask、tornado、django这种,这种应用可以被定义成WSGI形式的WEB应用,用gunicorn启动服务,不过有一点,没有一个统一的关闭,启动,关机的重起服务。
安装Supervisor就可以比较好的解决这个问题:
Supervisor安装:
sudo apt-get install supervisor
supervisor的配置:
一般创建配置文件都是在下面这个目录,创建一个文件进行配置,例子文件叫
luaren.conf
[program:luaren]
command=/usr/bin/gunicorn -w 1 luaren:app
directory=/test/luaren
user=nginx
查看服务装态
/usr/bin/supervisorctl status
启动服务
/usr/bin/supervisorctlstart luaren
关闭服务
& ...
dashboard_usage.md
category: Advanced
redirect_from:
- /docs/latest/advanced/dashboard_usage/
title: “如何使用Dashboard”
sort_title: “1”
启动Orange后,浏览器输入http://localhost:9999即可访问内置的Dashboard。
从v0.1.1版本开始,Orange Dashboard(默认在9999端口监听)可开启授权验证,只有通过授权的账户才能使用控制台。
请注意,目前仅当选择store为mysql时,才能使用该功能。
其相关的配置在orange.conf中:
"dashboard": {
"auth": false, //是否开启授权验证,开启时需要先登录才能使用Dashboard
"session_secret": "y0ji4pdj61aaf3f11c2e65cd2263d3e7e5", // 用于加密cookie的盐,自 ...
Socket 编程发展
Socket 编程发展
Linux Socket 编程领域,为了处理大量连接请求场景,需要使用非阻塞 I/O 和复用。select、poll 和 epoll 是 Linux API 提供的 I/O 复用方式,自从 Linux 2.6 中加入了 epoll 之后,高性能服务器领域得到广泛的应用,现在比较出名的 Nginx 就是使用 epoll 来实现 I/O 复用支持高并发,目前在高并发的场景下,Nginx 越来越收到欢迎。
据 w3techs 在2015年8月10日的统计数据表明,在全球 Top 1000 的网站中,有 43.7% 的网站在使用 Nginx,这使得 Nginx 超越了 Apache,成为了高流量网站最信任的 Web 服务器足足有两年时间。已经确定在使用Nginx的站点有:Wikipedia,WordPress,Reddit,Tumblr,Pinterest,Dropbox,Slideshare,Stackexchange 等,可以持续罗列好几个小时,他们太多了。
下图是统计数据:
select 模型
下面是 select 函数接口:
int select (int ...
不同阶段共享变量
不同阶段共享变量
在 OpenResty 的体系中,可以通过共享内存的方式完成不同工作进程的数据共享,可以通过 Lua 模块方式完成单个进程内不同请求的数据共享。如何完成单个请求内不同阶段的数据共享呢?最典型的例子,估计就是在 log 阶段记录一些请求的特殊变量。
ngx.ctx 表就是为了解决这类问题而设计的。参考下面例子:
location /test {
rewrite_by_lua '
ngx.ctx.foo = 76
';
access_by_lua '
ngx.ctx.foo = ngx.ctx.foo + 3
';
content_by_lua '
ngx.say(ngx.ctx.foo)
';
}
首先 ngx.ctx 是一个表,所以我们可以对他添加、修改。它用来存储基于请求的 Lua 环境数据,其生存周期与当前请求相同 (类似 Nginx 变量)。它有一个最重要的特性:单个请求内的 rewrite (重写),access (访问), ...
与其他 location 配合
与其他 location 配合
nginx 世界的 location 是异常强大的,毕竟 nginx 的主要应用场景是在负载均衡、API server,在不同 server、location 之间跳转更是家常便饭。利用不同 location 的功能组合,我们可以完成内部调用、流水线方式跳转、外部重定向等几大不同方式,下面将给大家介绍几个主要应用,就当抛砖引玉。
内部调用
例如对数据库、内部公共函数的统一接口,可以把它们放到统一的 location 中。通常情况下,为了保护这些内部接口,都会把这些接口设置为 internal 。这么做的最主要好处就是可以让这个内部接口相对独立,不受外界干扰。
示例代码:
location = /sum {
# 只允许内部调用
internal;
# 这里做了一个求和运算只是一个例子,可以在这里完成一些数据库、
# 缓存服务器的操作,达到基础模块和业务逻辑分离目的
content_by_lua_block {
local args = ngx.req.get_uri_args ...
cosocket.md
怎样理解 cosocket
todo: waiting to todo
简介
简介
OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。
通过糅合众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用。
OpenResty 致力于将你的服务器端应用完全运行于 Nginx 服务器中,充分利用 Nginx 的事件模型来进行非阻塞 I/O 通信。不仅仅是和 HTTP 客户端间的网络通信是非阻塞的,与MySQL、PostgreSQL、Memcached 以及 Redis 等众多远方后端之间的网络通信也是非阻塞的。
因为 OpenResty 软件包的维护者也是其中打包的许多 Nginx 模块的作者,所以 OpenResty 可以确保所包含的所有组件可以可靠地协同工作。
OpenResty 最早是雅虎中国的一个公司项目,起 ...
如何发起新 HTTP 请求
如何发起新 HTTP 请求
OpenResty 最主要的应用场景之一是 API Server,有别于传统 Nginx 的代理转发应用场景,API Server 中心内部有各种复杂的交易流程和判断逻辑,学会高效的与其他 HTTP Server 调用是必备基础。本文将介绍 OpenResty 中两个最常见 HTTP 接口调用方法。
我们先来模拟一个接口场景,一个公共服务专门用来对外提供加了“盐” md5 计算,业务系统调用这个公共服务完成业务逻辑,用来判断请求本身是否合法。
利用 proxy_pass
参考下面示例,利用 proxy_pass 完成 HTTP 接口访问的成熟配置+调用方法。
http {
upstream md5_server{
server 127.0.0.1:81; # ①
keepalive 20; # ②
}
server {
listen 80;
location /test ...
日志输出
日志输出
你如何测试和调试你的代码呢?Lua 的两个主力作者是这样回复的:
Luiz Henrique de Figueiredo:我主要是一块一块的构建,分块测试。我很少使用调试器。即使用调试器,也只是调试 C 代码。我从不用调试器调试 Lua 代码。对于 Lua 来说,在适当的位置放几条打印语句通常就可以胜任了。
Roberto Ierusalimschy:我差不多也是这样。当我使用调试器时,通常只是用来查找代码在哪里崩溃了。对于 C 代码,有个像 Valgrind 或者 Purify 这样的工具是必要的。
摘自《编程之魂 – 采访 Lua 发明人的一篇文章》。
由此可见掌握日志输出是多么重要,下至入门同学,上至 Lua 作者,使用日志输出来确定问题,是很必要的基本手段。
标准日志输出
OpenResty 的标准日志输出原句为 ngx.log(log_level, ...) ,几乎可以在任何 ngx_lua 阶段进行日志的输出。
请看下面的示例:
#user nobody;
worker_processes 1;
error_log logs/error.log err ...