2020-12-22 《OpenResty 最佳实践》及gitbook踩坑有感

最近在看《OpenResty 最佳实践》书籍是提供在线的,开源

https://moonbingbing.gitbooks.io/openresty-best-practices/content/
https://github.com/moonbingbing/openresty-best-practices/

十分感谢作者的辛苦劳动

但是总觉得点击很麻烦就想有没有pdf版本的,然后就发现了一系列的坑

大体的思路是,安装nvm,cnpm,然后使用nvm安装node10版本,如果默认安装我机子是12,会和gitbook有冲突。
安装svgexport ,这个是生成图书在做图片转换时候用到的。如果不用cnpm你会遇到各种奇奇怪怪的问题,全局科学上网也可。

cnpm install svgexport -g

这里有个小坑在我机子上执行的时候会报错

ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180

是svgexport 调用了puppeteer调用了chromium然后产生的问题,使用下面语句绕过了。。

export QTWEBENGINE_DISABLE_SANDBOX=1

然后安装ebook-convert,
https://www.mapull.com/gitbook/comscore/extend/pdf.html
这个页面有介绍,这个生成pdf的时候用

从github上下载书籍

git clone https://github.com/moonbingbing/openresty-best-practices/

理论上现在就可以生成了,不过建议你暂停一下

进入目录 openresty-best-practices
修改
SUMMARY.md(这里很奇怪在20201204的时候文件还正常的,但是作者自己进行了修改,如果不使用下面版本的summary生成的pdf只有一页还不对。)

# 目录

* [序](README.md)
* [入门篇](README.md)
    * [Socket 编程发展](base/web_evolution.md)
    * [OpenResty 简介](base/intro.md)
* [Lua 入门](lua/main.md)
    * [Lua 简介](lua/brief.md)
    * [Lua 环境搭建](lua/build_env.md)
    * [Lua 编辑器选择](lua/editor.md) 
    * [基础数据类型](lua/class.md)
    * [表达式](lua/operator.md)
    * [控制结构](lua/control_structrues.md)
        * [if/else](lua/if_else.md)
        * [while](lua/while.md)
        * [repeat](lua/repeat.md)
        * [for](lua/for.md)
        * [break,return 和 goto](lua/break.md)
    * [Lua函数](lua/function_descrip.md)
        * [函数的定义](lua/function_define.md)
        * [函数的参数](lua/function_parameter.md)
        * [函数返回值](lua/function_result.md)
        * [全动态函数调用](lua/call_user_func_array.md)
    * [模块](lua/module.md)
    * [String 库](lua/string_library.md)
    * [Table 库](lua/table_library.md)
    * [日期时间函数](lua/time_date_function.md)
    * [数学库函数](lua/math_library.md)
    * [文件操作](lua/file.md)
* Lua 高阶
    * [元表](lua/metatable.md)
    * [面向对象编程](lua/object_oriented.md)
    * [局部变量](lua/local.md)
    * [判断数组大小](lua/array_size.md)
    * [非空判断](lua/not_nil.md)
    * [正则表达式](lua/re.md)
    * [虚变量](lua/dummy_var.md)
    * [抵制使用 module() 定义模块](lua/not_use_module.md)
    * [调用代码前先定义函数](lua/function_before_use.md)
    * [点号与冒号操作符的区别](lua/dot_diff.md)
    * [module 是邪恶的](lua/module_is_evil.md)
    * [FFI](lua/FFI.md)
    * [什么是 JIT](lua/what_jit.md)
* [Nginx](ngx/nginx.md)
    * [Nginx 新手起步](ngx/nginx_brief.md)
    * [location 匹配规则](ngx/nginx_local_pcre.md)
    * [静态文件服务](ngx/static_file.md)
    * [日志](ngx/nginx_log.md)
    * [反向代理](ngx/reverse_proxy.md)
    * [负载均衡](ngx/balancer.md)
    * [陷阱和常见错误](ngx/pitfalls_and_common_mistakes.md)
* OpenResty
    * [环境搭建](openresty/install.md)
        * [Windows 平台](openresty/install_on_windows.md)
        * [CentOS 平台](openresty/install_on_centos.md)
        * [Ubuntu 平台](openresty/install_on_ubuntu.md)
        * [Mac OS X 平台](openresty/install_osx.md)
    * [Hello World](openresty/helloworld.md)
    * [与其他 location 配合](openresty/work_with_location.md)
    * [获取 uri 参数](openresty/get_url_param.md)
    * [获取请求 body](openresty/get_req_body.md)
    * [输出响应体](openresty/response.md)
    * [日志输出](openresty/log_response.md)
    * [简单API Server框架](openresty/simple_api.md)
    * [使用 Nginx 内置绑定变量](openresty/inline_var.md)
    * [子查询](openresty/sub_request.md)
    * [不同阶段共享变量](openresty/share_var.md)
    * [防止 SQL 注入](openresty/safe_sql.md)
    * [如何发起新 HTTP 请求](openresty/how_request_http.md)
