nginx && 定向本地静态资源 && 反代 golang 服务

前提

这几天在公司的局域网服务器上申请了一个服务器, 准备没事整点自己没接触过的东西玩玩, 比如 nginx 等等

开始折腾

申请到的服务器系统版本

1
2
cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

安装 nginx
  1. 添加CentOS 7 nginx yum资源库,打开终端,使用以下命令:

    1
    sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
  2. 使用 yum 命令从 nginx 源服务器中获取来安装 nginx:

    1
    sudo yum install -y nginx
  3. 启动 Nginx

    1
    sudo systemctl start nginx.service
  4. 现在基本上就可以通过IP地址 访问 nginx 的默认页面了
    比如我的ip 是192.168.9.251
    这个时候我在浏览器输入我的 ip, 就可以看到 nginx 的默认页面了

看到这个就代表nginx装好了

期间遇见的一个问题

启动服务器以后, 访问网页显示无法打开,去查了下发现是因为80端口没有开放.
首先:开启 web 端口
firewall-cmd –zone=public –add-port=80/tcp –permanent
然后重启 firewall
firewall-cmd –reload
搞定

nginx 的一些基本命令和配置
  • 默认的服务器 html 存放根目录是/usr/share/nginx/html.
    可以 cd 到这个目录中去看到一些基础的 html, 比如 404.html, 和 index.html
    可以把自己的网页放进这里面

  • 默认的服务器模块配置文件位于
    /etc/nginx/conf.d/default.conf.

  • nginx总的配置文件位于
    /etc/nginx/nginx.conf.

可以看到最后 那句 include 就是把我们刚才配的 /etc/nginx/conf.d/default.conf 引入进来

  • nginx 重新加载配置文件

    1
    nginx -s reload
  • nginx 关闭服务
    nginx -s stop

启动 go 服务

我在本机 使用 echo 写了一个简单的 http server
比较关键的几个代码如下

1
2
3
4
5
s := &http.Server{
Addr: ":1323",
ReadTimeout: 20 * time.Minute,
WriteTimeout: 20 * time.Minute,
}

这里是声明我这个服务 listen 1323端口.

这里是我声明了1个path group, 以 /me 打头

1
2
3
4
me := e.Group("/me")
me.GET("/ping", func(c echo.Context) error {
return c.String(200, "Pong")
})

当别人访问 /me/ping 的时候 我会返回 1个Pong 的 response.

ok 代码很简单.
如果本机跑的话 直接go build -> ./main 或者go run main.go 就ok
但是因为我要部署到服务器centos系统上, 我本机是mac, 所以需要一些特殊操作, go 可以很轻松的支持这种跨平台编译

1
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

这样就会生成1个可以在 centos 下 跑起来的二进制文件
通过 scp 命令 把该文件传到 我的服务器的某个路径上
运行该文件

1
./usr/share/go/main &

这样我的服务器上就已经成功跑起来该服务了
访问 http://192.168.9.251:1323/me/ping
可以收到 1个 pong 的 response.
前提依然是你的防火墙已经打开了 1323的端口

反向代理

我们先看看 正向代理 和 反向代理的 一些概念

正向代理的概念

正向代理,也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。** 结论就是,正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

反向代理的概念

用户访问 http://www.test.com/readme ,但 www.test.com 上并不存在readme页面,他是偷偷从另外一台服务器上取回来,然后作为自己的内容返回用户,但用户并不知情。这里所提到的 www.test.com 这个域名对应的服务器就设置了反向代理功能。
结论就是,反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

我的需求

我服务器本身是不希望打开过多的端口, 希望外部访问这台机器的时候, 只通过80端口来接受 http 请求, 并且根据相应的规则分发到不同的端口
比如 http://192.168.9.251/me/ping
这样就可以 收到 pong 的 回应, 而不用 加上 :1323 的端口
nginx 实现这个需求非常简单
只需要 在 /etc/nginx/conf.d/default.conf 加入这个规则就好

1
2
3
4
5
6
location /me {
proxy_pass http://127.0.0.1:1323;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

这样就是说 凡是 /me 的请求 都分发到本机的1323端口上
改完conf 之后, 执行 nginx -s reload
再次访问 http://192.168.9.251/me/ping
就能收到 我们来自 1323端口 go服务的 pong 的回应了

Share Comments