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

文章目录

  • 学习笔记-Nginx
    • 0. Nginx介绍
    • 1. Nginx下载安装
    • 2. 启动web服务和Nginx配置
      • 2.1 启动服务
      • 2.2 Nginx配置
    • 3. 测试
    • 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端口。

package mainimport ("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
  1. 在打开的编辑器中,输入以下内容:
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/
  1. 重启Nginx:
sudo nginx -s reload

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

3. 测试

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

4. 扩展

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

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配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/57069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode算法(双指针)

今天的题目主要都是力扣前100中,关于双指针的题 1.移动零 链接:移动零 示例: 示例 : 输入: nums [0,1,0,3,12] 输出:[1,3,12,0,0] 可以看到保持原有元素的顺序,将所有的0,移动到数组最后方即可。 这…

【论文写作】10.26 讨论

本次讨论主要是对方向的修正,以及一些科研素养的补足 一、关于方向 方案 波分离开了,可以分别喂给不同的网络,最后将不同的结果融合。观察结果,获得直观的估计,猜测可能的优化方案。 对于第二点的解释,在…

开源项目工具:LeanTween - 为Unity 3D打造的高效缓动引擎详解(比较麻烦的API版)

1.LeanTween.reset() 一、工具介绍 参考:推荐开源项目:LeanTween - 为Unity 3D打造的高效缓动引擎-CSDN博客 LeanTween是一个专为Unity 3D引擎设计的高效缓动(tweening)库,它提供了简单易用的API,帮助开…

ctfshow(175->178)--SQL注入--联合注入及其过滤

Web175 进入界面: 审计: 查询语句: $sql "select username,password from ctfshow_user5 where username !flag and id ".$_GET[id]." limit 1;";返回逻辑: if(!preg_match(/[\x00-\x7f]/i, json_enc…

数据结构(8.4_3)——堆的插入删除

在堆中插入新元素 在堆中删除元素 总结:

Linux:权限的深度解析(小白必看!!!)

文章目录 前言一、Linux重要的几个热键二、关机三、扩展命令总结四、shell命令以及运行原理感性理解五、Linux权限的概念1. 权限的概念2. 认识人(用户)1)创建人2)人分类3)人切换4)指令提权 3. ll下文件的权…

《学会提问》

只要他们使说出口的话听起来显得信誓旦旦,你就极有可能会相信他们的说法 我们倾听他们,是为了构建出自己的答案,而不是听了他们的话以后,马上就按他们说的去做,就好像自己是只无助的羔羊,或者是个牵线的木…

一些待机电流波形特征

一、待机电流波形 最干净的待机电流波形应该只有paging,不过需要注意2点: 每个paging的间隔,不同网络可能不一样,有可能是320ms, 640ms 待机网络 paging 间隔 1分钟的耗电量 单个耗电量 单个待机电流 单个波形时长 4G 64…

二十三、Python基础语法(包)

包(package):包是一种组织代码的方式,可以将相关的模块组合在一起,以便更好地管理和重用代码,包的目录中有一个特殊代码文件__init__.py,包的命名也要遵循标识符的规则。 一、包的结构 一个 Python 包通常是一个包含…

NLTK无法下载?

以下内容仅为当前认识,可能有不足之处,欢迎讨论! 文章目录 nltk无法下载怎么办?什么是NLTK?为什么要用NLTK?如何下载? nltk无法下载怎么办? 什么是NLTK? NLTK是学习自然…

python项目实战——多协程下载美女图片

协程 文章目录 协程协程的优劣势什么是IO密集型任务特点示例与 CPU 密集型任务的对比处理 I/O 密集型任务的方式总结 创建并使用协程asyncio模块 创建协程函数运行协程函数asyncio.run(main())aiohttp模块调用aiohttp模块步骤 aiofiles————协程异步函数遇到的问题一 await …

代码随想录跟练21天——LeetCode332.重新安排行程, 51. N皇后,37. 解数独

332.重新安排行程 力扣题目链接(opens new window) 给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出…

3、java if流程控制、while循环语句

目录 选择流程控制语句循环流程控制语句控制循环语句顺序结构If语句Switch语句For循环While循环Do-While循环控制跳转语句1. 选择流程控制语句 引入话题 想象一下,你正在过马路,你需要先检查是否有车辆经过。如果没有车辆,你才会过马路。这种先判断条件再执行动作的过程,…

【Python可视化系列】一文教你绘制双Y轴的双折线图(案例+源码)

这是我的第369篇原创文章。 一、引言 在日常工作和学习中,我们会遇到将两个折线画在一张图上的情况,且这两个折线代表了两个特征,具有不同的涵义和量纲表示,这时候我们就需要绘制一个双Y轴折线图,一边代表一个特征&…

Redis 持久化 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 持久化 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 持久化 & 总结》(学习总结/最新最准/持续更新)《Redis & …

GraphQL语法入门

目录 一、介绍GraphQL二、GraphQL基本使用方法三、Schema 定义语言 (SDL)3.1 类型定义1)对象类型2)标量类型3)枚举类型4)输入类型5)列表类型6)非空类型7)接口类型8)联合类型 3.2 查询…

python进阶集锦

一、迭代器和生成器 区别 关于迭代器和生成器 迭代器与生成器的区别 迭代器(Iterator)和生成器(Generator)是Python中处理序列数据的两种不同概念。迭代器是遵循迭代协议的对象,而生成器是一种特殊类型的迭代器&am…

软考:中间件

中间件 中间件是一类位于操作系统软件与用户应用软件之间的计算机软件,它包括一组服务,以便于运行在一台或多台机器上的多个软件通过网络进行交互。 中间件的主要功能包括通信支持和应用支持。 通信支持为应用软件提供平台化的运行环境,屏蔽…

分布式并发场景的核心问题与解决方案

文章目录 分布式并发场景的核心问题与解决方案一、核心问题分析1. 分布式事务问题2. 数据一致性问题3. 并发控制问题4. 分布式锁失效问题 二、解决方案1. 分布式事务解决方案1.1 可靠消息最终一致性方案1.2 TCC方案实现 2. 缓存一致性解决方案2.1 延迟双删策略2.2 Canal方案 3.…

Vue学习笔记(八)

透传attribute "透传attribute"指的是传递给一个组件,却没有被改组件声明为props或emits的attribute或者v-on事件监听器。最常见的例子就是class、style和id。 当一个组件以单个元素为根作渲染时,透传的attribute会自动被添加到根元素上。 …