V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wleexi
V2EX  ›  程序员

为什么前后端分离要使用 nginx,前端工程直接访问接口不行吗

  •  
  •   wleexi · 2019-12-03 00:44:30 +08:00 · 10095 次点击
    这是一个创建于 1804 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看了几个前后端分离的工程,都使用到了 nginx。没有 nginx 直接访问服务端不行吗

    39 条回复    2019-12-03 14:44:34 +08:00
    rogwan
        1
    rogwan  
       2019-12-03 00:51:47 +08:00 via iPhone   ❤️ 2
    其实是可以的,只是 nginx 能做的更好,更专业、高性能。静态文件,反向代理,负载均衡等等都是 nginx 的长项
    renmu
        2
    renmu  
       2019-12-03 00:54:06 +08:00 via Android   ❤️ 1
    可以,但是性能不行
    wangyzj
        3
    wangyzj  
       2019-12-03 00:58:00 +08:00
    性能不行
    ecloud
        4
    ecloud  
       2019-12-03 01:08:21 +08:00
    我们用 haproxy
    因为难道你要在后端自己实现一个 SSL ?还是您老自行发明一种密码来加密数据?不然你前端 call 后端难道走明文?

    PS:某著名的交易软件在 TCP 上自己实现了一套加密 /编码方式,然后竟然大言不惭的管这东西叫做"web api",WCNMLGBD
    lalalakakaka
        5
    lalalakakaka  
       2019-12-03 01:08:49 +08:00   ❤️ 1
    几乎任何项目都需要静态文件服务器,这时候需要 nginx。
    既然已经用 nginx 了,那么为什么不多利用 nginx 搞搞负载均衡,路由,SSL 呢
    minglanyu
        6
    minglanyu  
       2019-12-03 01:15:27 +08:00 via iPhone   ❤️ 2
    前端调用的多个子系统接口的话,foo.com:8080/users,bar.com:9090/users
    用 nginx 反向代理以后,foo.com/users,bar.com/users

    不懂就去学一学,动手做一做嘛
    chendy
        7
    chendy  
       2019-12-03 01:20:17 +08:00   ❤️ 1
    直接访问服务端是访问到哪里呢?
    静态文件塞进后端项目的话,前后端就被迫要一起更新,失去了很多灵活性
    当然不用 nginx 用别的也行,有条件 oss+cdn 最好了
    Trim21
        8
    Trim21  
       2019-12-03 01:22:54 +08:00 via Android   ❤️ 1
    你要是用云服务商的那堆东西,比如对象存储 cdn 和负载均衡,也可以考虑不用 nginx 了
    不过也只是类似于云服务商帮你做了 nginx 能做的事情而已
    ecloud
        9
    ecloud  
       2019-12-03 01:22:57 +08:00
    @lalalakakaka 静态真不是理由,把静态资源放 FS 里再用 nginx 发出去,并不真的是个好主意。因为后端出现静资源本来就是比较奇怪的设计,如果肯定有静态的话,不是都应该在前端里吗?即使有静态,也不应该脱离后端代码和数据库而单独以文件的形式存在于 FS 中。即便是一定要个静态池子,一定不能放成 BLOB,哪怕是弄个 Zope 放里面也比裸在 FS 里好
    ericls
        10
    ericls  
       2019-12-03 03:14:07 +08:00 via iPhone
    这跟前后端分离有什么关系?
    Heebe
        11
    Heebe  
       2019-12-03 03:29:34 +08:00 via iPhone   ❤️ 2
    楼主问啥都没弄明白就可以可以……
    不是必须用 nginx,而是必须要用符合 http1 2 X 协议。nginx 或者 iis 等被用到的根本原因是他们符合协议,浏览器请求和服务器应答都是要在协议要求内,比如包含了头部信息、请求格式、保持连接、缓存等等。
    你连接到 ip 和端口,这本身依然是 tcp、udp 的方式,但是如果你建立一个服务端而没有符合 http 协议,那浏览器请求就会没有应答、状态码这些,那自然是得不到预期的结果,比如你想访问一个文件,浏览器发起请求,那么服务器就要告诉浏览器这个文件的状态和内容等。
    假如你的端口服务过程,要去完成一个 http 协议,那是很复杂的事情,所以,大家会选择流行的网站服务端产品,包括大企业他们也大多数用的都是第三方的开源的,以 nginx 及其衍生产品为主,Apache 和 iis 则相对少一些商用。
    至于说其他什么负载、代理等等,都是基于协议的扩展内容,不是基础但是又尤其重要,因为这关系到成本问题。如果开发和作为学习成本大,如果企业硬件成本高……定然选择成本最低性能符合预期的方案。
    akira
        12
    akira  
       2019-12-03 03:55:34 +08:00
    举个栗子,需要跑多份后端来提高负载能力,
    或者不同的 uri 是不同的程序实例
    这个时候就需要一个前置入口了
    wellsc
        13
    wellsc  
       2019-12-03 04:21:51 +08:00 via iPhone
    @ecloud 您这暴脾气,让我以为来到了百度帖吧
    holulu
        14
    holulu  
       2019-12-03 08:19:08 +08:00 via iPad   ❤️ 1
    没有能不能,只有需不需要。
    areless
        15
    areless  
       2019-12-03 08:19:37 +08:00 via Android   ❤️ 1
    单机总体上 nginx 性能会好一点。但单出口普通网络构架下反向代理 n 台内网服务器做分布式是没必要的,普通业务( cpu~内存没吃饱,却大量占用出口带宽类型)在出口 100m 的情况下,建立一个 100m 内网的分布式系统相当于一台电脑上插了一堆 usb1.0 的设备一样傻~~~所以有思科堆叠,mac mini 堆叠。cdn 是可行的,cdn 是多点出口缓存,不是单路出口反向代理。
    lululau
        16
    lululau  
       2019-12-03 08:21:42 +08:00 via iPhone   ❤️ 1
    前后端分离的情况下,不用 nginx 的话,前段资源用什么 serve,前后端域名端口不一样怎么解决?把前后端代码打包到一起? nginx 简单配置看一下,半个小时,不费劲的
    fengpan567
        17
    fengpan567  
       2019-12-03 08:22:48 +08:00
    你的接口不做集群的?就算是单个服务,为了安全也不会把真是的接口 IP 地址暴露出来
    yangxin0
        18
    yangxin0  
       2019-12-03 08:24:45 +08:00
    最简单一个例子如果你的服务要支持 HTTPS 咋弄? 如果你的服务要支持 HTTP2 咋弄? HTTP 协议极其复杂庞大一般后端 App 的 HTTP 服务器都比较简单且容易出问题。
    passerbytiny
        19
    passerbytiny  
       2019-12-03 08:50:29 +08:00
    楼主不要钻牛角尖,不是因为前后端分离才用 nginx,而是绝大多数情况下都要用 nginx 或 IIS。
    jorneyr
        20
    jorneyr  
       2019-12-03 08:51:45 +08:00
    集群、负载均衡、HTTPS、性能更好的静态文件等使用 Nginx 比较方便。
    wangxiaoaer
        21
    wangxiaoaer  
       2019-12-03 08:53:20 +08:00   ❤️ 1
    真是够了。麻烦搞清楚所谓的前后端分离的概念和场景.

    回答你的问题,是否需要 nginx 是由你们开发完成后打包的策略决定的:


    1 前后端各自分开打包

    产生了 2 个包,意味着同时运行了 2 个应用:一个前端纯静态,一个后端动态(比如 java 的 war )。那么问题来了,你那个纯静态的包怎么运行?这时候普遍用 nginx 或者其他 web server 了。这种情况 nginx 充当的是静态资源服务器的角色。

    此外,大多情况下我们还需要前后端用同样的域名和端口,这时候普遍用 ngnix 或其他,这个时候 nginx 充当的是反向代理服务器的角色。

    2 前后端合并成一个包

    打包的时候将前端资源合并到后端的包内(比如后端的 war 包内),这样就不需要 nginx。


    至于楼上有些人说的 SSL 等,跟这个前后端分离没有半毛钱关系。
    lihongjie0209
        22
    lihongjie0209  
       2019-12-03 09:04:14 +08:00   ❤️ 1
    你愿意在你的前端代码中写死 https://domain:8080/api 吗?因为一般的应用服务器都不会用 80 端口
    cz5424
        23
    cz5424  
       2019-12-03 09:06:09 +08:00 via iPhone
    出租房不好吗,为什么买别墅🏡
    ZSeptember
        24
    ZSeptember  
       2019-12-03 09:09:16 +08:00   ❤️ 1
    可以的。
    如果只是一个单机服务,直连业务服务没问题的。
    至于上面说的性能问题,肯定是理解错了,多了一层代理,肯定会降低性能的。
    mytsing520
        25
    mytsing520  
       2019-12-03 09:14:49 +08:00
    能用现有方案解决的问题为什么要重复造轮子呢?无端增加成本?
    我不敢说现有方案能完美解决你的问题,但使用 Nginx/IIS/Squid/Varnish 这是很多人包括某些大厂在内采纳的技术方案。
    至于楼主说的“前后端分离”,能让后端程序专心处理后端请求,提高系统承载能力我认为是个好事。

    以上
    qwerthhusn
        26
    qwerthhusn  
       2019-12-03 09:18:44 +08:00
    我们用 Nginx 的主要作用就是 SSL 消除。
    还有就是 80 和 443,一台机器一个端口只能被一个进程占用。如果有多个服务,可以根据 nginx 的 server_name 分发
    yxcoder
        27
    yxcoder  
       2019-12-03 09:22:59 +08:00
    本人前端,对此的理解是,当访问量过大时,直接访问服务器接口,只能访问某一个的服务器,不能调配,通过 nginx 就可以实现根据多个服务器的不同状态选择对应的服务器进行处理
    yalin
        28
    yalin  
       2019-12-03 09:27:33 +08:00
    为什么要前后端分离类?
    exploreXin
        29
    exploreXin  
       2019-12-03 09:30:51 +08:00   ❤️ 2
    楼主的经历,身份,年龄我不敢肯定,但我敢肯定的是楼主一定不是后端程序员,前后端分离也可以不用 Nginx,可以用其他 Web 服务器,也可以不用 Web 服务器,但一定要自己实现一个拥有 web 传输与解读能力的组件,例如 Node 自建 web 服务器,其他自建服务器的技术还有很多,比如 Swoole , Workman 等等,有时间可以了解一下。
    gamexg
        30
    gamexg  
       2019-12-03 09:51:56 +08:00   ❤️ 1
    可以不用 nginx 啊,
    一个小服务,编写时也是前后分离,
    编译后发布时,连前端 html 代码都合并到可执行文件里面了,
    单文件部署,不依赖任何 nginx 等内容。

    但是生产环境,面向客户等情况,你前端不使用 nginx 等做前端,那么单个 80 口只能开给一个网站了。
    子域名等也都别用了。
    当然也可以自己些子域名支持等,但是有现成的为什么要自己写?
    zw1one
        31
    zw1one  
       2019-12-03 09:55:54 +08:00   ❤️ 3
    我一般用 nginx 解决前后端的跨域问题。
    jsy123392550
        32
    jsy123392550  
       2019-12-03 10:02:12 +08:00
    我感觉楼主问的是后端为什么要用 nginx 再转一次吧,不是说前端为什么要用 nginx,楼上很多人估计理解错意思了。如果是单机的话,确实没有必要再用 nginx 再转一次
    NoKey
        33
    NoKey  
       2019-12-03 10:04:08 +08:00
    不反向代理,怎么解决跨域问题?服务端写代码解决?
    xuanbg
        34
    xuanbg  
       2019-12-03 10:04:10 +08:00   ❤️ 1
    像我们用 Node 做前端服务的,就不需要 nginx 了。总之,你的页面需要有个 web 服务才能通过浏览器访问,而这个必须的 web 服务,可以由 nginx、iis、Node 或者你自己开发一个来提供。不一定要 nginx,但必须要有。
    sarices
        35
    sarices  
       2019-12-03 10:21:43 +08:00   ❤️ 1
    从来没说一定要 nginx 啊,你可以其他啊,你不用就不行了,你的前端怎么跑呢?打包发个邮件给人下载打开看吗?
    wleexi
        36
    wleexi  
    OP
       2019-12-03 10:29:47 +08:00
    @minglanyu 在学做的过程中发现这个问题了,所以来问,感谢。
    leafre
        37
    leafre  
       2019-12-03 11:23:34 +08:00 via iPhone
    用于解决跨域以及集群的负载均衡,nginx
    是现成的高性能轮子,为何不用
    demonzoo
        38
    demonzoo  
       2019-12-03 13:50:50 +08:00   ❤️ 1
    看来你没遇到过跨域问题,这是一个最基本的需求了,尤其是在当今各种微内核架构之下。其它什么负载均衡 ssh 都要往后稍稍
    TypeErrorNone
        39
    TypeErrorNone  
       2019-12-03 14:44:34 +08:00   ❤️ 1
    最基本的,当后端服务有上百台机器时,你前端怎么访问接口?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2642 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 06:22 · PVG 14:22 · LAX 22:22 · JFK 01:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.