码迷,mamicode.com
首页 > Web开发 > 详细

Http2.2常见配置及功能

时间:2017-10-22 21:57:38      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:none   创建用户   登录   pst   asi   cti   根目录   echo   nec   

Httpd 2.2常见配置

要配置http服务的配置文件,先备份一下,养成良好习惯,如果误操作导致http服务起不来,就可以将备份的主配置文件重新覆盖一下

httpd配置文件的组成:有三大部分组成,其实配置文件里面的内容放的顺序没有规定,之所以把它划分为三部分是为了查看更加清晰

# grep "Section" /etc/httpd/conf/httpd.conf

### Section 1: Global Environment 全局配置

### Section 2: ‘Main‘ server configuration 主服务器配置

### Section 3: Virtual Hosts 虚拟主机

配置格式:directive value

directive: 不区分字符大小写

value: 为路径时,是否区分大小写,取决于文件系统

了解http服务的配置文件是学好http服务的基础,下面我们就一起来看一下http服务的配置文件有哪些功能

1.解决启动httpd服务时报错的问题

在启动http服务时,总会有一些错误,如图:

技术分享

修改httpd服务的配置文件

vim /etc/httpd/conf/httpd.conf,进入到配置文件之后搜索ServerName,然后按照格式随便添加一个域名就行了

技术分享

然后再重启服务,这样就没有报错了

技术分享

2、显示服务器版本信息

ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

ServerTokens Prod[uctOnly] Server: Apache

ServerTokens Major: Server: Apache/2

ServerTokens Minor: Server: Apache/2.0

ServerTokens Min[imal]: Server: Apache/2.0.41

ServerTokens OS: Server: Apache/2.0.41 (Unix)

ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

This setting applies to the entire server and cannot be enabled or disabled on a virtualhost-by-virtualhostbasis.

After version 2.0.44, this directive also controls the information presented by the ServerSignaturedirective.

建议使用:ServerTokens Prod,这时因为别人可以通过远程来查看你的服务器版本信息,知道了你的服务器版本信息,就可以针对你的服务器版本来攻击你,使用了Prod,就会隐藏你的服务器版本信息

curl -I 192.168.10.135 可以显示服务器版本信息

技术分享

修改版本信息(修改配置文件)

vim /etc/httpd/conf/httpd.conf,进入到配置文件后,搜索ServerTokens,如图:

技术分享

改完之后,在重新加载配置文件,service httpd reload,再次查看服务器版本信息

技术分享

服务器版本隐藏

3.修改监听的IPPort

Listen [IP:]PORT

(1) 省略IP表示为本机所有IP

(2) Listen指令至少一个,可重复出现多次

Listen 80

Listen 8080

在httpd服务的配置文件当中,监听的端口默认为80端口,你也可以人为的修改端口,比如修改成9527端口

技术分享

重新加载httpd服务service httpd reload,再查看一下端口号ss -ntl

技术分享

没有80端口,此时监听http服务的是9527端口,此时你在访问时就要指定端口号了,不然会访问失败

技术分享

当然你也可以将改端口号绑定在指定的本机IP地址上,不指定就默认绑定在本机的所有IP地址上,如图:将80端口绑定在本机的192.168.10.135上,将9527端口绑定在172.17.0.182

技术分享

然后再重新加载httpd服务,查看端口号

技术分享

这样别人访问时就必须指定端口号了,因为192.168.10.135绑定在80端口上,不指定就默认为80端口,所以能访问成功,而172.17.0.182绑定在9527端口上,这时你不指定就不能访问了

技术分享

示例:

Listen 192.168.1.100:8080

Listen 80

查看服务对应的端口

技术分享

4.持久连接

Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接

断开条件:数量限制:100

时间限制:以秒为单位,httpd-2.4 支持毫秒级

副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应

折衷:使用较短的持久连接时间

设置:KeepAlive On|Off

KeepAlive Timeout15

MaxKeepAlive Requests100

测试:telnet WEB_SERVER_IP PORT

GET /URL HTTP/1.1

