济南网站建设工作室/网络推广公司哪家好

济南网站建设工作室,网络推广公司哪家好,软件公司网站源码,公司网站建设合同模板文章目录 **1. Go 代码示例(main.go)****2. Dockerfile 多段构建**3.构建 Docker 镜像**4. docker-compose.yml 直接拉取镜像****5. 运行容器****6. 测试 API**7、配置域名访问**DNS解析:将域名转换为IP地址****DNS寻址示例** 8.错误记录 访问…

在这里插入图片描述

文章目录

      • **1. Go 代码示例(`main.go`)**
      • **2. `Dockerfile` 多段构建**
      • 3.构建 Docker 镜像
      • **4. `docker-compose.yml` 直接拉取镜像**
      • **5. 运行容器**
      • **6. 测试 API**
      • 7、配置域名访问
        • **DNS解析:将域名转换为IP地址**
        • **DNS寻址示例**
      • 8.错误记录

访问路径ip+端口:端口可以了,但是小程序中不支持该格式,还需要配置nginx代理通过域名访问

1. Go 代码示例(main.go

这个示例是一个简单的 Gin Web 服务,监听 8085 端口:

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong"})})r.Run(":8085") // 监听 8085 端口
}

2. Dockerfile 多段构建

使用 Alpine + Go 进行多阶段构建,以减少最终镜像大小:

FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY . .
RUN go mod init api/upd-unionid && go mod tidy  # 依赖管理
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o upd-unionid updappunionidbyopenid.go  # 编译 Go 二进制文件FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/upd-unionid .
# 监听 8085 端口
EXPOSE 8085
# 运行服务
CMD ["./upd-unionid"]

3.构建 Docker 镜像

通过dockerfile构建镜像,然后上传远程仓库,方便使用

## build  使用 Dockerfile 构建镜像(替换 yourusername)
docker build -t yourusername/myapp:latest .## 打tag,做标记,用于后续推送远程仓库必备步骤
docker tag myapp:v0.1 firehmx/myapp:v0.1 ## 登录 Docker Hub(如果是私有仓库,替换仓库地址),本地运行docker账户,直接docker login 可快捷登录
docker login -u username -p password ## 推送镜像到 Docker Hub
docker push yourusername/myapp:latestdocker logout

4. docker-compose.yml 直接拉取镜像

修改 docker-compose.yml,从远程镜像启动服务:

version: "3.8"
services:app:image: upd-unionid:v0.2   # 本地/远程构建的镜像ports:- "8085:8085"restart: alwaysnetworks:- mynetworknetworks:mynetwork:driver: bridge

5. 运行容器

# 1. 拉取最新镜像(可选)
docker pull yourusername/myapp:latest# 2. 启动容器
docker-compose up -d# 3.关闭服务
docker-compose down

6. 测试 API

到这里,一个go应用的接口,通过ip+端口形式可以在容器环境中运行完成。

curl http://localhost:8085/ping

返回:

{"message":"pong"}

7、配置域名访问

  • 具体讲解下apache中配置反向代理,将域名请求代理到ip+端口,这期间走了些弯路。配置单独项目来转发该业务,但是无法正常访问,后来通过在泛域名所在服务中进行配置转发解决。
  • 通过问答形式来还原下场景

问: 在A服务器nginx环境下配置项目请求具体域名(wechatapi.xxx.com)转发ip+端口出错,因为该域名在B服务器有Apache环境的泛域名项目(*.xxx.com),没有请求我在A服务器中配置的具体域名,请求了B服务器中泛域名的配置的项目。

答:

7.1、先排查域名所在的ip是哪个。发现确实A服务器配置的项目,访问到了B服务器的项目。

1.验证某一个域名解析的ip地址: dig 域名 +short

场景需求

  • 泛域名 *.example.com 解析到默认服务器 1.1.1.1
  • 特定子域名 sub.example.com 解析到另一台服务器 2.2.2.2

排查泛域名:

  • dig random.example.com +short # 应返回 1.1.1.1

具体子域名:

  • dig sub.example.com +short # 应返回 2.2.2.2

