首页
关于
壁纸
直播
留言
友链
统计
Search
1
《三国志英杰传》攻略
6,133 阅读
2
Emby客户端IOS破解
6,000 阅读
3
白嫖Emby
5,983 阅读
4
《吞食天地1》金手指代码
5,304 阅读
5
破解emby-server
4,253 阅读
moonjerx
game
age-of-empires
zx3
san-guo-zhi
尼尔:机械纪元
net
emby
learn-video
docker
torrent
photoshop
route
minio
git
ffmpeg
im
vue
gitlab
typecho
svn
alipay
nasm
srs
mail-server
tailscale
kkfileview
aria2
webdav
synology
redis
oray
chemical
mxsite
math
π
x-ui
digital-currency
server
nginx
baota
k8s
http
cloud
linux
shell
database
vpn
esxi
rancher
domain
k3s
ewomail
os
android
windows
ios
app-store
macos
develop
java
javascript
uniapp
nodejs
hbuildx
maven
android-studio
jetbrain
jenkins
css
mybatis
php
python
hardware
hard-disk
pc
RAM
software
pt
calibre
notion
office
language
literature
philosophy
travel
登录
Search
标签搜索
ubuntu
mysql
openwrt
zerotier
springboot
centos
openvpn
jdk
吞食天地2
synology
spring
idea
windows11
吞食天地1
transmission
google-play
Japanese
xcode
群晖
kiftd
MoonjerX
累计撰写
377
篇文章
累计收到
465
条评论
首页
栏目
moonjerx
game
age-of-empires
zx3
san-guo-zhi
尼尔:机械纪元
net
emby
learn-video
docker
torrent
photoshop
route
minio
git
ffmpeg
im
vue
gitlab
typecho
svn
alipay
nasm
srs
mail-server
tailscale
kkfileview
aria2
webdav
synology
redis
oray
chemical
mxsite
math
π
x-ui
digital-currency
server
nginx
baota
k8s
http
cloud
linux
shell
database
vpn
esxi
rancher
domain
k3s
ewomail
os
android
windows
ios
app-store
macos
develop
java
javascript
uniapp
nodejs
hbuildx
maven
android-studio
jetbrain
jenkins
css
mybatis
php
python
hardware
hard-disk
pc
RAM
software
pt
calibre
notion
office
language
literature
philosophy
travel
页面
关于
壁纸
直播
留言
友链
统计
搜索到
377
篇与
moonjerx
的结果
2025-02-22
使用 Docker 部署 Ollama 与 Open WebUI 完整指南
基于 DeepSeek-R1 模型的本地化部署方案前言本文详细介绍如何通过 Docker 快速搭建支持 GPU 加速的 Ollama 服务,并集成 Open WebUI 实现可视化交互界面。方案完整支持:✅ 多 GPU 并行计算✅ 模型持久化存储✅ 企业级权限管理✅ 中英文双语支持前置准备硬件要求NVIDIA 显卡(显存 ≥8GB,推荐 RTX 3060 以上)内存 ≥16GB磁盘空间 ≥50GB软件依赖# 安装 Docker 和 NVIDIA 容器工具包 sudo apt-get update sudo apt-get install -y docker.io nvidia-container-toolkit sudo systemctl restart docker # 验证 GPU 支持 docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi如果报错:sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit Hit:1 http://hk.archive.ubuntu.com/ubuntu jammy InRelease Hit:2 http://hk.archive.ubuntu.com/ubuntu jammy-updates InRelease Hit:3 http://hk.archive.ubuntu.com/ubuntu jammy-backports InRelease Hit:4 http://hk.archive.ubuntu.com/ubuntu jammy-security InRelease Reading package lists... Done Reading package lists... Done Building dependency tree... Done Reading state information... Done E: Unable to locate package nvidia-container-toolkit你的系统中可能未正确添加 NVIDIA Container Toolkit 的软件源。请按以下步骤操作:解决方案如下:添加 NVIDIA 官方源和密钥# 安装依赖 sudo apt-get install -y curl # 添加 GPG 密钥 curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - # 添加仓库(注意系统代号匹配) distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list更新并安装sudo apt-get update sudo apt-get install -y nvidia-container-toolkit验证安装nvidia-ctk --version常见问题排查:如果系统代号不匹配(如 Ubuntu 22.04 应为 ubuntu22.04),可手动替换上述命令中的 $distribution若仍报错,尝试清理缓存:sudo rm -rf /var/lib/apt/lists/* sudo apt-get update替代方案(若网络受限):# 通过 NVIDIA Docker 仓库安装 sudo apt-get install -y nvidia-docker2 sudo systemctl restart docker部署流程1. 部署 Ollama 服务# 创建持久化存储目录 mkdir -p ~/ollama_storage # 启动 Ollama 容器 docker run -d --name=ollama \ --gpus=all \ --restart unless-stopped \ -p 30037:11434 \ -v /home/$USER/dockerfile/ollama/data:/root/.ollama \ ollama/ollama # 下载 DeepSeek-R1 模型 docker exec -it ollama ollama run deepseek-r1:7b如果运行容器报错:xdboy@xdserver:~$ docker run -d --name=ollama \ --gpus=all \ --restart unless-stopped \ -p 30037:11434 \ -v /home/$USER/dockerfile/ollama/data:/root/.ollama \ ollama/ollama Unable to find image 'ollama/ollama:latest' locally latest: Pulling from ollama/ollama d9802f032d67: Pull complete 161508c220d5: Pull complete 6b78c8d09c74: Pull complete e0c387d586cc: Pull complete Digest: sha256:82956f40bb1f307c77f7a8c3ed91c7a37e072ed757ff143e34210a7b991b9480 Status: Downloaded newer image for ollama/ollama:latest 78a836df1c7ce1436b41b2d08e9d74764ae732fb06257308430ac9488ad8102d docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy' nvidia-container-cli: initialization error: load library failed: libnvidia-ml.so.1: cannot open shared object file: no such file or directory: unknown.你遇到的错误 libnvidia-ml.so.1: cannot open shared object file 表明 NVIDIA 容器运行时未能正确加载 GPU 驱动。以下是完整解决方案:问题原因NVIDIA 驱动未安装 Docker 容器需要宿主机已安装 NVIDIA 驱动并通过 nvidia-container-toolkit 暴露给容器。nvidia-container-toolkit 配置未生效 即使安装了工具包,Docker 可能未正确绑定 NVIDIA 驱动库。分步解决方案1. 确认 NVIDIA 驱动已安装运行以下命令检查驱动状态:nvidia-smi # 应有 GPU 信息输出若无输出,需先安装 NVIDIA 驱动:sudo ubuntu-drivers autoinstall # 自动安装推荐驱动 sudo reboot2. 修复 nvidia-container-toolkit 配置重新配置 NVIDIA 容器运行时并重启 Docker:# 确认工具包已安装 sudo apt-get install -y nvidia-container-toolkit # 重新生成配置 sudo nvidia-ctk runtime configure --runtime=docker # 重启 Docker 服务 sudo systemctl restart docker3. 验证容器 GPU 访问运行测试容器检查 GPU 是否可见:docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi若成功输出 GPU 信息,则配置已修复。4. 重新运行你的 Ollama 容器docker run -d --name=ollama \ --gpus=all \ --restart unless-stopped \ -p 30037:11434 \ -v /home/$USER/dockerfile/ollama/data:/root/.ollama \ ollama/ollama常见问题补充如果仍报错 libnvidia-ml.so.1强制绑定 NVIDIA 库(显式指定驱动路径):docker run -d --name=ollama \ --gpus=all \ -v /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1:/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 \ ollama/ollama若系统为 WSL2需在 Windows 宿主机安装 NVIDIA 驱动,并在 WSL2 中启用 GPU 支持:# 在 WSL2 中安装驱动兼容层 sudo apt-get install -y nvidia-cuda-toolkit关键日志检查若问题持续,检查 Docker 和 NVIDIA 容器日志:# Docker 日志 journalctl -u docker.service --since "5 minutes ago" # NVIDIA 容器日志 nvidia-container-cli -k -d /dev/tty info2. 部署 Open WebUIdocker run -d \ --name=open-webui \ -p 3000:8080 \ -e OLLAMA_API_BASE_URL=http://host.docker.internal:11434 \ --add-host=host.docker.internal:host-gateway \ --restart unless-stopped \ ghcr.io/open-webui/open-webui:main配置说明关键参数解析参数作用示例值--gpus=all启用全部 GPU必填-v ~/ollama_storage模型存储路径可自定义目录OLLAMA_API_BASE_URLOllama 服务地址保持默认网络架构示意图[用户浏览器] <-> [Open WebUI:3000] <-> [Ollama API:11434] ↑ | └── 模型数据持久化存储 ───┘验证部署1. 检查服务状态docker ps -a | grep -E "ollama|open-webui"2. 测试 API 接口curl http://localhost:11434/api/tags # 应返回包含 deepseek-r1 的模型列表3. 访问 Web 界面浏览器打开 http://[服务器IP]:3000,完成注册后:点击左下角模型选择器选择 deepseek-r1:7b开始对话测试高级配置多 GPU 分配docker update ollama --gpus '"device=0,1"' # 指定使用前两块 GPU中文支持优化登录 Open WebUI进入 Settings → Global Settings设置 Default Language 为 Chinese (Simplified)常见问题解决Q1: 容器启动报错 GPU not found# 重新配置 NVIDIA 容器 sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart dockerQ2: 模型下载速度慢# 在 Ollama 容器内配置镜像加速 docker exec -it ollama bash echo 'OLLAMA_MIRROR="https://mirror.example.com"' >> /etc/ollama.envQ3: 对话历史丢失# 检查 Open WebUI 数据卷 docker inspect open-webui | grep "Mounts"应用场景示例智能客服集成import requests def ask_ai(question): response = requests.post( "http://localhost:11434/api/generate", json={ "model": "deepseek-r1:7b", "prompt": f"作为客服助手回答:{question}", "stream": False } ) return response.json()["response"]自动生成 SQL 查询性能优化建议量化部署:使用 GGUF 格式量化模型docker exec -it ollama ollama run deepseek-r1:7b-q4缓存优化:调整 Ollama 的 OLLAMA_NUM_PARALLEL 环境变量负载均衡:部署多个 Ollama 实例并使用 Nginx 分流总结本文方案相比传统部署方式具备三大优势:快速部署:一行命令完成环境搭建资源隔离:Docker 容器保证服务稳定性弹性扩展:轻松实现多模型并行服务建议企业用户在此基础上进一步:配置 HTTPS 安全访问集成 LDAP 身份验证设置自动化备份策略立即按照本指南部署您的 AI 助手吧!如有问题欢迎在评论区留言讨论。
2025年02月22日
197 阅读
0 评论
1 点赞
2025-01-26
查询IP地址信息的免费开放接口
在开发网络应用时,了解用户地理位置是提升用户体验的关键之一。本文将介绍多个免费的开放API来查询IP地址的具体信息,并展示其请求方式和返回结果。我们将以阿里巴巴接口文档规范为标准,详细说明每个接口的使用方法。1. 阿里巴巴IP查询接口请求地址https://ip.taobao.com/outGetIpInfo?ip=121.8.215.106&accessKey=alibaba-inc请求方法GET参数说明参数名必选类型说明ip是string待查询的IP地址accessKey是string访问密钥返回数据格式{ "data": { "area": "", "country": "中国", "isp_id": "100017", "queryIp": "121.8.215.106", "city": "广州", "ip": "121.8.215.106", "isp": "电信", "county": "", "region_id": "440000", "area_id": "", "county_id": null, "region": "广东", "country_id": "CN", "city_id": "440100" }, "msg": "query success", "code": 0 }2. 百度IP查询接口请求地址https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=119.135.194.24&co=&resource_id=6006&ie=utf8&oe=gbk&format=json请求方法GET参数说明参数名必选类型说明query是string待查询的IP地址resource_id是int资源IDie是string输入编码oe是string输出编码format是string数据格式返回数据格式{ "status": "0", "t": "", "set_cache_time": "", "data": [ { "location": "广东省清远市 电信", "origip": "119.135.194.24" } ] }3. VORE-API IP查询接口请求地址https://api.vore.top/api/IPdata?ip=121.8.215.106请求方法GET参数说明参数名必选类型说明ip是string待查询的IP地址返回数据格式{ "code": 200, "msg": "SUCCESS", "ipinfo": { "type": "ipv4", "text": "121.8.215.106", "cnip": true }, "ipdata": { "info1": "广东省", "info2": "广州市", "info3": "增城", "isp": "电信" }, "adcode": { "o": "广东省广州市增城 - 电信" }, "tips": "接口由VORE-API(https://api.vore.top/)免费提供" }4. 百度地图IP定位接口请求地址https://api.map.baidu.com/location/ip?ak=LA46NZu12hG3MHAfH9jhDRhObBd0uR9t&ip=121.8.215.106请求方法GET参数说明参数名必选类型说明ak是stringAPI密钥ip是string待查询的IP地址返回数据格式{ "address": "CN|广东省|广州市|None|None|100|100", "content": { "address_detail": { "province": "广东省", "city": "广州市", "district": "" }, "address": "广东省广州市", "point": { "x": "12609455.26", "y": "2631453.98" } }, "status": 0 }5. IP.cn API请求地址https://www.ip.cn/api/index?ip=121.8.215.106&type=1请求方法GET参数说明参数名必选类型说明ip是string待查询的IP地址type是int查询类型返回数据格式{ "rs": 1, "code": 0, "address": "中国 广东省 广州市 电信", "ip": "121.8.215.106", "isDomain": 0 }6. db-ip.com API请求地址https://db-ip.com/demo/home.php?s=121.8.215.106请求方法GET返回数据格式{ "demoInfo": { "ipAddress": "121.8.215.106", "continentName": "Asia", "countryName": "中国", "stateProv": "广东", "city": "广州", "timezone": "Asia/Shanghai", "latitude": 23.1317, "longitude": 113.266, "isp": "Chinanet", "organization": "Chinanet GD" } }7. OpenData百度API请求地址https://opendata.baidu.com/api.php?co=&resource_id=6006&oe=utf8&query=121.8.215.106请求方法GET参数说明参数名必选类型说明query是string待查询的IP地址resource_id是int资源IDoe是string输出编码返回数据格式{ "status": "0", "data": [ { "location": "广东省广州市 电信", "origip": "121.8.215.106" } ] }8. Whois.pconline.com.cn API请求地址https://whois.pconline.com.cn/ipJson.jsp?ip=121.8.215.106&json=true请求方法GET参数说明参数名必选类型说明ip是string待查询的IP地址json是bool是否返回JSON返回数据格式{ "ip": "121.8.215.106", "pro": "广东省", "city": "广州市", "addr": "广东省广州市 电信" }9. API.IP.SB GeoIP接口请求地址https://api.ip.sb/geoip/121.8.215.106请求方法GET返回数据格式{ "organization": "China Telecom", "longitude": 113.2539, "city": "Guangzhou", "timezone": "Asia/Shanghai", "isp": "China Telecom", "offset": 28800, "region": "Guangdong", "asn": 4134, "asn_organization": "Chinanet", "country": "China", "ip": "121.8.215.106", "latitude": 23.1181, "continent_code": "AS", "country_code": "CN", "region_code": "GD" }10. IPINFO.IO JSON接口请求地址https://ipinfo.io/121.8.215.106/json请求方法GET返回数据格式{ "ip": "121.8.215.106", "city": "Shenzhen", "region": "Guangdong", "country": "CN", "loc": "22.5455,114.0683", "org": "AS4134 CHINANET-BACKBONE", "postal": "518000", "timezone": "Asia/Shanghai", "readme": "https://ipinfo.io/missingauth" }11. IPINFO.IO Widget接口请求地址https://ipinfo.io/widget/demo/121.8.215.106请求方法GET返回数据格式{ "input": "121.8.215.106", "data": { "ip": "121.8.215.106", "city": "Shenzhen", "region": "Guangdong", "country": "CN", "loc": "22.5455,114.0683", "org": "AS4134 CHINANET-BACKBONE", "postal": "518000", "timezone": "Asia/Shanghai", "is_anycast": false, "is_mobile": false, "is_anonymous": false, "is_satellite": false, "is_hosting": false, "asn": { "asn": "AS4134", "name": "CHINANET-BACKBONE", "domain": "chinatelecom.com.cn", "route": "121.8.0.0/13", "type": "isp" }, "company": { "name": "CHINANET Guangdong province network", "domain": "chinatelecom.cn", "type": "isp" }, "privacy": { "vpn": false, "proxy": false, "tor": false, "relay": false, "hosting": false, "service": "" }, "abuse": { "address": "No.31 ,jingrong street,beijing, 100032", "country": "CN", "email": "anti-spam@chinatelecom.cn", "name": "ABUSE CHINANETCN", "network": "121.8.0.0/13", "phone": "+000000000" } } }12. API.IPBASE.COM IP查询接口请求地址https://api.ipbase.com/v1/json/121.8.215.106请求方法GET返回数据格式{ "ip": "121.8.215.106", "country_code": "CN", "country_name": "China", "region_code": "CN-GD", "region_name": "Guangdong", "city": "Guangzhou", "zip_code": "510140", "time_zone": "Asia/Shanghai", "latitude": 23.1273612976074, "longitude": 113.264572143555, "metro_code": 0 }13. IP-API.IO JSON接口请求地址https://ip-api.io/json?ip=121.8.215.106请求方法GET返回数据格式{ "ip": "27.158.109.238", "countryCode": "CN", "country_code": "CN", "countryName": "China", "country_name": "China", "isInEuropeanUnion": false, "is_in_european_union": false, "regionName": "Guangdong", "region_name": "Guangdong", "regionCode": "GD", "region_code": "GD", "city": "Guangzhou", "zipCode": "", "zip_code": "", "timeZone": "Asia/Shanghai", "time_zone": "Asia/Shanghai", "latitude": 23.1181, "longitude": 113.2539, "metroCode": 0, "metro_code": 0, "organisation": "Chinanet", "flagUrl": "https://www.countryflags.io/CN/flat/64.png", "emojiFlag": "https://www.countryflags.io/CN/emoji.png", "currencySymbol": "", "currency": "", "callingCode": "", "countryCapital": "", "suspiciousFactors": { "isProxy": false, "isTorNode": false, "isSpam": false, "isSuspicious": false } }14. API.IPAPI.IS 查询接口请求地址https://api.ipapi.is/?ip=121.8.215.106请求方法GET返回数据格式{ "ip": "121.8.215.106", "rir": "APNIC", "is_bogon": false, "is_mobile": false, "is_crawler": false, "is_datacenter": false, "is_tor": false, "is_proxy": true, "is_vpn": false, "is_abuser": true, "company": { "name": "CHINANET Guangdong province network", "abuser_score": "0.0003 (Very Low)", "domain": "chinatelecom.cn", "type": "isp", "network": "121.8.0.0 - 121.15.255.255", "whois": "https://api.ipapi.is/?whois=121.8.0.0" }, "abuse": { "name": "IPMASTER CHINANET-GD", "address": "NO.18,RO. ZHONGSHANER,YUEXIU DISTRIC,GUANGZHOU", "email": "anti-spam@chinatelecom.cn", "phone": "+86-20-87189274" }, "asn": { "asn": 4134, "abuser_score": "0.001 (Low)", "route": "121.8.0.0/13", "descr": "CHINANET-BACKBONE No.31,Jin-rong Street, CN", "country": "cn", "active": true, "org": "CHINANET BACKBONE", "domain": "chinatelecom.cn", "abuse": "anti-spam@chinatelecom.cn", "type": "business", "updated": "2021-06-15", "rir": "APNIC", "whois": "https://api.ipapi.is/?whois=AS4134" }, "location": { "is_eu_member": false, "calling_code": "86", "currency_code": "CNY", "continent": "AS", "country": "China", "country_code": "CN", "state": "Guangdong", "city": "Guangzhou", "latitude": 23.11667, "longitude": 113.25, "zip": "510000", "timezone": "Asia/Shanghai", "local_time": "2025-01-26T17:34:38+08:00", "local_time_unix": 1737884078, "is_dst": false }, "elapsed_ms": 0.92 }15. IPAPI.COM 查询接口请求地址https://ipapi.com/ip_api.php?ip=121.8.215.106请求方法GET返回数据格式{ "ip": "121.8.215.106", "hostname": "121.8.215.106", "type": "ipv4", "continent_code": "AS", "continent_name": "Asia", "country_code": "CN", "country_name": "China", "region_code": "GD", "region_name": "Guangdong", "city": "Guangzhou", "zip": "510000", "latitude": 23.124719619751, "longitude": 113.238609313965, "msa": null, "dma": null, "radius": null, "ip_routing_type": "fixed", "connection_type": "tx", "location": { "geoname_id": 1809858, "capital": "Beijing", "languages": [ { "code": "zh", "name": "Chinese", "native": "中文" } ], "country_flag": "https://assets.ipstack.com/flags/cn.svg", "country_flag_emoji": "🇨🇳", "country_flag_emoji_unicode": "U+1F1E8 U+1F1F3", "calling_code": "86", "is_eu": false }, "time_zone": { "id": "Asia/Shanghai", "current_time": "2025-01-26T17:27:58+08:00", "gmt_offset": 28800, "code": "CST", "is_daylight_saving": false }, "currency": { "code": "CNY", "name": "Chinese Yuan", "plural": "Chinese yuan", "symbol": "CN¥", "symbol_native": "CN¥" }, "connection": { "asn": 4134, "isp": "Chinanet", "sld": "kj-textile", "tld": "com", "carrier": "chinanet", "home": true, "organization_type": "Internet Service Provider", "isic_code": "J6110", "naics_code": "517311" }, "security": { "is_proxy": false, "proxy_type": null, "is_crawler": false, "crawler_name": null, "crawler_type": null, "is_tor": false, "threat_level": "low", "threat_types": null, "proxy_last_detected": null, "proxy_level": null, "vpn_service": null, "anonymizer_status": null, "hosting_facility": false } }16. API.IP2LOCATION.IO 查询接口请求地址https://api.ip2location.io/?ip=121.8.215.106请求方法GET返回数据格式{ "ip": "121.8.215.106", "country_code": "CN", "country_name": "China", "region_name": "Guangdong", "city_name": "Guangzhou", "latitude": 23.12736, "longitude": 113.26457, "zip_code": "510140", "time_zone": "+08:00", "asn": "4134", "as": "Asia Pacific Network Information Centre", "is_proxy": true, "message": "Limit to 500 queries per day. Sign up for a Free plan at https://www.ip2location.io to get 30K queries per month." }17. REALIP.CC 查询接口请求地址https://realip.cc/?ip=121.8.215.106请求方法GET返回数据格式{ "ip": "121.8.215.106", "city": "Guangzhou", "province": "Guangdong", "country": "China", "continent": "Asia", "isp": "Chinanet", "time_zone": "Asia/Shanghai", "latitude": 23.1181, "longitude": 113.2539, "postal_code": null, "iso_code": "CN", "network": "121.8.128.0/17", "notice": "api文档在/docs路径下,调用并发数是有限制的 ©2021-09-27->now", "provider": "Powered by Bboysoul", "blog": "https://www.bboy.app", "tg_group": "https://t.me/bboyapp", "data_updatetime": 20250102, "count": 195369546 }18. IPAPI.CO 查询接口请求地址https://ipapi.co/121.8.215.106/json/请求方法GET返回数据格式{ "ip": "121.8.215.106", "network": "121.8.128.0/17", "version": "IPv4", "city": "Guangzhou", "region": "Guangdong", "region_code": "GD", "country": "CN", "country_name": "China", "country_code": "CN", "country_code_iso3": "CHN", "country_capital": "Beijing", "country_tld": ".cn", "continent_code": "AS", "in_eu": false, "postal": null, "latitude": 23.1181, "longitude": 113.2539, "timezone": "Asia/Shanghai", "utc_offset": "+0800", "country_calling_code": "+86", "currency": "CNY", "currency_name": "Yuan Renminbi", "languages": "zh-CN,yue,wuu,dta,ug,za", "country_area": 9596960.0, "country_population": 1411778724, "asn": "AS4134", "org": "Chinanet" }19. GET.GEOJS.IO 查询接口请求地址https://get.geojs.io/v1/ip/geo/121.8.215.106.json请求方法GET返回数据格式{ "country_code3": "CHN", "continent_code": "AS", "region": "Guangdong", "latitude": "23.1181", "longitude": "113.2539", "accuracy": 20, "organization_name": "Chinanet", "timezone": "Asia/Shanghai", "asn": 4134, "organization": "AS4134 Chinanet", "city": "Guangzhou", "ip": "121.8.215.106", "area_code": "0", "country": "China", "country_code": "CN" }结语通过上述多个接口的对比和使用,开发者可以根据自身需求选择最适合的API进行IP地址查询。无论是获取详细的地理位置信息,还是简单的城市级别定位,这些接口都能提供丰富的支持。
2025年01月26日
94 阅读
0 评论
0 点赞
2024-12-18
linux对用户组操作
1. 查看当前用户组查看所有用户组要查看系统中所有的用户组,可以使用cat或less命令查看/etc/group文件,该文件包含了所有用户组的信息。cat /etc/group或者使用less进行分页查看:less /etc/group每个条目包含四个字段,分别是:组名组密码(通常为空或x,表示密码存储在/etc/gshadow中)GID(Group ID)成员列表(用逗号分隔)查看当前用户的用户组要查看当前登录用户所属的所有用户组,可以使用groups命令:groups或者使用id命令,它会显示更详细的信息,包括用户ID(UID)和GID:id2. 添加用户组要创建一个新的用户组,可以使用groupadd命令:sudo groupadd 新组名例如,创建一个名为developers的用户组:sudo groupadd developers3. 删除用户组要删除一个用户组,可以使用groupdel命令:sudo groupdel 组名例如,删除developers用户组:sudo groupdel developers注意:删除用户组时,请确保该组没有活动成员,否则可能会导致权限问题。4. 修改用户组修改用户组名称要更改用户组的名称,可以使用groupmod命令:sudo groupmod -n 新组名 旧组名例如,将developers用户组重命名为devteam:sudo groupmod -n devteam developers修改用户组的GID你还可以更改用户组的GID(Group ID):sudo groupmod -g 新GID 组名例如,将devteam用户组的GID改为1005:sudo groupmod -g 1005 devteam5. 查询用户组信息查询特定用户组的信息要查看特定用户组的详细信息,可以使用getent命令:getent group 组名例如,查看devteam用户组的详细信息:getent group devteam这将返回类似于以下的输出:devteam:x:1005:user1,user2查询用户属于哪些组要查看某个特定用户属于哪些用户组,可以使用groups命令加上用户名:groups 用户名例如,查看bigserver用户属于哪些组:groups bigserver或者使用id命令:id bigserver6. 增加用户到用户组要将用户添加到一个用户组,可以使用usermod命令:sudo usermod -aG 组名 用户名例如,将bigserver用户添加到www用户组:sudo usermod -aG www bigserver-aG选项表示将用户添加到指定的组,而不影响其现有的其他组成员身份。7. 删除用户从用户组要将用户从一个用户组中移除,可以编辑/etc/group文件,或者使用gpasswd命令:sudo gpasswd -d 用户名 组名
2024年12月18日
26 阅读
0 评论
0 点赞
2024-11-23
【openwrt】通过zerotier网络连接路由器时,如何配置使用TYDD终端工具
一、创建新的接口命名为ZEROTIER,接口的协议选择DHCP客户端,接口选择已经连接的ZEROTIER适配器。修改刚刚创建的接口配置,防火墙设置,新建ZEROTIER防火墙,保存并应用二、配置防护墙端口转发配置7681端口转发,并选择ZEROTIER网络三、自定义规则iptables -I FORWARD -i ztyfejv2us -j ACCEPT iptables -I FORWARD -o ztyfejv2us -j ACCEPT iptables -t nat -I POSTROUTING -o ztyfejv2us -j MASQUERADE
2024年11月23日
149 阅读
0 评论
1 点赞
2024-11-11
Java面试一
面试概况本次面试为快手商业化部门日常实习生的一轮面试,面试时长约为40分钟。面试内容主要集中在Java基础知识、数据库、并发编程、算法等方面。以下是详细的面试问题及回答整理。面试问题及回答1. Java 的集合类知道哪些?Java 的集合类主要分为以下几类:List:有序集合,允许重复元素。常见实现类有 ArrayList、LinkedList、Vector。Set:不允许重复元素的集合。常见实现类有 HashSet、LinkedHashSet、TreeSet。Map:键值对集合,键唯一但值可以重复。常见实现类有 HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap。Queue:队列集合,支持 FIFO(先进先出)操作。常见实现类有 LinkedList、PriorityQueue、ArrayDeque。2. 说说 HashMap?HashMap 是 Java 中常用的集合类,基于哈希表实现,允许存储键值对。其主要特点如下:无序存储:HashMap 不保证元素的顺序。允许空键和空值:但最多只能有一个空键。线程不安全:在多线程环境下使用 HashMap 可能会导致数据不一致。时间复杂度:插入、删除、查找操作的时间复杂度均为 O(1)(理想情况下)。3. HashMap 线程安全吗,如何变线程安全?HashMap 本身是线程不安全的。可以通过以下几种方式使其线程安全:使用 Collections.synchronizedMap:将 HashMap 包装成线程安全的 Map。Map<String, String> map = Collections.synchronizedMap(new HashMap<>());使用 ConcurrentHashMap:ConcurrentHashMap 是线程安全的 Map 实现,性能优于 Hashtable。Map<String, String> map = new ConcurrentHashMap<>();手动同步:在访问 HashMap 的地方手动加锁。synchronized (map) { map.put(key, value); }4. ConcurrentHashMap 如何实现的?ConcurrentHashMap 通过分段锁(Segment)机制实现线程安全。具体实现如下:分段锁:将整个哈希表分成多个段(Segment),每个段内部是一个小的哈希表。锁粒度:每次操作只锁定当前段,而不是整个哈希表,提高了并发性能。JDK 1.8 改进:取消了 Segment,改为使用 CAS 操作和锁竞争机制,进一步提高了性能。5. synchronized 原理以及升级过程synchronized 是 Java 中的内置锁,用于实现线程同步。其原理如下:锁的状态:锁有四种状态,依次是无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。锁升级:锁可以从较低状态升级到较高状态,但不能降级。无锁状态:没有任何线程持有锁。偏向锁:偏向于第一个获取锁的线程,减少锁的竞争。轻量级锁:使用 CAS 操作尝试获取锁,如果失败则升级为重量级锁。重量级锁:使用操作系统互斥量实现,性能较差。6. 线程池的参数?ThreadPoolExecutor 是 Java 中创建线程池的类,其构造方法参数如下:corePoolSize:核心线程数。maximumPoolSize:最大线程数。keepAliveTime:线程空闲时间。unit:keepAliveTime 的时间单位。workQueue:任务队列,用于存储等待执行的任务。threadFactory:线程工厂,用于创建线程。handler:拒绝策略,当任务队列满且线程数达到最大值时的处理策略。7. full gc, minor gc?Minor GC:回收年轻代(Young Generation)的垃圾收集操作。当年轻代空间不足时触发。Full GC:回收整个堆(包括年轻代和老年代)的垃圾收集操作。通常在以下情况下触发:老年代空间不足。系统显式调用 System.gc()。Minor GC 时发现老年代空间不足。8. 垃圾回收算法?常见的垃圾回收算法有:标记-清除:标记所有需要回收的对象,然后清除这些对象。标记-整理:标记所有需要回收的对象,然后将存活对象移动到一端,清除边界外的对象。复制:将内存分为两个区域,每次只使用其中一个区域,将存活对象复制到另一个区域。分代收集:将内存分为年轻代和老年代,分别使用不同的回收算法。9. CPU 密集型和 IO 密集型下如何设置核心线程数?CPU 密集型:任务主要消耗 CPU 资源,核心线程数一般设置为 CPU 核心数 + 1。int corePoolSize = Runtime.getRuntime().availableProcessors() + 1;IO 密集型:任务主要消耗 I/O 资源,核心线程数一般设置为 CPU 核心数 * 2。int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;10. 聚簇索引和非聚簇索引区别聚簇索引:数据行的物理存储顺序与索引顺序一致。一个表只能有一个聚簇索引。查询速度快,但插入、删除、更新操作较慢。非聚簇索引:数据行的物理存储顺序与索引顺序无关。一个表可以有多个非聚簇索引。查询速度相对较慢,但插入、删除、更新操作较快。11. MySQL 的各个隔离级别,以及分别解决了什么问题MySQL 的事务隔离级别有四种:读未提交(Read Uncommitted):最低隔离级别,允许脏读。读已提交(Read Committed):允许不可重复读,但不允许脏读。可重复读(Repeatable Read):默认隔离级别,允许幻读,但不允许脏读和不可重复读。串行化(Serializable):最高隔离级别,不允许脏读、不可重复读和幻读。12. Redis 有什么数据类型Redis 支持多种数据类型:字符串(String):最基本的类型,可以存储字符串、数字等。列表(List):有序集合,支持从两端插入和删除操作。集合(Set):无序集合,不允许重复元素。有序集合(Sorted Set):有序集合,每个元素关联一个分数。哈希表(Hash):键值对集合,键唯一。位图(Bitmap):用于处理位级别的操作。HyperLogLog:用于估算集合的基数。13. Redis 分布式锁实现?Redis 分布式锁可以通过以下几种方式实现:SETNX 命令:使用 SETNX 命令尝试获取锁。SETNX key valueEXPIRE 命令:设置锁的超时时间,防止死锁。EXPIRE key secondsLua 脚本:使用 Lua 脚本保证原子性。local key = KEYS[1] local value = ARGV[1] local expire = tonumber(ARGV[2]) if redis.call("setnx", key, value) == 1 then redis.call("expire", key, expire) return 1 else return 0 end14. 项目中的前缀树,自定义注解限频,网站优化过程前缀树(Trie):用于快速查找字符串,常用于搜索引擎、拼写检查等。自定义注解限频:通过自定义注解和 AOP 切面实现接口限流。@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface RateLimit { int limit() default 100; int time() default 1; } @Aspect @Component public class RateLimitAspect { @Around("@annotation(rateLimit)") public Object around(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable { // 限流逻辑 return joinPoint.proceed(); } }网站优化过程:前端优化:使用 CDN、压缩资源、合并文件、懒加载等。后端优化:优化数据库查询、使用缓存、减少网络请求等。服务器优化:调整 JVM 参数、优化网络配置、使用负载均衡等。15. 算法:反转链表反转链表的实现如下:public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode current = head; while (current != null) { ListNode next = current.next; current.next = prev; prev = current; current = next; } return prev; }总结本次面试涉及的知识点较为广泛,涵盖了 Java 基础、并发编程、数据库、算法等多个方面。准备面试时,建议重点复习这些知识点,并结合实际项目经验进行准备。希望这篇博客对大家有所帮助!
2024年11月11日
21 阅读
0 评论
0 点赞
1
2
3
...
76
您的IP: