跳到主要内容

2 篇博文 含有标签「个人推荐」

查看所有标签

结合阿里云DNS实现动态DNS

· 阅读需 3 分钟

动态DNS 实现

项目已放Github,欢迎Star。 https://github.com/MasonSRE/ddns

编写脚本获取公网IP地址,实时更新DNS记录

编写 get_ip_dns.py

import time
import logging
import requests
import json
from aliyunsdkcore.client import AcsClient
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest, DescribeDomainRecordInfoRequest


# 阿里云API凭证
access_key_id = 'your_access_key_id'
access_key_secret = 'your_access_key_secret'
region_id = 'cn-hangzhou' # 你的阿里云区域ID (可以不做修改)

# 域名和记录信息
domain_name = 'example.com' # 你的域名
sub_domain = 'www' # 子域名,例如www

# 设置日志记录
logging.basicConfig(level=logging.INFO)

def get_public_ip():
try:
response = requests.get('https://api.ipify.org?format=json')
response.raise_for_status() # 抛出HTTP错误
ip = response.json()['ip']
logging.info(f'Public IP retrieved: {ip}')
return ip
except requests.exceptions.RequestException as e:
logging.error(f'Failed to retrieve public IP: {e}')
return None

def get_current_dns_record(client, domain_name, sub_domain):
request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
request.set_DomainName(domain_name)
try:
response = client.do_action_with_exception(request)
records = json.loads(response)['DomainRecords']['Record']
for record in records:
if record['RR'] == sub_domain and record['Type'] == 'A':
return record['RecordId'], record['Value']
return None, None
except ServerException as e:
logging.error(f'Failed to get the current DNS record: {e}')
return None, None

def update_dns_record(client, record_id, sub_domain, ip):
request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
request.set_RecordId(record_id)
request.set_RR(sub_domain)
request.set_Type('A')
request.set_Value(ip)
try:
client.do_action_with_exception(request)
logging.info(f'Updated DNS record to {ip}')
except ServerException as e:
logging.error(f'Failed to update DNS record: {e}')

def add_dns_record(client, domain_name, sub_domain, ip):
request = AddDomainRecordRequest.AddDomainRecordRequest()
request.set_DomainName(domain_name)
request.set_RR(sub_domain)
request.set_Type('A')
request.set_Value(ip)
try:
client.do_action_with_exception(request)
logging.info(f'Added DNS record: {sub_domain}.{domain_name} -> {ip}')
except ServerException as e:
logging.error(f'Failed to add DNS record: {e}')

def update_dns_record_if_needed(client, domain_name, sub_domain, new_ip):
record_id, current_ip = get_current_dns_record(client, domain_name, sub_domain)
if record_id is None:
logging.warning(f'No existing DNS record found for {sub_domain}.{domain_name}, adding a new record.')
add_dns_record(client, domain_name, sub_domain, new_ip)
return
if current_ip != new_ip:
update_dns_record(client, record_id, sub_domain, new_ip)

def main():
client = AcsClient(access_key_id, access_key_secret, region_id)

while True:
new_ip = get_public_ip()
if new_ip is not None:
update_dns_record_if_needed(client, domain_name, sub_domain, new_ip)
time.sleep(10) # 等待10秒再检查

if __name__ == '__main__':
main()

检查公网IP并更新 DNS 纪录

此脚本将获取该服务器的公网IP,并且修改阿里云对应的DNS解析的A纪录。

  • 非常适用于家用网络,公网IP改变时也会同步修改至Aliyun dns解析
  • 手动误修改此DNS解析时,也会进行操作IP对比,同时进行修改 dns 解析

1、下载依赖包

pip3 install requests
pip3 install aliyun-python-sdk-core
pip3 install aliyun-python-sdk-alidns

2、修改配置

# 阿里云API凭证
access_key_id = 'your_access_key_id'
access_key_secret = 'your_access_key_secret'
region_id = 'cn-hangzhou' # 你的阿里云区域ID(可以不做修改)

# 域名和记录信息
domain_name = 'example.com' # 你的域名
sub_domain = 'www' # 子域名,例如www

3、运行脚本

python3 get_ip_dns.py

Locust 部署压测

· 阅读需 2 分钟

Locust 部署压测

Python环境安装

要求 python 3.7+ 此处安装3.9版本测试

1、安装 Python 3.9

# 安装必要的开发工具和库
yum groupinstall -y "Development Tools"
yum install -y openssl-devel bzip2-devel libffi-devel zlib-devel

# 下载源码
curl -O https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz
tar -xf Python-3.9.0.tgz
cd Python-3.9.0

# 配置并编译源代码
./configure --enable-optimizations
make -j$(nproc)
make altinstall # 使用 make altinstall 而不是 make install 来避免替换系统自带的 Python 版本

# 验证
python3.9 --version

2、安装 pip3

# 安装 pip3
curl -O https://bootstrap.pypa.io/get-pip.py
python3.9 get-pip.py

# 验证
pip3.9 --version

3、软连接替换

# 替换 pip3
which pip3.9
ln -s /usr/local/bin/pip3.9 /usr/local/bin/pip3
pip3 --version

# 替换 python
which python3.9
ln -s /usr/local/bin/python3.9 /usr/local/bin/python3
python3 --version

安装 Locust

1、安装 Locust

pip3 install locust

报错:

ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'OpenSSL 1.0.2k-fips 26 Jan 2017'. See: https://github.com/urllib3/urllib3/issues/2168

解决方案(两种都可以):

1、yum update openssl

2、pip3 install 'urllib3<2.0' # 降级 urllib3 的版本

2、创建一个 Locustfile

# 创建一个名为 locustfile.py 的文件,并在其中定义你的用户行为和任务。下面是一个简单的示例,该示例对一个网站进行 GET 请求:

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
wait_time = between(1, 2.5)

@task(1)
def load_main(self):
self.client.get("/")
# 定义了一个 WebsiteUser 类,它从 HttpUser 继承而来,并定义了一个 task 来模拟用户访问网站的主页。

3、运行 Locust

locust -f locustfile.py

4、访问 Locust web 界面

打开你的 web 浏览器,访问 http://127.0.0.1:8089 来访问 Locust 的 web 界面。

5、开始测试

在 Locust web 界面中,可以输入想要模拟的用户数量和用户启动速率,然后点击“开始测试”来开始测试。

这里看到一个实时更新的仪表板,显示了各种有用的性能指标,包括请求的数量、失败的数量、最小/最大/平均响应时间等。

如果需要更复杂的可以看这里:https://docs.locust.io/en/stable/