|零基础开发 nginx 模块( 六 )
static ngx_http_module_t ngx_http_hello_module_ctx = { NULL,/* preconfiguration */ hello_init,/* postconfiguration */ hello_create_main_conf,/* create main configuration */ NULL,/* init main configuration */ NULL,/* create server configuration */ NULL,/* merge server configuration */ NULL,/* create location configuration */ NULL/* merge location configuration */ };至此 , 开发完成 。 在 nginx 代码仓库目录下执行 make modules 重新编译生成动态模块文件 , 然后执行如下命令启动 nginx。
objs/nginx -p ''$PWD'' -c objs/nginx.conf使用浏览器或 curl 命令访问 http://localhost:8080/, 每访问一次将看到 nginx 打印一次 hello 语句 , 及当前请求 uri。 类似如下输出:
2020/05/16 22:46:26 [notice] 7279#0: *1 HELLO Nginx, uri: /, client: 127.0.0.1, server: , request: ''GET / HTTP/1.1'', host: ''localhost:8080'' 2020/05/16 22:46:27 [notice] 7279#0: *1 HELLO Nginx, uri: /, client: 127.0.0.1, server: , request: ''GET / HTTP/1.1'', host: ''localhost:8080''热更新 (reload)
nginx 还支持热更新 (reload), 这是一个很有用的高级特性 。 在不停止 nginx 的情况下将配置文件中的 hello 指令修改如下:
hello ''阿泉'';在 nginx 代码仓库目录下执行如下 reload 命令:
objs/nginx -p ''$PWD'' -c objs/nginx.conf -s reloadreload 命令将看到如下输出:
2020/05/16 23:09:31 [notice] 9617#0: HELLO 阿泉 2020/05/16 23:09:31 [notice] 9617#0: signal process started原 nginx 进程将看到如下输出 。 nginx 将重新进行配置初始化 , 创建新 worker 进程 , 并优雅退出旧 worker 进程 。
2020/05/16 23:09:31 [notice] 9384#0: signal 1 (SIGHUP) received from 9617, reconfiguring 2020/05/16 23:09:31 [notice] 9384#0: reconfiguring 2020/05/16 23:09:31 [notice] 9384#0: HELLO 阿泉 # ... ... 2020/05/16 23:09:31 [notice] 9384#0: start worker process 9623 2020/05/16 23:09:31 [notice] 9385#0: gracefully shutting down再次访问 http://localhost:8080/ 时 , 可看到 nginx 日志打印的 hello 语句也随之变成了新配置的 hello 语句 。
2020/05/16 23:09:49 [notice] 9623#0: *3 HELLO 阿泉, uri: /, client: 127.0.0.1, server: , request: ''GET / HTTP/1.1'', host: ''localhost:8080''热更新 (reload) 功能非常有用 , 但在生产使用时一定要非常小心以避免故障 。 实际使用中可能用的并不多 。
教程到此结束 , 下面扯些题外话 。
吐槽与闲聊
Nginx 文档还算完善 , 代码还算优雅 , 阅读 Nginx 源码对提升开发水平颇有裨益 , 但其过程实在是烧脑和痛苦 (对我而言)。 Nginx 源码几乎攒齐了传统 C 语言编程的所有缺点 。 比如使用整数定义错误码和枚举类型 , 使用了迪杰斯特拉 (Dijkstra) 先生不建议使用的 goto 语句 , 一个整数字段 (如 cmd->type) 整合了多种枚举类型信息 , 许多地方使用了动态类型 void* 等 。 这些用法不受工具 (静态) 检查和约束 (原作者的脑中可能有一幅清晰的场景图表?) , 对不熟悉的开发者来说不仅难以理解 , 而且非常危险!但其背后往往又是出于性能 (和某种简洁性) 的考虑 , 大概是使用 C 语言的情况下所能做出的最大努力 。 换句话说 , (很多时候) 这是 C 语言的局限性 , 而不是 Nginx 的问题 。 错误处理的正确解法应该是 Java 受检查的异常 , 但 C 语言缺少异常 (Exception) 等高级特性 , 合理使用 (无效业务值) 错误码和 goto 语句是优雅且高效的最佳实践之一 。
语言之争
本段内容容易引起不适 , 建议跳过 。
推荐阅读
- |万向肖风:区块链的商业突破不是从 C 端开始,而是从开发者开始
- 华为开发者联盟|华为课堂|华为帐号如何保护您的帐号安全?
- 品谷农产品|专业的软件开发流程,应该是怎样的呢?
- AI人工智能|“眼健康黑科技” AI智能眼科检测仪来了!展锐虎贲T710开发板等你来盘!
- 智慧医疗|“眼健康黑科技” AI智能眼科检测仪来了!展锐虎贲T710开发板等你来盘!
- 智能电视|苹果正在开发带有A12x和A14x芯片的Apple TV
- IBM|百年IBM再度迎来历史性变革 拆分基础设施服务部门全力押宝云计算
- 互联网分析师于斌|鸿蒙搜索和EMUI11!华为开发者大会回顾
- cnBeta|前苹果工程师/自动修正创造者开发首款App:名为Up Spell的文字游戏
- 化学奖|女科学家获2020年诺贝尔化学奖,她们开发了“基因剪刀”