Host: WEB_SERVER_IP

如果不配置http服务配置文件的话,默认只能访问一个资源,就断开连接

技术分享

在http服务配置文件将KeepAlive off改为KeepAlive on

技术分享

再去访问资源时就能够连续访问多个资源,而不断开连接

技术分享

5、MPM(Multi-Processing Module)多路处理模块

prefork, worker, event(试验阶段)

httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持

确认方法:

psaux | grep httpd

默认为/usr/sbin/httpd, prefork模式

查看静态编译的模块

httpd -lhttpd.worker -l

技术分享

查看静态编译及动态装载的模块

httpd –Mhttpd.worker -M

技术分享

动态模块路径

/usr/lib64/httpd/modules/动态模块路径

技术分享

?

更换使用的httpd程序:

vim /etc/sysconfig/httpd

HTTPD=/usr/sbin/httpd.worker

技术分享

重启服务生效

pstree -p|grep httpd查看进程和线程

技术分享

prefork的默认配置:

<IfModule prefork.c>

StartServers ????8 开启的服务器(表现为开启了http服务,运行了8httpd主程序)

MinSpareServers ????5 最小空闲服务器

MaxSpareServers ????20 最大空闲服务器

ServerLimit 256 最多进程数,最大20000

MaxClients 256 最大并发

MaxRequestsPerChild 4000 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(0时永远不释放)

</IfModule>

worker的默认配置:

<IfModule worker.c>

StartServers 4

MaxClients 300

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

MaxRequestsPerChild 0 无限制

</IfModule>

将来开启了http服务就会运行4httpd.worker程序,每个主程序包含25个线程,所以总共有100个线程,但是支持最多的空闲线程只有75个,所以要杀死一个httpd.worker程序,所以当你开启了http服务,就只有3httpd.worker程序运行

技术分享

测试性能

ab -c 100 -n 1000 http://192.168.10.135/a.jpg总共1000个请求访问a.jpg,并发同时能够访问100个,注意:访问的页面尽量大一些,不然无法测试性能

ll /var/www/html

技术分享

1.prefork,将主程序改为httpd

技术分享

经过几次测试,prefork每秒能够处理的次数大约为520

技术分享

2.测试worker,将主程序改为httpd.worker

技术分享

经过几次测试,worker每秒能够处理的请求次数大约为512

技术分享

由此可以看出preforkwork的性能差不多

6、DSO:Dynamic Shared Object(动态共享对象)

加载动态模块配置

/etc/httpd/conf/httpd.conf

配置指定实现模块加载格式:

LoadModule<mod_name> <mod_path>

模块文件路径可使用相对路径:

相对于ServerRoot(默认/etc/httpd)

示例:

LoadModuleauth_basic_module

modules/mod_auth_basic.so

http服务要实现一个功能,要看他的模块是否加载,在http服务的配置文件中,如果你把某个模块给注释掉,然后再重启http服务,那么http服务就没有了这个模块所对应的功能,例如:我将modules/mod_auth_basic.so这个模块给注释掉,如图:

技术分享

重启服务,再查看所有的动态和静态模块就查不到了,http服务就没有这个basic验证的功能了

技术分享

7、定义‘Main‘ server的文档页面路径

DocumentRoot"/path"

文档路径映射:

DocumentRoot指向的路径为URL路径的起始位置

示例:

DocumentRoot"/app/data"

http://HOST:PORT/test/index.html

--> /app/data/test/index.html

注意:SELinuxiptables的状态

更改‘Main‘ server的文档页面路径

默认是/var/www/html,如图我将默认的路径给注释掉,更改为/app/data

技术分享

然后再/app/data目录下建一个index.html,再在里面写点东西

vim /app/data/index.html

技术分享

在重启服务,再来访问,访问的页面就是在/app/data下编辑的index.html的内容,不是/var/www/index.html的内容了

技术分享

?

8、定义站点主页面

DirectoryIndex index.html index.html.var

在http服务的配置文件中,定义了站点的主页面

技术分享

