当前位置: 首页 > news >正文

泰安网站建设介绍站长申论

泰安网站建设介绍,站长申论,国外建设网站情况报告,外贸网站制作设计《XAPI项目》:GitHub仓库(勿打🚫小破站一个) 这篇文档,主要内容是记录使用Docker Compose 部署《XAPI项目》遇道的问题及解决方案 目录 📚 本地MySQL数据如何导入到容器内的MySQL中❎ 解决报错:…

《XAPI项目》:GitHub仓库(勿打🚫小破站一个)
这篇文档,主要内容是记录使用Docker Compose 部署《XAPI项目》遇道的问题及解决方案

目录

  • 📚 本地MySQL数据如何导入到容器内的MySQL中
  • ❎ 解决报错:docker-xapi-backend-1 | q.GetUserInfoByUserAccount err=dial tcp 127.0.0.1:3306: connect: connection refused
    • 原因:docker内的后端项目正尝试连接本地的 MySQL 数据库,但由于 Docker 容器内与宿主机是隔离的,所以无法直接连接到宿主机上的服务。
    • 解决:让后端项目连接到 Docker 容器内运行的 MySQL 服务,而不是本地的 MySQL 服务。
  • ❎ 解决报错:docker-xapi-backend-1 | q.GetUserInfoByUserAccount err=Error 1130: Host '172.22.0.5' is not allowed to connect to this MySQL server
    • 原因:因为MySQL 默认情况下限制了远程主机的连接权限
    • 解决:执行以下 SQL 命令允许来自 Docker 容器内的主机连接:
      • 方法一:登录到MySQL数据库服务器修改权限
      • 方法二[推荐⭐️]:将MySQL容器的配置添加到docker-compose.yml文件,并在其中包含初始化脚本,以便在启动容器时自动执行SQL权限设置。
      • 方法三:创建my.cnf 映射到容器内的 MySQL 配置文件,my.cnf内容为:bind-address = 0.0.0.0
  • ❎ 解决报错:项目A 发起http请求给 项目B时,访问被项目B拒绝
    • 原因:项目A 发起http请求给 项目B时,访问的是本地127.0.0.1,而在容器内,127.0.0.1上的端口各个容器间是隔离,不让访问的
    • 解决:将http请求中项目B的域名修改为指定域名,如果是线上项目自然有域名解析到正确的服务器上,如果是本地测试环境,不存在该域名,就改写hosts,将该域名指向本机IP即可
      • 方法一[推荐⭐️]:使用 extra_hosts 往容器内 /etc/hosts 文件中添加记录
      • 方法二:修改Docker容器的hosts文件来实现
  • 📚 如何查看某一个容器内的ip是多少?
  • ❎ 解决报错:Failed to invoke the method GetInvokeUser
    • 原因分析:调用者通过nacos查询接口时,接口还未注册,说明注册方注册时出现了问题
    • 解决:继续看下一个问题就能解决
  • ❎ 解决报错:error message is retry3times request failed,err=Post "http://nacos:8848/nacos/v1/ns/instance": dial tcp 172.23.0.3:8848: connect: connection refused
    • 原因分析:注册方注册接口到nacos时,连接被拒绝,此时nacos应该还没有初始化完成
    • 解决:继续看下一个问题就能解决
  • 📚 关于 depend_on: 只会等待容器启动,而不会等待容器的服务初始化完成
    • 结论:上面两个问题,是因为nacos容器启动后,backend就马上启动去nacos注册接口,而此时nacos服务还未初始化完成,所以注册失败,所以调用方调用失败。解决方法就是:在backend项目内部使用协程,轮询判断nacos初始化成功后,再去注册接口。
  • ❎ 解决报错:前端项目打包后,动态路由失效了
    • 原因:Ant Design Pro 使用的 Umi 可以使用两种路由方式:browserHistory 和 hashHistory。
    • 解决:[Ant Design Pro 部署的官方文档说明](https://pro.ant.design/zh-CN/docs/deploy/)

📚 本地MySQL数据如何导入到容器内的MySQL中

在启动 Docker 容器后,将本地的 MySQL 数据导入到容器内的 MySQL 数据库中。以下是一种方法:

  1. 准备 SQL 导入文件: 首先,在本地创建一个 SQL 导入文件,该文件包含了你要导入的数据。假设你的 SQL 文件名为 data.sql。
  2. 将 SQL 文件复制到容器内: 在 Docker Compose 文件中的 MySQL 服务部分添加一个卷映射,以将 SQL 文件复制到容器内。你可以将 data.sql 文件放在与 Docker Compose 文件相同的目录中,然后使用以下配置将它复制到容器内:
    mysql:
    image: mysql:8.0
    volumes:- ./xapi/mysql8.0/mysql-data:/var/lib/mysql- ./data.sql:/docker-entrypoint-initdb.d/data.sql
    environment:- MYSQL_ROOT_PASSWORD=root- MYSQL_DATABASE=xapi
    ports:- "3306:3306"
    
    上述配置将 ./data.sql 映射到容器内的 /docker-entrypoint-initdb.d/data.sql,这是 MySQL 容器初始化时会自动运行的 SQL 文件目录。
  3. 重启 MySQL 容器: 启动或重新启动 Docker Compose 时,MySQL 容器将会初始化并执行 data.sql 文件中的 SQL 语句,从而导入数据。
  4. 检查数据导入结果: 通过登录到 MySQL 容器来检查数据是否成功导入。你可以使用以下命令登录到 MySQL 容器:
    docker-compose exec mysql mysql -uroot -p
    
    然后输入 MySQL 的 root 密码(在这里是 “root”),并查询数据库以确保数据已导入。

❎ 解决报错:docker-xapi-backend-1 | q.GetUserInfoByUserAccount err=dial tcp 127.0.0.1:3306: connect: connection refused

原因:docker内的后端项目正尝试连接本地的 MySQL 数据库,但由于 Docker 容器内与宿主机是隔离的,所以无法直接连接到宿主机上的服务。

解决:让后端项目连接到 Docker 容器内运行的 MySQL 服务,而不是本地的 MySQL 服务。

以下是一些步骤:

  1. 首先,确保 Docker 容器内的 MySQL 服务已经正确启动和配置,可以从容器内部访问。
  2. 在后端项目的配置中,将 MySQL 主机地址设置为 Docker 容器名称。容器名称在 Docker Compose 中可以通过服务名称直接访问。
    例如,如果你的 MySQL 服务在 Docker Compose 中命名为 mysql,你可以将后端项目的 MySQL 主机地址设置为 mysql。
    ⚠️ 注意,使用MySQL服务名称已经包含了其所在端口,所以拼接时无需在拼接上端口了。
    docker-compose.yml内:
    environment:
    - DB_HOST=mysql  # 设置 MySQL 主机地址为容器名称
    - DB_USER=root
    - DB_PASSWORD=root
    - DB_NAME=xapi
    
    项目内代码:
    // 从环境变量中获取 MySQL 连接信息
    dbHost := os.Getenv("DB_HOST")
    dbUser := os.Getenv("DB_USER")
    dbPassword := os.Getenv("DB_PASSWORD")
    dbName := os.Getenv("DB_NAME")// 构建 MySQL 连接字符串
    dataSourceName := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=true", dbUser, dbPassword, dbHost, dbName)db.MyDB = db.ConnectionPool(dataSourceName)
    
  3. 重新构建和启动项目的 Docker 容器。

❎ 解决报错:docker-xapi-backend-1 | q.GetUserInfoByUserAccount err=Error 1130: Host ‘172.22.0.5’ is not allowed to connect to this MySQL server

原因:因为MySQL 默认情况下限制了远程主机的连接权限

解决:执行以下 SQL 命令允许来自 Docker 容器内的主机连接:

方法一:登录到MySQL数据库服务器修改权限

mysql -uroot -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.22.0.5' IDENTIFIED BY 'your_password' WITH GRANT OPTION;

将 ‘172.22.0.5’ 替换为你的 Docker 容器内部的主机 IP 地址,将 ‘your_password’ 替换为你的 MySQL root 用户的密码。
然后,刷新 MySQL 权限:

FLUSH PRIVILEGES;

方法二[推荐⭐️]:将MySQL容器的配置添加到docker-compose.yml文件,并在其中包含初始化脚本,以便在启动容器时自动执行SQL权限设置。

version: '3'
services:mysql:image: mysql:8.0 # MySQL的Docker镜像名称,你可以根据需要选择版本environment:- MYSQL_ROOT_PASSWORD=root # 设置MySQL的root密码- MYSQL_DATABASE=xapi # 创建一个MySQL数据库,并设置其名称ports:- "3306:3306" # 映射MySQL的端口volumes:- ./docker-mysql8.0/mysql-data:/var/lib/mysql # 将MySQL数据持久化到宿主机的目录- ./init.sql:/docker-entrypoint-initdb.d/init.sql # 将 ./init.sql 映射到容器内的 /docker-entrypoint-initdb.d/init.sql,这是 MySQL 容器初始化时会自动运行的 SQL 初始化脚本目录。

将一个名为 init.sql 的初始化脚本映射到了 MySQL 容器内部的 /docker-entrypoint-initdb.d/init.sql 目录。这个脚本会在 MySQL 容器启动时自动执行。在 init.sql 文件中,你可以添加设置 MySQL 权限的 SQL 命令,init.sql文件内容如下:

-- 授予用户对数据库的访问权限(替换 database_name)
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'%';
-- 举例:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
GRANT ALL PRIVILEGES ON xapi.* TO 'xapiuser'@'%';-- 刷新权限
FLUSH PRIVILEGES;

替换 username 、database_name 为实际的用户名、数据库名称。然后将这个 init.sql 文件与 docker-compose.yml 放在同一目录下,启动 Docker Compose 时,它会自动运行初始化脚本以设置权限。
⚠️ 注意:该init.sql 只会在容器首次启动时执行,一旦执行过,就会生成/var/lib/mysql 中的数据,也就是只要 /var/lib/mysql 中数据不是空的,之后在重启这个容器,都不会触发init.sql的执行。

方法三:创建my.cnf 映射到容器内的 MySQL 配置文件,my.cnf内容为:bind-address = 0.0.0.0

  1. 打开 MySQL 容器的配置文件 /etc/mysql/my.cnf,你可以通过在 Docker Compose 文件中的 MySQL 服务下添加一个 volumes 来挂载这个文件并修改它。
    mysql:# ...volumes:- ./docker-mysql8.0/mysql-data:/var/lib/mysql- ./init.sql:/docker-entrypoint-initdb.d/init.sql- ./my.cnf:/etc/mysql/my.cnf  # 将 my.cnf 映射到容器内的 MySQL 配置文件
    
    创建一个名为 my.cnf 的配置文件并添加以下内容:
    [mysqld]
    bind-address = 0.0.0.0
    
    这将允许 MySQL 服务器接受来自任何 IP 地址的连接。
  2. 重新启动你的 Docker 容器。确保 MySQL 容器已经重新启动并应用了新的配置。

❎ 解决报错:项目A 发起http请求给 项目B时,访问被项目B拒绝

原因:项目A 发起http请求给 项目B时,访问的是本地127.0.0.1,而在容器内,127.0.0.1上的端口各个容器间是隔离,不让访问的

解决:将http请求中项目B的域名修改为指定域名,如果是线上项目自然有域名解析到正确的服务器上,如果是本地测试环境,不存在该域名,就改写hosts,将该域名指向本机IP即可

方法一[推荐⭐️]:使用 extra_hosts 往容器内 /etc/hosts 文件中添加记录

version: '3'networks:xapi_net:services:backend:image: xapi-backend-image # 后端项目的Docker镜像名称ports:- "8090:8090" # 映射后端项目的端口depends_on:- mysql- nacos- gatewayvolumes:- ./docker-xapi-backend/conf:/app/conf # 将MySQL数据持久化到宿主机的目录extra_hosts:- "xapi-gateway.com:192.168.2.104" 

方法二:修改Docker容器的hosts文件来实现

  1. 创建一个自定义的hosts文件,该文件包含你想要的主机名和IP地址的映射。例如,你可以创建一个名为 custom_hosts 的文本文件,内容如下:
    192.168.2.104 xapi-gateway.com
    
  2. 将这个自定义hosts文件挂载到你的Docker容器中。在你的Docker Compose文件或Docker运行命令中,使用 -v 选项来挂载这个文件。假设你要挂载到名为 mycontainer 的容器,可以使用以下命令:
    docker run -d --name mycontainer -v /path/to/custom_hosts:/etc/hosts my_image
    
    或者,如果你正在使用Docker Compose,可以将 volumes 属性添加到你的服务定义中:
    version: '3'
    services:
    myservice:image: my_imagevolumes:- /path/to/custom_hosts:/etc/hosts
    
  3. 重新启动你的容器,以便使用新的hosts文件。你的容器现在应该能够将 xapi-gateway.com 解析为 192.168.2.104。

📚 如何查看某一个容器内的ip是多少?

在该Docker Compose配置中,服务都连接到了一个自定义的网络 xapi_net。可以使用以下命令来查找某个服务容器的IP地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

例如,如果你想查找 backend 服务的IP地址,可以运行以下命令:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' backend

❎ 解决报错:Failed to invoke the method GetInvokeUser

详细错误日志

docker-xapi-gateway-1  | 2023-09-09T09:30:53.982Z       WARN    proxy/proxy.go:210      [CallProxy] received rpc err: Failed to invoke the method GetInvokeUser. No provider available for the service tri://:@172.23.0.4:80/?interface=rpc_api.UserInfo&group=&version= from registry nacos://nacos:8848?registry=nacos&registry.group=&registry.label=true&registry.namespace=&registry.preferred=false&registry.role=0&registry.timeout=5s&registry.ttl=10s&registry.weight=0&registry.zone=&remote-client-name=dubbo.registries-nacos-nacos%3A8848&simplified=false on the consumer 172.23.0.4 using the dubbo version 3.0.0 .Please check if the providers have been started and registered.

错误解析:

  1. Failed to invoke the method GetInvokeUser:这是Dubbo服务调用中的一个方法名,表示在Dubbo消费者中尝试调用名为 GetInvokeUser 的方法时出现了问题。
  2. No provider available for the service:这表示Dubbo消费者无法找到提供名为 tri://:@172.23.0.4:80/?interface=rpc_api.UserInfo&group=&version= 的服务的提供者。
  3. from registry nacos://nacos:8848?registry=nacos&registry.group=&registry.label=true&registry.namespace=&registry.preferred=false&registry.role=0&registry.timeout=5s&registry.ttl=10s&registry.weight=0&registry.zone=&remote-client-name=dubbo.registries-nacos-nacos%3A8848&simplified=false:这是从Nacos注册中心获取服务提供者信息的详细信息,它指定了使用Nacos进行服务发现的配置。
  4. Please check if the providers have been started and registered:这是建议,意思是你应该检查服务提供者是否已经启动并在Nacos注册中心进行了注册。

原因分析:调用者通过nacos查询接口时,接口还未注册,说明注册方注册时出现了问题

解决:继续看下一个问题就能解决

❎ 解决报错:error message is retry3times request failed,err=Post “http://nacos:8848/nacos/v1/ns/instance”: dial tcp 172.23.0.3:8848: connect: connection refused

docker-xapi-backend-1  | 2023-09-09T10:06:57.033Z       ERROR   protocol/protocol.go:201        provider service tri://:@:20000/?interface=rpc_api.IntefaceInfo&group=&version= register registry nacos://:@nacos:8848/?interface=rpc_api.IntefaceInfo&group=&version= error, error message is retry3times request failed,err=Post "http://nacos:8848/nacos/v1/ns/instance": dial tcp 172.23.0.3:8848: connect: connection refuseddocker-xapi-backend-1  | 2023-09-09T10:06:57.033Z       ERROR   config/provider_config.go:149   service IntefaceInfoServerImpl export failed! err: Registry protocol new exporter error, registry is {nacos://nacos:8848?nacos.access=&nacos.group=DEFAULT_GROUP&nacos.namespaceId=&nacos.password=&nacos.secret=&nacos.username=&registry=nacos&registry.group=&registry.label=true&registry.namespace=&registry.preferred=false&registry.role=3&registry.timeout=5s&registry.ttl=10s&registry.weight=0&registry.zone=&remote-client-name=dubbo.registries-nacos-nacos%3A8848&simplified=false&timeout=5s}, url is {tri://:20000/rpc_api.IntefaceInfo?accesslog=&app.version=3.0.0&application=dubbo.io&auth=&bean.name=IntefaceInfoServerImpl&cluster=failover&config.tracing=&environment=dev&execute.limit=&execute.limit.rejected.handler=&export=true&interface=rpc_api.IntefaceInfo&loadbalance=random&message_size=4&metadata-type=local&module=sample&name=dubbo.io&organization=dubbo-go&owner=dubbo-go&param.sign=&pid=1&registry=nacos&registry.role=3&release=dubbo-golang-3.0.0&retries=&serialization=&service.filter=echo%2Cmetrics%2Ctoken%2Caccesslog%2Ctps%2Cgeneric_service%2Cexecute%2Cpshutdown&side=provider&timestamp=1694254017&tps.limit.interval=&tps.limit.rate=&tps.limit.rejected.handler=&tps.limit.strategy=&tps.limiter=&warmup=}docker-xapi-backend-1  | 2023-09-09T10:06:57.044Z       ERROR   protocol/protocol.go:201        provider service tri://:@:20000/?interface=rpc_api.UserInfo&group=&version= register registry nacos://:@nacos:8848/?interface=rpc_api.UserInfo&group=&version= error, error message is retry3times request failed,err=Post "http://nacos:8848/nacos/v1/ns/instance": dial tcp 172.23.0.3:8848: connect: connection refused

原因分析:注册方注册接口到nacos时,连接被拒绝,此时nacos应该还没有初始化完成

解决:继续看下一个问题就能解决

📚 关于 depend_on: 只会等待容器启动,而不会等待容器的服务初始化完成

在docker-compose.yml中,我们写了

backend:image: xiaoxiongmao5/xapi-backend:1.0.5container_name: xapi-backendports:- "8090:8090"depends_on:- mysql- nacos	#这里 depends_on nacos,只会等待容器启动- gateway

这意味着虽然backend容器等待nacos容器启动,但它不能确保nacos内部的服务已经完全初始化并准备好接受连接。

要解决这个问题,可以在backend项目内添加一些逻辑来等待nacos服务准备就绪。一种常见的做法是使用一个轮询机制,不断地检查nacos服务是否已经可用。可用后再加载nacos相关的配置。

// 参数: Nacos 服务地址和端口
func RegisterServiceToNacos(nacosHost string, nacosPort int) {// 最大尝试次数和当前尝试次数maxAttempts := 30attempt := 1// 循环检查 Nacos 服务是否可用for attempt <= maxAttempts {url := fmt.Sprintf("http://%s:%d/nacos/health", nacosHost, nacosPort)resp, err := http.Get(url)if err == nil && resp != nil && resp.StatusCode == http.StatusOK {glog.Log.Info("Nacos is up and running, starting backend service...")//开始加载nacos相关的配置LoadDubboConfig()break} else {glog.Log.Infof("Attempt %d: Nacos is not ready yet, waiting...", attempt)attempt++time.Sleep(5 * time.Second)}}if attempt > maxAttempts {glog.Log.Info("Max attempts reached. Nacos may not be available.")// 在这里可以添加适当的错误处理或退出逻辑} else {// Nacos 可用后执行启动后端服务的操作// 示例:启动后端服务// startBackendService()}
}

上述函数将等待Nacos服务最多30次,每次等待5秒,以检查Nacos是否已准备就绪。一旦Nacos服务就绪,它将加载nacos相关的配置。

结论:上面两个问题,是因为nacos容器启动后,backend就马上启动去nacos注册接口,而此时nacos服务还未初始化完成,所以注册失败,所以调用方调用失败。解决方法就是:在backend项目内部使用协程,轮询判断nacos初始化成功后,再去注册接口。

❎ 解决报错:前端项目打包后,动态路由失效了

访问 http://localhost:8000/interface_info/2
显式如下:

Error response
Error code: 404Message: File not found.Error code explanation: HTTPStatus.NOT_FOUND - Nothing matches the given URI.

请求日志如下:

docker-xapi-frontend-1  | 172.22.0.1 - - [09/Sep/2023:16:40:19 +0000] "GET /interface_info/2 HTTP/1.1" 404 555 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" "-"
docker-xapi-frontend-1  | 2023/09/09 16:40:19 [error] 32#32: *18 open() "/usr/share/nginx/html/interface_info/2" failed (2: No such file or directory), client: 172.22.0.1, server: localhost, request: "GET /interface_info/2 HTTP/1.1", host: "localhost", referrer: "http://localhost/"

原因:Ant Design Pro 使用的 Umi 可以使用两种路由方式:browserHistory 和 hashHistory。

解决:Ant Design Pro 部署的官方文档说明

config.ts

export default defineConfig({history: { type: 'browser' }, // 默认是 browser

nginx.conf

server {listen 80;root /usr/share/nginx/html;location / {# 用于配合 browserHistory使用try_files $uri $uri/index.html /index.html;}
}

dockerfile

# 使用一个基础的 Node.js 镜像
FROM node:14 as builder# 设置工作目录
WORKDIR /app# 将本地项目文件复制到容器中
COPY . .# 安装依赖并构建前端应用程序
RUN npm install
RUN npm run build# 第二阶段:使用一个基础的 Nginx 镜像来创建最终的容器
FROM nginx:alpine# 复制自定义Nginx配置文件
COPY nginx.conf /etc/nginx/conf.d/default.conf# 复制构建后的前端文件到 Nginx 的默认站点目录
COPY --from=builder /app/dist /usr/share/nginx/html# 定义容器暴露的端口
EXPOSE 80# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]

docker-compose.yml

version: '3'
services:single-frontend:build:context: .dockerfile: Dockerfileports:- "80:80"  # 映射容器的80端口到主机的80端口restart: always  # 总是重新启动容器

文章转载自:
http://maurist.yzkf.cn
http://convolvulus.yzkf.cn
http://abstinency.yzkf.cn
http://tenonitis.yzkf.cn
http://yesternight.yzkf.cn
http://phencyclidine.yzkf.cn
http://crinkleroot.yzkf.cn
http://geopressured.yzkf.cn
http://legitimation.yzkf.cn
http://ordnance.yzkf.cn
http://honolulu.yzkf.cn
http://boneblack.yzkf.cn
http://deepie.yzkf.cn
http://greenlining.yzkf.cn
http://warve.yzkf.cn
http://nymphaeaceous.yzkf.cn
http://eben.yzkf.cn
http://prospectus.yzkf.cn
http://hardback.yzkf.cn
http://dentation.yzkf.cn
http://effigy.yzkf.cn
http://aidman.yzkf.cn
http://verve.yzkf.cn
http://aliyah.yzkf.cn
http://trinal.yzkf.cn
http://eurythmic.yzkf.cn
http://prepose.yzkf.cn
http://stokehold.yzkf.cn
http://consultative.yzkf.cn
http://unreclaimable.yzkf.cn
http://pretext.yzkf.cn
http://lubricous.yzkf.cn
http://bulletin.yzkf.cn
http://caldarium.yzkf.cn
http://berried.yzkf.cn
http://nastic.yzkf.cn
http://understratum.yzkf.cn
http://radiocompass.yzkf.cn
http://lem.yzkf.cn
http://cobaltiferous.yzkf.cn
http://chian.yzkf.cn
http://malarious.yzkf.cn
http://landswoman.yzkf.cn
http://sarcomere.yzkf.cn
http://babyless.yzkf.cn
http://ermengarde.yzkf.cn
http://unfasten.yzkf.cn
http://concomitance.yzkf.cn
http://drecky.yzkf.cn
http://czaritza.yzkf.cn
http://opsin.yzkf.cn
http://reinvestigation.yzkf.cn
http://trounce.yzkf.cn
http://enmesh.yzkf.cn
http://spence.yzkf.cn
http://leucoderma.yzkf.cn
http://thistle.yzkf.cn
http://plastics.yzkf.cn
http://transaminate.yzkf.cn
http://preordain.yzkf.cn
http://horary.yzkf.cn
http://cytophotometry.yzkf.cn
http://myristic.yzkf.cn
http://pregalactic.yzkf.cn
http://miserere.yzkf.cn
http://gentilesse.yzkf.cn
http://microlitre.yzkf.cn
http://supermundane.yzkf.cn
http://sirgang.yzkf.cn
http://microdistribution.yzkf.cn
http://blastula.yzkf.cn
http://thane.yzkf.cn
http://compromise.yzkf.cn
http://inauguratory.yzkf.cn
http://recomfort.yzkf.cn
http://undertaker.yzkf.cn
http://caroline.yzkf.cn
http://gallantly.yzkf.cn
http://loss.yzkf.cn
http://ingravescent.yzkf.cn
http://winfred.yzkf.cn
http://hairbrush.yzkf.cn
http://suffuse.yzkf.cn
http://superintend.yzkf.cn
http://nonperformance.yzkf.cn
http://floe.yzkf.cn
http://langostino.yzkf.cn
http://overgraze.yzkf.cn
http://locomote.yzkf.cn
http://decapacitation.yzkf.cn
http://sleeper.yzkf.cn
http://serial.yzkf.cn
http://username.yzkf.cn
http://maulvi.yzkf.cn
http://anywhither.yzkf.cn
http://thrasher.yzkf.cn
http://apsidal.yzkf.cn
http://stalin.yzkf.cn
http://impetus.yzkf.cn
http://zonkey.yzkf.cn
http://www.15wanjia.com/news/65423.html

相关文章:

  • 广西北海联友建设网站管理seo关键词外包
  • 买个域名后怎么做网站广州网络推广培训
  • 越南做网站百度seo排名优化是什么
  • 网站评估 源码百度app营销软件
  • 自己开发网站怎么开发百度关键字推广费用
  • 代码网站模板哈尔滨电话本黄页
  • 网站 风格想找搜索引擎优化
  • 做酒招代理的网站免费网站推广软文发布
  • 中国建设银行官方网站汇率免费网络推广100种方法
  • 自己做网站赚佣金百度推广工资多少钱一个月
  • 做雕塑网站找哪家好广州百度推广代理公司
  • 法律推广网站seoul是哪个城市
  • 政府投资类网站建设单位时事新闻最新
  • ps做游戏下载网站有哪些内容有什么可以做推广的软件
  • 西安网站设计开发人才培训网站模板
  • 自己建网站做淘宝客靠谱吗腾讯企点账户中心
  • 京网站建设公司seo公司的选上海百首网络
  • 梧州网站推广seowhy论坛
  • 淄博哪有培训做网站的seo搜索排名优化方法
  • 保靖网站建设广告营销平台
  • 番禺微网站建设个人免费网站建设
  • 可以做任务的创意设计网站seo实战培训学校
  • php网站源码建设教程黑帽seo365t技术
  • 长春 网站建设百度联盟广告
  • 百度我的网站搜索引擎优化的概念是什么
  • 重庆建网站品牌策划方案范文
  • 自己做的网站怎么发布win7百度一下手机版首页
  • 网页设计师培训费用预算图重庆seo优化效果好
  • 廊坊哪里有制作手机网站的百度搜索引擎收录入口
  • 织梦网站怎么做伪静态页面seo好seo