7.2、直接将我需要的二级域名重新解析到对应服务器中,正常配置也行,不过稍微麻烦,毕竟解析DNS是在老板账户控制。

  • 这里是由于A服务器的nginx环境下,有一些域名a.xxx.com和b.xxx.com是可以配置走通,且指定下A服务器所在域名,我就通过复制修改该配置,想将容器化的项目改为新域名,但是由于项目长久,我记不大清了,后来验证,应该是这两域名配置过DNS解析导致的,我新增的服务区没有配置过DNS解析,导致无法请求到具体项目(容器化项目,我改为ip+8086端口是可以访问到)
  • 我也验证了C服务器Apache环境下的api.xxx.com,通过dig验证,也是指定C服务器的ip,这些都属于上边提到的泛域名所属域名,只不过均不在一个服务器中,这个C服务器的域名应该也是配置了DNS解析的。

后来我确定应该是DNS解析问题,全貌应该是:泛域名解析到了B服务器中,A服务器又有a.xxx.com和b.xxx.com项目都正常运行,C服务器的api.xxx.com也运行很久了,并且ABC三台服务器都是同一个域名下,子域名的解析会覆盖泛域名的解析,也就是子域名优先级更高,这就解释通了。

这就联系到最经典的面试题:浏览器输入网址到最终页面展示的过程( DNS解析 → 网络连接 → 请求处理 → 数据渲染 ),这里温习下DNS解析过程:

DNS解析:将域名转换为IP地址
  1. 浏览器缓存:检查浏览器是否缓存过该域名的IP。
  2. 系统缓存:查询操作系统(如Windows的hosts文件或DNS缓存)。
  3. 路由器缓存:向本地路由器查询缓存记录。
  4. ISP的DNS服务器:向互联网服务提供商(ISP)的DNS服务器发起请求。
  5. 递归查询
    • 若ISP无缓存,依次查询根域名服务器(.)→ 顶级域名服务器(.com)→ 权威域名服务器(example.com),最终获取IP。
  • 结果:获得服务器的IP地址。
DNS寻址示例

以查询 www.example.com 为例:

  1. 浏览器检查缓存 → 未命中。
  2. 操作系统检查缓存 → 未命中。
  3. 路由器检查缓存 → 未命中。
  4. 请求发送到ISP的DNS服务器 → 未命中。
  5. ISP的DNS服务器发起递归查询:
    • 查询根域名服务器,获得 .com 顶级域名服务器地址。
    • 查询 .com 顶级域名服务器,获得 example.com 权威域名服务器地址。
    • 查询 example.com 权威域名服务器,获得 www.example.com 的IP地址(如 93.184.216.34)。
  6. ISP的DNS服务器将结果返回给客户端,客户端缓存结果。

DNS记录类型

  • A记录:将域名映射到IPv4地址。

  • AAAA记录:将域名映射到IPv6地址。

  • CNAME记录:将域名指向另一个域名(别名)。

  • MX记录:指定邮件服务器地址。

  • NS记录:指定域名服务器。

总结:由于再进行DNS解析,还需要找老板配置,并且还有单独配置项目,毕竟没有项目,这个逻辑就是想配置转发到ip+端口接口,这个就较为繁琐,不是最优方案,接着继续有最优方案。

7.3、在B服务器的项目中配置代理转发是最优方案,且指定具体的路由

在泛域名所在项目的apache的ssl.conf中配置转发ip+端口的可用服务(nginx转发也一样,参考:[每周一更]-(第88期):Nginx 之 proxy_pass使用详解 - 胡梦旭博客,技术博客,个人博客模板, php博客系统,go语言,Python语言),结果:是可以行

