运维必备技能:Docker-Consol服务自动注册与发现

运维必备技能:Docker-Consol服务自动注册与发现每个服务专注于单一业务功能,服务之间采用轻量级通信机制相互沟通。然后使用一条命令将多个容器启动,DockerCompose会通过解析容器件的依赖

大家好,欢迎来到IT知识分享网。

技能目标:

· 掌握Docker网络原理

· 掌握Compose的安装及YAML文件详解

· 掌握Consol服务自动注册和更新

3.1 案例分析

3.1.1 案例概述

Docker容器技术同样受到关注的微服务架构也在潜移默化的改变着应用的部署方式,其提倡将应用分割成一系列细小的服务,每个服务专注于单一业务功能,服务之间采用轻量级通信机制相互沟通。同时,数据库解决方案也在发生在变化,多种持久化混合方案(Polyglot Persistence)提倡将数据存放在最适合的数据库解决方案中,而传统的数据库解决方案将数据存在在同一个数据库服务中。服务数量的增加也就意味着容器数量的增多,逐渐增加的容器数量为容器部署,运行及管理带来了挑战。Docker Compose的出现解决多个容器部署的问题并提高了多个容器解决方案的可移植性。

使用Docker将Consul、Consul Template、Registrator和Nginx组装成一个值得信任且可扩展的服务框架,这套架构在这个框架中添加和移除服务,不需要重写任何配置,也不需要重启任何服务,一切都能正常运行。

3.1.2 案例前置知识点

1. 什么是Docker Compose

Docker Compose的前身是Fig,它是一个定义及运行多个Docker容器的工具。使用Docker Compose你只需要在一个配置文件中定义多个Docker容器,然后使用一条命令将多个容器启动,Docker Compose会通过解析容器件的依赖关系(link, 网络容器 –net-from或数据容器 –volume-from)按先后顺序启动所定义的容器

2. 什么是Consul

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Consul的方案更”一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。

3.1.3 案例环境

1. 本案例实验环境

运维必备技能:Docker-Consol服务自动注册与发现

本案例环境如表3-1所示。

表3-1创建Docker Compose 及consul环境

2. 案例需求

1)创建单机网络下容器与容器之间互通。

2)使用docker compose创建容器。

3)搭建consul服务自动发现和更新。

3. 案例实现思路

1)Docker 网络通信。

2)Docker Compose容器编排及命令说明。

3)通过Docker Compose创建lnmp环境。

4)基于Nginx和Consul构建容器自动发现与注册。

3.2 案例实施

3.2.1 Docker网络通信

Docker提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。

1. 端口映射

在启动容器的时候,如果不指定对应的端口,在容器外是无法通过网络来访问容器内的服务。Docker提供端口映射机制来将容器内的服务提供给外部网络访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口便可访问容器内的服务。

实现端口映射,需要在运行docker run命令时使用-P(大写) 选项实现随机映射,Docker会随机映射一个端口到容器内部开放的网络端口。 例如:

[root@consul ~]# docker pull httpd

[root@consul ~]# docker run -d -P httpd

24ab31d7879c3544ce540a66cbc0cccb06c8e213a3c01cad0d4abfed5

此时,使用docker –ps 命令可以看到,本机的32768端口被映射到了容器中的80端口。那么访问宿主机的32768端口即可访到容器内web应用提供的界面。

[root@ consul ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

34ec7fd9538a httpd “httpd-foreground” 9 seconds ago Up 7 seconds 0.0.0.0:32768->80/tcp happy_almeida

还可以在运行docker run命令时使用-p(小写)选项实现指定要映射的端口,例如:

[root@consul ~]# docker run -d -p 49280:80 httpd

c8b185af1e92a04927a2a8e57a47183fd9745afce224cecd084c4ae657

此时,将本机的49280端口被映射到了容器中的80端口。

[root@consul ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

c8b185af1e92 httpd “httpd-foreground” 10 seconds ago Up 7 seconds 0.0.0.0:49280->80/tcp backstabbing_feynman

2. 容器互联

容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道从而实现的互联。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

在运行docker run命令时使用–link选项实现容器之间的互联通信。

格式为 –link name:alias

其中name是要连接的容器名称,alias是这个连接的别名。

注意:容器互联是通过容器的名称来执行的,–name选项可以给容器创建一个友好的名称,这个名称是唯一的。如果已经命名了一个相同名称的容器,当要再次使用这个名称时,需先使用docker rm删除之前创建的同名容器。

下面是使用容器互联技术实现容器间通信的例子:

1)创建源容器

使用docker run命令建立容器A ,使用–name指定容器名称为web1。

[root@consul ~]# docker run -d -P –name web1 httpd

4ca528f3d96b6979ea41aafd4a730d4984d0ca36f65ff4625e7ef26655a12f38

2)创建接收容器

