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

相关推荐
tgethe24 分钟前
Nginx笔记
运维·笔记·nginx
小徐Chao努力1 小时前
Go语言核心知识点底层原理教程【Map的底层原理】
java·golang·哈希算法
invicinble1 小时前
对于nginx(一,认识nginx)
运维·nginx
未来之窗软件服务1 小时前
幽冥大陆(六十二) 多数据库交叉链接系统Go语言—东方仙盟筑基期
数据库·人工智能·oracle·golang·数据库集群·仙盟创梦ide·东方仙盟
徒手千行代码无bug1 小时前
Nginx upstream 负载均衡 404,单节点转发正常的根因与解决
运维·nginx·负载均衡
irisart2 小时前
第二章【NGINX 开源功能】—— 七层反向代理(下)
运维·nginx
码luffyliu2 小时前
Go 语言并发编程:为何它能甩开 Java 等传统后端语言?
java·后端·golang·go
xixiyuguang2 小时前
nginx tar离线安装 ubuntu22.04
运维·nginx
丁丁丁梦涛2 小时前
nginx解决域名代理到IP+端口的平台静态资源和接口地址问题
运维·tcp/ip·nginx
苹果醋33 小时前
24.记录Vue项目iview组件日期获取时间少一天
java·运维·spring boot·mysql·nginx