V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
millet230413
V2EX  ›  程序员

我想到了一个学习 nginx 的方式,嘿嘿嘿嘿

  •  
  •   millet230413 · 2024-02-15 12:14:01 +08:00 · 6084 次点击
    这是一个创建于 369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前的工作在搞 openresty / nginx 这块,产品稳定,需求也很小,都是改一些配置和 lua 脚本,空闲时候比较多。想系统的学习一下 openresty / nginx ,看了一些书、文章和视频。然后读源码,画流程图、活动图、状态图。于是产生了用 golang 把 nignx 重写一遍想法,主要用于学习。

    36 条回复    2024-02-18 13:23:26 +08:00
    wonderfulcxm
        1
    wonderfulcxm  
       2024-02-15 12:19:17 +08:00 via iPhone
    厉害
    Yoruno
        2
    Yoruno  
       2024-02-15 12:21:37 +08:00 via Android   ❤️ 3
    为什么不用 rust?
    wheeler
        3
    wheeler  
       2024-02-15 12:24:12 +08:00 via iPhone
    那是不是事件驱动都自己写啊
    yumusb
        4
    yumusb  
       2024-02-15 13:00:51 +08:00   ❤️ 2
    给你两个月的时间 抓紧时间发布 (doge)
    0o0O0o0O0o
        5
    0o0O0o0O0o  
       2024-02-15 13:10:54 +08:00   ❤️ 3
    Albertcord
        6
    Albertcord  
       2024-02-15 13:17:01 +08:00   ❤️ 1
    期待,但这种底层好像用 rust 写更好?不是说 rust 是 C++的平替吗? nginx 就是用 c 写的吧
    drymonfidelia
        7
    drymonfidelia  
       2024-02-15 14:29:08 +08:00   ❤️ 11
    目前的工作在搞 linux 这块,产品稳定,需求也很小,都是改一些配置和 bash 脚本,空闲时候比较多。想系统的学习一下 linux ,看了一些书、文章和视频。然后读源码,画流程图、活动图、状态图。于是产生了用 golang 把 lniux (
    楼主的 nginx 也是拼错的)重写一遍想法,主要用于学习。
    dorothyREN
        8
    dorothyREN  
       2024-02-15 14:37:46 +08:00
    golang 运行时,需要垃圾回收。不合适
    lesismal
        9
    lesismal  
       2024-02-15 15:03:45 +08:00
    基于 runtime 、标准库 Conn ,caddy 开销太大,根本干不过 nginx
    不用 runtime 自己手撸 poller 性能也干不过 nginx 、但是好在 golang 方便开发
    lesismal
        10
    lesismal  
       2024-02-15 15:04:45 +08:00
    支持 OP 用 golang 搞搞看!
    但这种基础设施,我也投 rust !
    millet230413
        11
    millet230413  
    OP
       2024-02-15 16:22:10 +08:00
    @0o0O0o0O0o 我知道 caddy ,之前的公司用过这个,主要就是想通过这种方式来学习 nginx ,不然光看不做假把式。
    millet230413
        12
    millet230413  
    OP
       2024-02-15 16:23:19 +08:00
    @Yoruno 没碰过 rust ,公司业务用 golang 这块做的,我之前做业务部分,后来调过来做网关相关的产品,同时不想把 golang 丢下,就想用 golang 来实现。
    millet230413
        13
    millet230413  
    OP
       2024-02-15 16:26:32 +08:00
    @drymonfidelia 真大佬,我主要就是用这种方法来学习 nginx ,以及网关相关的知识。我想着能在写的过程中把相关的知识点都摸一遍,这样以后产品出什么问题,能知道从哪里切入。
    millet230413
        14
    millet230413  
    OP
       2024-02-15 16:27:47 +08:00
    millet230413
        15
    millet230413  
    OP
       2024-02-15 16:31:04 +08:00
    事件驱动肯定是用操作系统的
    Yoruno
        16
    Yoruno  
       2024-02-15 17:11:57 +08:00 via Android
    @millet230413 我也是主 go ,最近再看 rust ,感觉 rust 特性太多了,长时间不用就忘记了
    mokiki
        17
    mokiki  
       2024-02-15 17:59:03 +08:00
    learn golang the crazy away
    dayeye2006199
        18
    dayeye2006199  
       2024-02-15 18:23:12 +08:00 via Android
    不如看看 caddy
    lesismal
        19
    lesismal  
       2024-02-15 18:32:29 +08:00
    @millet230413 #15
    如果要自己手撸 epoll ,可以试试我的:github.com/lesismal/nbio
    chaleaochexist
        20
    chaleaochexist  
       2024-02-15 18:42:55 +08:00
    开源吗? 地址?
    realJamespond
        21
    realJamespond  
       2024-02-15 18:48:15 +08:00
    nginx 最大特点就是自己搞了一套内存池吧,用 golang 和 rust 没必要搞这个了,其他都差不多都是调 epoll
    chesha1
        22
    chesha1  
       2024-02-15 19:43:57 +08:00
    cloudflare 不是用 rust 重写了一个自己内部的 nginx 吗?这种需求用 rust 确实更好
    vincent7245
        23
    vincent7245  
       2024-02-15 19:55:00 +08:00
    我也觉得 rust 更好,自从学会了 rust 我看到啥都想用 rust 重写一个
    pastel
        24
    pastel  
       2024-02-15 21:51:56 +08:00
    这个工程量是不是太大
    tool2d
        25
    tool2d  
       2024-02-15 21:57:58 +08:00
    我也写过类似的网站服务器,运行效率很低。

    主要能学到一些知识,比如 SSL 详细的握手流程,加密流程,还有签名认证之类的。
    YsHaNg
        26
    YsHaNg  
       2024-02-15 22:59:35 +08:00
    YUX
        27
    YUX  
       2024-02-15 23:19:40 +08:00
    看了楼上的发言,感觉又可以入门 rust 了
    HaroldFinchNYC
        28
    HaroldFinchNYC  
       2024-02-16 01:38:20 +08:00
    @tool2d 要是运行效率很高,你就可以卖钱了
    kkk9
        29
    kkk9  
       2024-02-16 08:31:50 +08:00
    😅 nginx 通过社区贡献已经基本优化到最佳了,除非是有特定需求,如 aws 网关、cf 节点内联,不然怎么样也不会超越 ngx 的
    kkk9
        30
    kkk9  
       2024-02-16 08:34:48 +08:00
    没打完又给回了……

    学习思路换一个,试着写一个 ngx 模块插件,或者 如 @tool2d #25 学习其他知识,@lesismal #19 手撸 epoll 学习。这样比较实际
    gowk
        31
    gowk  
       2024-02-16 10:33:44 +08:00
    millet230413
        32
    millet230413  
    OP
       2024-02-16 11:22:24 +08:00   ❤️ 1
    呃,看了大家的回复,可能是误解了我的初衷,我并不是想要复制一个这样的产品(事实上已经有类似 nginx 这样优秀的网关产品了,比如上面大家说的 caddy ),我是想通过这种方式来学习 nginx ,学习里面的设计思想(这么优秀的产品肯定有很多很多值得学习的地方),学习处理请求的各个阶段和流程(把一个请求合理的划分成多个阶段,这种工程思维本身就有很多值得学习的地方),学习里面的网络知识(肯定有很多我未知的盲点在里面)。
    ingramyang
        33
    ingramyang  
       2024-02-16 18:11:48 +08:00
    有那个时间还不如去看 caddy 的源码
    wws2023
        34
    wws2023  
       2024-02-16 19:31:53 +08:00 via Android
    学着学着发现 nginx 很多功能都是加模块的
    deorth
        35
    deorth  
       2024-02-17 10:37:00 +08:00 via Android
    道理我都懂,可是为什么 nginx 不支持 abstract unix socket
    julyclyde
        36
    julyclyde  
       2024-02-18 13:23:26 +08:00
    我觉得你 *仅仅是* 想学 golang 而已
    这事看起来和 nginx 没啥关系
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5489 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:37 · PVG 11:37 · LAX 19:37 · JFK 22:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.