22f10c7104c1b0b6b79f436422cbc3d3
gin框架构架Api:基于Nginx和Supervisor的部署方案

目录

nginx简介

Nginx 是一个自由、开源、高性能及轻量级的 HTTP 服务器和反向代理服务器,它有很多功能,主要功能为:

  • 正向代理
  • 反向代理
  • 负载均衡
  • HTTP 服务器(包含动静分离)

Nginx 反向代理功能

Nginx 最常用的功能之一是作为一个反向代理服务器。反向代理(Reverse Proxy)是指以代理服务器来接收 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器(摘自百度百科)。

为什么需要反向代理呢?在实际的生产环境中,服务部署的网络(内网)跟外部网络(外网)通常是不通的,需要通过一台既能够访问内网又能够访问外网的服务器来做中转,这种服务器就是反向代理服务器。Nginx 作为反向代理服务器,简单的配置如下:

server {                     
        listen      80;           
        server_name  ginserver.com;    
        client_max_body_size 1024M;

        location / {             
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass  http://127.0.0.1:8080/;
            client_max_body_size 100m;
        }                        
    }

Nginx 在做反向代理服务器时,能够根据不同的配置规则转发到后端不同的服务器上。

Nginx 负载均衡功能

Nginx 另一个常用的功能是负载均衡,所谓的负载均衡就是指当 Nginx 收到一个 HTTP 请求后,会根据负载策略将请求转发到不同的后端服务器上。比如,ginserver 部署在两台服务器 A 和 B 上,当请求到达 Nginx 后,Nginx 会根据 A 和 B 服务器上的负载情况,将请求转发到负载较小的那台服务器上。这里要求 ginerver 是无状态的服务。

安装和启动 Nginx

  • 切换到root用户
  • 安装 Nginx(CentOS 7.x 安装流程)
$ yum -y install nginx
  • 确认 Nginx 安装成功
$ nginx -v
  • 启动 Nginx
$ systemctl start nginx
  • 设置开机启动
$ systemctl enable nginx
  • 查看 Nginx 启动状态
$ systemctl status nginx

Nginx 常用命令

Nginx 常用命令如下(执行 which nginx 可以找到 Nginx 命令所在的路径):

nginx -s stop 快速关闭 Nginx,可能不保存相关信息,并迅速终止 Web 服务
nginx -s quit 平稳关闭 Nginx,保存相关信息,有安排的结束 Web 服务
nginx -s reload 因改变了 Nginx 相关配置,需要重新加载配置而重载
nginx -s reopen 重新打开日志文件
nginx -c filename 为 Nginx 指定一个配置文件,来代替默认的
nginx -t 不运行,而仅仅测试配置文件。Nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
nginx -v 显示 Nginx 的版本
nginx -V 显示 Nginx 的版本、编译器版本和配置参数。

配置 Nginx 作为反向代理

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

server {  
        listen      80;                                                        
        server_name  ginserver.com;                                              
        client_max_body_size 1024M;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass  http://127.0.0.1:8080/;
            client_max_body_size 5m;
        }
    }

}
  • proxy_pass:反向代理的路径(这里是本机的 API 服务,所以IP为 127.0.0.1。端口要和 API 服务端口一致:8080)

测试

  • 配置完 Nginx 后重启 Nginx
$ systemctl restart nginx
  • 在编译完 ginserver 后,启动 API 服务器
$ ./ginserver
  • 在 /etc/hosts 中添加一行:127.0.0.1 ginserver.com
  • 发送 HTTP 请求
  curl -XGET  http://ginserver.com/video/getAddressByFileId?file_id=67e13ee0cf8a0bf71354ce6fe4a3b8c5

在用 curl 请求 http://ginserver.com/v1/user 后,后端的请求流程实际上是这样的:

  • 因为在/etc/hosts 中配置了127.0.0.1 ginserver.com,所以请求 http://ginserver.com/v1/use 实际上是请求本机的 Nginx 端口(127.0.0.1:80)
  • Nginx 在收到请求后,解析到请求域名为 ginserver.com,根据请求域名去匹配 Nginx 的 server 配置,匹配到 server_name ginserver.com 配置
  • 匹配到 server 后,把请求转发到该 server 的 proxy_pass 路径
top Created with Sketch.