对于简单的项目,通常我们只需要将编译后的二进制文件拷贝到服务器上,然后设置为后台守护进程运行即可。
本文以项目:https://github.com/johncxf/go_practice 为例
编译为 linux 系统可执行的二进制文件,二进制文件为 ./bin/go-api
,可自行修改
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./bin/go-api
可以使用 -ldflags "-s -w"
参数去掉符号表和调试信息,可以压缩二进制文件大小
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" -o ./bin/go-api
大小对比:
$ ll ./bin
total 92168
-rwxr-xr-x 1 chen staff 27M 1 16 22:03 go-api
-rwxr-xr-x 1 chen staff 18M 1 16 22:53 go-api-1
在服务器新建一个目录,用来存放该项目:
$ mkdir /www/wwwroot/go-project & cd /www/wwwroot/go-project
上传编辑的二进制文件到对应项目目录下,并将静态资源文件、配置文件等项目依赖的文件同时上传
.
├─ bin
| ├─ go-api
├─ config
| └─ env.yml
# 在项目根目录下
$ ./bin/go-api config/env.yml
直接启动可以键盘 control + c 直接退出即可
这里使用nohup
进行启动,也可以使用其他进程管理工具进行启动(如:supervisor)
$ sudo nohup ./bin/go-api config/env.yml > nohup_go-api.log 2>&1 &
# 执行后控制台会输出进程号
[1] 19935
./bin/go-api config/env.yml
:是我们应用程序的启动命令nohup ... &
表示在后台不挂断的执行上述应用程序的启动命令> nohup_api-admin.log
表示将命令的标准输出重定向到 nohup_api-adminlog 文件2>&1
表示将标准错误输出也重定向到标准输出中,结合上一条就是把执行命令的输出都定向到 nohup_api-admin.log 文件后台启动找到对应进程,直接 kill 即可
$ ps -ef | grep go-api
[root@VM-0-11-centos go-project]# ps -ef | grep go-api
root 19935 32326 0 22:47 pts/0 00:00:00 sudo nohup ./bin/go-api config/env.yml
root 19936 19935 0 22:47 pts/0 00:00:00 ./bin/go-api config/env.yml
root 28488 32326 0 23:12 pts/0 00:00:00 grep --color=auto go-api
$ kill -9 19936
其他指令:
# 查看所有后台进程
$ jobs -l
腾讯云或者阿里云等服务器都需要开放对于的端口,才能进行访问。
以腾讯云为例,在控制台设置对于服务器的安全组规则,在安全组中添加一条对应端口开放的规则即可,实际操作可以参考对应服务器服务商提供的文档。
访问:http://服务器公网ip:端口/uri
即可使用
如果需要通过域名访问,则需要搭配 nginx 来使用。
在需要静态文件分离、需要配置多个域名及证书、需要自建负载均衡层等稍复杂的场景下,我们一般需要搭配第三方的web服务器(Nginx、Apache)来部署我们的程序。
首先需要安装 nginx,nginx 安装教程这里不再赘述。
这里简单介绍通过 nginx 做反向代理,实现通过域名访问Go应用的示例。
修改 nginx 配置,配置反向代理即可:
...
http {
...
server {
# 端口
listen 80;
# 域名
server_name api.yiqiesuifeng.cn;
access_log /var/log/api-access.log;
error_log /var/log/api-error.log;
# 静态文件请求
location ~ .*\.(gif|jpg|jpeg|png|js|css|eot|ttf|woff|svg|otf)$ {
access_log off;
expires 1d;
root /www/wwwroot/go-project;
}
# index.html页面请求
location / {
root /www/wwwroot/go-project;
index index.html;
try_files $uri $uri/ /index.html;
}
# API 请求
location /api {
# 代理到go服务
proxy_pass http://127.0.0.1:8088;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
修改 ngxin 配置后重新 nginx 即可。