使用docker run 命令建立容器B,–name指定名称为web2,–link指定连接容器以实现容器互联。

[root@consul ~]# docker run -d -P –name web2 –link web1:web1 httpd

9fdd921d7d24e05c76e724b0bef87cec8acef6024aa9f1105e

3)测试容器互联

最简单的检测方法是进入容器,使用ping命令查看容器是否相互连通。

[root@consul ~]# docker exec -it web2 /bin/bash

root@9fdd921d7d24:/usr/local/apache2## ping web1

PING web1 (172.17.0.7) 56(84) bytes of data.

64 bytes from web1 (172.17.0.7): icmp_seq=1 ttl=64 time=0.804 ms

64 bytes from web1 (172.17.0.7): icmp_seq=2 ttl=64 time=0.340 ms

^C

— web1 ping statistics —

2 packets transmitted, 2 received, 0% packet loss, time 1003ms

rtt min/avg/max/mdev = 0.340/0.572/0.804/0.232 ms

[root@9fdd921d7d24 /]#

此时,可以看到容器web2与容器web1已经建立互联关系。这时Docker在两个互联的容器之间创建了一条安全隧道,而且不用映射它们的端口到宿主机上,从而避免暴露端口到外部网络。

3.2.2 Docker Compose容器编排

Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景。

1. Docker Compose环境安装

下载最新版的docker-compose文件

[root@consul ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

[root@consul ~]# chmod +x /usr/local/bin/docker-compose

[root@consul ~]# docker-compose -v

docker-compose version 1.21.1, build 5a3f1a3

2. 文件格式及编写注意事项

YAML是一种标记语言很直观的数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML简单的很多。YAML数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号括起来, hash用花括号括起来。

1) 不支持制表符 tab键缩进,需要使用空格缩进。

2) 通常开头缩进两个空格

3) 字符后缩进一个空格,如冒号、逗号、横杆

4) 用#号注释

5) 如果包含特殊字符用单引号引起来

6) 布尔值(true、 false、 yes、 no、 on、 off)必须用引号括起来,这样分析器会将他们解释为字符串。

3. 配置常用字段描述

配置常用字段描述如表3-2所示。

表3-2 常用字段描述表

4. Docker Compose 常用命令

Docker Compose 常用命令如表3-3所示。

表3-3 Docker Compose常用命令描述表

5. docker-compose文件结构和示例

[root@consul ~]# mkdir compose_lnmp

[root@consul ~]# cd compose_lnmp

[root@localhost compose_lnmp]# vim docker-compose.yml

version: ‘3’

services:

nginx:

hostname: nginx

build:

context: ./nginx

dockerfile: Dockerfile

ports:

– 81:80

networks:

– lnmp

volumes:

– ./wwwroot:/usr/local/nginx/html

php:

hostname: php

build:

context: ./php

dockerfile: Dockerfile

networks:

– lnmp

volumes:

– ./wwwroot:/usr/local/nginx/html

mysql:

hostname: mysql

image: mysql:5.6

ports:

– 3306:3306

networks:

– lnmp

volumes:

– ./mysql/conf:/etc/mysql/conf.d

– ./mysql/data:/var/lib/mysql

command: –character-set-server=utf8

environment:

MYSQL_ROOT_PASSWORD:

MYSQL_DATABASE: wordpress

MYSQL_USER: user

MYSQL_PASSWORD: user123

networks:

lnmp:

3.2.3 Compose 命令说明及lnmp环境部署

大部分命令都可以运行在一个或多个服务上。如果没有特别的说明,命令则应用在项目所有的服务上。执行 docker-compose [COMMAND] –help 查看具体某个命令的使用说明。

1. 基本的使用格式

docker-compose [options] [COMMAND] [ARGS…]

2. docker-compose选项

–verbose 输出更多调试信息。

–version 打印版本并退出。

-f, –file FILE 使用特定的 compose 模板文件,默认为 docker-compose.yml。

-p, –project-name NAME 指定项目名称,默认使用目录名称。

3. 创建lnmp环境

