使用SSH客户端(如SecureCRT)远程连接Linux操作系统,使用编程语言Golang搭建网页运行环境,并实现从MySQL中读取学生学号和姓名信息到页面中显示。
要求分别在本地和云端操作成功,云端的网页能被外网访问。
本地操作系统:Windows 10
本地虚拟机运行平台:VMware Workstation Pro 14
本地虚拟机镜像:CentOS-7-x86_64-Minimal-1908.iso
云服务器提供商:阿里云计算有限公司
Linux发行版本及版本号:CentOS 7.6 64位
SecureCRT
本人安装的是go 1.14.2版本,其他版本的安装和配置可能有所变化。
详见博客《Linux实验:MySQL的安装和配置》。
wget –c https://dl.google.com/go/go1.14.2.linux-amd64.tar.g
# 解压到/usr/local/文件夹下
tar -zxvf go1.14.2.linux-amd64.tar.gz -C /usr/local/
# 在当前目录下创建一个go目录,go目录下有src、bin和pkg三个子目录
mkdir -p go/src go/bin go/pkg
# 修改涉及Linux环境变量的/etc/profile文件
vi /etc/profile
# 按下i键进入编辑模式,添加以下内容:
export GOROOT=/usr/local/go # 设置Golang的安装路径
export GOPATH=$HOME/go # 设置Golang的工作目录路径
export PATH=$PATH:$GOROOT/bin # 添加到系统变量
# 按下esc键退出编辑模式
# 保存并退出文件
:wq
# 使配置生效
source /etc/profile
# 查看Golang环境配置信息
go env
# 查看Golang语言版本
go version
# 网页文件要放在Golang工作目录下的src文件夹中
vi go/src/MyGolang.go
# 按下i键进入编辑模式,添加以下内容:
package main
import (
"fmt"
"net/http"
"strings"
"log"
)
func sayHello(w http.ResponseWriter, r *http.Request) {
r.ParseForm() // 解析参数,默认是不会解析的
fmt.Println(r.Form) // 这些信息是输出到服务器端的打印信息
fmt.Println("path", r.URL.Path)
fmt.Println("scheme", r.URL.Scheme)
fmt.Println(r.Form["url_long"])
for k, v := range r.Form {
fmt.Println("key:", k)
fmt.Println("val:", strings.Join(v, ""))
}
fmt.Fprintf(w, "Hello Golang!") // 这个写入到w的是输出到客户端的
}
func main() {
http.HandleFunc("/MyGolang.go", sayHello) // 设置访问的路由
err := http.ListenAndServe(":9090", nil) // 设置监听的端口为9090
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
# 按下esc键退出编辑模式
# 保存并退出文件
:wq
Golang语法参考《从0开始Go语言,用Golang搭建网站》。
# 重启防火墙,以保证防火墙一定是开启的
systemctl restart firewalld
# 在防火墙添加端口9090且设置永久开启
firewall-cmd --zone=public --add-port=9090/tcp --permanent
# 重新加载防火墙,使上一步操作生效
firewall-cmd --reload
# 查看9090端口是否开放
firewall-cmd --zone=public --query-port=9090/tcp
如果是Linux云服务器,则还要在阿里云服务器控制台增加端口为9090的安全组规则,才能保证Golang网页能被访问,结果如下图所示。具体操作请参考博客《Linux脚本编程:sudo命令下安装ssh服务并自定义端口和允许root登陆》中代码实现部分的注意事项。
# 重启防火墙,以保证防火墙一定是开启的
systemctl restart firewalld
# 在防火墙添加服务http且设置永久开启
firewall-cmd --zone=public --add-service=http --permanent
# 重新加载防火墙,使上一步操作生效
firewall-cmd --reload
# 查看http服务是否开放
firewall-cmd --query-service http
此步是为了让Linux云服务器IP能被外网访问。
# 切换到Golang网页文件所在目录
cd go/src/
# 编译生成可执行文件
go build MyGolang.go
# 运行可执行文件,&表示后台运行,不加的话ctrl+c退出当前命令后网页将不能访问
./MyGolang &
# 在浏览器输入IP:9090/MyGolang.go查看网页是否正常显示
# 查看后台运行程序
jobs
# 找到正在运行的Golang网页的进程号,将其调到前台
fg 后台进程号
# 停止运行
ctrl+c
# 下载前确保Linux上已安装Git,如果没有安装则执行以下命令
yum –y install git
# 下载时间可能较长
go get github.com/go-sql-driver/mysql
此步本人曾因下载响应慢,于是根据网友的做法换成国内代理。但不知为什么,使用国内代理无法完整获得该驱动包,最终还是换了回来,耐心等待下载。具体的原因暂未找到,欢迎知情的朋友到评论区讨论!
# 网页文件要放在Golang工作目录下的src文件夹中
vi go/src/MyGolang.go
# 按下i键进入编辑模式,输入以下内容实现题目要求:
package main
import (
"fmt"
"net/http"
"log"
"database/sql"
_"github.com/go-sql-driver/mysql"
)
func readDB(w http.ResponseWriter, r *http.Request) {
// 连接数据库
// DSN数据源字符串:用户名:密码@协议(地址:端口)/数据库名?参数=参数值
db, err := sql.Open("mysql", "用户名:密码@tcp(localhost:3306)/数据库名?charset=utf8");
defer db.Close()
if err != nil{
fmt.Println("连接数据库失败!", err)
return
}
rows, err := db.Query("SELECT * FROM 数据表名")
if err != nil {
fmt.Println("查询数据库失败!", err)
return
}
// 遍历结果集
for rows.Next() {
var id string
var name string
err := rows.Scan(&id,&name)
if err != nil {
fmt.Println("读取数据库失败!", err)
return
}
fmt.Fprintf(w, "学号: %s - 姓名: %s", id , name)
}
}
func main() {
http.HandleFunc("/MyGolang.go", readDB) // 设置访问的路由
err := http.ListenAndServe(":9090", nil) // 设置监听的端口为9090
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
# 按下esc键退出编辑模式
# 保存并退出文件
:wq
Golang连接MySQL语法参考《Go连接MySQL数据库》。
# 切换到Golang网页文件所在目录
cd go/src/
# 编译生成可执行文件
go build MyGolang.go
# 运行可执行文件,&表示后台运行,不加的话ctrl+c退出当前命令后网页将不能访问
nohup ./MyGolang &
# 在浏览器输入IP:9090/MyGolang.go查看网页是否正常显示
nohup 是 no hang up 的缩写,就是不挂断的意思,使用该命令是为了解决断开SSH连接后网页不能访问的问题。参考《nohup》。
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!