访问站点的主页面先找index.html,再找index.html.var如果都找不到,就会访问一个错误页面

技术分享

为什么会返回一个错的页面呢,这是因为在另外一个配置文件/etc/httpd/conf.d/welcome.conf做了配置

vim /etc/httpd/conf.d/welcome.conf

技术分享

?

我在根目录下面建一个子目录bbs,里面创建一个index.html文件,并写上内容

技术分享

接下来我访问这个页面,能访问

技术分享

如果把bbs里面的index.html文件改个名a.html,再次去访问,竟然显示站点的文件列表,这样是很危险的

技术分享

再点一下a.html才能访问

技术分享

所以应该在http服务器的根目录下面以及其下面的子目录都建一个index.html或者index.html.tar文件,以防止这种现象出现

9.站点访问控制常见机制

可基于两种机制指明对哪些资源进行何种访问控制

访问控制机制有两种

1.客户端来源地址

2.用户账号

文件系统路径:

<Directory "/path">目录

...

</Directory>

<File "/path/file">具体的文件路径

...

</File>

<FileMatch"PATTERN">正则表达式来匹配

...

</FileMatch>

URL路径:

<Location "">

...

</Location>

<LocationMatch"">

...

</LocationMatch>

示例:

<FilesMatch "\.(gif|jpe?g|png)$">正则表达式

<Files "?at.*"> 通配符,?是任意的一个字符,.就是点,*是任意字符串

<Location /status> URL

<LocationMatch "/(extra|special)/data"> URL

?

10、<Directory>中"基于源地址"实现访问控制

(1) Options:后跟1个或多个以空白字符分隔的选项列表

在选项前的+-表示增加或删除指定选项

常见选项:

Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户

FollowSymLinks:允许访问符号链接文件所指向的源文件

None:全部禁用

All:全部允许

1.更改根目录的权限,对某个用户设置acl权限,或者设置根目录下文件的权限来实现访问控制

注意:设置acl权限是对apache用户设置,因为访问资源是通过apache用户来访问的