1)查看lnmp环境目录结构

[root@consul compose_lnmp]# tree .

.

├── docker-compose.yml

├── mysql

│ ├── conf

│ │ └── my.cnf

│ └── data

├── nginx

│ ├── Dockerfile

│ ├── nginx-1.12.1.tar.gz

│ └── nginx.conf

├── php

│ ├── Dockerfile

│ ├── php-5.6.31.tar.gz

│ └── php.ini

└── wwwroot

└── index.php

6 directories, 9 files

2)使用docker-compose构建lnmp环境在后台运行

构建lnmp环境需要一段时间,请耐心等待!

[root@consul compose_lnmp]# docker-compose -f docker-compose.yml up -d

Creating network “compose_lnmp_lnmp” with the default driver

Building nginx

Step 1/10 : FROM centos:7

7: Pulling from library/centos

7dc0dca2b151: Pull complete

Digest: sha256:b67d21dfe609ddacfe04631d90ae81c40aeaf3391f6717fa5322

Status: Downloaded newer image for centos:7

—> 49f7960eb7e4

Step 2/10 : MAINTAINER www.kgc.cn

—> Running in 43a5fb917bba

Removing intermediate container 43a5fb917bba

—> 47f4a6ccb11d

Step 3/10 : RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel

—> Running in 611c06a87fb7

…//省略部分

Digest: sha256:0267b9b43034ed630e94f846ca6c6c7d39d43d4dbe8d1404e1129

Status: Downloaded newer image for mysql:5.6

Creating compose_lnmp_nginx_1 … done

Creating compose_lnmp_php_1 … done

Creating compose_lnmp_mysql_1 … done

3)查看lnmp环境的容器

[root@consul compose_lnmp]# docker-compose ps

Name Command State Ports

————————————————————————————–

compose_lnmp_mysql_1 docker-entrypoint.sh –cha … Up 0.0.0.0:3306->3306/tcp

compose_lnmp_nginx_1 ./sbin/nginx -g daemon off; Up 0.0.0.0:81->80/tcp

compose_lnmp_php_1 ./sbin/php-fpm -c /usr/loc … Up 9000/tcp

4)验证docker-compose创建的lnmp环境

客户端使用浏览器验证docker-compose创建的lnmp环境,如图3.1所示。

PS:如果访问报Access denined.,手动进入nginx容器添加读权限。

[root@nginx ~]# chmod 644 /usr/local/nginx/html/index.php

运维必备技能:Docker-Consol服务自动注册与发现

图3.1

3.2.4 基于Nginx和Consul构建自动发现的Docker服务架构

1. 建立Consul 服务

要想利用Consul提供的服务实现服务的注册与发现,我们需要建立Consul服务。在Consul方案中,每个提供服务的节点上都要部署和运行Consul的agent,所有运行Consul agent节点的集合构成Consul Cluster。Consul agent有两种运行模式:Server和Client。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上 的应用服务无关。以Server模式运行的Consul agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server mode的Agent,Client节点不限。

[root@consul ~]# mkdir consul

[root@ consul ~]# cd consul/

将consul压缩包上传到/root/consul目录下

[root@ consul consul]# unzip consul_0.9.2_linux_amd64.zip

[root@ consul consul]# mv consul /usr/bin/

[root@ consul ~]# consul agent \

> -server \

> -bootstrap \

> -ui \

> -data-dir=/var/lib/consul-data \

> -bind=192.168.168.91 \

> -client=0.0.0.0 \

> -node=consul-server01

· -bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。

· -data-dir 参数指定数据存储目录

· -bind -bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。

· -ui 参数指定开启UI界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的web UI 界面。

· -client consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1。

· -node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。

//放到后台命令启动

