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

相关推荐
贰十六5 小时前
笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
笔记·nginx·centos
学Linux的语莫6 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
hummhumm11 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
hummhumm11 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
YMWM_12 小时前
第一章 Go语言简介
开发语言·后端·golang
hummhumm13 小时前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
_半夏曲13 小时前
node.js、nginx、iis、tomcat针对部署方面的简述
nginx·node.js·tomcat
好奇的菜鸟13 小时前
Go语言中的引用类型:指针与传递机制
开发语言·后端·golang
Alive~o.013 小时前
Go语言进阶&依赖管理
开发语言·后端·golang
ifanatic18 小时前
[面试]-golang基础面试题总结
面试·职场和发展·golang