LNCG简明Web服务搭建方案
基于 Go 的 Web 服务解决方案
类似 LAMP (Linux + Apache + MySQL + PHP),LNCG 也是一套 Web 服务开发与部署解决方案的尝试:
- 𝓛 : 服务器选择 Linux 操作系统
- 𝓝 : 对外提供的 Http/Https 服务使用 Nginx
- 𝓒 : 使用云(e.g. Qiniu) + 本地(e.g. MySQL/Redis) 的方式存储数据
- 𝓖 : 使用 Go (e.g. Beego 框架) 开发业务逻辑,并负责与数据的交互
本文暂不涉及具体业务细节,重点在记述以 Beego 框架搭建了独立的 Http Server 以后,如何配置 Nginx 代理对外提供服务。
① 业务:Beego 搭建框架
Beego 是一个典型的 MVC 架构,其主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,再结合 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个 RESTful 框架,可以用来快速开发 API、Web 及后端服务等各种应用。具体开发方式参见其官方文档,这里不做介绍。
首先安装 beego 和 bee 开发工具:
$ go get -u -v github.com/astaxie/beego
$ go get -u -v github.com/beego/bee
构建框架代码并启动 http server:
$ bee new hello-world
$ cd hello-world
$ bee run hello-world
浏览器中看一下 http://127.0.0.1:8080 ,你的 server 已经运行了。
② 存储: 云 + 本地
作为一个网站,存储是必须要考虑的。目前笔者考虑 云 + 本地 的混合存储方案:
因为笔者的 vps 硬盘和内存都受限,不得不考虑把数据存储到云端,并通过 API 方式从云端拉取数据。
(1) 对于大规模的数据
数据存储在云端(需着重考虑安全性问题),通过API Put/Get 数据。考虑到我们想用 Go 作为主要开发语言,这里选择对 Go 支持良好的国内云服务厂商 七牛云存储:
$ go get -u -v qiniupkg.com/api.v7
(2) 对于读取速度要求不是很强的中等规模的数据
采用 MySQL 本地存储:
$ go get -u -v github.com/go-sql-driver/mysql
(3) 对于读取速度约束很强的小规模数据
采用 Redis 在内存中存储
$ go get -u -v gopkg.in/redis.v3
③ 服务:Nginx 部署代理
Go 本身虽然可以提供独立的 http 服务,但从成熟性与安全性上说,nginx 可以帮我们做很多工作,例如访问日志,cc 攻击,静态服务等等。
(1) 获取 nginx 源码并编译
$ hg clone http://hg.nginx.org/nginx
更新时在 nginx 源码目录执行如下命令即可
$ hg pull && hg update
(2) 撰写 Buildfile
all install:
./auto/configure --user=www --group=www --prefix=${HOME}/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module
make
make install
clean:
make clean
这里之所以是 Buildfile 而不是 Makefile 是因为 configure 的时候会生成用于真正编译的 Makefile
(3) 编译并安装
$ cd nginx && make -f Buildfile
注意这里 make 出错时按照它的提示安装相应的确实包即可
(4) 配置 nginx 代理
http {
...
...
server {
listen 80;
server_name xzturn;
charset utf-8;
access_log off;
location /(css|js|fonts|img)/ {
access_log off;
expires 1d;
try_files $uri @backend;
}
location / {
try_files /_not_exists_ @backend;
}
location @backend {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8080;
}
...
}
...
(5) 链接 css/js/font/img 等网页相关配置与资源
$ cd $HOME/nginx/html
$ ln -sf path_to_your_beego_project/static/css
$ ln -sf path_to_your_beego_project/static/js
$ ln -sf path_to_your_beego_project/static/font
$ ln -sf path_to_your_beego_project/static/img
由于你的网页开发也是在 go 框架中运行的,这些静态资源都存在 go 的开发目录下,nginx 代理的时候,需要在当前 html 路径下找到这些资源,所以需要做一下这些链接
(6) 启动 nginx
$ sudo $HOME/nginx/sbin/nginx -c $HOME/nginx/conf/nginx.conf
再打开浏览器输入 http://127.0.0.1 , 你将看到通过 nginx 代理提供的 go 服务了。
至此,整个框架就搭建完成了,下面你就可以专注你自己的业务逻辑了。