在基于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配置

相关推荐
姜鱼问生7 小时前
每次开机手动检查 6 样东西?我写了个 2 秒自检脚本
运维·网络·nginx·docker·容器
云和数据.ChenGuang16 小时前
Golang AI 工程师路线图:从入门到实战
开发语言·人工智能·后端·golang
报错小能手17 小时前
内存管理 垃圾回收面试题
golang
xixingzhe21 天前
Nginx 看懂请求耗时瓶颈
服务器·前端·nginx
tachibana21 天前
Go 语言里的 Context 是什么?
开发语言·后端·golang·go·语言
北风toto1 天前
Windows 下用 OpenSSL 生成 SSL 密钥并配置 Nginx 教程
windows·nginx·ssl
卜锦元1 天前
Docker Compose 部署 Nginx 1.30.6 完整指南
nginx·docker·容器
小小龙学IT2 天前
Nginx 开源 Web 服务器与反向代理深度解
前端·nginx·开源
茉莉玫瑰花茶2 天前
GO [ 数据格式 ]
服务器·网络·算法·golang
土豆.exe2 天前
chunked 编码的行尾:Go、h11 与 Tomcat 各错在哪一处
开发语言·网络安全·golang·tomcat