2.也可以在主配置文件里配置,也可以在子配置文件中配置,为了方便管理,在子配置文件中配置/etc/httpd/conf.d/*.conf

在/etc/httpd/conf.d/目录下随便创建一个以conf为结尾的配置文件,这就是http服务的子配置文件,假如说创建一个test.conf文件

vim /etc/httpd/conf.d/test.conf

如果什么都不加,就默认能够访问软链接,和不能子目录下的索引,也就是子目录的文件列表(在子目录下没有index.html或者index.html.tar的情况下)

技术分享

将根目录改为/app/data

单独对根目录进行配置,其子目录也会继承根目录的配置

技术分享

现在我想要拒绝能够访问软链接和拒绝显示子目录下的索引,如图,也可以写成options none,不加-允许

技术分享

重启服务,这样别人就不能访问你的软链接和子目录的索引了,而且根目录的子目录会继承父目录的配置,所以别人也不能访问子目录里的软链接和子目录下的子目录索引

f1fstab的软链接,不能访问软链接

技术分享

bbs是根目录下的子目录,bbs目录中没有index/htmlindex.html.tar,也不能访问目录的索引

技术分享

f2是根目录的子目录下的软链接,也不能访问

技术分享

bbs1bbs的子目录,并且里面没有index.html或者index.html.tar,也不能访问bbs1的索引

技术分享

也可以单独对根目录下的子目录进行配置,让其不继承对根目录的配置

技术分享

f2bbs目录下的软链接,又能访问了

技术分享

bbs1bbs的子目录,又能访问其索引了

技术分享

(2) AllowOverride

与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令

只对<directory>语句有效

AllowOverride All: 所有指令都有效

AllowOverride None.htaccess 文件无效

AllowOverride AuthConfig Indexes除了AuthConfig Indexes的其它指令都无法覆盖

注意:.htaccess这个文件必须在你所做了访问控制的目录里创建,如图:我对/app/data做了访问控制,所以要在/app/data下创建.htaccess覆盖之前的访问控制指令

技术分享

vim /app/data/.htaccess在这个文件里设置配置指令来覆盖之前的配置指令,如图:拒绝了访问子目录的索引和访问软链接

技术分享

如图:不能访问子目录的索引

技术分享

如图:也不能访问软链接

技术分享

?

(3)order和allow、deny(HTTP2.4版本已经取消,使用别的方法代替)

放在directory, .htaccess

order:定义生效次序;写在后面的表示默认法则

Order allow,deny

Order deny,allow

Allow from, Deny from

来源地址:

IP

网络:172.16

172.16.0.0

172.16.0.0/16

172.16.0.0/255.255.0.0

还在http服务的子配置文件来配置

vim /etc/htpd/conf.d/test.conf

<directory /app/data>

配置指令

</directory>

配置指令如下:

示例1

order allow deny

allow from 192.168.10.188

deny from 192.168.10.200

允许和拒绝的毫无关系,所以order后面的allowdeny次序无所谓,允许192.168.10.188访问,拒绝192.168.10.200访问

示例2

order allow deny

allow from 192.168.10.0/14

deny from 192.168.10.200

允许的包括拒绝的,因为order后面deny在最后,所以拒绝的生效,允许192.168.10.0/24这个网段里的所有IP地址访问,但除了192.168.10.200

示例3

order deny allow

allow from 192.168.10.0/14

deny from 192.168.10.200

允许的包括拒绝的,因为order后面allow放在最后,所以允许的生效,允许192.168.10.0/24这个网段里的所有IP地址访问

?

11.日志设定

日志类型:

访问日志

错误日志

错误日志:

ErrorLoglogs/error_log

LogLevelwarn

loglevel可选值:

debug, info, notice, warn,error

crit, alert, emerg

访问日志:

定义日志格式:LogFormatformat strings

LogFormat"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

自定义日志格式:

CustomLog logs/access_log combined

如图:将原本的日志格式注释掉,添加自定义的日志格式

技术分享

然后再来访问一下,查看日志

技术分享

参考帮助:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

%h 客户端IP地址

%l 远程用户,启用mod_ident才有效,通常为减号"-"

%u 验证(basicdigest)远程用户,非登录访问时,为一个减号"-"

?%t 服务器收到请求时的时间

?%r First line of request,即表示请求报文的首行;记录了此次请求的"方法""URL"以及协议版本

?%>s 响应状态码

?%b 响应报文的大小,单位是字节;不包括响应报文http首部

?%{Referer}i 请求报文中首部"referer"的值;即从哪个页面中的超链接跳转至当前页面的

?%{User-Agent}i 请求报文中首部"User-Agent"的值;即发出请求的应用程序

?

12、设定默认字符集

AddDefaultCharset????UTF-8

中文字符集:GBK, GB2312, GB18030

设置指定的字符集(默认是UTF-8),修改http服务的配置文件

技术分享

查看指定的字符集

技术分享

13、定义路径别名

格式:Alias /URL/ "/PATH/"

DocumentRoot"/www/htdocs"

http://www.magedu.com/download/bash.rpm

==>/www/htdocs/download/bash.rpm

Alias /download/ "/rpms/pub/"

http://www.magedu.com/download/bash.rpm

==>/rpms/pub/bash.rpm

http://www.magedu.com/images/logo.png

==>/www/htdocs/images/logo.png

定义路径别名:假如我访问根目录下的bbs就给你跳转到/app/bbsdir下的主页面

1./app下建一个目录bbsdir,在这个目录下创一个主页面文件index.html

mkdir /app/bbsdir

echo /app/bbdir > /app/bbsdir/index.html

2。改http服务的配置文件,我们还是改子配置文件

vim /etc/httpd/conf.d/test.conf

alias /bbs /app/bbsdir (注意这里的/bbs是相对路径,相对于/var/www/html)

然后重新加载服务service httpd reload

3.访问根目录下的bbs,如图:确实跳转到了/app/bbsdir目录下的主页面

技术分享

?

14、基于用户的访问控制

认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码

认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源

认证方式两种:

basic:明文

digest:消息摘要认证,兼容性差

安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因

用户的账号和密码:

虚拟账号:仅用于访问某服务时用到的认证标识

存储:文本文件,SQL数据库,ldap目录存储,nis

basic认证配置示例:

(1) 定义安全域

<Directory "/path">

Options None

AllowOverride None

AuthType Basic

AuthName "String"

AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"

Require user username1 username2 ...

</Directory>

允许账号文件中的所有用户登录访问:

Require valid-user

(2)提供账号和密码存储(文本文件)

使用专用命令完成此类文件的创建及用户管理

htpasswd[options] /PATH/HTTPD_PASSWD_FILE username

-c:自动创建文件,仅应该在文件不存在时使用(注意创建第一个用户需要指定-c,创建第二个用户是就不要指定-c了,这样会覆盖创建的第一个用户)

-mmd5格式加密,默认方式

-s: sha格式加密

-D:删除指定用户

基于组账号进行认证

(1) 定义安全域

<Directory "/path">

AuthTypeBasic

AuthName"String"

AuthUserFile"/PATH/HTTPD_USER_PASSWD_FILE"

AuthGroupFile"/PATH/HTTPD_GROUP_FILE"

Require group grpname1 grpname2 ...

</Directory>

(2) 创建用户账号和组账号文件;(创建组账号文件不用命令创建,直接用vim,在写入每行的组用户)

组文件:每一行定义一个组

GRP_NAME: username1 username2 ...

实验

1.基于用户账号进行认证

(1)在http服务的子配置文件进行配置,如下图:对根目录下的bbs进行访问控制(我在http服务的主配置文件中定义的根目录是/app/data),是基于basic验证的,用户账号目录是/etc.httpd/conf.d/.httpusers,允许用户http1http2访问。

技术分享

(2)创建账号和密码,如图:创建http1,http2http33个用户

技术分享

(3)然后再去访问web服务器根目录下的bbs目录,如图:这时访问web服务根目录下bbs目录,就不会直接打开bbs目录下的主页面了,需要输入用户和密码

技术分享

根据我们在http服务的子配置文件的配置,用户http1http2能够访问,http3不能够访问

先来验证用户http1,能够访问

技术分享

?

技术分享

再来测试用户http3,不能访问

技术分享

?

技术分享

2.基于组账号进行认证

(1)在http服务的子配置文件里对根目录下的bbs目录进行访问控制,如下图:访问bbs目录需要进行basic验证,定义一个用户目录,定义一个组用户目录,允许组group1里的用户访问bbs目录

技术分享

(2)在定义的用户目录创建用户账号并指定密码

技术分享

(3)在定义的组用户目录下设置每个组中的用户

技术分享

(4)测试,访问web服务器根目录下的bbs目录,根据在子配置文件做的访问控制,允许组group1里的用户访问,group1里的用户有http1http2,所以http1http2能够访问bbs目录下的主页面,http3不能访问,先测试http1,如图:成功访问,http1测试成功了,http2就不用测试了,直接测试http3

技术分享

?

技术分享

?

测试http3,不能够访问

技术分享

?

技术分享

远程客户端和用户验证的控制

Satisfy ALL|Any

ALL 客户机IP和用户验证都需要通过才可以

Any客户机IP和用户验证,有一个满足即可

如图:在http服务的子配置文件中,对根目录下的bbs目录做了访问控制,对客户机ip和用户进行验证,并且都需要通过才行

技术分享

每个组中的用户

技术分享

加载http服务,然后测试,

15、虚拟主机(在一个虚拟主机上可以建立多个站点)

站点标识:socket

IP相同,但端口不同

IP不同,但端口均为默认端口

FQDN不同;

请求报文中首部

Host: www.magedu.com

有三种实现方案:

1.基于ip:为每个虚拟主机准备至少一个ip地址

2.基于port:为每个虚拟主机使用至少一个独立的port

3.基于FQDN:为每个虚拟主机使用至少一个FQDN

注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机

禁用方法:注释中心主机的DocumentRoot指令即可

虚拟主机的配置方法:

<VirtualHostIP:PORT>

ServerNameFQDN

DocumentRoot"/path"

</VirtualHost>

建议:上述配置存放在独立的配置文件中

其它可用指令:

ServerAlias:虚拟主机的别名;可多次使用

ErrorLog:错误日志

CustomLog:访问日志

<Directory "/path">

</Directory>

Alias

(1)配置基于ip的虚拟主机

1.在你的一个网卡上添加3个地址

技术分享

2.设置站点

在/app下建立3个目录,将来作为对应3IP地址的站点

技术分享

3.http服务的子配置文件配置虚拟主机(配置虚拟主机可以参照http服务的主配置文件)

cat /etc/httpd/conf/httpd.conf 参照格式在最后面

技术分享

参照上图的格式来配置虚拟主机

技术分享

4.重新加载http服务,测试

技术分享

5.在客户端,配置dns域名解析,就可以使用域名来访问站点了

编辑/etc/hosts文件,模拟dns解析

技术分享

接着就可以用域名来访问站点了

技术分享

(2)配置基于端口的虚拟主机

配置一个虚拟主机就要消耗一个IP地址,如果基于IP地址来配置虚拟主机就太浪费IP地址了,而基于端口来配置虚拟主机,只需要消耗一个IP地址,将一个IP地址绑定在多个端口上面,这样来配置多台虚拟主机。

1.1.设置站点,参考配置基于ip地址的虚拟主机的第二步

2.http服务的子配置文件里配置多台虚拟主机,如图:*代表本机的IP地址,本机的IP地址绑定不同的端口

技术分享

3.重新加载http服务,通过访问不同的端口就可以访问不同的站点

技术分享

4.在客户端,配置dns域名解析,就可以使用域名在加上端口来访问站点了

编辑/etc/hosts文件,模拟dns解析

技术分享

?

技术分享

(3)配置基于FQDN的虚拟主机

现在我们在访问一个站点都是通过访问域名来访问的,所以前两种方法来配置虚拟主机很少用,通常使用基于域名的方式来配置虚拟主机

如果在在请求报文的首部加上你要访问的站点,web服务器服务器通过分析你的请求报文首部来返回给你结果

技术分享

1.设置站点,参考配置基于ip地址的虚拟主机的第二步

2.在http服务的子配置文件来配置基于域名的虚拟主机

vim /etc/httpd/con.d/test.conf

技术分享

3.在客户端配置dns域名解析,来访问站点

编辑/etc/hosts文件,模拟dns域名解析

技术分享

4.通过域名来访问不同的站点

技术分享

5.查看日志文件,看看是否生成

技术分享

6.在http服务的子配置文件中,哪个站点排在第一个谁就是默认站点

技术分享

16、status页面(可以了解当前web服务器的工作的情况)

LoadModule status_module modules/mod_status.so

<Location /server-status>

SetHandler server-status

Order allow,deny

Allow from 172.16

</Location>

ExtendedStatus On 显示扩展信息

了解web服务器的工作情况,先查看status_mdule模块是否启动,再修改http服务的主配置文件

httpd -M|grep status 查看status_module模块是否启动,如果没有启动的话,要在http服务的主配置文件里添加该模块,如图:已经启动

技术分享

vim /etc/httpd/conf/httpd.conf 修改http服务的主配置文件

技术分享

重新加载一下http服务,然后再去访问,如图:就可以查看web服务器的工作情况

技术分享

如果还想显示当前web服务器更加详细的工作情况,再修改一下http服务的主配置文件,如图:

技术分享

重新加载一下http服务,再去查看一下当前web服务器的工作情况,就更加详细了,如图:

技术分享

?

好了,今天的内容就到这里,下期再见。

Http2.2常见配置及功能

标签:none   创建用户   登录   pst   asi   cti   根目录   echo   nec   

原文地址:http://www.cnblogs.com/1477717815fuming/p/7710704.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!