httpd 安装配置

web 服务介绍

web服务时一种应用程序的服务,它所提供的最主要的信息是一种超文本标记语言(HTML)、多媒体资源(如:视频、图片、音乐等)。HTML是一种纯文字的文本信息,通过所谓的标签来规范所要显示的内容格式,在客户端通过浏览器的形式对HTML及多媒体资源进行解析,然后呈现在终端上。主要由http和https协议实现

http协议

HTTP是一个属于应用层的面向对象的协议,B/S架构,由于其简单、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断的完善和扩展。

http协议版本

HTTP/0.9
HTTP/1.0:cache,MIMEmethod
       MIMEMultiurpose Internet Mail Extesion
       methodGET HEAD POST PUT DELETE TRACE OPTIONS
HTTP/1.1:增强了缓存功能
HTTP/2.0:采用二进制格式 完全多路复用 报头压缩 响应主动“推送”到客户端缓存

http协议的特点

1.c/s
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器练习的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型有Centent-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

http端口

服务所使用的端口信息,http服务默认为80端口,https默认为443端口,而这些默认的端口是可省略的,协议自身会去识别,只有当认为更改服务器服务监听端口时需要在客户端手动指定端口,否则会指向默认端口。

默认端口

IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)是负责协调一些使Internet正常运作的机构。同时,由于Internet已经成为一个全球范围的不受集权控制的全球网络,为了使网络在全球范围内协调,存在对互联网一些关键的部分达成技术共识的需要,而这就是IANA的任务。 
0-1023:众所周知,永久地址分配给固定的应用使用,特权端口;
1024-41951:为注册端口,但要求不是特别严格,分配给程序注册为某应用使用; 3306/tcp, 11211/tcp
41952+:客户端程序随机使用的端口,动态端口,或私有端口;其范围定义在/proc/sys/net/ipv4/ip_local_port_range

socket

IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

socket类型

BSD Socket:IPC的一种实现,允许位于不同主机(也可以使同一主机)上的进程之间进行通信
      Socket API(封装了内核中的socket通信相关的系统调用)
      SOCK_STREAM: tcp套接字
      SOCK_DGRAM: UDP套接字
      SOCK_RAW: raw套接字
根据套接字所使用的地址格式,Socket Domain
      AF_INET:Address Family,IPv4
      AF_INET6:IPv6
      AF_UNIX:同一主机上的不同进程间基于socket套接字通信使用的一种地址

TCP协议的特性

1.建立连接:三次握手
2.将数据打包成段:校验和(CRC32)
3.确认、重传及超时
4.排序:逻辑序号
5.流量控制:滑动窗口算法
6.拥塞控制:慢启动和拥塞避免算法

TCP协议状态类型

CLOSED:关闭连接
LISTEN:监听
SYN_SENT:请求建立连接
SYN_RECV:接收请求连接
ESTABLISHED:已建立的连接
FIN_WAIT1:主动关闭tcp连接,等待对方响应
CLOSE_WAIT:在关闭连接之前还有数据要发送或其它事物
FIN_WAIT2:被动关闭tcp连接
LAST_ACK:等待对方确认关闭连接
TIMEWAIT:当主动发起关闭连接请求后,则进入TIME_WAIT

接收请求的模型

并发访问响应模型:
   单进程I/O模型:启动一个进程处理用户请求; 这意味着,一次只能处理一个请求,多个请求被串行响应
   多进程I/O结构:并行启动多个进程,每个进程响应一个请求
   复用的I/O结构:一个进程响应n个请求
           多线程模式:一个进程生成n个线程,一个线程处理一个请求
           事件驱动(event-driven):一个进程直接n个请求
   复用的多进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程
   响应的请求的数量:m*n

http完整请求处理过程

(1)建立或处理连接:接收请求或拒绝请求
(2)接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程
(3)处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息
(4)访问资源:获取请求报文中请求的资源
(5)构建响应报文
(6)发送响应报文
(7)记录日志

http事务

http请求报文首部
http响应报文首部

请求报文首部的格式:request
   <method> <URL> <VERSION>
   HEADERS(name value)

   <request body>

响应报文首部的格式:response
   <version> <status> <reason-phrase>
   HEADERS(name value)

   <entity-body>

method:请求方法,标明客户端希望服务器对资源执行的动作
   GET, HEAD, POST
version:
   HTTP/<major>.<minor>
status:
   三位数字:如200, 301, 302, 404, 502; 标记请求处理过程中发生的情况
reason-phrase:
   状态码所标记的状态的简要描述
headers:
   每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个value
