在 Web 应用程序中使用 nginx 服务器转到 Web 服务器

我无法从 Google 搜索中找到这个答案,似乎没有人清楚地解释纯 Go 网络服务器和 nginx 反向代理之间的区别。前面大家好像都用nginx做web应用。


我的问题是,虽然 Go 具有所有 http 服务功能,但在纯 Go Web 服务器上使用 nginx 有什么好处?


在大多数情况下,我们为这里的所有路由设置了 Go 网络服务器,并在前面设置了 nginx 配置。


就像是:


limit_req_zone $binary_remote_addr zone=limit:10m rate=2r/s;


server {

    listen 80;


    log_format lf '[$time_local] $remote_addr ;


    access_log /var/log/nginx/access.log lf;

    error_log /var/log/nginx/error.log;


    set_real_ip_from 0.0.0.0/0;

    real_ip_header X-Forwarded-For;

    real_ip_recursive on;

    server_name 1.2.3.4 mywebsite.com;

}

当我们有这个 Go 时:


func handler(w http.ResponseWriter, r *http.Request) {

    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])

}


func main() {

    http.HandleFunc("/", handler)

    http.ListenAndServe(":8080", nil)

}

nginx 和 Go Web 服务器的流量是否不同?如果没有,为什么我们有两层 Web 服务器?


请帮助我理解这一点。


陪伴而非守候
浏览 160回答 2
2回答

慕慕森

没有什么可以阻止您直接处理来自 Go 的请求。另一方面,nginx 提供了一些开箱即用的功能,这些功能可能很有用,例如:处理许多虚拟服务器(例如,已经开始响应app.example.com并打开不同的应用程序www.example.com)某些路径中的 http 基本身份验证,例如 www.example.com/secure访问日志等等所有这些都可以在 go 中完成,但需要编程,而在 nginx 中,这只是编辑.conf文件并重新加载配置的问题。Nginx 甚至不需要重新启动即可进行此更改。(从“进程”的角度来看,nginx 可以由操作员管理,具有 root 权限,在众所周知的端口上运行,而开发人员将他们的应用程序部署在更高的端口上。)

子衿沉夜

这已经被问过几次[ 1 ],但为了后代:这取决于。开箱即用,将 nginx 作为反向代理放在前面会给你:访问日志错误日志简单的 SSL 终止SPDY 支持gzip 支持在几行中为某些路由设置 HTTP 标头的简单方法非常快速的静态资产服务(如果您在 S3/等之外提供服务,这不是那么重要)转到HTTP服务器是非常好的,但你将需要推倒重来做一些事情(这是罚款:它并不意味着所有人的所有需要)。我一直发现将 nginx 放在前面更容易——这是它的优点——让它做“网络服务器”的事情。我的 Go 应用程序执行应用程序的工作,并且只有最少的标题/等。它需要。不要认为将 nginx 放在前面是一件“坏事”。此外,为了扩展我的回答,还有一个崩溃弹性问题:你的 Go 应用程序不受配置语言的限制,可以做很多事情。其中一些事情可能会使您的程序崩溃。使用 nginx(或 HAProxy,或 Varnish 等)作为反向代理可以为您提供一些请求缓冲(以允许您的程序重新启动)和/或从其本地缓存(即您的静态主页)提供陈旧内容,这可能比让浏览器超时并提供“无法连接到服务器错误”更好。另一方面,如果您正在构建小型内部服务,则带有您自己的日志记录库的“裸”Go Web 服务器更易于管理(在操作方面)。如果您确实想在 Go 程序中保留所有内容,请查看gzip 的gorilla/handlers、日志记录和代理标头中间件,以及用于日志轮换的lumberjack(否则您可以使用系统的日志记录工具)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go