当前位置:首页 > 技术文章 > 正文内容

用Nginx反向代理Docker化你的IP地理定位服务

arlanguage4个月前 (01-08)技术文章22

  1. 必须安装Docker并运行docker守护进程。
  2. 运行docker命令的用户可能被添加到docker组,否则你可能需要sudo权限来运行这些命令。(可选)
  3. 在IP Geolocation API创建一个账户,并复制API密钥。
  4. 一个自签的证书。(https://getacert.com/selfsignedcert.html)
  5. 一个有效的域名。

在本教程中,我们将研究如何将一个运行ip-geolocation服务的flask应用程序、一个用于缓存的redis容器和一个配置了反向代理的nginx容器docker化。

  1. 我们将创建一个自定义的桥,以实现容器之间基于名字的通信。所有被创建的容器都将被连接到这个桥上。
  2. 请求由nginx容器接收,该容器被配置为反向代理服务器,将请求转发到配置的后端容器。
  3. 我们有3个API容器,运行一个flask应用程序,编码为联系所提供的API服务,以获取和服务所提供的IP地址的详细信息。
  4. 数据缓存服务是由redis容器提供的。 当我们第一次请求一个IP地址的详细信息时,API容器首先检查redis容器,看是否有任何缓存的信息。如果有的话,就直接从redis容器中提供详细信息。
  5. 如果没有,该容器就会与API服务提供商联系,收集数据,然后将其发送到redis容器中进行服务和缓存。

按照此文件创建一个秘密来存储你的API密钥。我们将配置API容器以从秘密管理器中获取密钥。

mkdir -p ip-geo/{conf,ssl} ; cd ip-geo/git clone https://github.com/sreehariskumar/ip-geo-location-finder.git

  

conf子目录用来保存nginx的配置文件,ssl子目录用来保存自签名的证书。

这些文件可以从git库中克隆。

cat app.py

import os
import requests
import json
import redis
from flask import Flask , jsonify , make_response
import boto3

def get_seceret(*,secret_name=None,secret_key=None,region_name=None):

  secrets_client = boto3.client(service_name ="secretsmanager",region_name=region_name)
  response = secrets_client.get_secret_value(SecretId=secret_name)
  ipstack_secrets = json.loads(response['SecretString'])
  return ipstack_secrets[secret_key] 

def get_from_cache(*,host=None):
   try: 
   
       redis_con = redis.Redis(host=redis_host,port=redis_port)
    cached_result = redis_con.get(host)
     
    if cached_result:
      
            output = json.loads(cached_result)
      output["cached"] = "True"
      output["apiServer"] = hostname
      return output

    else:
    
          return False
    
  except:

    return "Error In get_from_cache function."

def set_to_cache(*,host=None,ipgeolocation_key=None):
  try:
  
      redis_con = redis.Redis(host=redis_host,port=redis_port)
    ipgeolocation_url = "https://api.ipgeolocation.io/ipgeo?apiKey={}&ip={}".format(ipgeolocation_key,host)
    geodata = requests.get(url=ipgeolocation_url)
    geodata = geodata.json()
    geodata["cached"] = "False"
    geodata["apiServer"] = hostname
    redis_con.set(host,json.dumps(geodata))
    redis_con.expire(host,3600)

    return geodata

  except:
   
    return "Error In set_to_cache function."

    
app = Flask(__name__)

@app.route('/ip/<ip>',strict_slashes=False)
def ipstack(ip=None):
  
  output = get_from_cache(host=ip)
  
  if output: 
        
        return jsonify(output)
   
  output = set_to_cache(host=ip,ipgeolocation_key=ipgeolocation_key)

  return jsonify(output)

@app.route('/status',strict_slashes=False)
def check_status():
  return make_response("",200)

    
if __name__ == "__main__":
 
  hostname = os.getenv("HOSTNAME","none")
  redis_port = os.getenv("REDIS_PORT","6379")
  redis_host = os.getenv("REDIS_HOST",None)
  app_port = os.getenv("APP_PORT","8080")
  ipgeolocation_key = os.getenv("API_KEY", None)
  ipgeolocation_key_from_secret = os.getenv("API_KEY_FROM_SECRETSMANAGER",False)
  ipgeolocation_key_secret_name = os.getenv("SECRET_NAME",None)
  ipgeolocation_key_name = os.getenv("SECRET_KEY",None)
  aws_region = os.getenv("REGION_NAME",None)

  if ipgeolocation_key_from_secret == "True":
  
      ipgeolocation_key = get_seceret(secret_name=ipgeolocation_key_secret_name,
                                                                          secret_key=ipgeolocation_key_name,
                                                                          region_name=aws_region )

      
  app.run(port=app_port,host="0.0.0.0",debug=True)

该代码设置了一个Flask网络应用程序,通过一个API端点提供IP地址的地理位置信息。该API调用一个外部服务ipgeolocation.io,以检索地理位置信息。该API旨在将ipgeolocation.io的响应缓存在Redis数据库中一段时间(1小时),以减少API调用次数并提高响应时间。

当API收到一个关于IP地理位置信息的请求时,它首先检查Redis数据库中的缓存响应。如果响应在缓存中,API会返回缓存的响应。如果响应不在缓存中,API会调用ipgeolocation.io来检索地理位置信息,并将响应存储在Redis数据库中,过期时间为1小时。然后API从ipgeolocation.io返回响应。

访问ipgeolocation.io的API密钥可以指定为环境变量或从AWS Secrets Manager中检索。

该代码使用了以下库。

  1. os: 提供了一种与底层操作系统互动的方式,如读取环境变量。
  2. requests: 向外部API发出HTTP请求。
  3. json:处理JSON数据格式。
  4. redis:提供一个与Redis数据库交互的Python客户端。
  5. flask:提供了一个用于构建和运行网络应用的框架。
  6. boto3:提供一个Python客户端,用于与AWS服务进行交互。

该应用程序可以从命令行或AWS Secrets Manager服务中获取API密钥的纯文本。在任何秘密管理器中存储你的敏感数据以确保安全是最理想的。

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/706.html

标签: nginx aws
分享给朋友:

“用Nginx反向代理Docker化你的IP地理定位服务” 的相关文章

nginx配置多个站点使用同一端口

场景描述用户在同一台服务器上部署了多个站点,需要使用不同域名的80端口来访问不同的网站准备事项主机已安装好nginx服务站点文件已上传到主机目录不同域名已解析到主机IP部署步骤1、检查/etc/nginx/nginx.conf <span style="color:red"&g...

Linux服务器Centos7系统Nginx安装与配置

一 安装编译工具及库文件yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel二首先要安装 PCREPCRE 作用是让 Nginx 支持 Rewrite 功能。2.1 下载 PCRE 安装包cd /usr/...

全网最新最全的Docker命令大集合,收藏备用!

Docker 是一个开源的平台,用于自动化应用程序的部署、扩展和管理。它使得开发者能够打包应用及其依赖项到一个轻量级的容器中,并在任何环境中快速运行。掌握 Docker 的常用命令可以大大提高你的工作效率,尤其是在开发、测试和部署阶段。本文将详细介绍 Docker 的常用命令,涵盖从基本操作到高级使...

windows 搭建php运行环境(2024年)

由于需要运行一套cms系统,需要运行php环境,现在开始记录搭建步骤:1、分别下载nginx和php包,然后解压到自己喜欢目录下面2、这里我们使用nginx的反向代理模式的FastCGI server,修改nginx.conf,然后启动或重启nginx。location ~ \.php$ {...

服务器排障nginx 499 错误地解决

问题描述:近期平台对外开放了数据查询接口,在数据量特别大时,返回结果时间可能会超过3秒,接口开放后,系统本身调用没有问题,其他第三方平台接入时,总会报链接超时问题;问题原因:查看tomcat日志无任何错误,一开始以为是tomcat接收参数最大限制问题,对tomcat做了一次整体优化,修改连接数、修改...

08《Nginx 入门教程》Nginx 的 Http 模块介绍(中)

在前面介绍完 post-read、server-rewrite、find-config、rewrite 和 post-rewrite 阶段后,我们将继续学习 preaccess 和 access 两个阶段,中间会涉及部分模块,一同进行说明。1. preaccess 阶段在 preaccess 阶段在...