# xxx.com泛域名  + 增加了ip+端口的转发  - 完整请求配置 - xxx替换你自己的域名
<VirtualHost *:443>DocumentRoot "/var/www/html/gkmobile/public"ServerName xxx.com:443ServerAlias *.xxx.com:443Header set Access-Control-Allow-Origin "http://ip"Header set Access-Control-Allow-Origin "https://域名"ErrorLog "logs/xxx.com-error_log"CustomLog "logs/xxx.com-access_log" commonLogLevel warnSSLEngine onSSLProtocol all -SSLv2 -SSLv3SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUMSSLHonorCipherOrder onSSLCertificateFile /etc/httpd/conf/xxx-ssl/xxx.com.cerSSLCertificateKeyFile /etc/httpd/conf/xxx-ssl/xxx.com.keySSLCertificateChainFile /etc/httpd/conf/xxx-ssl/fullchain.cer<Files ~ "\.(cgi|shtml|phtml|php3?)$">SSLOptions +StdEnvVars</Files><Directory "/var/www/cgi-bin">SSLOptions +StdEnvVars</Directory>BrowserMatch "MSIE [2-5]" \nokeepalive ssl-unclean-shutdown \downgrade-1.0 force-response-1.0CustomLog logs/ssl_request_log \"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"SSLProxyEngine onProxyPass /api/small https://api.xxx.com/version1/small/ProxyPassReverse /api/small https://api.xxx.com/version1/small/# ADD 核心配置:仅在特定子域名+路径时触发转发ProxyRequests OffProxyPreserveHost On# ADD 条件判断:仅当请求域名为 wechatapi.xxx.com 且路径为 /update_unionid 时转发RewriteEngine OnRewriteCond %{HTTP_HOST} ^wechatapi\.xxx\.com$ [NC]RewriteRule ^/update_unionid(.*)$ http://IP:端口/update_unionid$1 [P,L]
</VirtualHost>

详细逻辑:

  • 泛域名 *.xxx.com 已经配置了一个虚拟主机(例如处理静态网站)。
  • 新增需求:当访问 wechatapi.xxx.com/update_unionid 时,自动转发到另一台服务器的 IP:Port/update_unionid,而其他子域名(如 blog.xxx.com)或路径仍由当前项目处理。

直接访问 wechatapi.xxx.com/update_unionid 请求正常了,到此整个逻辑就完整了。

8.错误记录

5.1、问:ERROR: failed to solve: golang:1.23-alpine: failed to resolve source metadata for docker.io/library/golang:1.23-alp
ine: failed to authorize: failed to fetch oauth token: Post “https://auth.docker.io/token”: dial tcp 31.13.69.245:4
43: connectex: A connection attempt failed because the connected party did not properly respond after a period of t
ime, or established connection failed because connected host has failed to respond.

该问题集中在服务器中拉去镜像超时连接失败。

答:

Linux系统

步骤 1:修改 Docker Daemon 配置 执行:

vim /etc/docker/daemon.json

添加以下内容:

{"registry-mirrors": ["https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com","https://dockerproxy.com"]
}

步骤 2:重启 Docker

systemctl daemon-reload
systemctl restart docker

报错拉取不到镜像就直接拉去: golang:1.23-alpine

Windows

步骤 1:打开 Docker Desktop 设置

  1. 确保 Docker Desktop 已经启动
  2. 点击任务栏 Docker 图标 → 进入 “Settings”(设置)
  3. 在左侧导航栏中,找到 “Docker Engine”

步骤 2:修改 daemon.json 配置

“Docker Engine” 选项卡里,你会看到一个 JSON 配置文件,找到 "registry-mirrors",修改或添加如下内容:

{"registry-mirrors": ["https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://docker.mirrors.ustc.edu.cn","https://registry.docker-cn.com","https://dockerproxy.com"]
}

注意:如果 "registry-mirrors" 字段不存在,直接添加进去。

步骤 3:应用配置并重启 Docker

点击 “Apply & Restart”(应用并重启),等待 Docker Desktop 重启完成。

2、问:本地docker部署运行正常,但是linux报错:Using default tag: latest
Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

答:

windows返回如下证明本地API接通:

{"code": -1,"msg": "fail","data": {"error": "微信 API 错误: invalid code, rid: 67d7db58-4d4f29d9-5c73463c"}
}

阿里云工程师提供的代理镜像就可以(配置一些其他加速地址):

操作步骤

  • vim /etc/docker/daemon.json,将如下配置添加进去

  • service restart docker