entity-body:请求时附加的数据或响应时附加的数据

method

    GET:从服务器获取一个资源
  HEAD:只获取一个资源的首部,而不是内容
  POST:向服务器发送要处理的数据
   PUT:将请求的主体部分存储在服务器上
DELETE:请求删除服务器上指定的文档
 TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法;

status

1xx:100-101,信息提示:
2xx:200-206,成功
3xx:300-305,重定向
4xx:400-415,错误类信息,客户端错误
5xx:500-505,错误类信息,服务端错误

常用的状态码:
   200:成功,请求的所有数据通过响应报文的entity-body部分发送:OK
   301:请求的URL指向的资源已被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
   302:与301相似,但在响应报文中通过Location指明资源现在所处临时新位置;Found
   304:客户端发出了条件是请求,但在服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端:Not Modified
   401:需要输入账号和密码认证方能访问资源:Unauthorized
   403:请求被禁止;Forbidden
   404:服务器无法找到客户端请求的资源:Not Found
   500:服务器内部错误;Internet Server Error
   502:代理服务器从后端服务器收到了一条伪响应;Bod Gateway

点此查看:状态码大全

headers

格式:
   name:value

首部的分类:
   通用首部
   请求首部
   响应首部
   实体首部
   扩展首部

通用首部:
   Date:报文的创建时间
   Connection:连接状态,如keep-alive,close
   Via:显示报文经过的中间节点
   Cache-Control:控制缓存
   Pragma

请求首部:
   Accept:通知服务器自己可接收的媒体类型
   Accept-Charset:声明自己可接收的字符集
   Accept-Encoding:可接收的编码格式,如gzip
   Accept-Language:接收的语言

   Client-IP:客户端IP地址
   Host:请求的服务器名称和端口号
   Referer:包含当前正在请求的资源的上一级资源,表示从哪个页面跳转至此页面
   User-Agent:客户端代理(浏览器类型)

条件式请求首部:
       Expect:
       If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改
       If-Unmodified-Since:自从指定的时间之后,请求的资源是否没有被修改过
       If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag不匹配
       If-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag匹配

安全请求首部:
       Authorization:向服务器发送认证信息,如账号和密码
       Cookie:客户端向服务器发送cookie
       Cookie2

代理请求首部:
       Proxy-Authorization:向代理服务器认证

响应首部:
   信息性:
       Age:响应持续时长
       Server:服务器程序软件名称版本

   协商首部:某资源有多种表示方法时使用
       Accept-Ranges:服务器可接受的请求范围类型
       Vary:服务器查看的其它首部列表

   安全响应首部:
       Set-Cookie:向客户端设置cookie
       Set-Cookie2
       WWW-Authentication:来自服务器的对客户端的质询认证表单

实体首部:
   Allow:列出对此实体可使用的请求方法
   Location:告诉客户端真正的实体位于何处

   Content-Encoding:服务器表明了自己的压缩方法
   Content-Language:服务器告诉客户端自己响应的语言
   Content-Length:主体的长度
   Content-Location:实体真正所处的位置
   Content-Type:主体的对象类型

缓存相关:
       ETag:实体的扩展标签
       Expires:实体的过期时间
       Last-Modified:最后一次修改的时间

web资源

 静态资源(无须服务端做出额外处理):.jpg, .png, .gif, .html, .txt, .js, .css, .mp3, avi
动态资源(服务端需要通过执行程序做出处理,发送给客户端的是程序的运行结果):.php, .jsp
注意:一个页面中展示的资源可能有多个;每个资源都需要单独请求

URL

Uniform Resouce Locator:用于描述服务器某特定资源的位置
   scheme://host[:port]/URL
       URL的根通常要映射为文件系统上的某路径
           DocumentRoot /var/www/html
               /index.html --> /var/www/html/index.html
               /images/logo.jpg --> /var/www/html/images/logo.jpg

           Alias /images/ /data/imgs/
               /images/logo.jpg --> /data/imgs/logo.jpg
               /images/a/3.gif --> /data/imgs/a/3.gif

   基本语法:<scheme>://<user>:<password>@<host>:<port></path>;<params>?<query>#<frag>
  params:参数
    http://www.luyubo.com/bbs/hello;gender=f
  query:查询
    http://www.luyubo.com/bbs/item.php?username=tom&title=abc
  frag:标记

httpd的特性

高度模块化:core modules + standard modules + 3rd party modules
DSO:dynamic shared object
MPM:Multipath Processing Modules(多路处理模块)
   prefork:多进程模型,每个进程响应一个请求
       一个主进程:负责生成子进程及回收子进程