* LuaRestyRedisLibrary
    * [访问有授权验证的 Redis](redis/auth_connect.md)
    * [select+set_keepalive 组合操作引起的数据读写错误](redis/select-keeplive.md)
    * [redis 接口的二次封装(简化建连、拆连等细节)](redis/out_package.md)
    * [redis 接口的二次封装(发布订阅)](redis/pub_sub_package.md)
    * [pipeline 压缩请求数量](redis/pipeline.md)
    * [script 压缩复杂请求](redis/script.md)
    * [动态生成的 lua-resty-redis 模块方法](redis/dynamic_redis_module_method.md)
* [LuaCjsonLibrary](json.md)
    * [json解析的异常捕获](json/parse_exception.md)
    * [稀疏数组](json/sparse_array.md)
    * [空table编码为array还是object](json/array_or_object.md)
* [PostgresNginxModule](postgres.md)
    * [调用方式简介](postgres/how_to_use.md)
    * [不支持事务](postgres/not_support_transaction.md)
    * [超时](postgres/timeout.md)
    * [健康监测](postgres/health_check.md)
    * [SQL注入](postgres/sql_inject.md)
* [LuaNginxModule](ngx_lua.md)
    * [执行阶段概念](ngx_lua/phase.md)
    * [正确的记录日志](ngx_lua/log.md)
    * [热装载代码](ngx_lua/hot_load.md)
    * [阻塞操作](ngx_lua/block_io.md)
    * [缓存](ngx_lua/cache.md)
    * [sleep](ngx_lua/sleep.md)
    * [定时任务](ngx_lua/timer.md)
    * [禁止某些终端访问](ngx_lua/allow_deny.md)
    * [请求返回后继续执行](ngx_lua/continue_after_eof.md)
    * [调试](ngx_lua/debug.md)
    * [请求中断后的处理](ngx_lua/on_abort.md)
    * [我的 lua 代码需要调优么](ngx_lua/lua_opt.md)
    * [变量的共享范围](ngx_lua/lua-variable-scope.md)
    * [动态限速](ngx_lua/lua-limit.md)
    * [shared.dict 非队列性质](ngx_lua/shared_get_keys.md)
    * [正确使用长链接](ngx_lua/keepalive.md)
    * [如何引用第三方 resty 库](ngx_lua/how_use_third_lib.md)
    * [典型应用场景](ngx_lua/use_case.md)
    * [怎样理解 cosocket](ngx_lua/whats_cosocket.md)
    * [如何安全启动唯一实例的 timer ](ngx_lua/how_one_instance_time.md)
    * [如何正确的解析域名](ngx_lua/resolve_the_domain_name.md)
* [LuaRestyDNSLibrary](dns/main.md)
    * [使用动态 DNS 来完成 HTTP 请求](dns/use_dynamic_dns.md)
* [LuaRestyLock](lock.md)
    * [缓存失效风暴](lock/cache-miss-storm.md)
* OpenResty 与 SSL
    * [HTTPS 时代](ssl/introduction.md)
    * [动态加载证书和 OCSP stapling](ssl/certificate.md)
    * [TLS session resumption](ssl/session_resumption.md)
* [测试](test.md)
    * [代码静态分析](test/static_analysis.md)
    * [单元测试](test/unittest.md)
    * [代码覆盖率](test/coverage.md)
    * [API 测试](test/apitest.md)
    * [性能测试](test/performance_test.md)
    * [持续集成](test/ci.md)
    * [灰度发布](test/abtest.md)
      * [分流引擎设计](test/abtest/1.md)
      * [控制台开发](test/abtest/2.md)
      * [向运维平台发展](test/abtest/3.md)
* [Web 服务](web.md)
    * [API的设计](web/api.md)
    * [数据合法性检测](web/check_data_valid.md)
    * [协议无痛升级](web/switch_protocol.md)
    * [代码规范](web/code_style.md)
    * [连接池](web/conn_pool.md)
    * [C10K 编程](web/c10k.md)
    * [TIME_WAIT 问题](web/time_wait.md)
    * [与 Docker 使用的网络瓶颈](web/docker.md)
* [火焰图](flame_graph.md)
    * [什么是火焰图](flame_graph/what.md)
    * [什么时候使用](flame_graph/when.md)
    * [如何安装火焰图生成工具](flame_graph/install.md)
    * [如何定位问题](flame_graph/how.md)

然后新建book.json,这个是修改最终生成pdf边框的,默认的太宽了。。。

{
  "pdf": {
    "margin": {
      "right": 10,
      "left": 10,
      "top": 8,
      "bottom": 8
    }
  }
}

其他参数可疑参照
https://topsale.gitbooks.io/gitbook/content/chapter3/32-gitbook-chang-yong-ming-ling/327-she-zhi-pdf-shu-chu-ge-shi.html

然后就可以

gitbook pdf

然后会生成一个book.pdf的文件

至此结束,所有版权归原作者所有。

最后就是福利了,如果你看到这里了,从下面链接可以下载。生成日期 2020年12月22日至于作者什么时候更新,那我就无法确定了。

md5sum(2155b742e090f2865be418f023ce0462),如果真有人碰撞出来。。。算他很,各自小心吧。。。

https://drive.google.com/file/d/1k3-vPZ-HHrry7tnIDRlzrPwJ0oyHFaLA/view?usp=sharing

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容