{"registry-mirrors": ["https://docker.registry.cyou","https://docker-cf.registry.cyou","https://dockercf.jsdelivr.fyi","https://docker.jsdelivr.fyi","https://dockertest.jsdelivr.fyi","https://mirror.aliyuncs.com","https://dockerproxy.com","https://mirror.baidubce.com","https://docker.m.daocloud.io","https://docker.nju.edu.cn","https://docker.mirrors.sjtug.sjtu.edu.cn","https://docker.mirrors.ustc.edu.cn","https://mirror.iscas.ac.cn","https://docker.rainbond.cc"]
}

这里说明下:提供了其他registry-mirrors,寻求了各大AI工具,均不行,且测试本地流程都可以,就是ECS不行(采用阿里云给的就可以)

如本地可拉取, 可docker save导出为tar.gz文件,然后上传到自己的机器,使用docker load -i XXX.tar.gz解压出来使用。

如果是正式环境业务,可评估将镜像上传到自建仓库管理,通过自建仓库拉取,避免依赖外部仓库通信,影响后续业务稳定性。、

容器镜像个人版免费管理可参考:https://help.aliyun.com/zh/acr/user-guide/use-a-container-registry-personal-edition-instance-to-push-and-pull-images

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt之MVC架构MVD

什么是MVC架构&#xff1a; MVC模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controll…

(C语言)理解 回调函数 和 qsort函数

一. 回调函数 1. 什么是回调函数&#xff1f; 回调函数&#xff08;Callback Function&#xff09;是通过 函数指针 调用的函数。其本质是&#xff1a; 将函数作为参数传递给另一个函数&#xff0c;并在特定条件下被调用&#xff0c;实现 反向控制。 2. 回调函数的使用 回调函…

vscode记录

vs code 下载安装&#xff0c;git 配置&#xff0c;插件安装_vscode安装git插件-CSDN博客 手把手教你在VS Code中使用 Git_vscode如何输入git命令-CSDN博客 VS Code | 如何快速重启VS Code&#xff1f;_vscode 怎么一键全部重启-CSDN博客 1&#xff0c;安装插件与git集成 2&am…

大数据学习(80)-数仓分层

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

数智读书笔记系列021《大数据医疗》:探索医疗行业的智能变革

一、书籍介绍 《大数据医疗》由徐曼、沈江、余海燕合著&#xff0c;由机械工业出版社出版 。徐曼是南开大学商学院副教授&#xff0c;在大数据驱动的智能决策研究领域颇有建树&#xff0c;尤其在大数据驱动的医疗与健康决策方面有着深入研究&#xff0c;曾获天津优秀博士论文、…

SpringSecurity——前后端分离登录认证

SpringSecurity——前后端分离登录认证的整个过程 前端&#xff1a; 使用Axios向后端发送请求 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title><script src"https://cdn…

qt下载和安装教程国内源下载地址

qt不断在更新中&#xff0c;目前qt6日渐成熟&#xff0c;先前我们到官方下载或者国内镜像直接可以下载到exe文件安装&#xff0c;但是最近几年qt官方似乎在逐渐关闭旧版本下载通道&#xff0c;列为不推荐下载。但是qt5以其广泛使用和稳定性&#xff0c;以及积累大量代码使得qt5…

Mysql架构理论部分

Mysql架构是什么&#xff1f;实际可以理解为执行一条sql语句所要经历的阶段有哪些&#xff01; 1.连接层 &#xff08;1&#xff09;客户端发起连接 客户端通过TCP/IP、Unix Socket或命名管道等方式向Mysql服务器发起链接请求 想要了解tcp与udp的区别&#xff0c;可以参考这…

架构师面试(十九):IM 架构

问题 IM 系统从架构模式上包括 【介绍人模式】和 【代理人模式】。介绍人模式也叫直连模式&#xff0c;消息收发不需要服务端的参与&#xff0c;即客户端之间直连的方式&#xff1b;代理人模式也叫中转模式&#xff0c;消息收发需要服务端进行中转。 下面关于这两类模式描述的…

【服务器】RAID0、RAID1、RAID5、RAID6、RAID10异同与应用

目录 ​编辑 一、RAID概述 1.1 磁盘阵列简介 1.2 功能 二、RAID级别 2.1 RAID 0&#xff08;不含校验与冗余的条带存储&#xff09; 2.2 RAID1&#xff08;不含校验的镜像存储&#xff09; 2.3 RAID 5 &#xff08;数据块级别的分布式校验条带存储&#xff09; 4、RAI…

