Linux安装Go并部署到web
下载Golang
可以去官网看看,然后把链接复制一下,用wget下载
我刚发现Go官网打不开,可以先去这里看看,然后改一下版本号。
wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
安装Golang
#解压
tar -zxvf go1.14.2.linux-amd64.tar.gz
#移动到/usr/local
mv go /usr/local
#切换目录
cd /usr/local/go
添加环境变量
echo "GOROOT=/usr/local/go" >> /etc/environment
#文件生效
source /etc/environment
#这个不用加好像可以
echo "PATH=$PATH:$GOROOT/bin" >> /etc/environment
#文件生效
source /etc/environment
创建工作空间
#创建工作空间
cd $HOME
mkdir -p go/src go/bin go/pkg
添加“工作空间”的环境变量
echo "GOPATH=$HOME/go" >> /etc/environment
#文件生效
source /etc/environment
其中,
- bin:编译后可的执行文件的存放路径
- pkg:编译包时,生成的.a文件的存放路径
- src:源码路径,一般我们的工程就创建在src下面。
第一个Go程序
#创建工程目录
mkdir $HOME/go/src/hello
cd $HOME/go/src/hello
#创建一个go文件
vim hello.go
内容如下
package main
import "fmt"
func main() {
fmt.Printf("hello world\n")
}
编译go
#编译go文件
go build
生成文件的名字,就是工程(上级目录)的名字
运行
./hello
即可看见输出
访问mysql数据库
#下载驱动包
go get github.com/go-sql-driver/mysql
编写all.go访问数据库
//all.go
package main
import (
"fmt"
"net/http"
"log"
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func all(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w,"<p>这个是nginx+Golang实现的页面</p>")
//链接数据库
db, err := sql.Open("mysql", "root:root@/database")
if err != nil {
log.Fatal(err)
}
defer db.Close()
//查询
rows, err := db.Query("SELECT * FROM book")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
//建立表头
fmt.Fprintf(w,"<table border='1'><tr>")
fmt.Fprintf(w,"<th>书号</th>")
fmt.Fprintf(w,"<th>书名</th>")
fmt.Fprintf(w,"<th>作者</th>")
fmt.Fprintf(w,"<th>出版社</th>")
fmt.Fprintf(w,"<th>价格</th>")
fmt.Fprintf(w,"</tr>")
//遍历结果集
for rows.Next() {
var name int
var title string
var author string
var publisher string
var price float64
if err := rows.Scan(&name,&title,&author,&publisher,&price); err != nil {
log.Fatal(err)
}
fmt.Fprintf(w,"<tr>")
fmt.Fprintf(w,"<td>%d</td>",name)
fmt.Fprintf(w,"<td>%s</td>",title)
fmt.Fprintf(w,"<td>%s</td>",author)
fmt.Fprintf(w,"<td>%s</td>",publisher)
fmt.Fprintf(w,"<td>%.2f</td>",price)
fmt.Fprintf(w,"</tr>")
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}
}
func main() {
//设置访问的路由
http.HandleFunc("/all.go",all)
//设置监听的端口
err := http.ListenAndServe(":9001", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
注:go的浮点数为float32或float64
设置后台运行go程序
在运行的时候可以在后面添加&,设置为后台运行
如,我的工程名是book
./book&
即可让其进入后台运行
jobs -l 可以查看后台运行的程序
fg %n 可以唤回后台进行至前台,其中n为后台工作号
如图,可见go程序正在监听9001端口
浏览器访问ip/all.go
部署到nginx
利nginx的方向代理
修改nginx.conf配置文件
添加如下配置
location ~ \.go$ {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:9001;
}
使用nginx的反向代理,当用户访问.go文件的时候,跳转到访问到go监听的端口
nginx -s reload
浏览器访问ip:nginx监听的端口/all.go
注1:需要先启动go程序,让其监听9001端口
注2:nginx反向代理的时候,相当于访问http://127.0.0.1:9001/all.go,这时相当于把url传递给了go处理,这是需要注意HandleFunc监听的url pattern。