[root@consul ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.168.91 -client=0.0.0.0 -node=consurl-server01 &>/var/log/consul.log &

安装consul是用于服务注册,也就是容器本身的一些信息注册到consul里面,其他程序可以通过consul获取注册的相关服务信息,这是就是所为的服务注册与发现。

2. 查看集群信息

[root@ consul ~]# consul members

Node Address Status Type Build Protocol DC

consul-server01 192.168.168.91:8301 alive server 0.9.2 2 dc1

[root@ consul ~]# consul info | grep leader

leader = true

leader_addr = 192.168.168.91:8300

3. 通过http api获取集群信息

[root@ consul ~]# curl 127.0.0.1:8500/v1/status/peers //查看集群server成员

[root@ consul ~]# curl 127.0.0.1:8500/v1/status/leader //集群Raf leader

[root@ consul ~]# curl 127.0.0.1:8500/v1/catalog/services //注册的所有服务

[root@ consul ~]# curl 127.0.0.1:8500/v1/catalog/nginx //查看nginx服务信息

[root@ consul ~]# curl 127.0.0.1:8500/v1/catalog/nodes //集群节点详细信息

3.2.5 容器服务自动加入Nginx集群

1. 安装gliderlabs/registrator

Gliderlabs/registrator检查容器运行状态自动注册和注销docker容器的服务到服务配置中心。目前支持Consul、etcd和SkyDNS2。

//在192.168.168.92节点操作

[root@registrator ~]# docker run -d \

> –name=registrator \

> –net=host \

> -v /var/run/docker.sock:/tmp/docker.sock \

> –restart=always \

> gliderlabs/registrator:latest \

> -ip=192.168.168.92 \

> consul://192.168.168.91:8500

2. 测试服务发现功能是否正常

[root@registrator ~]# docker run -itd -p:83:80 –name test-01 -h test01 nginx

[root@registrator ~]# docker run -itd -p:84:80 –name test-02 -h test02 nginx

[root@registrator ~]# docker run -itd -p:88:80 –name test-03 -h test03 httpd

[root@registrator ~]# docker run -itd -p:89:80 –name test-04 -h test04 httpd

3. 验证http和nginx服务是否注册到consul

浏览器输入http://192.168.168.91:8500,点击”NODES”,再点击”consurl-server01″”,会出现5个服务,如图3.2所示。

运维必备技能:Docker-Consol服务自动注册与发现

图3.2

[root@consul ~]# curl 127.0.0.1:8500/v1/catalog/services

{“consul”:[],”httpd”:[],”nginx”:[]} //从结果看,httpd和nginx服务已经注册到consul里面,说明服务正常。

//在192.168.168.91上操作

4. 安装consul-template

Consul-Template是基于Consul的自动替换配置文件的应用。在Consul-Template没出现之前,构建服务大多采用的是Zookeeper、Etcd+Confd这样类似的系统。Consul-template是一个守护进程,用于实时查询consul集群信息,并更新文件系统上的的任意数量的指定模板,生成配置文件,更新完成以后可以选择运行shell命令执行更新操作重加载nginx。

Consul-Template可以查询Consul中的服务目录、Key、Key-values等。这种强大的抽象功能和查询语言模板可以使Consul-Template特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends、Varnish Servers、Application Configurations等。

5. 准备template nginx模板文件

[root@consul ~]# vim /root/consul/nginx.ctmpl

upstream http_backend {

{{range service “nginx”}}

server {{ .Address }}:{{ .Port }};

{{ end }}

}

server {

listen 83;

server_name localhost 192.168.168.91;

access_log /var/log/nginx/kgc.cn-access.log;

index index.html index.php;

location / {

proxy_set_header HOST $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Client-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://http_backend;

}

}

6. 编译安装nginx

手动上传nginx-1.12.0.tar.gz包到/root目录下。

[root@consul ~]# yum install gcc pcre-devel zlib-devel -y

[root@consul ~]# tar zxvf nginx-1.12.0.tar.gz

[root@consul ~]# cd nginx-1.12.0

[root@consul nginx-1.12.0]# ./configure –prefix=/usr/local/nginx

[root@consul nginx-1.12.0]# make

[root@consul nginx-1.12.0]# make install

7. 配置nginx

[root@consul ~]#vim /usr/local/nginx/conf/nginx.conf

include vhost/*.conf; //在http段里面添加虚拟主机目录

[root@consul ~]#mkdir /usr/local/nginx/conf/vhost/

8. 配置并启动template

手动上传consul-template_0.19.3_linux_amd64.zip包到/root目录下。

[root@consul ~]# unzip consul-template_0.19.3_linux_amd64.zip

[root@consul ~]# mv consul-template /usr/bin/

在前台启动template服务,启动后不要按ctrl+c中止。

[root@consul ~]# consul-template -consul-addr 192.168.168.91:8500 -template “/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload” –log-level=info

2018/07/11 03:51:27. [INFO] consul-template v0.19.3 (ebf2d3d)

2018/07/11 03:51:27. [INFO] (runner) creating new runner (dry: false, once: false)

2018/07/11 03:51:27. [INFO] (runner) creating watcher

2018/07/11 03:51:27. [INFO] (runner) starting

2018/07/11 03:51:27. [INFO] (runner) initiating run

2018/07/11 03:51:27. [INFO] (runner) initiating run

2018/07/11 03:51:27. [INFO] (runner) rendered “/root/consul/nginx.ctmpl” => “/usr/local/nginx/conf/vhost/kgc.conf”

2018/07/11 03:51:27. [INFO] (runner) executing command “/usr/local/nginx/sbin/nginx -s reload” from “/root/consul/nginx.ctmpl” => “/usr/local/nginx/conf/vhost/kgc.conf”

2018/07/11 03:51:27. [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload

需要指定template模板文件及生成路径即可,生成的配置文件如下。

[root@consul ~]# cat /usr/local/nginx/conf/vhost/kgc.conf

upstream http_backend {

server 192.168.168.92:84;

server 192.168.168.92:83;

}

server {

listen 83;

server_name localhost 192.168.168.91;

access_log /var/log/nginx/kgc.cn-access.log;

index index.html index.php;

location / {

proxy_set_header HOST $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Client-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://http_backend;

}

}

9. 访问template-nginx配置文件

通过浏览访问template-nginx配置文件里面nginx监听的83端口,访问成功如图3.3所示。

运维必备技能:Docker-Consol服务自动注册与发现

图3.3

10. 增加一个nginx容器节点

增加一个nginx容器节点,测试服务发现及配置更新功能。

[root@registrator ~]# docker run -itd -p:85:80 –name test-05 -h test05 nginx

1)观察template服务,会从模板更新/usr/local/nginx/conf/vhost/kgc.conf文件内容,并且重载nginx服务。

2018/07/11 05:27:28. [INFO] (runner) initiating run

2018/07/11 05:27:28. [INFO] (runner) rendered “/root/consul/nginx.ctmpl” => “/usr/local/nginx/conf/vhost/kgc.conf”

2018/07/11 05:27:28. [INFO] (runner) executing command “/usr/local/nginx/sbin/nginx -s reload” from “/root/consul/nginx.ctmpl” => “/usr/local/nginx/conf/vhost/kgc.conf”

2018/07/11 05:27:28. [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload

2)查看/usr/local/nginx/conf/vhost/kgc.conf文件内容

[root@consul ~]# cat /usr/local/nginx/conf/vhost/kgc.conf

upstream http_backend {

server 192.168.168.92:83;

server 192.168.168.92:84;

server 192.168.168.92:85;

}

……//省略部分

3)查看三台nginx容器日志,请求正常轮询到各个容器节点上。

[root@registrator ~]# docker logs -f test-01

192.168.168.91 – – [11/Jul/2018:05:14:40 +0000] “GET / HTTP/1.0” 200 612 “-” “Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/ Firefox/45.0” “192.168.168.91”

192.168.168.91 – – [11/Jul/2018:05:14:41 +0000] “GET / HTTP/1.0” 200 612 “-” “Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/ Firefox/45.0” “192.168.168.91”

192.168.168.91 – – [11/Jul/2018:05:14:44 +0000] “GET / HTTP/1.0” 200 612 “-” “Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/ Firefox/45.0” “192.168.168.91”

[root@registrator ~]# docker logs -f test-02

192.168.168.91 – – [11/Jul/2018:05:14:39 +0000] “GET / HTTP/1.0” 200 612 “-” “Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/ Firefox/45.0” “192.168.168.91”

192.168.168.91 – – [11/Jul/2018:05:14:41 +0000] “GET / HTTP/1.0” 200 612 “-” “Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/ Firefox/45.0” “192.168.168.91”

192.168.168.91 – – [11/Jul/2018:05:14:43 +0000] “GET / HTTP/1.0” 200 612 “-” “Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/ Firefox/45.0” “192.168.168.91”

[root@registrator ~]# docker logs -f test-05

192.168.168.91 – – [11/Jul/2018:05:45:11 +0000] “GET / HTTP/1.0” 200 612 “-” “Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/ Firefox/45.0” “192.168.168.91”

192.168.168.91 – – [11/Jul/2018:05:45:11 +0000] “GET / HTTP/1.0” 200 612 “-” “Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/ Firefox/45.0” “192.168.168.91”

192.168.168.91 – – [11/Jul/2018:05:45:12 +0000] “GET / HTTP/1.0” 200 612 “-” “Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/ Firefox/45.0” “192.168.168.91”

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/78839.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信