; 负责创建套接字; 负责接收请求,并将其派发给某子进程进行处理
       n个子进程:每个子进程处理一个请求
       工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求; 最大空闲和最小空闲
   worker:多进程多线程模型,每线程处理一个用户请求
       一个主进程:负责生成子进程
       多个子进程:每个子进程负责生成多个线程
       每个线程:负责响应用户请求
       并发响应数量:m*n
           m:子进程数量
           n:每个子进程所能创建的最大线程数量
   event:事件驱动模型,多进程模型,每个进程响应多个请求
       一个主进程:负责生成子进程; 负责创建套接字; 负责接收请求,并将其派发给某子进程进行处理
       子进程:基于事件驱动机制直接响应多个请求

       httpd-2.2:仍为测试使用模型
       httpd-2.4event可生产环境中使用

httpd 安装

1.我们这里使用yum来安装httpd程序(以centos 6.8为例)
[root@localhost ~]# yum -y install httpd
2.程序环境
       配置文件:
           /etc/httpd/conf/httpd.conf
           /etc/httpd/conf.d/*.conf
       服务脚本:
           /etc/rc.d/init.d/httpd
           脚本配置文件:/etc/sysconfig/httpd
       主程序文件:
           /usr/sbin/httpd
           /usr/sbin/httpd.event
           /usr/sbin/httpd.worker
       日志文件:
           /var/log/httpd:
               access_log:访问日志
               error_log:错误日志
       站点文档:
           /var/www/html
       模块文件:
           /usr/lib64/httpd/modules
       设置开机启动:
           chkconfig httpd on | off
       管理选项:
           service {start|stop|restart|status|reload|configtest} httpd
centos7
       模块相关配置文件:/etc/httpd/conf.modules.d/*.conf
       systemctl unit file:/usr/lib/systemd/system/httpd.service
       设置开机启动:
       systemctl enable|disable httpd.service
       管理选项:
       systemctl {start|stop|restart|status} httpd.service

httpd配置

ServerRoot "/etc/httpd"      配置文件存放路径
PidFile run/httpd.pid        pid存放路径
Listen 80                    设置监听端口
Include conf.d/*.conf        定义conf.d下面以.conf的配置文件
DocumentRoot "/var/www/html" 程序默认存放目录
DirectoryIndex index.html    程序默认首页
AddDefaultCharset UTF-8      设置默认编码 中文字符集:GBK, GB2312, GB18030

服务重载

配置完成之后一定要测试语法是否正确使用命令 httpd -t
确定语法没有任何问题之后直接重载服务即可 service httpd reload
centos 7
       测试语法命令:httpd -t
       重载程序命令:systemctl reload httpd

保持链接

persistent connection:tcp连接建立后,资源获取完成之后不会断开连接,而是继续等待请求其它资源;
   可以通过数量限制或者时间限制来断开链接
       KeepAlive On|Off          #开启或关闭保持链接
       MaxKeepAliveRequests 100  #设置超时时间限制,秒
       KeepAliveTimeout 10       #设置链接请求数限制
   测试命令
       telnet 192.168.88.1 80
       GET /index.html HTTP/1.1
       host:192.168.88.1
       回车

MPM

httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定; CentOS 6的rpm包为此专门提供了三个应用程序文件,http(prefork),http.worker
httpd.event,分别用于实现对不同的MPM机制的支持;


prefork:进程模型,两级结构,master/worker,每worker处理一个请求;
worker:线程模型,三级结构,master/worker/thread,每thread处理一个请求;
 event:事件驱动线程模型,两级结构,master/worker,每worker响应多个请求;


默认使用的为/usr/sbin/httpd, 其为prefork的MPM模块
   查看httpd程序的模块列表
       查看静态编译的模块
           # httpd -l
       查看静态编译及动态编译的模块
           # httpd -M

更换使用httpd程序,以支持其它MPM机制;
   /etc/sysconfig/httpd
       HTTPD=/usr/sbin/httpd.{worker,event}

注意:重启服务进程方可生效

MPM配置:
   prefork的配置
       <IfModule prefork.c>
       StartServers       8   #启动服务器进程的数量
       MinSpareServers    5   #保持空闲的服务器进程的最少数量
       MaxSpareServers   20   #保持空闲的服务器进程的最大数量
       ServerLimit      256   #用于服务器的寿命MaxClients最大值
       MaxClients       256   #允许启动的服务器进程的最大数量
       MaxRequestsPerChild  4000  #服务器进程服务的最大请求数
       </IfModule>    

   worker的配置
       <IfModule worker.c>
       StartServers         4   #子进程初始数量
       MaxClients         300   #最大并发数
       MinSpareThreads     25   #保持空闲的最小工作线程数
       MaxSpareThreads     75   #保持空闲的最大工作线程数
       ThreadsPerChild     25   #在每个服务器进程中的恒定数目的工作线程
       MaxRequestsPerChild  0   #服务器进程服务的最大请求数
       </IfModule>

访问控制

基于IP的访问控制机制:
httpd-2.4:
   require ip, require not ip, require host, require not host  
httpd-2.2
   allow from, deny from
   order allow,deny, order deny,allow

基于主机名的虚拟主机:
       httpd-2.2:须使用NameVirtualHost;
       httpd-2.4:无须使用;

各映射的本地文件系统路径内的资源:
       httpd-2.4:须做显式授权
       httpd-2.2:无须显式授权

访问控制案例

1.限制year.html文件不能访问
       <Virtualhost 192.168.88.1:80 >
           ServerName  www.luyubo.com
           DocumentRoot "/home/httpd/"
       <files ~ year.html>
            order allow,deny
            deny from all
        </files>
        </Virtualhost>
        <Directory "/home/httpd">
            AllowOverride All
            Order allow,deny
            Allow from all
       </Directory>

2.限制192.168.88.88不能访问www.luyubo.com
       <Virtualhost 192.168.88.1:80 >
            ServerName  www.luyubo.com
            DocumentRoot "/home/httpd/"
       </Virtualhost>
       <Directory "/home/httpd">
            AllowOverride All
            Order allow,deny
            deny from 192.168.88.88
            allow from all
       </Directory>
###如果限制一个网段直接把192.168.88.88替换为192.168.88.0/24即可 显示多个直接以空格分割
3.以正则表达式匹配方式限制文件访问
       <Virtualhost 192.168.88.1:80 >
            ServerName  www.luyubo.com
            DocumentRoot "/home/httpd/"
       <FilesMatch "^year.*$">
            order allow,deny
            deny from all
       </FilesMatch>
       </Virtualhost>
       <Directory "/home/httpd">
            AllowOverride All
            Order allow,deny
            allow from all
       </Directory>
4.以URI限制访问
       <Virtualhost 192.168.88.1:80 >
            ServerName www.luyubo.com
            DocumentRoot "/home/httpd/"
       <location "/year.html">
            order allow,deny
            deny from all
       </location>
       </Virtualhost>
       <Directory "/home/httpd">
            AllowOverride All
            Order allow,deny
            allow from all
       </Directory>
5.以正则表达式匹配方式限制URI访问
       <Virtualhost 192.168.88.1:80 >
            ServerName www.luyubo.com
            DocumentRoot "/home/httpd/"
       <locationMatch "^/year.*$">
            order allow,deny
            deny from all
       </locationMatch>
       </Virtualhost>
       <Directory "/home/httpd">
            AllowOverride All
            Order allow,deny
            allow from all
       </Directory>

centos 7控制

<Directory>中"基于源地址"实现访问控制
   (1)Options
       后跟1个或多个以空白字符分隔的"选项"列表
           Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
           FollowSymLinks:允许跟踪符号链接文件所指向的源文件
           ExecCGI:是否允许运行CGI脚本
           None
           All
   (2)AllowOverride
       与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中
       AllowOverride表示是否允许目录中.htaccess文件中的配置来覆盖当前配置段中的配置
       All
       None
       Options FileInfo AuthConfig Limit

日志设置

日志类型:访问日志和错误日志
错误日志:
   ErrorLog logs/error_log
   LogLevel warn
   Possible values include: debug, info, notice, warn, error, crit,alert, emerg.

访问日志:
   LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
   CustomLog logs/access_log combined

       %h:客户端的IP地址
       %l:Remote User,通常为一个减号("_")
       %u:Remote user (from auth; may be bogus if return status (%s) is 401); 非为登录访问时,其为一个减号
       %t:服务器收到请求时的时间
       %r:First line of request,即表示请求报文的首行;记录了此次请求的"方法""URL"以及协议版本
       %>s:响应状态码
       %b:响应报文的大小,单位是字节; 不包括响应报文的http首部
       %{Referer}i:请求报文中首部"referer"的值;即从哪个页面中的超链接跳转至当前页面的
       %{User-Agent}i:请求报文中首部"User-Agent"的值; 即发出请求的应用程序

访问验证控制

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

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

认证方式有两种:
       basic:明文
       digest:消息摘要认证

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

用户账号和密码存放于何处?
   虚拟账号:仅用于访问某服务时用到的账号

存储:
       文本文件
       SQL数据库
       LDAP目录存储

basic认证配置示例:
     (1)定义安全域
           <Directory "/home/httpd">
               Options None
               AllowOverride None
               AuthType Basic
               AuthName "STRING"
               AuthUserFile "/etc/httpd/.passwd"
               Require user luyubo
              #Require valid-user    #允许账号文件中所有用户访问
           </Directory>

   (2)提供账号和密码存储(文本文件)
       使用专用命令完成此类文件的创建及用户管理
      #第一次需要使用-c创建指定的文件,第二次无须使用-c选项
           htpasswd -c -m /etc/httpd/.passwd luyubo
           htpasswd -m /etc/httpd/.passswd laozhai
               -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用
               -m:md5格式加密
               -s:sha格式加密
               -D: 删除指定用户
   另外:基于组账号进行认证
       (1)定义安全域
           <Directory "/home/httpd">
               Options None
               AllowOverride None
               AuthType Basic
               AuthName "String"
               AuthUserFile "/etc/httpd/conf/.htpasswd"
               AuthGroupFile "/etc/httpd/.passwd_group" #编辑.passwd_group文件格式为每一行定义一个组
               Require group groupluyubo
           </Directory>

定义网站别名

格式:
   alias /URL/ "/PATH/TO/SOMEDIR"
定义alias:
   alias /laozhai "/var/www/html/R2/download/soft"
访问测试(下载/download/soft/qq.exe)
   http://www.luyubo.com/laozhai/qq.exe
使用上面定义的alias可以正常打开,说明我们的配置是正确的,下面贴出配置
   <Virtualhost 192.168.88.1:80 >
        ServerName www.luyubo.com
        DocumentRoot "/home/httpd/"
        Alias /laozhai "/home/httpd/download/soft"
   </Virtualhost>
   <Directory "/home/httpd">
        AllowOverride All
        Order allow,deny
        allow from all
   </Directory>
   #centos 7 格式一样

原创文章,作者:闹钟哥,如若转载,请注明出处:http://www.178linux.com/56782

(0)
闹钟哥闹钟哥
上一篇 2016-11-01
下一篇 2016-11-01

相关推荐

  • 用户及权限管理 (Blog 1)

    用户、权限相关概念及用户管理类命令

    2017-11-06
  • Linux发展史

    适用对象:本文适合希望开始学习以及想了解Linux的朋友阅读。本文中所有内容仅供参考,不作为科学依据。 一、      Linux的起源 最初的计算机其实是具有单一功能的大型计算器,只能完成指定或者设定好的工作。多数情况下计算机资源是处于空闲状态的,为了不使资源浪费,就需要使计算机能够或者可以进行多种工作。或…

    Linux干货 2016-10-14
  • Linux用户和组管理及相关命令详解

        概要:在学习Linux的初级阶段,用户管理是基础管理的重要部分,任何命令的运行,系统的正常运转,均离不开用户管理的内容,本篇就为大家介绍下Linux用户管理的一些基础概念和一些基础命令的用法。内容主要分为以下三个部分:        &nbs…

    Linux干货 2016-08-02
  • 进程和计划任务

    一、进程概念    内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、 安全功能等 v Process:  运行中的程序的一个副本(文件),是被载入内存的一个指令集合,在内存中运行,系统指定一个内存空间和PID编号;进程ID(Process ID ,PID )号码被用来标记各个进程;存在生命周期 &nbsp…

    Linux干货 2016-11-27
  • Linux软件包管理

      在我们的运维工作,总是避免不了安装某些软件,或者编译安装某些软件,我们知道操作系统当中的程序都是有程序员通过开发工具开发的来,程序员直接编写的纯文本的文档我们称之为源代码,但我们的计算机只能识别二进制程序,那么必须要将源代码变成计算机能识别的二进制程序,这里需要通过编译器来进行编译,将源码转换成二进制程序,再通过安装即可。 还有一类程序就是二进…

    Linux干货 2016-08-24
  • linux小小小入门。

      ❀用户登录:     ❤root用户 这是一个特殊的管理账户,也被称为超级账户,root已经接近完整的系统控制。但是对系统的损害有非常广泛的能力。(一般情况下不会登录root)     ❤普通用户 权限有限,损害能力较小。 ❀终端terminal:     ❤设备终端 键盘,鼠标,显示器     &#x…

    Linux干货 2018-03-26