文章目录
- 学习笔记-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
。
-
在
/etc/nginx/sites-available/
目录下创建一个新的配置文件:sudo nano /etc/nginx/sites-available/my_app.conf
-
在打开的编辑器中,输入以下内容:
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;
}
}
-
保存并退出编辑器。
-
启用刚刚创建的配置文件:
sudo ln -s /etc/nginx/sites-available/my_app.conf /etc/nginx/sites-enabled/
-
重启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配置