分享

Go Web 与 Nginx 集成

 F2967527 2023-06-06 发布于北京

概述

Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,尤其擅长处理静态资源(html、js、css、image)。

Go 是一个独立的 HTTP 服务器,当 Go Web 服务器 与 Nginx 服务器集成时, nginx 可以提供其它功能服务,例如访问日志,cc 攻击,静态服务等,Go 只要专注于业务逻辑和功能就好,通过集成 nginx 配置代理就可以实现多应用同时部署。

Nginx 处理静态页面,Go Web 处理路由服务

前端静态网页通过 Nginx 服务器代理访问 Go Web 服务器接口,实现 Web 前后端分离,前后端解耦。
示例代码如下:
Go 服务器:
/goweb/src/nginx/MyServer.go

go
复制代码
package main import ( "fmt" "log" "net/http" ) func login(w http.ResponseWriter, r *http.Request) { r.ParseForm() username := r.Form["username"][0] password := r.Form["password"][0] if username == "john" && password == "4321" { fmt.Fprintf(w, "success") } else { fmt.Fprintf(w, "failed") } } func main() { http.HandleFunc("/mylogin", login) fmt.Println("服务器已经启动,请在浏览器地址栏中输入 http://localhost:8900") // 启动 HTTP 服务,并监听端口号 err := http.ListenAndServe(":8900", nil) if err != nil { log.Fatal("ListenAndServe:", err) } }

客户端:
login.html

xml
复制代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <form action="/mylogin" method="post"> <p>用户名:<input type="text" name="username" /></p> <p>密 码:<input type="password" name="password" /></p> <p><input type="submit" value="登录" /></p> </form> </body> </html>

把 login.html 静态文件放到 Nginx 服务器的 www 目录下。

Nginx 服务器配置:
nginx.conf

在 nginx.conf 文件里的 花括号里的 里添加如下配置:http {}server {}

arduino
复制代码
location /mylogin { proxy_pass http://127.0.0.1:8900; }

配置完成后,启动 Go 服务器 和 启动 Nginx 服务器,然后通过网址访问 Nginx 服务器下的静态登录页面(例如:),尝试登录操作。http://localhost:8080/login.html

本示例原理是:登录页面 通过 Nginx 服务器代理访问 Go 服务接口,实现登录功能。

注意:
本示例可以通过添加前缀实现支持多个路由的 Go Web 服务器集成。只需做如下部分改动:

Go 服务器:
/goweb/src/nginx/MyServer.go

csharp
复制代码
... func main() { http.HandleFunc("/service/mylogin", login) ...

客户端:
login.html

ini
复制代码
.. <body> <form action="/service/mylogin" method="post"> ..

Nginx 服务器配置:
nginx.conf

erlang
复制代码
... location /service { proxy_pass http://127.0.0.1:8900; } ...

使用 AJAX 提交数据

客户端除了使用 form 表单通过 Nginx 代理向 Go 服务器提交数据外,还可以使用 ajax 提交数据。
示例代码如下:
Go 服务器:
/goweb/src/nginx/MyServer.go

go
复制代码
package main import ( "fmt" "log" "net/http" ) func login(w http.ResponseWriter, r *http.Request) { r.ParseForm() username := r.Form["username"][0] password := r.Form["password"][0] if username == "john" && password == "4321" { fmt.Fprintf(w, "success") } else { fmt.Fprintf(w, "failed") } } func main() { http.HandleFunc("/service/login", login) fmt.Println("服务器已经启动,请在浏览器地址栏中输入 http://localhost:8900") // 启动 HTTP 服务,并监听端口号 err := http.ListenAndServe(":8900", nil) if err != nil { log.Fatal("ListenAndServe:", err) } }

客户端:
ajaxlogin.html

xml
复制代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> <script src="https://code./jquery-3.4.1.min.js"></script> </head> <body> <p>用户名:<input type="text" id="username" /></p> <p>密 码:<input type="password" id="password" /></p> <p><input type="submit" value="登录" onclick="login()" /></p> <script type="text/javascript"> function login() { $.post('/service/login', { username: $("#username").val(), password: $("#password").val() }, function (data, status) { alert('登录是否成功:' + data) }) } </script> </body> </html>

Nginx 服务器配置:
nginx.conf

erlang
复制代码
... location /service { proxy_pass http://127.0.0.1:8900; } ...

启动 Go 服务器 和 启动 Nginx 服务器,然后通过网址访问 Nginx 服务器下的静态登录页面(例如:),尝试登录操作。http://localhost:8080/ajaxlogin.html

用 AJAX 设置页面中动态的部分

go web 除了使用模板(template)来展示网页的动态内容外,还可以通过 AJAX 获取需要显示的内容并展示出来。
示例代码如下:
Go 服务器:
/goweb/src/nginx/MyServer.go

go
复制代码
package main import ( "fmt" "log" "net/http" ) func login(w http.ResponseWriter, r *http.Request) { r.ParseForm() username := r.Form["username"][0] password := r.Form["password"][0] if username == "john" && password == "4321" { fmt.Fprintf(w, "success") } else { fmt.Fprintf(w, "failed") } } // 用 AJAX 设置页面中的动态部分 func data(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, `{"user":"用户名", "pw":"密 码"}`) } func main() { http.HandleFunc("/service/login", login) http.HandleFunc("/service/data", data) fmt.Println("服务器已经启动,请在浏览器地址栏中输入 http://localhost:8900") // 启动 HTTP 服务,并监听端口号 err := http.ListenAndServe(":8900", nil) if err != nil { log.Fatal("ListenAndServe:", err) } }

客户端:
ajaxlogin.html

xml
复制代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> <script src="https://code./jquery-3.4.1.min.js"></script> </head> <body onload="onload()"> <p><label id="us"></label>:<input type="text" id="username" /></p> <p><label id="pw"></label>:<input type="password" id="password" /></p> <p><input type="submit" value="登录" onclick="login()" /></p> <script type="text/javascript"> function login() { $.post('/service/login', { username: $("#username").val(), password: $("#password").val() }, function (data, status) { alert('登录是否成功:' + data) }) } function onload() { $.post("service/data", function (data, status) { var obj = JSON.parse(data) $("#us").text(obj.user) $("#pw").text(obj.pw) }) } </script> </body> </html>

启动 Go 服务器 和 启动 Nginx 服务器,然后访问页面查看是否能正常显示登录页面。

实现部分动态的页面

可以通过使用 go web 模板(template)来实现部分网页的组件元素在服务器生成,然后通过客户端网页 iframe 嵌套的方式渲染页面,最终实现部分动态的页面。

Go 服务器:
/goweb/src/nginx/MyServer.go

go
复制代码
package main import ( "fmt" "html/template" "log" "net/http" ) func login(w http.ResponseWriter, r *http.Request) { r.ParseForm() username := r.Form["username"][0] password := r.Form["password"][0] if username == "john" && password == "4321" { fmt.Fprintf(w, "success") } else { fmt.Fprintf(w, "failed") } } // 用 AJAX 设置页面中的动态部分 func data(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, `{"user":"用户名", "pw":"密 码"}`) } // 实现部分动态的页面 func showLoginPage(w http.ResponseWriter, r *http.Request) { w.Header().Set("content-type", "text/html;charset=utf-8"); t,err := template.ParseFiles("./src/nginx/login.tpl") if err != nil { fmt.Println(err) } type Data struct { User string PW string } data := Data{"用户名", "密码"} t.Execute(w,data) } func main() { http.HandleFunc("/service/login", login) http.HandleFunc("/service/data", data) http.HandleFunc("/service/showLoginPage", showLoginPage) fmt.Println("服务器已经启动,请在浏览器地址栏中输入 http://localhost:8900") // 启动 HTTP 服务,并监听端口号 err := http.ListenAndServe(":8900", nil) if err != nil { log.Fatal("ListenAndServe:", err) } }

Go 模版:
/goweb/src/nginx/login.tpl

xml
复制代码
<form action="/service/login" method="post"> <p>{{ .User }}:<input type="text" name="username" /></p> <p>{{ .PW }}:<input type="password" name="password" /></p> <p><input type="submit" value="登录" /></p> </form>

客户端:
login.html

xml
复制代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <p>静态部分</p> <p>以下是 iframe 动态模版部分:</p> <iframe src="/service/showLoginPage" frameborder="0"></iframe> </body> </html>

启动 Go 服务器 和 启动 Nginx 服务器,然后访问页面查看是否能正常显示登录页面,登录功能是否正常。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多