MySQL身份验证的auth_socket插件

在Ubuntu 20.04 LTS上&#xff0c;MySQL 8.0默认使用auth_socket插件进行身份验证&#xff0c;可能存在意想不到的情况。 一、auth_socket插件 在使用sudo mysql或通过sudo切换用户后执行任何MySQL命令时&#xff0c;不需要输入密码或错误密码都可以正常登入mysql数据库&…

使用Python在Word中创建、读取和删除列表 - 详解

目录 工具与设置 Python在Word中创建列表 使用默认样式创建有序&#xff08;编号&#xff09;列表 使用默认样式创建无序&#xff08;项目符号&#xff09;列表 创建多级列表 使用自定义样式创建列表 Python读取Word中的列表 Python从Word中删除列表 在Word中&#xff…

软考-软件设计师-计算机网络

一、七层模型 中继器&#xff1a;信号会随着距离的增加而逐渐衰减&#xff0c;中继器可以接受一端的信息再将其原封不动的发给另一端&#xff0c;起到延长传输距离的作用&#xff1b; 集线器&#xff1a;多端口的中继器&#xff0c;所有端口公用一个冲突域&#xff1b; 网桥&…

关于Flask框架30道面试题及解析

文章目录 基础概念1. 什么是Flask?其核心特性是什么?2. Flask和Django的主要区别?3. 解释Flask中的“路由”概念。如何定义动态路由?核心组件4. Flask的请求上下文(Request Context)和应用上下文(Application Context)有什么区别?5. 如何访问请求参数?POST和GET方法的…

C++20 中 `constexpr` 的强大扩展:算法、工具与复数库的变革

文章目录 一、constexpr 在 <algorithm> 中的应用1. 编译时排序2. 编译时查找 二、constexpr 在 <utility> 中的应用1. 编译时交换2. 编译时条件交换 三、constexpr 在 <complex> 中的应用1. 编译时复数运算 四、总结 C20 对 constexpr 的增强是其最引人注目…

conda create之后,以前的conda env list 只能看到环境路径 没有环境名称了

1.命令 conda env list 看到的显示如下&#xff1a; 左边这列的"base"&#xff0c;指向的路径和其它环境变量安装的路径不一致。 这时需要通过"activate [anaconda的环境路径]"和"source activate"回到anaconda&#xff1a; 2.执行切换命令 …

vulnhub-Tr0ll ssh爆破、wireshark流量分析,exp、寻找flag。思维导图带你清晰拿到所以flag

vulnhub-Tr0ll ssh爆破、wireshark流量分析&#xff0c;exp、寻找flag。思维导图带你清晰拿到所以flag 1、主机发现 arp-scan -l 2、端口扫描 nmap -sS -sV 192.168.66.185 nmap -sS -A -T4 -p- 192.168.66.185 nmap --scriptvuln 192.168.66.185经典扫描三件套&#xff0c;…

强化学习(赵世钰版)-学习笔记(8.值函数方法)

本章是算法与方法的第四章&#xff0c;是TD算法的拓展&#xff0c;本质上是将状态值与行为值的表征方式&#xff0c;从离散的表格形式&#xff0c;拓展到了连续的函数形式。 表格形式的优点是直观&#xff0c;便于分析&#xff0c;缺点是数据量较大或者连续性状态或者行为空间时…

笛卡尔轨迹规划之齐次变换矩阵与欧拉角、四元数的转化

一、笛卡尔轨迹规划需求 笛卡尔轨迹规划本质就是我们对机械臂的末端位置和姿态进行规划&#xff0c;其实也就是对末端坐标系的位姿进行规划。我们清楚末端坐标系的位姿是可以用齐次变换矩阵T来表示的&#xff0c;但这样表示的话&#xff0c;并不利于我们去做规划&#xff0c;所…

大摩闭门会:250321 学习总结报告

如果图片分辨率不足&#xff0c;可右键图片在新标签打开图片或者下载末尾源文件进行查看 本文只是针对视频做相应学术记录&#xff0c;进行学习讨论使用