在基于go开发的web应用中加入Nginx反向代理

文章目录

  • 学习笔记-Nginx
    • [0. Nginx介绍](#0. Nginx介绍)
    • [1. Nginx下载安装](#1. Nginx下载安装)
    • [2. 启动web服务和Nginx配置](#2. 启动web服务和Nginx配置)
      • [2.1 启动服务](#2.1 启动服务)
      • [2.2 Nginx配置](#2.2 Nginx配置)
    • [3. 测试](#3. 测试)
    • [4. 扩展](#4. 扩展)

学习笔记-Nginx

在查阅资料时发现,很少有人介绍怎么在golang中使用nginx,为此,我们选择写一篇简单的,适合新手的在基于go的web项目中使用nginx的教程。

0. Nginx介绍

Nginx是一个开源的高性能 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3 的代理服务器。它最初是由 Igor Sysoev 开发的,旨在处理高并发连接,并提供更高效的资源管理和负载均衡。

在基于 Go 的 Web 项目中,Nginx 通常被用作反向代理服务器即将外部请求转发到运行在不同端口的 Go 应用,同时隐藏应用的真实端口,从而简化访问。同时,Nginx可以用于处理 HTTPS 请求,减少 Go 应用的 SSL/TLS 处理负担,同时集中管理证书。

1. Nginx下载安装

首先,我们需要下载Nginx。在Linux系统(Ubuntu 20.04)中,我们可以使用yum、apt-get等包管理工具进行安装。

这里以apt为例,安装Nginx:

sudo apt update
sudo apt install nginx

安装完成后,我们可以使用以下命令查看Nginx的版本:

nginx -v

接下来通过启动nginx服务来测试是否安装成功:

sudo service start nginx
sudo service nginx status

如果看到nginx的版本号和启动状态,说明安装成功。

此时,在浏览器中,打开http://localhost,可以看到nginx的欢迎页面。

2. 启动web服务和Nginx配置

2.1 启动服务

我们在localhost上启动一个简单的web服务,并让其运行在8888端口。

go 复制代码
package main

import (
    "fmt"
    "net/http"
"github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "Hello, World!",
        })
    })
    r.Run(":8888")
}

此时访问http://localhost:8888,可以看到返回的json数据。但是很容易发现,访问需要提供具体的端口号,这很不方便。此外,当存在多个路由对应多个不同的端口号时,访问会变得极其复杂。同时,由于暴露了具体的端口,可能会导致安全问题。为此,我们配置 Nginx 来将不同的请求路由到相应的服务,而不需要直接暴露内部端口。

2.2 Nginx配置

我们需要创建一个新的Nginx配置文件,并将其命名为my_app.conf

  1. /etc/nginx/sites-available/目录下创建一个新的配置文件:

    sudo nano /etc/nginx/sites-available/my_app.conf

  2. 在打开的编辑器中,输入以下内容:

conf 复制代码
server {
    listen 80;
    server_name 172.25.164.190;  # 替换为你的 IP 地址或域名

    # 配置静态文件目录
    location /static/ {
        alias /var/www/your-app/static/;  # 指向静态资源所在的目录
        expires 30d;                      # 缓存静态资源 30 天
    }

    # 配置动态请求
    location / {
        proxy_pass http://localhost:8888;  # 你的 Go 应用地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  1. 保存并退出编辑器。

  2. 启用刚刚创建的配置文件:

    sudo ln -s /etc/nginx/sites-available/my_app.conf /etc/nginx/sites-enabled/

  3. 重启Nginx:

    sudo nginx -s reload

这样,Nginx就配置好了,可以将请求路由到Web应用。

3. 测试

打开浏览器,访问http://172.25.164.190,可以看到返回的json数据,而无需提供具体的端口号。

4. 扩展

当需要访问多个端口时,可以进一步更改Nginx 配置文件,添加多个server块,并配置不同的端口号。

conf 复制代码
server {
    listen 80;  # Nginx 监听 80 端口

    location /api/ {
        proxy_pass http://localhost:8888;  # 将以 /api/ 开头的请求转发到 Go 应用(运行在8888端口)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /static/ {
        root /var/www/html;  # 直接提供静态文件服务
    }

    location / {
        proxy_pass http://localhost:3000;  # 将其他请求转发到另一个后端服务(运行在3000端口)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

配置说明:

  • listen 80;: Nginx 监听 80 端口,接收来自用户的请求。
  • location /api/: 将以 /api/ 开头的请求转发到 Go 应用(运行在8888端口)。
  • location /static/: 直接提供静态文件服务。
  • location /: 将其他请求转发到另一个后端服务(运行在3000端口)。

这样,Nginx 将不同的请求分发到不同的服务和端口,这样可以实现更灵活的服务架构和负载均衡。

todo: 通过Nginx,完善HTTPS配置

相关推荐
苹果醋316 分钟前
React系列(八)——React进阶知识点拓展
运维·vue.js·spring boot·nginx·课程设计
我要出家当道士21 分钟前
Nginx单向链表 ngx_list_t
数据结构·nginx·链表·c
fat house cat_3 小时前
Linux环境下使用tomcat+nginx部署若依项目
linux·nginx·tomcat
꧁༺朝花夕逝༻꧂5 小时前
nginx-代理服务
运维·服务器·nginx
Smile_Gently5 小时前
Ubuntu环境 nginx.conf详解(二)
运维·服务器·前端·nginx·ubuntu
weixin_449568706 小时前
Nginx区分PC端和移动端访问
运维·nginx
xiaocaibao7776 小时前
编程语言的软件工程
开发语言·后端·golang
记得开心一点嘛8 小时前
Nginx与Tomcat之间的关系
java·nginx·tomcat
ascarl20108 小时前
【Nginx系列】---Nginx配置tcp转发
运维·tcp/ip·nginx
xiaocaibao7778 小时前
Java语言的网络编程
开发语言·后端·golang