Linux基本服务搭建

  1. arp欺骗、ssh密钥对、tcp wrappers
    1. arp欺骗

      原理:在主机a上arp –a发现b,c的mac地址是相同的,该mac地址都是b的mac地址    

      实验环境

              客户机a:

              欺骗机b:导入arp.iso

              客户机c:

      安装步骤:

      欺骗机b

      traceroute IP        #可以测试连通性

      mount -o loop /root/arp.iso /root/dir

      yum -y install *

      vim /etc/sysctl.conf

              修改:

                      net.ipv4.ip_forward = 1

      sysctl -p

      arpspoof -i eth0 -t IP-a IP-c #b监听网卡a到c的数据

      iptables -A FORWARD -s IP-a -j REJECT/DROP

      #b配置防火墙规则,丢弃a的数据包

                  -A     FOREARD:指定从哪限制,经过是限制

                  -s     IP-a:指定限制的主机IP

                  -j     DORP:指定动作,丢弃

      客户机a

              ping 客户机c            #发送数据

      arp欺骗的解决方法

      arp -s IP-c c-mac        #将主机c的ip与mac地址捆绑在一起

    2. ssh密钥对验证

      原理

              加密方式:

      rsa:长,更安全

              dsa:短,快,不安全

              #dsa不支持免密登入

              #同IP不同主机使用秘钥对认证,会被拒绝,需要删除know_hosts文件

      环境准备

      iptables –F         #清空防火墙规则    

      setenforce 0            #关闭SELinux

              ssh-keygen -t rsa/dsa

                  

      实现windows与linux之间的秘钥连接

      使用windows的Xshell软件生成秘钥对,免密只能使用rsa

      /etc/ssh/sshd_config

          修改:

      PubkeyAuthentication yes    

      AuthorizedKeysFile .ssh/authorized_keys

      #上面两条,默认开启,取消注释即可,秘钥认证

              touch ~/.ssh/authorized_keys

      vim ~/.ssh/authorized_keys        #把生成的公钥复制到authorized_keys文件中

      windows登入方式改为kublic Key登入

      实现linux与linux之间的秘钥连接

      ssh-keygen -b 1024/2048/3072 -t rsa/dsa

      #客户机生成秘钥对,b指定长度,t指定类型

      /etc/ssh/sshd_config

      修改:

      PubkeyAuthentication yes    

      AuthorizedKeysFile .ssh/authorized_keys

      #上面两条,默认开启,取消注释即可,秘钥认证

      touch ~/.ssh/authorized_keys

      ssh-copy-id root@IP        #传输公钥到服务器两种方式

      scp id_rsa.pub [email protected]:/root/.ssh/        #传输公钥到服务器两种方式

      ssh root@IP        #登入测试

      配置文件选项/etc/ssh/sshd_config

      PubkeyAuthentication yes和AuthorizedKeysFile

      #开启服务机钥匙对功能:取消注释(默认就生效)

      PasswordAuthentication no    #禁止密码安全验证

      PermitRootLogin yes                #此选项默认为允许root远程登录

      MaxAuthTries 6                        #设置密码错误后的尝试次数

      Port 22                                        #默认端口

      TMOUT=300                            #登录超时时间,需要在/etc/profile添加

      service sshd restart                    #配置后需要重启服务

    3. tcp wrappers(简化版的防火墙)

      作用:用于跳板机搭建,只允许跳板机访问后台服务器,批量化比较简单

      基本简介tcp wrappers是对部分的tcp应用数据进行访问控制(允许某些数据包通过和拒绝某些数据包通过)

      linux四层安全访问控制:

      第一层:acl

                      用于用户空间中拒绝

              第二层:TCPwrappers

                      用于libwrap.so库中拒绝

              第三层:iptables

                      用于内核空间,消耗资源最小

              第四层:selinux

                      应用程序调用数据是拒绝

      库(库文件libwrap.so):

      内核和应用程序之前的桥梁

      支持的服务类型

          which    查询某服务命令所在位置

          ldd 查询某命令调用的相关库文件

      配置文件:

      /etc/hosts.allow(允许访问)

      /etc/hosts.deny(拒绝访问)

      格式:服务列表:客户端地址列表

      访问规则:

      策略即时生效

      默认情况下,允许访问

      网段不可以使用/8 /16 /24

      可以通过 .开始或.结束

      通配符不可以和.开始或.结束的格式混用(如:192.*168.34.

      可以使用宏(ALL     LOCAL

      多个匹配条件之间用逗号隔开

      通过@符号指定特定网卡ip

      策略的应用顺序:

      优先查看hosts.allow,之后再查deny

      允许个别,拒绝所有:hosts.allow文件添加允许的策略,hosts.deny文件添加all

      拒绝个别,允许所有:hosts.allow文件为空,hosts.deny文件添加单个拒绝的策略

  2. 网络服务—DHCP

    DHCP

    概念:DHCPDynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作

    用途:给内部网络或网络服务供应商自动分配IP地址、子网掩码、网关以及DNStcp/ip信息,给用户或者内部网络管理员作为对所有计算机作中央管理的方法

    作用:

    1. 给客户机自动分配IP
    2. 还可以分配IP,掩码,网关,DNS等
    3. DHCP服务器需要固定IP

                优点:提高IP利用率

                缺点:不可控(如果局域网中有多台DHCP服务器,选择接受最快的那台)

    1. DHCP四步租约过程

    A:客户端进行IP请求

        IP0.0.0.0

        源端口:68

        目的IP255.255.255.255

        目的端口:67

        发送discover包内容:客户机MAC地址,计算机名

    当一个DHCP客户机启动时,会自动将自己的IP地址配置成0.0.0.0,由于使用0.0.0.0不能进行正常通信,所以客户机就必须通过DHCP服务器来获取一个合法的地址。由于客户机不知道DHCP服务器的IP地址,所以它使用0.0.0.0的地址作为源地址,使用UDP68端口作为源端口,使用255.255.255.255作为目标地址,使用UDP67端口作为目的端口来广播请求IP地址信息。广播信息中包含了DHCP客户机的MAC地址和计算机名,以便使DHCP服务器能确定是哪个客户机发送的请求。

     

    B:服务器响应

        IPDHCP服务器IP

        源端口:67

        目的IP255.255.255.255

        目的端口:68

        发送offer包内容:DHCP客户机的MAC地址;DHCP服务器提供的合法IP地址;子网掩码;默认网关(路由);租约的期限;DHCP服务器的IP地址

     

    DHCP服务器接收到客户机请求IP地址的信息时,它就在自己的IP地址池中查找是否有合法的IP地址提供给客户机。如果有,DHCP服务器就将此IP地址做上标记,加入到DHCPOFFER的消息中,然后DHCP服务器就广播一则包括下列信息的DHCPOFFER消息:

    DHCP客户机的MAC地址;DHCP服务器提供的合法IP地址;子网掩码;默认网关(路由);租约的期限;DHCP服务器的IP地址。

    因为DHCP客户机还没有IP地址,所以DHCP服务器使用自己的IP地址作为源地址,使用UDP67端口作为源端口,使用255.255.255.255作为目标地址,使用UDP68端口作为目的端口来广播DHCPOFFER信息

     

    C:客户机选择IP

        IP0.0.0.0

        源端口:68

        目的IP255.255.255.255

        目的端口:67

        发送request包内容:该客户机提供IP配置的服务器的服务标识符(IP地址)

    DHCP客户机从接收到的第一个DHCPOFFER消息中选择IP地址,发出IP地址的DHCP服务器将该地址保留,这样该地址就不能提供给另一个DHCP客户机。当客户机从第一个DHCP服务器接收DHCPOFFER并选择IP地址后,DHCP租约的第三过程发生。客户机将DHCPREQUEST消息广播到所有的DHCP服务器,表明它接受提供的内容。DHCPREQUEST消息包括为该客户机提供IP配置的服务器的服务标识符(IP地址)。DHCP服务器查看服务器标识符字段,以确定它自己是否被选择为指定的客户机提供IP地址,如果那些DHCPOFFER被拒绝,则DHCP服务器会取消提供并保留其IP地址以用于下一个IP租约请求。

    在客户机选择IP的过程中,虽然客户机选择了IP地址,但是还没有配置IP地址,而在一个网络中可能有几个DHCP服务器,所以客户机仍然使用0.0.0.0的地址作为源地址,使用UDP68端口作为源端口,使用255.255.255.255作为目标地址,使用UDP67端口作为目的端口来广播DHCPREQUEST信息

     

    D:服务器确认租约

    IPDHCP服务器IP

        源端口:67

        目的IP255.255.255.255

        目的端口:68

        发送ack/nack包内容:IP地址的有效租约和其他可能配置的信息

    服务器确认租约:DHCPNACK

    DHCP服务器接收到DHCPREQUEST消息后,以DHCPACK消息的形式向客户机广播成功的确认,该消息包含有IP地址的有效租约和其他可能配置的信息。虽然服务器确认了客户机的租约请求,但是客户机还没有收到服务器的DHCPACK消息,所以服务器仍然使用自己的IP地址作为源地址,使用UDP67端口作为源端口,使用255.255.255.255作为目标地址,使用UDP68端口作为目的端口来广播DHCPACK信息。当客户机收到DHCPACK消息时,它就配置了IP地址,完成了TCP/IP的初始化。

     

    服务器确认租约:DHCPNACK

    如果DHCPREQUEST不成功,例如客户机试图租约先前的IP地址,但该IP地址不再可用,或者因为客户机移到其他子网,该IP无效时,DHCP服务器将广播否定确认消息DHCPNACK。当客户机接收到不成功的确认时,它将重新开始DHCP租约过程。

     

    1:如果DHCP客户机无法找到DHCP服务器,它将从TCP/IPB类网段169.254.0.0/16中挑选一个IP地址作为自己的IP地址,继续每隔5分钟尝试与DHCP服务器进行通讯,一旦与DHCP服务器取得联系,则客户机放弃自动配置的IP地址,而使用DHCP服务器分配的IP地址。

     

    2DHCP客户机收到DHCP服务器回应的ACK报文后,通过地址冲突检测(arp)发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送DECLINE报文,通知服务器所分配的IP地址不可用。

    1. DHCP续租

      DHCP客户机会在租期过去50%的时候,直接向为其提供IP地址的DHCP服务器发送DHCPREQUEST消息包。如果客户机接收到该服务器回应的DHCPACK消息包,客户机就根据包中所提供的新的租期以及其它已经更新的TCP/IP参数,更新自己的配置,IP租用更新完成。如果没有收到该服务器的回复,则客户机继续使用现有的IP地址,因为当前租期还有50%

      如果在租期过去50%的时候没有更新,则DHCP客户机将在租期过去87.5%的时候再次向为其提供IP地址的DHCP服务器联系。如果还不成功,到租约的100%时候,DHCP客户机必须放弃这个IP地址,重新申请。如果此时无DHCP服务器可用,DHCP客户机会使用169.254.0.0/16中随机的一个地址,并且每隔5分钟再进行尝试。

    2. DHCP服务基本搭建

          准备环境:

              一台主机为DHCP服务器

              一台主机为客户机

              iptables -F        #防火墙

              setenforce 0     #SELinux

              关闭Vmware虚拟网络编辑器的DHCP功能

      安装DHCP服务:dhcpdhcp-common

      配置文件:

      dhcpd /etc/dhcp/dhcpd.conf

      修改:

      1. 源配置文件为空内容需要复制模板文件

      /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample覆盖到目录下

      2. 删除一些不需要的subnet配置

      格式:

      subnet 192.168.88.0     netmask 255.255.255.0

                  #声明要分配的网段和子网掩码

              range 192.168.88.3 192.168.88.254

                  #声明可用IP地址池

              option domain-name " linuxlc.com" ;

      #设置DNS

              option domain-name-servers 8.8.8.8114.114.114.114 ;

      #设置DNS服务器地址,中间需要逗号隔开

              option routers 192.168.88.2

                  #默认网关的地址(可不改)

              option broadcast-address 192.168.88.255

                  #广播地址(可有可无)

              default-lease-time 600

                  #默认租约(s

              max-lease-time 7200

                  #最大租限

          步骤:    

      1.修改配置文件

              2.修改本机IP,保证同网段

      3.重启服务:service dhcpd start

      4.重启客户机的网卡    ifdown eth0ifup eth0

      5.监听/var/log/messages日志文件,查错误

      6.客户机网卡改为dhcp自动获取

      7.重启网络服务获取IP,或ifdown/ifup    eth0

       

    3. DHCP中继搭建(用于不同网段)

          准备环境:

              1.一台主机为DHCP服务器,一台中继服务器,两台主机为客户机

              2.iptables -F        #防火墙

              3.setenforce 0     #SELinux

              4.关闭Vmware虚拟网络编辑器的DHCP功能

      5.安装DHCP服务:dhcpdhcp-common

              6.安装dhcrelay /etc/sysconfig/dhcrelay(中继配置文件),单独服务

              修改:

                  INTERFACES=""

      #添加网卡名,DHCP服务器要写第一个

                  DHCPSERVERS=""

                      #指向服务器的IP地址

          步骤:

      1. 搭建dhcp服务器,添加多网卡和网段
      2. 搭建中继服务器
        1. VMware添加网卡,关闭VM的dhcp服务
        2. 复制网卡文件修改(不会自动生成网卡文件),修改网卡名,删除UUID和MAC地址,IP设置为其他网段的网关
        3. 重启网卡
        4. 配置中继文件dhcrelay
        5. 启动动中继 service dhcrelay restart(独立服务)
        6. 配置数据转发(可以互相通信)/etc/sysctl.conf
      3. 客户机配置
        1. 网卡配置文件中,改为dhcp模式
        2. 网关指向中继对应网段
        3. 重启网卡

      4.dhcp服务器监控日志文件,客户机开启网卡获取IP

       

    4. 固定地址绑定

          步骤:

      1.arp -a 查看客户机的mac地址

      2.修改/etc/dhcp/dhcpd.conf文件:

                  host fantasia

                      hardware ethernet 客户机的mac地址;

                          #想要固定ip的客户机的mac地址

                      fixed-address 地址池外的某一IP    

                          #固定分配给客户机的ip地址

      3.service dhcpd restart

      #重启客户机网卡验证IP获取是否成功

      注:改地址不要事已分配地址池的IP

       

    5. 超级作用域(同一局域网)

          超级作用域:

              #之前的网段声明和主机声明全都注释掉!

              例:shared-network public

                  subnet 192.168.88.0 netmask 255.255.254.0

                      option routers 192.168.88.1

                      range 192.168.88.3 192.168.88.3;}

                  subnet 192.168.88.0 netmask 255.255.254.0

                      option routers 192.168.88.1

                      range 192.168.89.3 192.168.89.5;}

                  

                  #下面几行都删掉

      重启:service dhcpd restart

      分别重启两台机器的网卡,查看获取的地址

  3. dns域名服务器
    1. 介绍

      1984年,加州大学伯克利分校的几个学生完成了Unix名称服务的实现,起名叫Berkeley Internet Name DomainBIND)。目前,它是互联网上使用最为广泛的DNS服务软件

      注:北京网通DNS202.106.0.20(最早的DNS,也最稳定)

      定义:域名系统

      作用:域名解析

      Host域名解析文件

      位置:windows c:\windows\system\drivers\etc\hosts

              Linux /etc/hosts

      优缺点

      1. 优先级大于DNS
      1. 纯文本文件,手工维护太过麻烦
      2. 主机名重复

      递归查询:客户机向首选DNS服务器查询,一定要返回准确(无论对错)结果

      迭代查询:首选DNS服务器向其他DNS服务器查询,可以返回近似结果

      正向查询:域名查找IP地址

      反向查询:IP地址查找域名

      Wins:把IP翻译成主机名或主机名翻译成IP

      DNS作用

      正向解析:域名-->IP

      反向解析:IP-->域名

      DNS管理

      IANA 分配ip地址和域名

      ICANN 互联网名称与数字地址分配机构

      A.通过文件管理:hosts

      从文件服务器下载,覆盖/etc/hosts里的内容(设置的有定时任务)

      B.搭建域名服务器:DNS

      降低了客户端的操作的复杂难度

      加重了服务器端的维护难度

      C.分布式DNS

      优点:减轻单台服务器压力

      缺点:时间过长;管理麻烦

      解决方案:每级服务器只管理直连下级、允许重名

    2. 工作原理

      1)客户机首先查看查找本地hosts文件,如果有则返回,否则进行下一步

      2)客户机查看本地缓存,是否存在本条目的缓存,如果有则直接返回,不再向外发出请求,否则进行下一步,转发。

      3)将请求转发本地DNS服务器。

      4)查看域名是否本地解析,是则本地解析返回,否则进行下一步。

      5)本地DNS服务器首先在缓存中查找,有则返回,无则进行下一步。

      6)向全球13个根域服务器发起DNS请求,根域返回org域的地址列表。

      7)使用某一个org域的IP地址,发起DNS请求,org域返回kernel域服务器地址列表。

      8)使用某一个kernelIP地址,发起DNS请求,kernel域返回www.kernel.org主机的IP地址,本地DNS服务收到后,返回给客户机。

      注:递归查询:压力在服务器端

      迭代查询:压力在客户端(直接返回结果到客户机)

    3. DNS搭建

          搭建步骤:

      1. 一台主机为dns服务器,一台为客户机,同一局域网
      2. 安装dns软件bind
      3. 修改主配置文件/etc/named.conf

      1. 修改文件区域文件/etc/named.rfc1912.zones

      #删除多余的模板,只留下一个正向和一个反向

      #可删除反向解析,不常用

      #先对区域文件进行备份,因为这个文件需要删除一些设置

      1. 修改配置文件/var/named/xx.xx
        1. 先用cp -p 复制解析文件,文件名区域设置时定义的
        2. 编辑是注意域后面加点(完全合格域名)

      1. 重启DNS服务service named restart
      2. 在客户机网卡配置文件中添加DNS服务器的地址,然后用nslookup测试

       

    4. DNS服务器搭建

          目的:减轻主服务器的压力

      搭建步骤:

      1. 一台主服务器、一台从服务器、一台测试机,同一局域网
      2. 先关闭服务器和客户机上的防火墙和SELinux
      3. 主服务器搭建dns服务器

      #但有一点需要注意:主DNS的区域配置文件中allow-updata参数添加从服务器IP地址

      1. 从服务器搭建
        1. 安装bind软件
        2. 修改主配置文件/etc/named.conf

                  #都可以指向any(任何IP

              5. 配置区域文件/etc/named.rfc1912.zones

              

                  #file选项需要更改为 file "slaves/.后缀"

              6. 重启服务

              7. 在测试机上写从服务器的IP

    5. DNS缓存服务器

          作用:加快解析速度提高工作效率

      搭建步骤:

      1. 关闭服务器和客户机上的防火墙和SELinux
      2. 一台主服务器,一台缓存服务器,一台测试机,同一局域网
      3. 安装软件dnsmasq
      4. 修改配置文件/etc/dnsmasq.conf

              domain=域名            #需要解析的域名 #添加

                  server=ip                #DNS服务器IP #添加

                  cache-size=15000        #声明缓存条数    #修改

      1. 重启服务:service dnsmasq restart
      2. 在测试机上填写DNS为缓存服务器的ip地址,先访问,在停止主服务器,再访问
    6. DNS分离解析

      搭建步骤:

      1. 先关闭服务器和客户机上的防火墙和SELinux
      2. 一台内网(client)1块网卡;一台网关(dns)2块网卡,一台外网1块网卡,一台内网web服务器
      3. web服务器安装httpd,只设置IP和掩码,两张网卡
      4. 内网客户机修改网卡,网关和dns都指向网关内网IP
      5. 外网客户机修改网卡,网关和dns都指向网关外网IP
      6. 网关dns服务器修改
        1. 模拟路由器,把0改成1模拟数据包转发(实际生产中必不可少),修改/etc/sysctl.conf,sysctl -p重新加载
        2. cp -a 复制网卡改名,重启网卡
        3. 内网网卡IP修改为内网网关,外网网卡IP修改为外网网关,删除除eth0以外网卡的MAC和UUID
        4. 安装bind服务,修改主配置文件/etc/named.conf

      1. 生成自己定义的区域文件cp -a /etc/named.rfc1912.zones /etc/

       

      1. 配置内网的正向解析文件:IP指向web服务器IP

      配置内网的反向解析文件:

      配置外网的正向解析文件:

      配置外网的反向解析文件:

      1. 重启服务service named restart
      2. 测试

       

    7. 资源解析记录

      注:SOA与PTR的域名格式必须一致(二级或三级)

      1. SOA起始授权记录:记录DNS的基本信息(FQDN,刷新时间,更新时间,缓存时间)
      2. NS名称服务器:记录FQDN
      3. A主机:正向解析,域名解析IP
      4. PTR指针:反向解析,IP解析域名
      5. MX邮件交叉记录:用于标识邮件等级
      6. SRV服务
      7. CNAME别名

      A记录

      A记录也称为主机记录,是使用最广泛的DNS记录,A记录的基本作用就是说明一个域名对应的IP是多少,它是域名和IP地址的对应关系,表现形式为www.linuxlc.com 192.168.1.1 这就是一个A记录!A记录除了进行域名IP对应以外,还有一个高级用法,可以作为低成本的负载均衡的解决方案,比如说,www.linuxlc.com 可以创建多个A记录,对应多台物理服务器的IP地址,可以实现基本的流量均衡!

       

      NS记录

      NS记录和SOA记录是任何一个DNS区域都不可或缺的两条记录,NS记录也叫名称服务器记录,用于说明这个区域有哪些DNS服务器负责解析,SOA记录说明负责解析的DNS服务器中哪一个是主服务器。因此,任何一个DNS区域都不可能缺少这两条记录。NS记录,说明了在这个区域里,有多少个服务器来承担解析的任务,

       

      SOA记录

      NS记录说明了有多台服务器在进行解析,但哪一个才是主服务器呢,NS并没有说明,这个就要看SOA记录了,SOA名叫起始授权机构记录,SOA记录说明了在众多NS记录里那一台才是主要的服务器!

       

      MX记录

      全称是邮件交换记录,在使用邮件服务器的时候,MX记录是无可或缺的,比如A用户向B用户发送一封邮件,那么他需要向DNS查询B的MX记录,DNS在定位到了BMX记录后反馈给A用户,然后A用户把邮件投递到B用户的MX记录服务器里!

       

      CNAME记录

      又叫别名记录,我们可以这么理解,我们小的时候都会有一个小名,长大了都是学名,那么正规来说学名的符合公安系统的,那个小名只是我们的一个代名词而已,这也存在一个好处,就是比暴漏自己,比如一个网站a.com 在发布的时候,他可以建立一个别名记录,把B.com发不出去,这样不容易被外在用户所察觉!达到隐藏自己的目的!

       

      PTR记录

      PTR记录也被称为指针记录,PTR记录是A记录的逆向记录,作用是把IP地址解析为域名。由于我们在前面提到过,DNS的反向区域负责从IP到域名的解析,因此如果要创建PTR记录,必须在反向区域中创建。

  4. 网络服务—VSFTP

    FTP

    File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的文件的双向传输。使用 FTP 来传输时,其实是具有一定程度的『危险性』,因为数据在因特网上面是完全没有受到保护的『明文』传输方式!

    VSFTP

    是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP,从名称定义上基本可以看出,这是为了解决ftp传输安全性问题的。

        特点:

    vsftp程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性

    任何需要执行较高权限的指令都需要上层程序许可

    ftp所需要使用的绝大多数命令都被整合到了vsftp中,基本不需要系统额外提供命令

    拥有chroot功能,可以改变用户的根目录,限制用户只能在自己的家目录

    VSFTP连接类型

        控制连接(持续连接)    à    TCP21(命令信道)    à    用户收发FTP命令

        数据连接(按需连接)    à    TCP20(数据信道)    à    用于上传下载数据

    1. VSFTP工作模式

      注意:很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口,而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。

      VSFTP传输模式

      ASCII传输模式(文本)

      假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。(Linuxàwindows)但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,则使用binary模式。

      二进制传输模式(Binary模式)

      在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,mp3jpgexe

      VSFTP安装配置

          服务端:

              安装包vsftpd    高性能、高安全性

          客户端:

              安装包ftp

          配置文件:

              /etc/vsftpd/vsftpd.conf

      登录验证方式

          匿名用户验证:

              a.    用户账号名称:ftpanonymous

              b.    用户账号密码:空或任意字符

              c.    服务器目录:/var/ftp

              d.    权限:可下载不可上传,上传权限由两部分组成(主配置文件和文件系统)

              e.    匿名权限控制:

                  anonymous_enable=YES        启用匿名访问

                  anon_umask=022            匿名用户所上传文件的权限掩码

                  anon_root=/var/ftp            匿名用户的FTP根目录

                  anon_upload_enable=YES        允许上传文件

                  anon_mkdir_write_enable=YES    允许创建目录

                  anon_other_write_enable=YES    开放其他写入权

                  anon_max_rate=0            限制最大传输速率

              f.    特点:配置简单,所有用户使用相同的用户登录

          本地用户验证:

              a.    用户账号名称:本地用户(/etc/passwd

              b.    用户账号密码:用户密码(/etc/shadow

              c.    工作目录为:登录用户的宿主目录

              d.    权限:最大权限(drwx------

              e.    本地用户权限控制:

                  local_enable=YES        是否启用本地系统用户

                  local_umask=022        本地用户所上传文件的权限掩码

                  local_root=/var/ftp        设置本地用户的FTP根目录

                  chroot_local_user=YES    是否将用户禁锢在主目录

                  local_max_rate=0        限制最大传输速率

                  ftpd_banner=Welcome to blah FTP service        用户登录时显示的欢迎信息

                  banner_file=/目录        弹出一个说明,可以做哪些操作

                  userlist_enable=YES & userlist_deny=YES

                  禁止/etc/vsftpd/user_list文件中出现的用户名登录FTP

                  userlist_enable=YES & userlist_deny=NO

                  仅允许/etc/vsftpd/user_list文件中出现的用户名登录FTP

                  ftpusers

      禁止/etc/vsftpd/ftpusers文件中出现的用户名登录FTP,权限比user_list更高,即时生效

              f.    特点:配置相对复杂,可以设置严格的权限,有安全隐患

          虚拟(virtual)用户验证:

      能够设置严格的权限(为每一个用户生成单独的配置文件)

      减少了系统中本地用户的数量,提高了安全性。

    2. 匿名用户验证实验:

          #先关闭服务器和客户机上的防火墙和SELinux

      #在客户端登录后,默认情况下是可以下载的,但不能上传

      anon_upload_enable = YES        #实现可以上传

      anon_mkdir_write_enable=YES    #允许创建目录

      anon_other_write_enable=YES    #允许删除文件,改名,覆盖

      dirmessage_enable=YES            #确认是否启用,用户进入某个文件夹时,弹出相应的说明,在对应目录下创建 .message 文件,并写入相应内容

    3. 本地用户验证实验:

      服务端需要创建用户并设置密码

      客户端上安装相对应的ftp客户端,然后登录

      将所有用户禁锢在自己的家目录下

      注:默认没有禁锢用户时,客户端登录后可以随意切换目录,查看文件所在位置和文件名

      chroot_local_user=YES        #限制所有用户不能随便切换目录

      chroot_list_enable=YES        #将部分用户禁锢在自己的家目录下

      chroot_list_file=/etc/vsftpd/chroot_list

      #开启白名单功能,允许白名单中的用户随意切换目录

      #白名单文件所在位置(需自己创建)

      ftpusers    文件        #所有写入此文件内的用户名都不允许登录ftp,立刻生效,优先级比黑名单高

      pasv_enable=YES

      pasv_min_port=3000

      pasv_max_port=3010

      修改被动模式数据传输使用端口

      客户端下载文件,查看服务器上使用的端口号

    4. 虚拟用户验证实验

          1./etc/vsftpd/创建ftp软件的认证配置文件(虚拟用户的认证文件)

              vim vsftpd.user

                  奇数行:用户

                  偶数行:密码

              #添加多个用户和密码组合

          2.将产生的认证文件转化为数据库文件

              db_load -T -t hash -f vsftpd.user vsftpd.db    (后缀一定要是*.db)

              将产生的*.db文件修改权限,chmod 600 *.db

          3.为虚拟用户创建映射用户:

              useradd -d /var/ftproot -s /sbin/nologin virtual

          4.修改ftp的认证机制为虚拟用户认证

              /etc/pam.d/        #各个软件服务的认证机制配置文件

              1.    cp -a vsftpd vsftpd.pam

                  #用默认使用的认证配置文件生成新的认证配置文件

              2.    修改vsftpd.pam文件

                  #删除所有,添加自定义的两行

                  auth required pam_userdb.so db=/etc/vsftpd/vsftpd                            #指定自定义生成的数据库文件

                  account required pam_userdb.so db=/etc/vsftpd/vsftpd

                  #借助pam_userdb.so 函数文件帮助vsftpd软件解读认证虚拟用户的登录

          5.修改/etc/vsftpd/vsftpd.conf配置文件,

              修改:

              pam_service_name=vsftpd.pam    #将认证配置文件指向自己创建的

              添加:

              guest_enable=YES                #开机虚拟用户

              guest_username=virtual            #指定虚拟用户的映射用户为virtual

              user_config_dir=/etc/vsftpd/dir    #每一个虚拟用户的配置文件保存路径

          6.为虚拟用户创建配置文件和目录(/etc/vsftpd/dir/)

              虚拟用户的配置文件文件名和用户名同名即可

              a1用户的配置文件

                  anon_upload_enable=YES

              a2用户的配置文件

                  anon_mkdir_write_enable=YES

              a3用户的配置文件

                  anon_upload_enable=YES

                  anon_other_write_enable=YES

      #注意:要保证虚拟用户上传的文件能下载,必须在配置文件中添加anon_umask=022

              #让上传的文件其他人位置有r权限

      #注:做虚拟用户配置文件设置时,将主配置文件中匿名用户相关设置注释掉。

          7.启动服务:service vsftpd restart

      测试连接:ftp 服务端IP

    5. openssl+vsftpd 加密验证方式

      1.查看是否安装了openssl         rpm –q openssl

      2.查看vsftpd 是否支持openssl    ldd /usr/sbin/vsftpd | grep libssl

      3.生成加密信息

              openssl req –new –x509 –nodes –out vsftpd.pem –keyout vsftpd.pem

              req         标注格式

              -new     创建一个新的证书

              -x509    证书内容格式

              -nodes     不使用密码

              -out        生成文件名

              -keyout    生成的秘钥文件名

              创建过程当中根据提示要一次填写:国家、省份、城市、组织、部门、个人或主机名、邮箱

      4.把证书存放到特定目录

              cp –a vsftpd.pem /etc/ssl/certs/

              chmod 500 /etc/ssl/certs/

      5.修改添加主配置文件/etc/vsftpd/vsftpd.conf

              ssl_enable=YES                #启用ssl认证

              ssl_tlsv1=YES                #开启tlsv1sslv2sslv3都支持

              ssl_sslv2=YES

              ssl_sslv3=YES

              allow_anon_ssl=YES                    #允许匿名用户

              force_anon_logins_ssl=YES            #匿名登录强制使用ssl

              force_anon_data_ssl=YES                #匿名传输时强制使用ssl

              force_local_logins_ssl=YES            #本地登录时强制使用ssl

              force_local_data_ssl=YES                #本地传输时强制使用ssl                rsa_cert_file=/etc/ssl/certs/vsftpd.pem        #证书文件所在目录

      6.重启服务service vsftpd restart

      7.测试(使用第三方客户端连接)    FileZilla-FTP(第三方客户端工具)

          新建站点

      连接测试时选择:

              服务器类型:通过显式 TLS/SSL

              登录类型:一般或匿名

          8.抓包

      使用tcpdump 工具进行指定端口抓包,抓取ftp登录过程中的数据包

      tcpdump –i eth0 –nn –X –vv tcp port 21 and ip host 来源ip

      -i interface:指定tcpdump需要监听的接口

      -n:对地址以数字方式显式,否则显式为主机名

      -nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名

      -X:输出包的头部数据,会以16进制和ASCII两种方式同时输出

      -vv:产生更详细的输出

      自定义私钥文件和证书文件:

      注:私钥文件要在配置文件中单独声明

      rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt                     #rsa格式的证书

      rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key             #rsa格式的密钥

      至于证书分开创建的步骤:

      (umask 077;openssl genrsa -out vsftpd.key 2048;)            #创建密钥

      openssl req -new -key vsftpd.key -out vsftpd.csr            #用创建的秘钥生成证书

    6. vsftpd配置文件详解

      默认配置:

      1. 允许匿名用户和本地用户登陆。

              anonymous_enable=YES

              local_enable=YES

      2    匿名用户使用的登陆名为ftpanonymous,口令为空;匿名用户不能离开匿名用户家目录/var/ftp,且只能下载不能上传。

      3.    本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自己家目录中进行读写操作;本地用户可以离开自家目录切换至有权限访问的其他目录,并在权限允许的情况下进行上传/下载。

              write_enable=YES

      4.    写在文件/etc/vsftpd.ftpusers中的本地用户禁止登陆。

      匿名用户(anonymous)设置

      anonymous_enable=YES/NOYES

      #控制是否允许匿名用户登入,YES 为允许匿名登入,NO 为不允许。默认值为YES

      write_enable=YES/NOYES

      #是否允许登陆用户有写权限。属于全局设置,默认值为YES

      no_anon_password=YES/NONO

      #若是启动这项功能,则使用匿名登入时,不会询问密码。默认值为NO

      ftp_username=ftp

      #定义匿名登入的使用者名称。默认值为ftp

      anon_root=/var/ftp

      #使用匿名登入时,所登入的目录。默认值为/var/ftp。注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限

      anon_upload_enable=YES/NONO

      #如果设为YES,则允许匿名登入者有上传文件(非目录)的权限,只有在write_enable=YES时,此项才有效。当然,匿名用户必须要有对上层目录的写入权。默认值为NO

      anon_world_readable_only=YES/NOYES

      #如果设为YES,则允许匿名登入者下载可阅读的档案(可以下载到本机阅读,不能直接在FTP服务器中打开阅读)。默认值为YES

      anon_mkdir_write_enable=YES/NONO

      #如果设为YES,则允许匿名登入者有新增目录的权限,只有在write_enable=YES时,此项才有效。当然,匿名用户必须要有对上层目录的写入权。默认值为NO

      anon_other_write_enable=YES/NONO

      #如果设为YES,则允许匿名登入者更多于上传或者建立目录之外的权限,譬如删除或者重命名。(如果anon_upload_enable=NO,则匿名用户不能上传文件,但可以删除或者重命名已经存在的文件;如果anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但可以删除或者重命名已经存在的文件夹。)默认值为NO

      chown_uploads=YES/NONO

      #设置是否改变匿名用户上传文件(非目录)的属主。默认值为NO

      chown_username=username

      #设置匿名用户上传文件(非目录)的属主名。建议不要设置为root

      anon_umask=077

      #设置匿名登入者新增或上传档案时的umask 值。默认值为077,则新建档案的对应权限为700

      deny_email_enable=YES/NONO

      #若是启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address。若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。默认值为NO

      banned_email_file=/etc/vsftpd/banner_emails

      #此文件用来输入email address,只有在deny_email_enable=YES时,才会使用到此档案。若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。

      本地用户设置

      local_enable=YES/NOYES

      #控制是否允许本地用户登入,YES 为允许本地用户登入,NO为不允许。默认值为YES

      local_root=/home/username

      当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。

      write_enable=YES/NOYES

      是否允许登陆用户有写权限。属于全局设置,默认值为YES

      local_umask=022

      本地用户新增档案时的umask 值。默认值为077

      file_open_mode=0755

      本地用户上传档案后的档案权限,与chmod 所使用的数值相同。默认值为0666

      欢迎语设置

      dirmessage_enable=YES/NOYES

      如果启动这个选项,那么使用者第一次进入一个目录时,会检查该目录下是否有.message这个档案,如果有,则会出现此档案的内容,通常这个档案会放置欢迎话语,或是对该目录的说明。默认值为开启。

      message_file=.message

      设置目录消息文件,可将要显示的信息写入该文件。默认值为.message

      banner_file=/etc/vsftpd/banner

      当使用者登入时,会显示此设定所在的档案内容,通常为欢迎话语或是说明。默认值为无。如果欢迎信息较多,则使用该配置项。

      ftpd_banner=Welcome to BOB's FTP server

      这里用来定义欢迎话语的字符串,banner_file是档案的形式,而ftpd_banner 则是字符串的形式。预设为无。

      控制用户是否允许切换到上级目录

      在默认配置下,本地用户登入FTP后可以使用cd命令切换到其他目录,这样会对系统带来安全隐患。可以通过以下三条配置文件来控制用户切换目录。

      chroot_list_enable=YES/NONO

      设置是否启用chroot_list_file配置项指定的用户列表文件。默认值为NO

      chroot_list_file=/etc/vsftpd.chroot_list

      用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录。

      chroot_local_user=YES/NONO

      用于指定用户列表文件中的用户是否允许切换到上级目录。默认值为NO

      通过搭配能实现以下几种效果:

      ①当chroot_list_enable=YESchroot_local_user=YES时,在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。

      ②当chroot_list_enable=YESchroot_local_user=NO时,在/etc/vsftpd.chroot_list文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。

      ③当chroot_list_enable=NOchroot_local_user=YES时,所有的用户均不能切换到其他目录。

      ④当chroot_list_enable=NOchroot_local_user=NO时,所有的用户均可以切换到其他目录。

      数据传输模式设置

      FTP在传输数据时,可以使用二进制方式,也可以使用ASCII模式来上传或下载数据。

      ascii_upload_enable=YES/NONO

      设置是否启用ASCII 模式上传数据。默认值为NO

      ascii_download_enable=YES/NONO

      设置是否启用ASCII 模式下载数据。默认值为NO

      访问控制设置

      两种控制方式:一种控制主机访问,另一种控制用户访问。

      ①控制主机访问:

      tcp_wrappers=YES/NOYES

      设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制。默认值为YES。如果启用,则vsftpd服务器会检查/etc/hosts.allow /etc/hosts.deny 中的设置,来决定请求连接的主机,是否允许访问该FTP服务器。这两个文件可以起到简易的防火墙功能。

      比如:若要仅允许192.168.0.1192.168.0.254的用户可以连接FTP服务器,则在/etc/hosts.allow文件中添加以下内容:

      vsftpd:192.168.0. :allow

      all:all :deny

      ②控制用户访问:

      对于用户的访问控制可以通过/etc目录下的vsftpd.user_listftpusers文件来实现。

      userlist_file=/etc/vsftpd.user_list

      控制用户访问FTP的文件,里面写着用户名称。一个用户名称一行。

      userlist_enable=YES/NONO

      是否启用vsftpd.user_list文件。

      userlist_deny=YES/NOYES

      决定vsftpd.user_list文件中的用户是否能够访问FTP服务器。若设置为YES,则vsftpd.user_list文件中的用户不允许访问FTP,若设置为NO,则只有vsftpd.user_list文件中的用户才能访问FTP

      /etc/vsftpd/ftpusers文件专门用于定义不允许访问FTP服务器的用户列表(注意:如果userlist_enable=YES,userlist_deny=NO,此时如果在vsftpd.user_listftpusers中都有某个用户时,那么这个用户是不能够访问FTP的,即ftpusers的优先级要高)。默认情况下vsftpd.user_listftpusers,这两个文件已经预设置了一些不允许访问FTP服务器的系统内部账户。如果系统没有这两个文件,那么新建这两个文件,将用户添加进去即可。

      访问速率设置

      anon_max_rate=0

      设置匿名登入者使用的最大传输速度,单位为B/s0 表示不限制速度。默认值为0

      local_max_rate=0

      本地用户使用的最大传输速度,单位为B/s0 表示不限制速度。预设值为0

      超时时间设置

      accept_timeout=60

      设置建立FTP连接的超时时间,单位为秒。默认值为60

      connect_timeout=60

      PORT 方式下建立数据连接的超时时间,单位为秒。默认值为60

      data_connection_timeout=120

      设置建立FTP数据连接的超时时间,单位为秒。默认值为120

      idle_session_timeout=300

      设置多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒。默认值为300

      日志文件设置

      xferlog_enable= YES/NOYES

      是否启用上传/下载日志记录。如果启用,则上传与下载的信息将被完整纪录在xferlog_file 所定义的档案中。预设为开启。

      xferlog_file=/var/log/vsftpd.log

      设置日志文件名和路径,默认值为/var/log/vsftpd.log

      xferlog_std_format=YES/NONO

      如果启用,则日志文件将会写成xferlog的标准格式,如同wu-ftpd 一般。默认值为关闭。

      log_ftp_protocol=YES|NONO 
      如果启用此选项,所有的FTP请求和响应都会被记录到日志中,默认日志文件在/var/log/vsftpd.log。启用此选项时,xferlog_std_format不能被激活。这个选项有助于调试。默认值为NO

      定义用户配置文件

      vsftpd中,可以通过定义用户配置文件来实现不同的用户使用不同的配置。

      user_config_dir=/etc/vsftpd/userconf

      设置用户配置文件所在的目录。当设置了该配置项后,用户登陆服务器后,系统就会到/etc/vsftpd/userconf目录下,读取与当前用户名相同的文件,并根据文件中的配置命令,对当前用户进行更进一步的配置。

      例如:定义user_config_dir=/etc/vsftpd/userconf,且主机上有使用者 test1,test2,那么我们就在user_config_dir 的目录新增文件名为test1test2两个文件。若是test1 登入,则会读取user_config_dir 下的test1 这个档案内的设定。默认值为无。利用用户配置文件,可以实现对不同用户进行访问速度的控制,在各用户配置文件中定义local_max_rate=XX,即可。

      FTP的工作方式与端口设置

      FTP有两种工作方式:PORT FTP(主动模式)和PASV FTP(被动模式)

      listen_port=21

      设置FTP服务器建立连接所监听的端口,默认值为21

      connect_from_port_20=YES/NO

      指定FTP使用20端口进行数据传输,默认值为YES

      ftp_data_port=20

      设置在PORT方式下,FTP数据连接使用的端口,默认值为20

      pasv_enable=YES/NOYES

      若设置为YES,则使用PASV工作模式;若设置为NO,则使用PORT模式。默认值为YES,即使用PASV工作模式。

      pasv_max_port=0

      PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为0

      pasv_min_port=0

      PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为0

      与连接相关的设置

      listen=YES/NOYES

      设置vsftpd服务器是否以standalone模式运行。以standalone模式运行是一种较好的方式,此时listen必须设置为YES,此为默认值。建议不要更改,有很多与服务器运行相关的配置命令,需要在此模式下才有效。若设置为NO,则vsftpd不是以独立的服务运行,要受到xinetd服务的管控,功能上会受到限制。

      max_clients=0

      设置vsftpd允许的最大连接数,默认值为0,表示不受限制。若设置为100时,则同时允许有100个连接,超出的将被拒绝。只有在standalone模式运行才有效。

      max_per_ip=0

      设置每个IP允许与FTP服务器同时建立连接的数目。默认值为0,表示不受限制。只有在standalone模式运行才有效。

      listen_address=IP地址

      设置FTP服务器在指定的IP地址上侦听用户的FTP请求。若不设置,则对服务器绑定的所有IP地址进行侦听。只有在standalone模式运行才有效。

      setproctitle_enable=YES/NONO

      设置每个与FTP服务器的连接,是否以不同的进程表现出来。默认值为NO,此时使用ps aux |grep ftp只会有一个vsftpd的进程。若设置为YES,则每个连接都会有一个vsftpd的进程。

      虚拟用户设置

      虚拟用户使用PAM认证方式。

      pam_service_name=vsftpd

      设置PAM使用的名称,默认值为/etc/pam.d/vsftpd

      guest_enable= YES/NONO

      启用虚拟用户。默认值为NO

      guest_username=ftp

      这里用来映射虚拟用户。默认值为ftp

      virtual_use_local_privs=YES/NONO

      当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限。默认情况下此参数是关闭的(NO)。

      其他设置

      text_userdb_names= YES/NONO

      设置在执行ls la之类的命令时,是显示UIDGID还是显示出具体的用户名和组名。默认值为NO,即以UIDGID方式显示。若希望显示用户名和组名,则设置为YES

      ls_recurse_enable=YES/NONO

      若是启用此功能,则允许登入者使用ls R(可以查看当前目录下子目录中的文件)这个指令。默认值为NO

      hide_ids=YES/NONO

      如果启用此功能,所有档案的拥有者与群组都为ftp,也就是使用者登入使用ls -al之类的指令,所看到的档案拥有者跟群组均为ftp。默认值为关闭。

      download_enable=YES/NOYES

      如果设置为NO,所有的文件都不能下载到本地,文件夹不受影响。默认值为YES

    7. 响应代码解释说明

      110新文件指示器上的重启标记

      120服务器准备就绪的时间(分钟数)

      125打开数据连接,开始传输

      150打开连接

      200成功

      202命令没有执行

      211系统状态回复

      212目录状态回复

      213文件状态回复

      214帮助信息回复

      215系统类型回复

      220服务就绪

      221退出网络

      225打开数据连接

      226结束数据连接

      227进入被动模式(IP 地址、ID 端口)

      230登录因特网

      250文件行为完成

      257路径名建立

      331要求密码

      332要求帐号

      350文件行为暂停

      421服务关闭

      425无法打开数据连接

      426结束连接

      450文件不可用

      451遇到本地错误

      452磁盘空间不足

      500无效命令

      501错误参数

      502命令没有执行

      503错误指令序列

      504无效命令参数

      530未登录网络

      532存储文件需要帐号

      550文件不可用

      551不知道的页类型

      552超过存储分配

      553文件名不允许

    8. yum本地服务器源

      服务端:

      yum -y install vsftpd

      mount /dev/sr0 /var/ftp/

      service vsftpd start

      客户端:

      yum -y install ftp

      vim /etc/yum.repos.d/CentOS-Media.repo

      baseurl=ftp://192.168.10.100

      yum list

      测试安装

  5. samba
    1. 原理

      作用:客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。

      协议:

      smb协议:服务信息块,为上层应用提供一个网络访问文件的接口

      NMB协议:主机名与ip的解析

      CIFS协议:通用文件互联系统,CIFS+wins=局域网共享(windows)

      Linux 之间的资源共享:NFS协议(网络文件系统)

      Windows之间的资源共享:CIFS协议

      特点:

      不支持公网传输

      支持在服务器端直接修改文件内容(网络磁盘)

    2. 实验

          准备环境:

      关闭防火墙和selinux

      yum -y install samba        服务器端安装samba

      yum -y install samba-client         客户机安装

      yum -y install samba-common    客户机安装

          步骤

      1. useradd 用户名 -s /sbin/nologin

      #创建linux用户,指定不能登入系统

      1. pdbedit –a zhangsan

      #转换为samba用户

      1. cp -a /etc/samba/smb.conf /etc/samba/smb.conf.bak

      #需要删除内容,先备份

      1. 添加自定义共享

        [共享名]

        comment = the share is zdy

        path = /share/zdy

        public = yes

        browseable = yes

        writable = yes

      2. 创建共享目录并给定777权限,用smb控制权限

        mkdir 目录

        chmod 777 目录

      3. 测试配置文件并重启服务

        启动:service smb start

        重启:testparm

      4. 登录测试(上传下载)

        Window端:\\ip地址\共享名(网络驱动器映射)

        Linux端:smbclient -U 用户名 //IP地址/共享名

      5. 客户端查看共享文件夹并登录测试

        smbcient -U zhangsan –L IP地址

    3. 实验类型

    部分用户登录samba服务器

    修改:/etc/samba/smb.conf

    #自定义的共享区域

    添加:valid users = 用户,@组(多个逗号分隔)

    #设置合法用户列表

    部分用户对共享区域有写权限

    修改:/etc/samba/smb.conf

    #自定义的共享区域

    添加:开启只读,设置可写列表

            read only = yes

            write list = 用户名或@

    设置上传文件的默认权限

    修改:/etc/samba/smb.conf

    添加:

            create mask = 666        #文件上传默认权限

            directory mask = 777    #目录上传默认权限

    设置用户别名

    添加别名(/etc/samba/smbusers

    添加:

            zhangsan = zs

    启用别名(修改主配置文件)

    vim /etc/samba/smb.conf

    添加:

            username map = /etc/samba/smbusers(要在全局配置写)

    Linux下挂载共享目录

    临时挂载:

    mount -t cifs -o username=xxx,password=xxx //服务器ip/服务器共享 /本地挂载目录

    永久挂载:

    //服务器ip/服务器共享 /本地挂载目录 cifs defaults,username=xxx,password=xxx 0 0

    映射网络驱动器Window

    我的电脑、计算机、此电脑、这台电脑等右键映射网络驱动器:\\服务器IP\共享名

    图形化界面(centos中)

    安装(导入安装包samba-swat)

            使用yum -y install * 安装所有上传的rpm包

    修改/etc/xinetd.d/swat

            添加:

                    only_from = 登录来源IP/24

                    disable = no

    重启xinetd服务:

                service xinetd restart

    测试:

                浏览器:IP:901        #登录时注意端口号,用户名用root

    1. 相关命令

      testparm            #检查配置文件语法问题

      testparm -v    #显示samba所有支持的选项

      pdbedit -a username        #新建Samba账户

      pdbedit -x username        #删除Samba账户

      pdbedit -L            #列出Samba用户列表,读取passdb.tdb数据库文件

      pdbedit -Lv        #列出Samba用户列表的详细信息

      pdbedit -c "[D]" -u username        #暂停该Samba用户的账号

      pdbedit -c "[]" -u username        #恢复该Samba用户的账号

      smbclient -U 用户名 //服务器ip/共享名    #登入指定用户服务器共享

      smbclient -U 用户名 -L 服务器IP            #查看共享目录

      windows连接相关命令

      \\服务器ip\共享名        #映射网络驱动器格式,samba用户登入

      net use * /del     #清空登录缓存,命令提示符输入

    2. 配置详解

    配置文件

        smb.conf            #主配置文件

        lmhosts            #类似于hosts 文件,用来进行主机名和ip的解析

        smbusers            #别名配置文件

    自定义共享参数

        [共享名]

    #共享名

        comment = 任意字符串

            # comment是对该共享的描述,可以是任意字符串

        path = 共享目录路径

            # path用来指定共享目录的路径

        browseable = yes/no

            #用来指定该共享是否可以浏览查看

        writable = yes/no

            #writable用来指定该共享路径是否可写

        available = yes/no

            #用来指定该共享资源是否可用

        admin users = 该共享的管理者

            #用来指定该共享的管理员(对该共享具有完全控制权限)

        valid users = 允许访问该共享的用户

    # valid users用来指定允许访问该共享资源的用户,多个用户或者组中间用逗号隔开,如果要加入一个组就用"@+组名"表示

        invalid users = 禁止访问该共享的用户

            # invalid users用来指定不允许访问该共享资源的用户

        read only = yes

            #只读

    write list = 允许写入该共享的用户

            #用来指定可以在该共享下写入文件的用户

        public = yes/no

            #用来指定该共享是否允许guest账户访问

        guest ok = yes/no

            #用来指定该共享是否允许guest账户访问

    [global]全局参数

        config file = /usr/local/samba/lib/smb.conf.%m

            #可以让一台samba服务器模拟多台不同配置的服务器

            1.先在/etc/samba/host/下为PC1配置一个名为smb.conf.pc1的文件

            2.在smb.conf中加入:config file = /etc/samba/host/smb.conf.%m

            3.那么主机名为PC1,访问服务器,访问的是smb.conf.pc1配置

        workgroup = WORKGROUP

            #Samba Server 所要加入的工作组或者域

        server string = Samba Server Version %v

            #Samba Server 的注释,宏%v表示显示Samba的版本号

        netbios name = smbserver

    #NetBIOS名称,如果不填,则默认会使用该服务器的DNS名称的第一部分,netbios name和workgroup名字不要设置成一样了

        interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24

            #监听网卡,可以写网卡名,也可以写该网卡的IP地址

        hosts allow = 127. 192.168.1. 192.168.10.1

            #允许连接的客户端,hosts deny 与hosts allow 刚好相反

            例:hosts allow=172.17.2.EXCEPT172.17.2.50

            #表示容许来自172.17.2.*.*的主机连接,但排除172.17.2.50

            例:hosts allow=172.17.2.0/255.255.0.0

            #表示容许来自172.17.2.0/255.255.0.0子网中的所有主机连接

            例:hosts allow=M1,M2

            #表示容许来自M1和M2两台计算机连接(主机名)

            例:hosts allow=@xq

            #表示容许来自XQ网域的所有计算机连接

        max connections = 0

            #连接Samba Server的最大连接数目,0表示不限制

        deadtime = 0

            #断掉没有打开任何文件的连接的时间,单位是分钟,0代表不自动切断任何连接

        log file = /var/log/samba/log.%m

            #日志文件的存储位置以及日志文件名称,宏%m(主机名)表示客户端单独日志

        max log size = 50

            #日志文件的最大容量,单位为kB,0代表不限制

        security = user

            #centos7z中share级别无法使用,如果需要使用,在user底下添加map to guest = Bad User

            #设置用户访问Samba Server的验证方式,一共有四种验证方式

            # share:用户访问不需要提供用户名和口令, 安全性能较低

    # user:共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性,账号和密码要在本Samba Server中建立

    # server:依靠其他Windows NT/2000或Samba Server来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的Windows用户和口令集中到一个NT系统上,使用Windows NT进行Samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,Samba将使用用户级安全模式作为替代的方式

            # domain:域安全级别,使用主域控制器(PDC)来完成认证

        passdb backend = tdbsam

            # passdb backend就是用户后台的意思

    #smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户(真实用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件

    # tdbsam:该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb用户数据库可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户。pdbedit命令的参数很多,我们列出几个主要的

    # ldapsam:该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置"passdb backend = ldapsam:ldap://LDAP Server"

        encrypt passwords = yes/no

            #是否将认证密码加密,配置文件默认已开启

        username map = /etc/samba/smbusers

            #用来定义用户名映射,也就是别名

        guest account = nobody

            #用来设置guest用户名,也就是匿名用户

        socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

            #用来设置服务器和客户端之间会话的Socket选项,可以优化传输速度

        domain master = yes/no

            #:设置Samba服务器是否要成为网域主浏览器,网域主浏览器可以管理跨子网域的浏览服务

        local master = yes/no

    #是否试图成为本地网域主浏览器,如果设为no,则永远不会成为本地网域主浏览器。但是即使设置为yes,也不等于该Samba Server就能成为主浏览器,还需要参加选举

        preferred master = yes/no

    #设置Samba Server一开机就强迫进行主浏览器选举,可以提高Samba Server成为本地网域主浏览器的机会。如果该参数指定为yes时,最好把domain master也指定为yes。使用该参数时要注意:如果在本Samba Server所在的子网有其他的机器(不论是windows NT还是其他Samba Server)也指定为首要主浏览器时,那么这些机器将会因为争夺主浏览器而在网络上大发广播,影响网络性能,如果同一个区域内有多台Samba Server,将上面三个参数设定在一台即可

        os level = 200

    #设置samba服务器的os level。该参数决定Samba Server是否有机会成为本地网域的主浏览器。os level从0到255,winNT的os level是32,win95/98的os level是1。Windows 2000的os level是64。如果设置为0,则意味着Samba Server将失去浏览选择。如果想让Samba Server成为PDC,那么将它的os level值设大些

        domain logons = yes/no

            #设置Samba Server是否要做为本地域控制器。主域控制器和备份域控制器都需要开启此项

        logon . = %u.bat

    #当使用者用windows客户端登陆,那么Samba将提供一个登陆档。如果设置成%u.bat,那么就要为每个用户提供一个登陆档。如果人比较多,那就比较麻烦。可以设置成一个具体的文件名,比如start.bat,那么用户登陆后都会去执行start.bat,而不用为每个用户设定一个登陆档了。这个文件要放置在[netlogon]的path设置的目录路径下

        wins support = yes/no

            #设置samba服务器是否提供wins服务

        wins server = wins服务器IP地址

            #设置Samba Server是否使用别的wins服务器提供wins服务

        wins proxy = yes/no

            #设置Samba Server是否开启wins代理服务

        dns proxy = yes/no

            #设置Samba Server是否开启dns代理服务

        load printers = yes/no

            #设置是否在启动Samba时就共享打印机

        printcap name = cups

            #设置共享打印机的配置文件

        printing = cups

    #设置Samba共享打印机的类型现在支持的打印系统有:bsd, sysv, plp, lprng, aix, hpux, qnx

  6. 网络服务—NFS

    什么是NFS

        NFS Network File System的缩写,即网络文件系统,它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录,NFS一般用来存储共享视频,图片等静态数据。

    1. NFS通信原理

      1)首先服务器端启动RPC服务,并开启111端口

      2)启动NFS服务,并向RPC注册端口信息

      3)客户端启动RPCportmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口

      4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。

      5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

    2. NFS服务搭建流程
      1. 关闭防火墙和selinux
      2. 安装软件
        1. rpcbind:支持安全NFS RPC服务的连接
        2. nfs-utils:包括基本的NFS命令与监控程序
      3. 修改配置文件/etc/exports

      共享目录客户端1(访问权限,用户映射,其他)客户端2(访问权限,用户映射,其他)

      例:/nfs 192.168.10.0/24(rw,all_squash,anonuid=501,anongid=501)

      客户端常用的指定方式:

      指定ip地址的主机:192.168.0.200

      指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0

      指定域名的主机:www.linuxlc.com

      指定域中的所有主机:*.linuxlc.com

      所有主机:*

      1. 启动服务和自启动
        1. 先启动RPC:service rpcbind start
        2. 再启动NFS:service nfs start
        3. chkconfig 服务 on/off
        4. chkconfig --list 服务
      2. 查看rpcinfo -p localhost是否有nfs端口
      3. 修改服务器共享目录权限,否则客户端无法创建文件
      4. 客户端挂载服务端共享目录
        1. 临时:mount -o vers=3 192.168.10.100:/nfs/ /mou
        2. 永久/etc/fstab: 192.168.10.100:/nfs /mou nfs defaults 0 0
      5. 如果修改配置文件,重启服务多种方法
        1. exportfs -ra
        2. service nfs restart
      6. 访问客户端挂载目录,自由设置服务端权限测试

      nfs相关命令

      1. exportfs

      格式:exportfs [-aruv]

      -a 全部

      -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab

      -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)

      -v 在export的时候,将详细的信息输出到屏幕上。

      具体例子:

      # exportfs -au 卸载所有共享目录

      # exportfs -ra 重新共享所有目录

      1. rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些其中nfs 开启的是2049,portmapper(rpcbind) 开启的是111,其余则是rpc开启的
      2. showmount -e NFS服务器IP    #客户机查看服务器共享目录
      3. 服务器查看共享目录
        1. showmount –e 本机ip
        2. exportfs

      nfs相关权限内容

      1. 访问权限选项
      2. 设置输出目录只读:ro
      3. 设置输出目录读写:rw
      4. 用户映射选项:
      5. root_squash:将root用户的访问映射为匿名(nfsnobody)用户uid和gid
      6. no_root_squash:保留管理员权限,以服务器管理员的权限管理(客户机以当前身份创建文件)
      7. all_squash:将远程访问的用户及所属组都映射为指定uid、gid的匿名用户
      8. anonuid=xxx:将远程访问的所有用户都映射为指定uid的匿名用户
      9. anongid=xxx:将远程访问的所有用户组都映射为指定gid匿名组账户
      10. 其它选项
      11. sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性(同步)
      12. async:将数据先保存在内存缓冲区中,必要时才写入磁盘(异步)
  7. nfs ftptftp samba区别

    NFS:Network File System 是已故的Sun公司制定的用于分布式访问的文件系统,它的本质是文件系统。主要在Unix系列操作系统上使用,基于TCP/IP协议层,可以将远程的计算机磁盘挂载到本地,像本地磁盘一样操作。

    samba是Unix系统下实现的 Windows文件共享协议-CIFS,由于Windows共享是基于NetBios协议,是基于Ethernet的广播协议,在没有透明网桥的情况下(如VPN)是不能跨网段使用的。它主要用于unix和windows系统进行文件和打印机共享,也可以通过samba套件中的程序挂载到本地使用。

    FTP的目的是在Internet上共享文件而发明的一种协议,基于TCP/IP。世界上绝大多数系统都会有支持FTP的工具存在,通用性很强。目前少有人把VPS修改成支持FTP组件的形式,主要是因为FTP一开始就不是为了文件系统而设计的。

    三种协议虽然都可以支持文件共享,但是其功能点和侧重点上面各有所不同,协议格式不同。Authentication(鉴定)也就是你说的登陆方式也会随着协议的内容也有所不同。

    标准的FTP协议的登陆密码是用明文传输的,没有加密,这会有很大的安全隐患,目前有FTPs(FTP on SSL/TLS)和sFTP(SSH FTP)等基于通信层进行加密的FTP协议,这样会有更好的安全性。

    NFS的鉴定机制是基于IP地址的,没有密码这种东西。是控制本地映射的用户权限来控制访问者的权

    ftp_tftp_nfs三种文件传输协议的区别

    文件传送协议FTP(File Transfer Protocol)是Internet上使用比较广泛的文件传送协议。FTP提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限。FTP屏蔽了各种计算机系统的细节,因此适用于在异构网络中任意计算机之间传送文件。它的基本应用就是将文件从一台计算机复制到另一台计算机中。它要存取一个文件,就必须先获得一个本地文件的副本,如果修改文件,也只能对文件的副本进行修改,然后再将修改后的文件副本传回到原节点。

    您只要记住几个关键词:交互式、存取权限和副本。

    简单文件传送协议TFTP(Trivial File Transfer Protocol)是一个小而易于实现的文件传送协议。TFTP是基于UDP数据报,需要有自己的差错改正措施。TFTP只支持文件传输,不支持交互,没有庞大的命令集。也没有目录列表功能,以及不能对用户进行身份鉴别。但它的代码所占内存较小,不需要硬盘就可以固化TFTP代码,很适合较小的计算机和特殊用途的设备。

    您会发现TFTP和FTP一个主要的区别就是它没有交互式,且不进行身份验证。

    NFS最初应用于UNIX操作系统下,它允许应用进程打开一个远地文件,并能够在该文件中某一个特定位置上开始读写数据。

    FTP在修改数据文件时是需要首先获得一个文件的副本,如果计算机A上运行的应用程序要在远地计算机B的一个很大的文件中添加一行信息。那么就需要将此文件从计算机B传送到计算机A,添加好信息后再回传到计算机B。来回传输这样大的文件很花费时间,而这种传送是不必要的。而NFS可使用户只复制一个大文件中的一个很小的片段,在网络上传送的只是少量的修改数据。

  8. LAMP环境搭建
    1. 准备工作
      1. 安装编译工具gcc、gcc-c++

      yum -y install gcc gcc-c++

      yum -y install gcc*

      1. 关闭系统RPM安装包的Apache、MySQL的服务

      service httpd stop

      service mysqld stop

      chkconfig --level 2345 httpdmysqld off

      1. 关闭SELinux,允许防火墙80端口访问

      vim /etc/selinux/config

      SELINUX=disabled

      修改后需重新启动Linux方可生效!

      1. 关闭防火墙Netfilter/iptables

      iptables -F * 如果没有禁用防火墙,默认80端口禁止访问

      iptables A INPUT p tcp dport 80 j ACCEPT

      iptables -Z

      iptables -X

      1. 关闭不必要自启动服务

        # ntsysv

        以下列出服务可保持自启动,未列出的服务都可以关闭:

        atd

        crond # atdcrond计划任务

        irqbalance

        microcode_ctl # 系统irq端口调用,系统服务

        network #网络设置

        sendmail #邮件

        sshd #远程管理

        syslog #系统日志

      2. 查看确认磁盘空间未满

      df -h

      1. 如何确定报错

      安装过程停止

      停止后,一页界面中出现error或者warning

      如何确定安装成功

      进入安装目录,确认安装程序出现,就是成功

    2. 安装步骤
      1. 拷贝源码包,解包解压缩

      建议将LAMP环境安装源码包统一存放在一个目录下,如/lamp

      可编写个批量处理脚本,一次性把所有.tar.gz的安装包解包解压缩

      # vim tar.sh

          cd /lamp

      /bin/ls *.tar.gz > ls.list

          for TAR in `cat ls.list`

      do

              /bin/tar -zxf $TAR

      done

      /bin/rm ls.list

      1. 安装libxml2

      Libxml2 是一个xml c语言版的解析器, 它除了支持c语言版以外,还支持c++PHPPascalRubyTcl等语言的绑定,能在WindowsLinuxSolarisMacOsX等平台上运行

      yum install -y libxml2-devel python-devel

      cd /lamp/libxml2-2.9.1 && ./configure --prefix=/usr/local/libxml2/ && make && make install && echo $?

      1. 安装libmcrypt

      libmcrypt是加密算法扩展库。支持DES, 3DES, RIJNDAEL, Twofish, IDEA, GOST, CAST-256, ARCFOUR, SERPENT, SAFER+等算法

      cd /lamp/libmcrypt-2.5.8 && ./configure --prefix=/usr/local/libmcrypt/ && make && make install && echo $?

      1. 安装libltdl,也在libmcrypt源码目录中,非新软件

      cd /lamp/libmcrypt-2.5.8/libltdl && ./configure --enable-ltdl-install && make && make install && echo $?

      1. 安装mhash

      Mhash是基于离散数学原理的不可逆向的php加密方式扩展库,其在默认情况下不开启。mhash的可以用于创建校验数值,消息摘要,消息认证码,以及无需原文的关键信息保存(如密码)等

                  cd /lamp/mhash-0.9.9.9 && ./configure && make && make install && echo $?

      1. 安装mcrypt

      mcrypt php 里面重要的加密支持扩展库。Mcrypt库支持20多种加密算法和8种加密模式LD_LIBRARY_PATH用于指定libmcryptmhash的库的位置--with-libmcrypt-prefix用于指定libmcrypt软件位置

      cd /lamp/mcrypt-2.6.8 && LD_LIBRARY_PATH=/usr/local/libmcrypt/lib:/usr/local/lib ./configure --with-libmcrypt-prefix=/usr/local/libmcrypt && make && make install && echo $?

      1. 安装zlib

      zlib是提供数据压缩用的函式库

      针对64位:cd /lamp/zlib-1.2.3 && ./configure && sed -i 's/CFLAGS=-O3 -DUSE_MMAP.*/CFLAGS=-O3 -DUSE_MMAP -fPIC/g' Makefile && make &&make install && echo $?

      zlib指定安装目录可能造成libpng安装失败,故不指定,为卸载方便,建议make install执行结果输出到安装日志文件,便于日后卸载

      针对32位:cd /lamp/zlib-1.2.3 && ./configure && make && make install && echo $?

      1. 安装libpng

      libpng 软件包包含 libpng .这些库被其他程式用于解码png图片

      cd /lamp/libpng-1.2.31 && ./configure --prefix=/usr/local/libpng && make && make install && echo $?

      1. 安装jpeg6

      用于解码.jpg.jpeg图片, --enable-shared--enable-static参数分别为建立共享库和静态库使用的libtool

      mkdir -p /usr/local/jpeg6 /usr/local/jpeg6/bin /usr/local/jpeg6/lib /usr/local/jpeg6/include /usr/local/jpeg6/man/man1

      cd /lamp/jpeg-6b

      yum -y install libtool*

      \cp /usr/share/libtool/config/config.sub ./

      \cp /usr/share/libtool/config/config.guess ./64位中的问题,32位没有此报错)

      ./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static && make && make install && echo $?

      1. 安装freetype

      FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。支持单色位图反走样位图的渲染。FreeType库是高度模块化的程序库,虽然它是使用ANSI C开发,但是采用面向对象的思想,因此,FreeType的用户可以灵活地对它进行裁剪。

              cd /lamp/freetype-2.3.5 && ./configure --prefix=/usr/local/freetype/ && make && make install && echo $?

      1. 安装Apache

      若前面配置zlib时没有指定安装目录,Apache配置时不要添加--with-z=/usr/local/zlib/参数

      yum -y install openssl-devel

      cp -r /lamp/apr-1.4.6 /lamp/httpd-2.4.7/srclib/apr

      cp -r /lamp/apr-util-1.4.1 /lamp/httpd-2.4.7/srclib/apr-util

      cd /lamp/pcre-8.34 && ./configure && make && make install && echo $?

      cd /lamp/httpd-2.4.7 && ./configure --prefix=/usr/local/apache2 --sysconfdir=/usr/local/apache2/etc --with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared && make && make install && echo $?

      自启动:echo "/usr/local/apache2/bin/apachectl start" >> /etc/rc.d/rc.local

      1. 安装ncurses

      Ncurses 提供字符终端处理库,包括面板和菜单

      如果报错,包找不到,是*通配符没有识别,给文件名加双引号 "ncurses*"

      若不安装ncurses编译MySQL时会报错

      --without-ada参数为设定不编译为ada绑定,因进入chroot环境不能使用ada ;--enable-overwrite参数为定义把头文件安装到/tools/include下而不是/tools/include/ncurses目录

      --with-shared    生成共享库

              yum -y install ncurses-devel

      cd /lamp/ncurses-5.9 && ./configure --with-shared --without-debug --without-ada --enable-overwrite && make && make install && echo $?

      1. 安装cmake和bison

      mysql5.5以后,不再使用./configure工具,进行编译安装。而使用cmake工具替代了./configure工具。cmake的具体用法参考文档cmake说明

                      yum -y install cmake bison

      1. 安装MySQL

                  useradd -r -s /sbin/nologin mysql

                  #添加用户组mysql ,将mysql用户默认组设置为mysql用户组

      cd /lamp/mysql-5.5.48 && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306 && make && make install && echo $?

      cd /usr/local/mysql/

      chown -R root .

      chown -R mysql data

      cp support-files/my-medium.cnf /etc/my.cnf

      /usr/local/mysql/scripts/mysql_install_db --user=mysql

      #创建数据库授权表,初始化数据库

      /usr/local/mysql/bin/mysqld_safe --user=mysql &

      #用原本源代码的方式去使用和启动mysql

      /usr/local/mysql/bin/mysqladmin -uroot password 123

      #设定mysql密码

      /usr/local/mysql/bin/mysql -u root -p

      #登录MySQL

      echo "/usr/local/mysql/bin/mysqld_safe --user=mysql &" >> etc/rc.local

      #自启动

                  make clean

      rm CMakeCache.txt

      #如果报错,清除缓存,请使用以上命令

      1. 安装PHP

      若前面配置zlib时没有指定安装目录,PHP配置时不要添加--with-zlib-dir=/usr/local/zlib/参数

      选项:

          --with-config-file-path=/usr/local/php/etc/    指定配置文件目录

          --with-apxs2=/usr/local/apache2/bin/apxs    指定apache动态模块位置

          --with-libxml-dir=/usr/local/libxml2/        指定libxml位置

          --with-jpeg-dir=/usr/local/jpeg6/            指定jpeg位置

          --with-png-dir=/usr/local/libpng/            指定libpng位置

          --with-freetype-dir=/usr/local/freetype/    指定freetype位置

      --with-mcrypt=/usr/local/libmcrypt/         指定libmcrypt位置

          --with-mysqli=/usr/local/mysql/bin/mysql_config        指定mysql位置

      --with-gd 启用gd

          --enable-soap                            支持soap服务

          --enable-mbstring=all                    支持多字节,字符串

          --enable-sockets                        支持套接字

          --with-pdo-mysql=/usr/local/mysql        启用mysqlpdo模块支持

          --without-pear                            不安装pear(安装pear需要连接互联网,PEARPHP扩展与应用库)

      cd /lamp/php-7.0.7 && ./configure --prefix=/usr/local/php/ --with-config-file-path=/usr/local/php/etc/ --with-apxs2=/usr/local/apache2/bin/apxs --with-libxml-dir=/usr/local/libxml2/ --with-jpeg-dir=/usr/local/jpeg6/ --with-png-dir=/usr/local/libpng/ --with-freetype-dir=/usr/local/freetype/ --with-mcrypt=/usr/local/libmcrypt/ --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-soap --enable-mbstring=all --enable-sockets --with-pdo-mysql=/usr/local/mysql --with-gd --without-pear && make && make install && echo $?

      mkdir /usr/local/php/etc/

      cp /lamp/php-7.0.7/php.ini-production /usr/local/php/etc/php.ini

      vim /usr/local/apache2/etc/httpd.conf

                  AddType application/x-httpd-php .php .phtml

                  AddType application/x-httpd-php-source .phps

                  echo -e "<?php\nphpinfo();\n?>" /usr/local/apache2/htdocs/test.php

                  /usr/local/apache2/bin/apachectl restart

                  http://Apache服务器地址/test.php

      1. 安装openssl

      OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用

              yum -y install openssl-devel

              cd /lamp/php-7.0.7/ext/openssl

              mv config0.m4 config.m4

              /usr/local/php/bin/phpize

      ./configure --with-openssl --with-php-config=/usr/local/php/bin/php-config && make && make install

      1. 编译安装memcache

      Memcache是一个高性能的分布式的内存对象缓存系统, 简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度

              cd /lamp/pecl-memcache-php7

              /usr/local/php/bin/phpize

      ./configure --with-php-config=/usr/local/php/bin/php-config && make && make install

      echo "extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20151012/"" >> /usr/local/php/etc/php.ini

      echo "extension="openssl.so";" >> /usr/local/php/etc/php.ini

      echo "extension="memcache.so";" >> /usr/local/php/etc/php.ini

      /usr/local/apache2/bin/apachectl restart

      yum -y install libevent libevent-devel

      cd /lamp/memcached-1.4.17

      ./configure --prefix=/usr/local/memcache && make && make install

      useradd -r -s /sbin/nologin memcache

      /usr/local/memcache/bin/memcached -umemcache &

      1. 安装phpMyAdmin

      通过web管理数据库

              下载最新版phpMyAdmin-4.8.2-all-languages.zip

              unzip phpMyAdmin-4.8.2-all-languages.zip

      cp -r phpMyAdmin-4.8.2-all-languages /usr/local/apache2/htdocs/phpmyadmin

              下载网站解压复制到/usr/local/apache2/htdocs/就可以访问

              访问网站设置数据库内容,给htdocs目录给相应权限,用户是daemon用户

    3. yum简易安装LAMP环境

      安装httpd

      1. yum -y install httpd httpd-devel
      2. service httpd start
      3. chkconfig httpd on

      安装mysql

      1. yum -y install mysql mysql-server mysql-devel
      2. service mysqld start
      3. 设置mysql密码

      mysql>; USE mysql;

      mysql>; UPDATE user SET Password=PASSWORD('newpassword') WHERE user='root';

      mysql>; FLUSH PRIVILEGES;

      #设置mysql密码还可以用:mysql_secure_installation 命令

      1. 允许远程登录

      mysql -u root -p

      mysql>GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT

      1. 设为开机启动 chkconfig mysqld on

      安装php

      1. yum -y install php php-mysql php-common php-gd php-mbstring php-mcrypt php-devel php-xml
      2. service httpd restart
      3. 测试

      /var/www/html/新建个test.php文件,将以下内容写入,然后保存。

      <?

      phpinfo();

      ?>

    4. rpmhttpd基本配置与使用

      httpd相关软件包说明

      httpd                主软件包;

      httpd-devel        http相关的开发包;

      httpd-manual        官方提供的手册;

      httpd-tools        httpd相关的工具(包括一些测试工具);

          httpd文件位置

      服务脚本:/etc/rc.d/init.d/httpd

      工作目录:/etc/httpd

      配置文件存放目录:/etc/httpd/conf/

      主配置文件:/etc/httpd/conf/httpd.con

      扩展配置文件:/etc/httpd/conf.d/*.conf

      sockethttp80/tcp),https443/tcp

      网页文件存放目录:/var/www/html/

      CGI脚本目录:/var/www/cgi-bin/

      模块目录:/etc/httpd/modules(链接到/usr/lib/httpd/modules

      日志目录:/etc/httpd/logs(链接到/var/log/httpd

      启动httpd服务:service httpd start

      注意:在rhel系列中,启动httpd后会默认打开一个测试页面,如果不想显示该测试页,使用"mv -f /etc/httpd/conf.d/welcome.conf webcome.conf.bak",并重启服务即可

      主配置文件的构成

      1. 全局配置:对主服务器或虚拟主机都生效,并且有些功能是服务器自身的工作属性
      2. 主服务器:与主站相关的设置
      3. 虚拟主机:虚拟主机相关的设置

      主配置文件的设置/etc/httpd/conf/httpd.conf

      ServerTokens OS       #定义页面显示的服务器信息详细程度,可以指定其他参数

      ServerRoot "/etc/httpd"            #定义服务器的工作的根目录

                PidFile run/httpd.pid            #定义pid配置文件的路径(这是一个相对路径)

              Timeout 60                        #TCP连接的超时时间(如三次握手等等)

              KeepAlive Off                    #是否打开长连接,开启后有助于提升服务器性能,但如果在比较繁忙的服务器中,应考虑是否开启

              MaxKeepAliveRequests 100        #长连接请求的最大资源数,达到该限制后断开链接

              KeepAliveTimeout 15                #长连接请求的超时时间

              <IfModule prefork.c>                #prefork模型的相关设置;

              StartServers 8              #服务器启动多少个空闲进程;

              MinSpareServers 5             #最少空闲进程(如果8个空闲进程使用了4个,则会再启动一个空闲进程,保证存在5个空闲进程)

              MaxSpareServers 20                #最大空闲进程(如果有500个用户访问,退出了450个,则kill30个);

              ServerLimit 256              #MaxClients设定的上限值(需要将服务器进程kill掉,然后在重启)

              MaxClients 256              #最大客户端数量(最大允许多少个连接请求);

           MaxRequestsPerChild  4000          一个进程最多响应多少个用户请求,当接收用户请求4000次后,将其kill掉,生成新的进程响应用户请求;

           </IfModule>

           <IfModule worker.c>          worker模型的相关设置;

           StartServers         4          默认启动的进程数;

           MaxClients         300          最大客户端数量(最大允许多少个连接请求);

           MinSpareThreads     25          最小空闲线程(所有进程的线程数之和);

           MaxSpareThreads     75          最大空闲线程(所有进程的线程数之和);

           ThreadsPerChild     25          一个进程生成多少个线程;

           MaxRequestsPerChild  0          每个进程响应多少个用户请求(由于是由线程来控制,为0表示不限制);
           </IfModule>

           Listen 12.34.56.78:80          httpd监听的IP地址和端口,可以不指定IP地址表示监听本机所有地址(listen可以出现多次,用于监听多个端口);

           LoadModule auth_basic_module modules/mod_auth_basic.so          指定httpd启动时装载的模块(前后分别为"模块名称/模块路径",路径为相对路径);

           Include conf.d/*.conf          装载额外的配置文件(相对路径);

           ExtendedStatus On          使用status时,是否显示更详细的信息(默认注释掉);

           User apache          httpdwork进程使用的用户;

           Group apache          httpdwork进程使用的组名;

           ### Section 2: 'Main' server configuration

           ServerAdmin root@localhost          服务器管理员的邮箱地址;

           ServerName www.example.com:80          服务器名称(如果不启用此指令,则服务器启动时会试图反解当前主机的IP地址,如果解析成功,则引用此主机名作为服务器名称,否则会使用"127.0.0.1"来作为默认主机名);

           DocumentRoot "/var/www/html"          网页文件存放的根目录;

           <Directory "/var/www/html">          定义一个网站容器;

           Options FollowSymLinks          定义容器名称内文件被访问时的访问属性;

                Options的参数

                     Indexes     允许索引目录,即没有默认页面时,列出网页文件列表(生成环境中应该关闭,如果作为下载站点时可以开启);

                     none          不支持任何参数;

                     FollowSymLinks          允许符号链接(是否允许访问页面中的符号链接所指向的源文件,如果没有必要可以关闭,在一定程度上可以提高服务器性能);

                     Includes          允许执行服务器端包含"SSI"的文档,为了安全起见,应该关闭;

                     ExecCGI          是否允许执行CGI脚本;

                     MultViews          内容协商机制,根据客户端来源的语言来判定显示相匹配的的网页(消耗资源,没有必要不必开启);

                     All          支持所有参数;

           AllowOverride None          是否使用.htacess覆写访问权限;

                AuthConfig          需要进程用户认证后才可以访问网页;

           Order allow,deny          定义基于主机的访问控制功能,可以实现基于IP、网络地址或主机名来定义,deny写在后面表示deny所有;

           Allow from all          允许所有的主机访问,或者使用Deny from all拒绝所有主机,也可以使用以下写法:

                Deny from 192.168.0.0/24

                Allow from 192.168.1.0/24 172.16.100.0/24 .edu  apache.org www.example.com 172.16

           </Directory>

           注意: 目录可能会继承父目录的选项,在选择前"-"符号表示取消从父目录继承的某项功能;

           <IfModule mod_userdir.c>     是否支持用户在个人的家目录中建立网页文件,使用http://xxx/~home/的方式访问;

                UserDir disabled          默认不允许,如果要启用此功能,将此项注释,去掉#UserDir public_html的注释,用户建立public_html目录,然后将网页文件放到该目录即可;

           </IfModule>

           DirectoryIndex index.html index.html.var          定义访问的默认页面,从左向右匹配;

           AccessFileName .htaccess          apache的每目录访问控制,在对应的目录下创建".htacess"文件,将访问控制机制写入即可,但会降低apache的执行效率,生产中通常禁用;

           <Files ~ "^\.ht">          模式匹配,以ht开头的文件,保障此类开头文件的安全性;
                Order allow,deny
                Deny from all
                Satisfy All
           </Files>

           TypesConfig /etc/mime.types          定义httpd支持的mime类型的文件;

           DefaultType text/plain          如果没有指定类型,默认使用的类型为:明文的纯文本类型;

           HostnameLookups Off          日志记录中,是否将每个访问用户的IP地址反解成主机名(消耗系统资源,建议不启用);

           EnableSendfile off

           ErrorLog logs/error_log          定义错误日志的存放位置;

           LogLevel warn          定义日志级别;

           LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined          定义日志格式,最后面的一项为日志格式的名称;

                %h          客户端地址;

                %l          远端主机的登录名称(远程主机登录系统的用户名);

                %u          登录网站使用的用户;

                %t          日志事件产生的时间;

                %r          请求报文的第一行(访问方法,URL获取的资源以及版本号)

                %>s          最后一个请求对应的状态码;

                %b          响应报文的大小;

                %{Referer}i           从哪个页面的链接过来的;

                %{User-Agent}i          客户端浏览器的类型;

           CustomLog logs/access_log combined          定义访问日志格式的类型;

           Alias /icons/ "/var/www/icons/"          定义路径别名;

           注意:Alias /luntan "/bbs/forum"     如果luntan后面加了/符号,后面forum也一定要加/符号,如果没加则都不加;

           ScriptAlias          定义执行CGI脚本的目录;

           配置用户认证

           <Directory "/var/www/html">

                AllowOverride AuthConfig

                AuthType Basic          使用基本用户认证;

                AuthName "Restricted Site..."          认证提示信息;

                AuthUserFile "/etc/httpd/conf/htpasswd"          认证用户的账号密码文件;

                Require valid-user          valid-user表示允许密码文件中所有用户登录,也可以指定特定用户;

                AuthGroupFile "/etc/httpd/conf/group"          指定组名和包含的用户(语法"myusers:hadoop tom");

                Require group groupname          允许哪些组可以登录;

                Order allow,deny

                Allow from all

           </Directory>

           ### Section 3: Virtual Hosts

           定义虚拟主机前,最好先取消中心主机,注释中心的DocumentRoot即可;

           配置基于IP的虚拟主机

           <VirtualHost 192.168.1.1:80>

                ServerName www.example.com               域名;

                DocumentRoot "/var/www/html"            网页文件存放目录;

           </VirtualHost>

           <VirtualHost 192.168.1.2:80>

                ServerName www.linux.com

                DocumentRoot "/var/www/linux"

           </VirtualHost>

           配置基于端口的虚拟主机

           <VirtualHost 192.168.1.1:80>

                ServerName www.example.com

                DocumentRoot "/var/www/html"

                CustomLog logs/example.com-access_log common          访问日志的记录位置和类型;

           </VirtualHost>

           <VirtualHost 192.168.1.1:8080>          需要在Listen指令上添加监听8080端口;

                ServerName www.linux.com

                DocumentRoot "/var/www/linux"

                CustomLog logs/linux.com-access_log common          访问日志的记录位置和类型;

           </VirtualHost>

           配置基于域名的虚拟主机:使用基于域名的虚拟主机,需要启用"NameVirtualHost *:80"指令,可以指定监听的地址,*表示监听所有IP

           <VirtualHost *:80>

                ServerName www.example.com

                DocumentRoot "/var/www/html"

                CustomLog logs/example.com-access_log common

                <Directory "/var/www/html">

                     Options none

                     AllowOverride none

                     Order deny,allow

                     Deny from 192.168.10.1

                </Directory>

           </VirtualHost>

           <VirtualHost *:80>

                ServerName www.linux.com

                DocumentRoot "/var/www/linux"

                CustomLog logs/linux.com-access_log common

                <Directory "/var/www/linux">

                     Options none

                     AllowOverride AuthConfig

                     AuthType Basic

                     AuthName "Restricted Site..."

                     AuthUserFile "/etc/httpd/conf/htpassw"

                     Require valid-user

                </Directory>

           </VirtualHost>

           定义默认虚拟主机:需将其放在所有虚拟主机的最上面;

           <VirtualHost _default_:80>

                DocumentRoot "/var/www/default"

           </VirtualHost>

      配置httpdstatus功能

           <Location /status>

                SetHandler server-status          实现所有匹配到的文件由一个处理器来处理,server-status可以显示服务器的状态信息;

                Order deny,allow

                Deny from all

                Allow from .example.com          生产中应该对用户访问status做认证;

           </Location>

      配置基于opensslhttps服务

           1,安装ssl模块:yum install -y mod_ssl,安装后会生成以下文件

                /etc/httpd/conf.d/ssl.conf          ssl的配置文件,需要装载到httpd的主配置文件中(重启httpd会自动装载);

                /usr/lib/httpd/modules/mod_ssl.so          ssl的模块;

                /var/cache/mod_ssl          ssl会话的缓存目录

           2,为服务器提供证书(测试环境中,可以自建CA,然后使用自签名证书);

           3,配置https服务:编辑/etc/httpd/conf.d/ssl.conf

                <VirtualHost 192.168.1.1:443>

                     DocumentRoot "/var/www/html"

                     ServerName www.example.com

                     ErrorLog logs/ssl_error_log          错误日志的存放位置;

                     TransferLog logs/ssl_access_log          访问日志的存放位置;

                     LogLevel warm          记录日志的级别;

                     SSLengine on          是否启用ssl功能;

                     SSLProtocal all -SSLv2          支持哪些ssl协议,ALL表示所有,-SSLv2表示不支持ssl v2

                     SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW          SSL支持哪些加密机制,ALL表示所有,!表示排除;

                     SSLCertificateFile /etc/pki/tls/certs/localhost.crt          证书文件存放的位置;

                     SSLCertificateKeyFile /etc/pki/tls/private/localhost.key          私钥文件的存放位置;

           注意

                1,证书中的主机名称必须与客户浏览器访问的名称一致;

                2,一个IP地址上只能建立一个SSL主机;

                3,将CA的证书(如cacert.pem)下载到客户机,改名为"cacert.crt",然后导入到客户端浏览器的"受信任的根证书颁发机构"中,客户端浏览器打开https就不会报错;

                4,生产环境中的服务器,建议向权威的CA机构申请证书;

      httpd配置文件语法测试

           service httpd configtest         httpd -t;两个命令的效果是一样的,前者也是调用的后者;

           注意:大部分配置被修改后,使用"service httpd reload"即可生效,而修改监听地址和端口需要重启服务才生效;

      htpasswd:创建用户密码文件的命令;

           -c:创建密码文件,只有在第一次的时候使用,如果密码文件已经存在,则将文件内的用户清空;

           -m:用户的密码以md5格式加密存放;

           -D:删除一个用户

           htpasswd -c -m /etc/httpd/conf/htpasswd hadoop

           htpasswd -m /etc/httpd/conf/htpasswd tom

      关于<Directory><Location>的说明

           <Directory "/var/a.org"></Directory>          定义用户访问某个文件系统路径的时候,应该具有何种访问属性;

           <Location "/images"></Location>          定义用户访问该URL的时候,具有何种的访问属性;

      关于MPM:多道处理模块,用于定义apache响应多个用户请求时所工作的模型;

           mpm_winntwindows专用;

           prefork:一个请求用一个进程响应;

           worker:一个进程响应多个用户请求;worker是基于线程,其启动多个进程,进程启动后启动多个线程一个请求用一个线程响应;

           enent:基于事件驱动模型,一个进程响应多个用户请求;

           httpd -l :查看httpd编译所支持的模型,如果没有编译又想使用其他模型可以使用httpd.eventhttpd.worker
           
      /etc/sysconfig/httpd 文件中可以修改httpd启动的默认模型,在2.2event为测试模型,不建议使用;2.4默认为event模型;

      虚拟主机的类型

           基于IP:每个虚拟主机使用不同的IP地址,但使用的端口相同;

           基于端口:每个虚拟主机的IP地址相同,但端口不同;

           基于域名:每个虚拟主机的IP和端口相同,但使用的域名不用;

      配置基于opensslhttps服务,不需要密码认证

      1.  vi /etc/apache2/mods-available/ssl.conf

      2.  注释SSLPassPhraseDialog  builtin,在后面加上

              SSLPassPhraseDialog exec:/etc/apache2/ssl/ssl_pass.sh

      3.  vi /etc/apache2/ssl/ssl_pass.sh

      4.  输入

          #!/bin/sh
          echo "
      你的ssl证书密码"

      5.  chmod +x /etc/apache2/ssl/ssl_pass.sh

      6.  /etc/init.d/apache2 restart

       

      这样就直接重启apache了,不需要再每次都输入恼人的证书密码

       

  9. RSYNC服务
    1. rsync概述

      rsync是类unix系统下的数据镜像备份工具——remote sync。一款支持快速增量备份的工具,支持本地复制,远程同步等,rsync 命令来同步系统文件之前要先登录remote 主机认证,认证过程中用到的协议有2种:ssh 协议和rsync协议。

      rsync特性

      1. 能更新整个目录和树和文件系统
      2. 有选择性的保持符号链接、硬链接、文件属性、权限、设备以及时间等
      3. 对于安装来说,无任何特殊权限要求
      4. 对于多个文件来说,文件传输效率高
      5. 能用rsh、ssh或直接端口作为传输入口端口
      6. 支持匿名rsync同步文件,是理想的镜像工具
    2. ssh同步源

          作用:目标地址同名文件数据同步,文件同步,不删除多余文件

          准备环境

      1. 一台服务器,一台客户端
      2. 在服务器和客户端上创建单独的测试目录(/server/ssh、/client/ssh)
      3. 普通用户需要对目录有相应权限,最好使用setfacl权限

              步骤:arsync -avz 用户@服务器地址:/服务器目录/* 本地目录    #下行同步(下载)

                      -a:归档模式,递归并保留对象属性

      -v:显示同步过程

      -z:在传输文件时进行压缩

                       brsync -avz /本地目录/* 用户@服务器地址:/服务器目录    #上行同步(上传)

      4.    免密传输:ssh-keygen -t rsa     ssh-copy-id [email protected]

       

    3. 构建rsync同步源

          作用:设置虚拟用户登录,目标地址同名文件数据同步,文件同步

      实验环境

      1. 一台服务器,一台客户端
      2. 在服务器和客户端上创建单独的测试目录(/server/rsync、/client/rsync)
      3. 创建主配置文件(/etc/rsyncd.conf)

      添加:

      address = 192.168.10.200        #服务器地址

      port 873

      log file = /var/log/rsyncd.log

      pid file = /var/run/rsyncd.pid

      [share]

      comment = this is share        #描述

      path = /server        #共享目录地址

      read only = yes        #只读权限,改为no是可写

      dont compress = *.gz *.bz2

      auth users = aa        #自由定义虚拟用户

      secrets file = /etc/rsyncd_users.db        #定义密码文件

      1. 创建密码文件

      vim /etc/rsyncd_users.db

              添加内容:aa:123456        #设置虚拟用户密码

      1. 修改密码文件权限为600
      2. 启动服务rsync --daemon
        1. netstat -antp | grep rsync
        2. 再次启动需要先关闭kill -s QUIT 进程号
        3. 删除进程号的文件,rm -rf /var/run/rsyncd.pid
        4. 最后重新启动rsync --daemon
      3. 下行同步
        1. rsync -avz 用户名@服务器地址::共享模块名 /本地目录
        2. rsync -avz rsync://用户名@服务器地址/共享模块名 /本地目录
      4. 上行同步
        1. 修改etc/rsyncd.conf中read only = no,表示可写
        2. 给nobody设置acl权限
        3. rsync -avz /本地目录/* 用户名@服务器地址::共享模块名
        4. rsync -avz /本地目录/* rsync://用户名@服务器地址/共享模块名
      5. delete删除共享目录没有有,而本机地址有的文件
        1. rsync -avz --delete rsync://[email protected]/share /client/rsync
      6. 免密码验证:export RSYNC_PASSWORD=虚拟用户密码(客户端生成)
    4. 单向实时同步

          作用:客户机目录改变,服务机也改变,但服务机文件不会删除

      调整inotify内核参数(/etc/sysctl.conf6.*下的优化

      mak_queue_events

      监控队列大小(16384

      mak_user_instances

      最多监控实例数(1024

      max_user_watches

      每个实例最多监控文件数(1028576

      inotifywait:用于持续监控,实时输出结果

      inotifywatch:用于短期监控,任务完成后再出结果

      监控的行为:modify(内容),create,attrib(权限),move,delete

      步骤

      1. yum -y install gcc*
      2. 创建同步目录
      3. 导入文件inotify-tools.iso
      4. 挂载:mount -o loop inotify-tools.iso 空目录
      5. 安装inotify-tools:./configure && make && make install
      6. 如果是普通用户,给予目录权限
      7. 创建监控脚本,添加以下内容

      #!/bin/bash

      a="inotifywait -mrq -e create,delete /client"

      b="rsync -avz /client/* [email protected]:/server/"

      $a | while read directory event file

      do

      $b

      done

      1. 使用免密登入ssh-keygen -t rsa     ssh-copy-id [email protected]
      2. 执行脚本放入后台
    5. 配置unison双向实时同步

          作用:主机之间目录可以实现实时添加删除数据同步

      注:双向自动同步,监控目录同步时,源目录不能使用 * 通配传输,否则会变成死循环

      inotify-tools:监控服务

      ocaml

      unison:同步工具与rsync类似,专用于双向同步

      1. yum -y install gcc*
      2. 服务器和客户端创建同步目录
      3. 导入文件inotify-tools.iso
      4. 挂载:mount -o loop inotify-tools.iso 空目录
      5. 安装inotify-tools:./configure && make && make install
      6. 安装ocaml:./configure && make world opt && make install
      7. 安装unison,已经有Makefile文件直接:make UISTYLE=text THREADS=true STATIC=true
      8. 复制命令:cp unison /usr/local/bin/
      9. 创建ssh免密设置
      10. 客户机操作一样,unison命令文件通用,可以复制到客户机用
      11. 配置脚本

      服务机

      #!/bin/bash

      a="inotifywait -mrq -e create,delete /server"

      b="/usr/local/bin/unison -batch /server/ ssh://192.168.10.101//client/"

      $a | while read directory event file

      do

      $b

      done

      客户机:

      #!/bin/bash

      a="inotifywait -mrq -e create,delete /client"

      b="/usr/local/bin/unison -batch /client/ ssh://192.168.10.200//server/"

      $a | while read directory event file

      do

      $b

      done

      1. 运行脚本放入后台:bash 脚本 &(开机自启,可以放入.bashrc)
      2. 测试,在共享目录中创建,删除
  10. 源码包Apache

    apache 加载模块的方式:    慢,功能太多,

        静态加载--内存

        DOS:动态共享对象--外存-解决apache

    工作方式:APACHE + PHP以so 函数库方式添加解析

     Apache 2.X  支持插入式并行处理模块,称为多路处理模块(MPM)。在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不同的MPM可供选择,它们会影响到apache的速度和可伸缩性。 

    prefork模式可以算是很古老但是非常稳定的模式。Apache在启动之初,就预派生 fork一些子进程,然后等待请求进来,并且总是视图保持一些备用的子进程。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程中只有一个线程,在一个时间点内,只能处理一个请求。

    优点:成熟,兼容所有新老模块。进程之间完全独立,使得它非常稳定。同时,不需要担心线程安全的问题。(我们常用的mod_php,PHP的拓展不需要支持线程安全)

    缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。

    worker模式比起上一个,是使用了多进程+多线程的模式。它也预先fork了几个子进程(数量比较少),每个子进程能够生成一些服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。 Apache总是试图维持一个备用(spare)或是空闲的服务线程池。这样,客户端无须等待新线程或新进程的建立即可得到处理。在Unix中,为了能够绑定80端口,父进程一般都是以root身份启动,随后,Apache以较低权限的用户建立子进程和线程。User和Group指令用于配置Apache子进程的权限。虽然子进程必须对其提供的内容拥有读权限,但应该尽可能给予他较少的特权。另外,除非使用了suexec ,否则,这些指令配置的权限将被CGI脚本所继承。 线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下,表现得比 prefork模式好。 有些人会觉得奇怪,那么这里为什么不直接使用多线程呢(即在一个进程内实现多进程),还要引入多进程? 原因主要是需要考虑稳定性,如果一个线程异常挂了,会导致父进程连同其他正常的子线程都挂了(它们都是同一个进程下的)。多进程+多线程模式中,各个进程之间都是独立的,如果某个线程出现异常,受影响的只是Apache的一部分服务,而不是整个服务。其他进程仍然可以工作。

    优点:占据更少的内存,高并发下表现更优秀。

    缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,也许中间几乎没有请求,这时就会发生阻塞,线程被挂起,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

    event这个是 Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和 worker模式很像,最大的区别在于,它解决了 keep-alive 场景下 ,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂在那里等待,中间几乎没有请求过来,一直等到超时)。 event MPM中,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻塞。 event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。注意一点,event MPM需要Linux系统(Linux 2.6+)对Epoll的支持,才能启用。

    HTML

    超文本标记语言,使用html语言编写的文本叫超文本,"超文本"就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素

    URL

    统一资源定位符,是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址

    URI

    统一资源标志符,URIURL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URLURI的一部分。

    HTTP协议

    超文本传输协议,HTTP使用统一资源标识符(URL)来传输数据和建立连接。是一个基于TCP/IP通信协议来传递数据的协议,属于应用层协议。

    相关文件

        apache配置文件

            源码包安装:/usr/lcoal/apache2/etc/httpd.conf(主配置文件)

                     /usr/local/apache/etc/extra/*.conf(子配置文件)

            rpm包安装:/etc/httpd/conf/httpd.conf

        网页保存位置:

            源码包:    /usr/local/apache2/htdocs/

            rpm包安装:/var/www/html/

        日志保存位置

            源码包:/usr/local/apache2/logs/

            rpm包:/var/log/httpd/

    配置文件/usr/lcoal/apache2/etc/httpd.conf

        注意:apache配置文件严格区分大小写

    1. 针对主机环境的基本配置

            ServerRoot        #apache主目录        /usr/local/apache2

            Listen            #监听端口                :80

            LoadModule        #加载的相关模块        php5

            User

            Group                        #用户和组

            ServerAdmin                    #管理员邮箱

            ServerName                    #服务器名(没有域名解析时,使用临时解析。默认不开启)

            ErrorLog "logs/error_log                #错误日志

            CustomLog "logs/access_log" common        #正确访问日志

            DirectoryIndex index.html index.php        #默认网页文件名,优先级顺序

            Include etc/extra/httpd-vhosts.conf        #子配置文件中内容也会加载生效

    1. 主页目录及权限

            DocumentRoot "/usr/local/apache2/htdocs"    #网页文件存放目录(默认)

            <Directory "/usr/local/apache2/htdocs">    #定义指定目录的权限

     

            Options Indexes FollowSymLinks    #泛匹配域名

                None                    #没有任何额外权限

                All                    #所有权限(除去MultiViews以外)

                Indexes                #浏览权限(当此目录下没有默认网页文件时,显示目录内容)

    FollowSymLinks        #准许软连接到其他目录

                MultiViews            #准许文件名泛匹配(需要手动开启模块才有效negotiation

    AllowOverride None            #定义是否允许目录下.htaccess文件中的权限生效

                None                    #.htaccess中权限不生效

                All                    #文件中所有权限都生效

                AuthConfig            #文件中,只有网页认证的权限生效

    Require all granted        #访问控制列(黑白名单)

    1    仅允许IP192.168.1.1的主机访问

    <RequireAll>

                Require all granted

                Require ip 192.168.1.1

    </RequireAll>

    2:        禁止192.168.1.2的主机访问,其他的都允许访问,

    <RequireAll>

                Require all granted

                Require not ip 192.168.1.2

    </RequireAll>

    3:        允许所有访问,

    Require all granted

    4:        拒绝所有访问,

    Require all denied

    Apache 实验

    实验环境:使用lamp环境安装好的apache进行试验

    安装完成后,先启动apache进行服务验证,是否安装成功,并且主页是否可以访问。

    注:发现启动服务报错:AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain. Set the 'ServerName' directive globally to suppress this message

    解决办法:打开主配置文件httpd.conf

    搜索ServerName (约在200行左右)

    修改为 ServerName localhost:80(并且去掉前面的#注释)

    1. 实验一:目录别名

      可以使特定的网站程序不出现在网站根目录下面,而这样的话,就可以避免和原来的程序本身发生混淆和冲突;缩短网页目录的纵深,减少URL的长度。

      注:如果网页目录在htdocs下,需要修改主文件AllowOverride None

      1. 打开apache主配置文件

      #Include etc/extra/httpd-autoindex.conf (将#号去掉)

      1. 进到子配置文件目录extra下,打开httpd-autoindex.conf

        仿照例子写一个别名:

        Alias /a/ "/www/a/"        #实际目录结束要有/

        <Directory "/www/a/">

        Options Indexes MultiViews

        AllowOverride None

        Require all granted

        </Directory>

      2. 在/www/a/目录下手动创建index.html文件
      3. 将apache服务重启:

      /usr/local/apache2/bin/apachectl stop

      /usr/local/apache2/bin/apachectl start

      注:重启源码包安装的apache需要先关闭,再启动。

      1. 验证试验结果:浏览器输入 服务器IP/a/
    2. 实验二:用户认证

      提高网站安全性,保护个别页面的信息,限制特定目录,只有指定用户可以访问

      注:在/usr/local/apache2/htdocs/下的目录,可以不创建<Directory>,创建可以方便设置权限

      1. 打开主配置文件在最下面添加:

      <Directory "/usr/local/apache2/htdocs/baohu">    #声明被保护目录

      Options Indexes

      AllowOverride All                     #开启权限认证文件.htaccess

      Require all granted

      </Directory>

      1. 在指定目录下创建权限文件.htaccess

      vim /usr/local/apache2/htdocs/baohu/.htaccess    

      #创建 .htaccess文件,并添加下面的内容

      AuthName "Welcome to linuxlc "

      #提示信息

      AuthType basic                    

      #加密类型

      AuthUserFile /usr/local/apache2/htdocs/baohu/apache.passwd

      #密码文件,文件名自定义。(但是路径要对,使用绝对路径)

      require valid-user

      #允许密码文件中所有用户访问

      1. 建立密码文件,加入允许访问的用户。(此用户和系统用户无关)

      /usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/baohu/apache.passwd test1

      -c 建立密码文件,只有添加第一个用户时,才能-c

      /usr/local/apache2/bin/htpasswd -m /usr/local/apache2/htdocs/baohu/apache.passwd test2

      -m 再添加更多用户时,使用-m 参数

      4.    验证访问:(自己手动去目录下创建index.html文件)

      浏览器输入服务器IP/baohu/index.html

    3. 实验三:虚拟主机

      虚拟主机的分类:

      1. 基于IP的虚拟主机:一台服务器,多个ip,搭
      2. 基于端口的虚拟主机:一台服务器,一个ip,搭建多个网站,每个网络使用不同端口访问
      3. 基于域名的虚拟主机:一台服务器,一个ip,搭建多个网站,每个网站使用不同域名访问(常用)

      步骤:

      1. 域名解析:准备两个域名www.sohu.com,www.sina.com
      2. 没搭建DNS,只能手动添加到本地hosts文件内进行解析hosts
      3. 在/htdocs/目录下分别创建sohu 和 sina 两个目录,并且在分别在新建目录内创建index.html文件(分别写不一样的内容)
      4. 修改配置文件

      vi /usr/local/apache2/etc/httpd.conf

      #修改主配置文件开启文件关联

      Include etc//extra/httpd-vhosts.conf

      #此行取消注释

      vi /usr/local/apache2/etc/extra/httpd-vhosts.conf

      #添加下方内容(添加之前先把原先存在的示例删除掉)

      <Directory "/usr/local/apache2/htdocs/sina">

      Options Indexes

      AllowOverride None

      Require all granted

      </Directory>

       

      <VirtualHost 192.168.150.253>                    #虚拟主机标签

      ServerAdmin [email protected]                #管理员邮箱

      DocumentRoot "/usr/local/apache2/htdocs/sina"    #网站主目录

      ServerName www.sina.com                        #完整域名

      ErrorLog "logs/sina-error_log"                #错误日志

      CustomLog "logs/sina-access_log" common        #访问日志

      </VirtualHost>

       

      <Directory "/usr/local/apache2/htdocs/sohu">

      Options Indexes

      AllowOverride None

      Require all granted

      </Directory>

       

      <VirtualHost 192.168.150.253>

      ServerAdmin [email protected]

      DocumentRoot "/usr/local/apache2/htdocs/sohu"

      ServerName www.sohu.com

      ErrorLog "logs/sohu.com-error_log"

      CustomLog "logs/sohu.com-access_log" common

      </VirtualHost>

      1. 重启服务,验证结果

      Windows 下:浏览器下输入两个不同的域名验证网页内容

          添加host文件

      Linux下:通过elinks命令验证:elinks 域名

       

    4.     实验四:rewrite重写功能

              原理:在URL中输入一个地址,会自动跳转为另一个地址,多用于网站更换或者添加新域名

              注:以旧域名跳转到新域名

              步骤

      1. 开启重写模块(取消注释)

      LoadModule rewrite_module modules/mod_rewrite.so

      1. 修改主配置文件

        vi */extra/httpd-vhosts.conf

        <Directory "/usr/local/apache2/htdocs/sina">

        Options Indexes FollowSymLinks

        #添加FollowSymLinks

      AllowOverride All

      #None改为All

      Require all granted

      </Directory>

      1. 创建规则匹配文件

        vi */.htaccess

        #在指定的网站目录下创建文件,并添加以下内

        RewriteEngine on

        #开启rewrite功能

        RewriteCond %{HTTP_HOST} www.sina.com

        #把以www.sina.com    开头的内容赋值给HTTP_HOST变量,用于跳转到其它地址

        RewriteRule .* http://www.sohu.com

        #.* 输入任何地址,都跳转到http://www.sohu.com

        1. 重启服务,测试
        2. 开启伪静态

        RewriteEngine on

        RewriteRule index(\d+).html index.php?id=$1

        #可以把访问html的跳转到php主页,index3123.html也可以访问

    5. 常用配置文件

          httpd-default.conf                #apache线程控制,必须开启

              Timeout 300                #连接线程超时时间

      KeepAlive On                #开启线程控制(不开启的话用户访问页面会产生一个进程,访问其他页面会产生另一个进程,这样的话一个用户会产生好多个进程,会降低apache性能。开启此项,当用户访问网站时会产生一个进程,打开其他页面时会产生线程,保证了一个用户只产生一个进程。网站此项功能必须开启。)

              MaxKeepAliveRequests 100   #最大线程连接数

          httpd-info.conf    #apache状态统计

      <Location /server-status>

      SetHandler server-status

      Order deny,allow

      Deny from all

      Allow from .example.com

      </Location>

      #通过访问www.domain.com/server-status可以查看apache状态。如果页面显示not found 则需要修改目录权限,在Deny from all下加上allow from ip(允许的ip)注:通过日志文件统计,更准确,或现成工作

          httpd-manual.conf     #apache帮助文档

              #通过访问www.domain.com/manual 查看apache帮助文档,一般为英文。

          httpd-languages.conf    #语言编码

              #要使其生效需要在主配置文件中打开,如果中文乱码不是浏览器编码的原因可能是此配置文件注释没打开

      Apache的三种工作模式

          Apache 一共有3种稳定的 MPM 模式(多进程处理模块),它们分别是 preforkworkereventhttp-2.2版本的httpd默认的mpm工作模式为prefork2.4版本的httpd默认是event工作模式。可以通过 httpd -V 来查看

          PATH=${PATH}:/usr/local/apache2/bin        #变量叠加

          ../bin/httpd -v                        #查看版本

          ../bin/httpd -V |grep -i "server mpm"        #查看系统工作模式

      1. prefork 工作模式

      Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。

              优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。

              缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。

      1. worker 工作模式

      使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。

              优点:占据更少的内存,高并发下表现更优秀。

              缺点:必须考虑线程安全的问题。

      1. event 工作模式

      它和worker模式很像,最大的区别在于,它解决了keep-alive(线程处理时间)场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

      HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的,但不能在HTTPS访问下工作。

              优点Event MPM方式是最有效的

              缺点:不能在HTTPS访问下工作。

    6. 二、Apache的用户认证

      有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全。比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,但我们为了更加安全,可以再设置一层用户认证。

      1、编辑配置文件

      vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
      

      在对应的虚拟主机配置中加入如下配置:(加粗部分是添加内容)

      <VirtualHost *:80>
      
          DocumentRoot "/usr/local/apache2/htdocs"
          ServerName www.123.com
      
          ServerAlias www.abc.com
      
      
      									<Directory /usr/local/apache2/htdocs/admin.php>
      
              AllowOverride AuthConfig
      
              AuthName "Please input you acount."
              AuthType Basic
      
              AuthUserFile /usr/local/apache2/htdocs/.htpasswd
      
              require valid-user
      
          </Directory>
      								
      </VirtualHost>
      

      说明:首先指定要对哪个目录进行验证,AuthName自定义,AuthUserFile指定用户密码文件在哪里。

      2、创建加密用的用户名和密码文件

      htpasswd -c /usr/local/apache2/htdocs/.htpasswd liwei
      
      htpasswd -m /usr/local/apache2/htdocs/.htpasswd admin
      

      创建第一个用户时-c选项创建.htpasswd文件,-m选项增加用户,根据提示输入密码。

      3、重启apache服务

      apachectl -t
      
      apachectl graceful
      

      先检查配置是否正确,然后用graceful相当于是reload配置,不用重启apache服务,效果一样。测试,通过浏览器输入 www.123.com/admin.php 提示输入密码。

         

    7. 三、设置默认虚拟主机

      默认虚拟主机就是配置文件里的第一个虚拟主机。关于默认虚拟主机有个特点,凡是解析到这台服务器的域名,不管是什么域名,只要在配置文件中没有配置,那么都会访问到这个主机上来。如果我们直接用IP访问,会访问到这个站点上来。为了避免别人乱解析,所以应该把默认也就是第一个虚拟主机给禁止掉。我们使用allow,deny语句,已经禁止掉了。

      1、配置默认虚拟主机

      vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
      

      添加一个虚拟主机的记录:

      <VirtualHost *:80>
      
          DocumentRoot "/var/123"
          ServerName xxxxx.com.cn
      
          <Directory /var/123>
      
              Order allow,deny
      
              Deny from all
      
          </Directory>
      
      </VirtualHost>
      

      创建/var/123目录,并且设置600权限,daemon用户无法访问:

      mkdir /var/123
      chmod -R 600 /var/123

      2、重启apache服务器

      apachectl -t
      
      apachectl graceful
      

      如果用IP或其它解析的域名访问,发现提示:

      Forbidden
      
      You don't have permission to access / on this server.

         

    8. 四、域名301跳转

      一个站点难免会有多个域名,而多个域名总得有一个主次,比如我的网站可以用两个域名访问:www.itepub.cn 和 www.linuxblogs.cn 但大家发现不管我用哪个域名访问,最终都会跳转到www.linuxblogs.con 上来。这个行为就叫做域名跳转,这里的301只是一个状态码,跳转除了301还有302,301是永久跳转,302是临时跳转,网站上一定要设置为301,这样对搜索引擎是比较友好的。

      1、配置域名跳转

      # vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
      
      <IfModule mod_rewrite.c>
      
          RewriteEngine on
      
          RewriteCond %{HTTP_HOST} ^www.abc.com$
      
          RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]
      </IfModule>
      

      配置为:当访问aaa时,跳转到123的网站。

      2、配置多个域名跳转

      <IfModule mod_rewrite.c>
      
          RewriteEngine on
      
          RewriteCond %{HTTP_HOST} ^www.abc.com$ [OR]
      
          RewriteCond %{HTTP_HOST} ^www.abcd.com$
      
          RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]
      </IfModule>
      

      3、重启服务器并测试

      apachectl -t
      
      apachectl graceful
      

      测试:

      # curl -x192.168.0.8:80  www.abc.com -I
      HTTP/1.1
      											301 Moved Permanently 
      Date: Tue, 25 Oct 2016 15:48:10 GMT 
      Server: Apache/2.2.31 (Unix) PHP/5.5.38
      Location: http://www.123.com/
      Content-Type: text/html; charset=iso-8859-1
      # curl -x192.168.0.8:80  www.abcd.com -I
      HTTP/1.1
      											301 Moved Permanently 
      Date: Tue, 25 Oct 2016 15:48:49 GMT 
      Server: Apache/2.2.31 (Unix) PHP/5.5.38
      Location: http://www.123.com/
      Content-Type: text/html; charset=iso-8859-1

      通过上述测试,发现无论是abc或abcd都可以跳转到 www.123.com 域名上来,通过浏览器访问也一样。

         

    9. 五、Apache日志切割

      我们每访问一次网站,那么就会记录若干条日志。当然前提是已经设置了日志,日志不去管理,时间长了日志文件会越来越大,如何避免产生这么大的日志文件?其实apache有相关的配置,使日志按照我们的需求进行归档,比如每天一个新日志,或者每小时一个新的日志。

      1、首先简单设置日志的路径名称

      vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
      

      编辑添加内容如下:

      ErrorLog "logs/error.log"
      CustomLog "logs/access.log" combined
      

      指定了日志存放在/usr/local/apache2/logs目录下分别为error.log和access.log,combined为日志显示的格式,日志格式可以参考配置文件httpd.conf中格式的指定,如下:

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

      2、设置apache日志分割

      同样编辑配置文件httpd-vhosts.conf

      ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-error_%Y%m%d.log 86400" 
      CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-access_%Y%m%d.log 86400" combined

      ErrorLog是错误日志,CustomLog是访问日志。|就是管道符,意思是把产生的日志交给rotatelog这个工具,而这个工具就是apache自带的切割日志的工具。-l的作用是校准时区为UTC,也就是北京时间。86400,单位是秒,正好是一天,那么日志会每天切割一次。而最后面的combined为日志的格式,在httpd.conf中有定义。

         

    10. 六、不记录指定文件类型的日志

      如果一个网站访问量特别大,那么访问日志就会很多,但有一些访问日志我们其实是可以忽略掉的,比如网站的一些图片,还有js、css等静态对象。而这些文件的访问往往是巨量的,而且即使记录这些日志也没有什么用,那么如何忽略不记录这些日志呢?

      1、配置日志不记录图片的访问

      vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
      

      相关配置为:

      SetEnvIf Request_URI ".*\.gif$" image-request
      
      SetEnvIf Request_URI ".*\.jpg$" image-request
      
      SetEnvIf Request_URI ".*\.png$" image-request
      
      SetEnvIf Request_URI ".*\.bmp$" image-request
      
      SetEnvIf Request_URI ".*\.swf$" image-request
      
      SetEnvIf Request_URI ".*\.js$"  image-request
      
      SetEnvIf Request_URI ".*\.css$" image-request
      
      CustomLog "|/usr/local ... _%Y%m%d.log 86400" combined env=!image-request 

      说明:在原来日志配置基础上,增加了一些image-request的定义,比如把gif、jpg、bmp、swf、js、css等结尾的全标记为image-request,然后在配置日志后加一个标记env=!image-request,表示取反。

         

    11. 七、Apache配置静态缓存

      所说的静态文件指的是图片、js、css等文件,用户访问一个站点,其实大多数元素都是图片、js、css等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验。但这些静态文件总不能一直缓存,它总有一些时效性,那么就得设置这个过期时间。

      1、配置静态缓存

      # vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
      
      <IfModule mod_expires.c>
      
          ExpiresActive on
      
          ExpiresByType image/gif "access plus 1 days"
          ExpiresByType image/jpeg "access plus 24 hours"
          ExpiresByType image/png "access plus 24 hours"
          ExpiresByType text/css "now plus 2 hour"
          ExpiresByType application/x-javascript "now plus 2 hours"
          ExpiresByType application/javascript "now plus 2 hours"
          ExpiresByType application/x-shockwave-flash "now plus 2 hours"
          ExpiresDefault "now plus 0 min"
      </IfModule>
      

      或者使用 mod_headers 模块实现:

      <IfModule mod_headers.c>
      
          # htm,html,txt 类的文件缓存一个小时
      
          <filesmatch "\.(html|htm|txt)$">
      
              header set cache-control "max-age=3600"
          </filesmatch>
      

       

          # css, js, swf 类的文件缓存一个星期
      
          <filesmatch "\.(css|js|swf)$">
      
              header set cache-control "max-age=604800"
          </filesmatch>
      

       

          # jpg,gif,jpeg,png,ico,flv,pdf 等文件缓存一年
      
          <filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
      
              header set cache-control "max-age=29030400"
          </filesmatch>
      
      </IfModule>
      

      说明:这里的时间单位可以 days、 hours 甚至是 min,两种不同的方法,上面使用的是mod_expires,而下面用的是 mod_headers,要想使用这些模块,必须要事先已经支持。如何查看是否支持,使用命令:

      # /usr/local/apache2/bin/apachectl -M
      

      2、重启服务器并验证

      apachectl -t
      
      apachectl graceful
      

      验证:

      # curl -x127.0.0.1:80 'http://www.123.com/static/image/common/online_admin.gif' -I
      HTTP/1.1
      											200 OK 
      Date: Wed, 26 Oct 2016 03:51:26 GMT 
      Server: Apache/2.2.31 (Unix) PHP/5.5.38
      Last-Modified: Tue, 31 May 2016 03:08:36 GMT 
      ETag: "46891b-16b-5341ab0597500"
      Accept-Ranges: bytes
      
      Content-Length: 363
      Cache-Control: max-age=86400
      Expires: Thu, 27 Oct 2016 03:51:26 GMT 
      Content-Type: image/gif
      

         

    12. 八、Apache配置防盗链

      如果你的网站有很多漂亮的图片,比如你网站域名 www.123.com,图片地址为 www.123.com/image/111.jpg,那么其它人就可以直接把这个地址放到他自己的网站上,他的用户可以直接从他网站查看这张图片,而实际图片是从你的网站访问的,所产生的带宽消耗对你没有任何意义,应该对这些图片限制一下,凡是在第三方站点上,严禁访问你站点的图片,如何配置呢?

      1、配置防盗链

      # vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
      SetEnvIfNoCase Referer "^http://.*\.123\.com" local_ref
      
      SetEnvIfNoCase Referer ".*\.abc\.com" local_ref
      
      SetEnvIfNoCase Referer "^$" local_ref
      
      <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
      
          Order Allow,Deny
      
          Allow from env=local_ref
      
      </filesmatch>
      

      说明:在这段配置中涉及到一个名词referer,其实就是上次访问的网站链接。配置referer是根据来源链接做限制的,如果来源链接不是我们想要的,就直接拒绝,这就是防盗链的原理。当然不止是图片,mp3、rar、zip等文件同样支持。上述配置中默认是除了定义的列表中的referer,其它都拒绝。

         

    13. 九、Apache访问控制

      其实我们可以对apache的访问进行控制,可以设置白名单或黑名单。前面更改httpd.conf时候就已经看到了allow,deny这两个关键词,先来看看allow和deny的规则。

      1、举例1

      Order deny,allow
      
      deny from all
      
      allow from 127.0.0.1

      我们的判断依据是这样的:

  • Order后面的,哪个在前,哪个在后
  • 如果deny在前,那么就需要看deny from这句,然后看allow from这句
  • 规则是一条一条匹配的,不管是deny在前还是allow在前,都会生效的。

    2、举例2

    Order allow,deny
    
    deny from all
    
    allow from 127.0.0.1

    这个就会deny所有了,127.0.0.1也会被deny。因为顺序是先allow然后deny,虽然开始allow了127,但是后面又拒绝了它。

    3、举例3

    Order allow,deny
    
    deny from all
    

    上面的规则就表示,全部都不能通过。

    4、举例4

    Order deny,allow
    
    deny from all
    
    上面的规则表示,全部都不能通。
    

     

    Order deny,allow
    
    只有顺序,没有具体规则,表示全部都可以通行(默认的),因为allow在最后了。
    

     

    Order allow,deny
    
    这个表示,全部都不能通行(默认的),因为deny在最后。
    

    5、针对某个目录限制

    比如这个目录很重要,只允许我们公司的IP访问,当然这个目录可以是网站根目录,也就是整个站点。

    <Directory /usr/local/apache2/htdocs>
    
        Order deny,allow
    
        Deny from all 
    
        Allow from 127.0.0.1
    </Directory>
    

    6、针对请求的URL去限制

    <filesmatch "(.*)admin(.*)">
    
        Order deny,allow
    
        Deny from all 
    
        Allow from 127.0.0.1
    </filesmatch>
    

    这里用到了filesmatch语法,表示匹配的意思。

    7、验证

    # curl -x192.168.0.8:80 www.123.com/admin.php -I
    HTTP/1.1
    									403 Forbidden 
    Date: Wed, 26 Oct 2016 06:24:54 GMT 
    Server: Apache/2.2.31 (Unix) PHP/5.5.38
    Content-Type: text/html; charset=iso-8859-1
    # curl -x127.0.0.1:80 www.123.com/admin.php -I
    HTTP/1.1
    									401 Authorization Required 
    Date: Wed, 26 Oct 2016 06:25:03 GMT 
    Server: Apache/2.2.31 (Unix) PHP/5.5.38
    WWW-Authenticate: Basic realm="Please input you acount."
    Content-Type: text/html; charset=iso-8859-1

       

  1. 十、禁止解析PHP

    某个目录下禁止解析PHP,这个很有作用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件,为了避免上传的文件有木马,所以我们禁止这个目录下面的访问解析PHP。

    1、配置禁止解析php

    <Directory /usr/local/apache2/htdocs/data>
    
        php_admin_flag engine off 
    
        <filesmatch "(.*)php">
    
            Order deny,allow
    
            Deny from all 
    
        </filesmatch>
    
    </Directory>
    

    说明:php_admin_flag engine off这个语句就是禁止解析php的控制语句,但只这样配置还不够,因为这样配置后用户依然可以访问php文件,只不过不解析了,但可以下载,用户下载php文件也是不合适的,所以有必要再禁止一下。

       

  2. 十一、禁止指定user_agent

    user_agent叫做浏览器标识,目前主流的浏览器有IE、chrome、Firefox、360、iphone的Safari、Android手机上的、百度搜索引擎、google搜索引擎等很多,每一种浏览器都有对应的user_agent。为了避免一些无用的搜索引擎或机器爬虫之类引起的带宽的无辜消耗。

    <IfModule mod_rewrite.c>
    
        RewriteEngine on
    
        RewriteCond %{HTTP_HOST} ^www.abc.com$ [OR]
    
        RewriteCond %{HTTP_HOST} ^www.abcd.com$
    
        RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]

     

        RewriteCond %{HTTP_USER_AGENT} ".*Firefox.*" [NC,OR]
    
        RewriteCond %{HTTP_USER_AGENT} ".*Tomato Bot.*" [NC]
    
        RewriteRule .* - [F]
    						
    </IfModule>
    

    同样是使用rewrite模块来实现限制指定user_agent。本例中,RewriteRule .* - [F]可以直接禁止访问,rewritecond用user_agent来匹配,NC表示不区分大小写,OR表示或者,连接下一个条件。假如我们要把百度的搜索引擎限制掉,可以加一条这样的规则:

    RewriteCond %{HTTP_USER_AGENT} ^.*Baiduspider/2.0.* [NC]
    
    RewriteRule .* - [F]
    

       

  3. 十二、限制某个目录

    我们可以allow和deny去现在网站根目录下的某个子目录,当然这个rewrite也可以实现,配置如下:

    <IfModule mod_rewrite.c>
    
        RewriteEngine on
    
        RewriteCond %{REQUEST_URI} ^.*/tmp/* [NC]
    
        RewriteRule .* - [F]
    
    </IfModule>

    这段配置,会把只要是包含 /tmp/ 字样的请求都限制了。

  4. 请求码

    200    #服务器成功处理请求

    301    #永久移动,地址跳转

    302    #暂时移动,地址跳转

    400    #错误请求

    403    #服务器拒绝请求

    404    #服务器找不到请求网页

    503    #服务器不可用,由于超载或停机维护,暂时状态

  1. LNMP搭建

    工作模式:Nginx + PHP通过FastCGI 协议调用FPM

    一个主进程管理多个从进程,每个进程管理多个线程,每个线程维持一个连接

    网络IO模型:epoll,操作系统跟应用程序进行通行时,调用一定的函数,也就是开发包

     

    1. 安装Nginx

          导入LNMP.iso

      yum -y install pcre zlib pcre-devel zlib-devel gcc*    #安装所依赖的库文件

      useradd -r -s /sbin/nologin nginx    #Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险

      tar -xf nginx-1.0.8.tar.gz

      ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install

      注:配置前可以参考:./configure --help给出说明

      --prefix:设定Nginx的安装目录

      --user--group:指定Nginx运行用户和组

      --with-http_stub_status_module

      启用http_stub_status_module模块以支持状态统计

      ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/        #至此Nginx安装完成,为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行nginx命令就可以调用

      nginx -t    #配置文件nginx.conf默认位于安装目录下的conf/子目录中。若要检查位于其他位置的配置文件,可使用"-c"选项来指定路径。

      nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

      nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

      nginx #启动nginx

      Killall nginx #停止nginx

    2. 安装mysql

      yum -y install ncurses-devel

      tar -xf mysql-5.1.55.tar.gz

      ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-collation=utf8_general_ci --with-extra-charset=gbk.gb2312 && make && make install

      注:--with-charset:指定默认使用的字符集编码

      --with-collation:指定默认使用的字符集校对规则

      utf8_general_ci是适用于UTF-8字符集的通用规则

      --with-extra-charsets:指定额外支持的其他字符集编码

      优化调整:

      \cp -a support-files/my-medium.cnf /etc/my.cnf

      cp -a support-files/mysql.server /etc/init.d/mysqld

      chmod a+x /etc/init.d/mysqld

      chkconfig --add mysqld

      ln -s /usr/local/mysql/bin/* /usr/local/bin

      ln -s /usr/local/mysql/lib/mysql/* /usr/lib/

      ln -s /usr/local/mysql/include/mysql/* /usr/include

      useradd -r -s /sbin/nologin mysql

      cd /usr/local/mysql/bin/

      ./mysql_install_db --user=mysql         #初始化数据库

      chown -R root.mysql /usr/local/mysql/

      chown -R mysql /usr/local/mysql/var/

      service mysqld start     #启动sql

      mysqladmin -u root password 123456     #设置数据库密码

      mysql -u root -p123456        #进入数据库

    3. 安装PHP环境

      yum -y install libxml2-devel libpng-devel        #5.3版本以上的PHP已经自带FPM(fastCGI process manager,FastCGI进程管理器)模块,用来对PHP解析实例进行管理,优化解析效率,因此在配置PHP编译选项时应添加"--enable-fpm"以启用此模块。

      tar -xf php-5.3.6.tar.gz

      ln -s /usr/lib64/libpng.so /usr/lib     #解决系统版本问题

      ./configure --prefix=/usr/local/php5 --with-gd --with-zlib --with-mysql=/usr/local/mysql/ --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm && make && make install

      优化调整:

      cp -a php.ini-development /usr/local/php5/php.ini

      ln -s /usr/local/php5/bin/* /usr/local/bin/

      ln -s /usr/local/php5/sbin/* /usr/local/sbin/

      tar -xf ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz

      cd ZendGuardLoader-php-5.3-linux-glibc23-x86_64/php-5.3.x/

      cp ZendGuardLoader.so /usr/local/php5/lib/php/        #安装ZendGuardLander

      echo "zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so" /usr/local/php5/php.ini

      echo "zend_loader.enable=1" >> /usr/local/php5/php.ini        #为了提高PHP解析效率,安装相应版本ZendGuardLander

      cd /usr/local/php5/etc/

      cp -a php-fpm.conf.default php-fpm.conf    # php-fpm.conf.default为模板文件

      sed -i '25c pid = run/php-fpm.pid' /usr/local/php5/etc/php-fpm.conf    #确认PID文件

      sed -i '122c user = nginx' /usr/local/php5/etc/php-fpm.conf    #指定运行php的用户

      sed -i '123c group = nginx' /usr/local/php5/etc/php-fpm.conf    #指定运行php的组

      sed -i '157c pm.start_servers = 20' /usr/local/php5/etc/php-fpm.conf    #启动时开启的进程数

      sed -i '162c pm.min_spare_servers = 5' /usr/local/php5/etc/php-fpm.conf    #最少空闲进程数

      sed -i '167c pm.max_spare_servers = 35' /usr/local/php5/etc/php-fpm.conf    #最多空闲进程数

      /usr/local/sbin/php-fpm        #启动php-fpm,端口9000

      vim /usr/local/nginx/conf/nginx.conf    #添加配置文件

      location ~ \.php$ {

      root html;                 #PHP网页文档根目录

      fastcgi_pass 127.0.0.1:9000;     #php-fpm的监听地址

      fastcgi_index index.php;        #PHP首页文件

      include fastcgi.conf;         #include调用fastcgi.conf样本配置(查找文件所在位置并修改)

      }

      killall nginx

      nginx

      html/创建test.php文件测试

      <?php

      phpinfo();

      ?>

    4. Nginx 配置详解

      全局配置

      配置文件:/usr/local/nginx/conf/nginx.conf

      注:所有设置以分号结尾

      user www www;

      #程序运行用户和组

      worker_processes auto;

      #启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目

      error_log /home/wwwlogs/nginx_error.log crit;

      #全局错误日志,这个是一键安装包产生的配置,源码包不是这个位置

      pid /usr/local/nginx/logs/nginx.pid;

      #主进程PID保存文件

      worker_rlimit_nofile 51200;

      #文件描述符数量,限制对文件访问次数,同事打开的数目

      events

          {

      use epoll;     

          #使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能

          worker_connections 51200;    

          #工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。

          }

      网页配置

      http

      #整体环境配置--网站配置

          {

      include mime.types;

      default_type application/octet-stream;

              #设定mime类型,文件传送类型由mime.type文件定义

      server_names_hash_bucket_size 128;

              #保存服务器名字的hash表大小

      client_header_buffer_size 32k;

              #客户端请求头部缓冲区大小

      large_client_header_buffers 4 32k;

              #最大客户端头缓冲大小

      client_max_body_size 50m;

              #客户端最大上传文件大小(M

      sendfile on;

              #sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.

      tcp_nopush on;

              #这个是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。(只在sendfile on时有效)

      keepalive_timeout 60;

              #连接超时时间

      tcp_nodelay on;

              #禁用nagle算法,也即不缓存数据。有效解决网络阻塞

       

      fastcgi_connect_timeout 300;

      fastcgi_send_timeout 300;

      fastcgi_read_timeout 300;

      fastcgi_buffer_size 64k;

      fastcgi_buffers 4 64k;

      fastcgi_busy_buffers_size 128k;

      fastcgi_temp_file_write_size 256k;

      #fastcgi设置

      gzip on;

      gzip_min_length 1k;

      gzip_buffers 4 16k;

      gzip_http_version 1.1;

      gzip_comp_level 2;

      gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application xml+rss;

      gzip_vary on;

      gzip_proxied expired no-cache no-store private auth;

      gzip_disable "MSIE [1-6]\.";

      #limit_conn_zone $binary_remote_addr zone=perip:10m;

      ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.

      server_tokens off;

               #隐藏nginx版本号(curl -I 192.168.4.154可以查看,更加安全)

      #log format

      log_format access '$remote_addr - $remote_user [$time_local] "$request"'

          '$status $body_bytes_sent "$http_referer" '

          '"$http_user_agent" $http_x_forwarded_for';

      #定义日志格式

      server

          {

      listen 80 default_server;

              #listen [::]:80 default_server ipv6only=on;

                      #监听80端口,WEB服务的监听设置,可以采用"IP地址:端口"形式

      server_name www.lnmp.org;

                      #服务器名,可以写多个域名,用空格分隔

      index index.html index.htm index.php;

                      #默认网页文件

      root /home/wwwroot/default;

                      #网页主目录

                      #error_page 404 /404.html;

                      include enable-php.conf;

                      location /nginx_status

                  {

                       stub_status on;

                       access_log off;

                       }

                      #开启status状态监测

                      location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

                  {

                       expires 30d;

                       }

                      #静态文件处理,保存期30

                      location ~ .*\.(js|css)?$

                       {

                       expires 12h;

                       }

                      #jscss文件处理,保存期12小时

                      location ~ /\.

                       {

                       deny all;

                       }

       

                       access_log /home/wwwlogs/access.log access;

                      #正确访问日志

                  }

      include vhost/*.conf;

      #vhost/下子配置文件生效

      }

      Nginx相关实验

      注意事项

      注意配置文件中的结尾有;作为结束~!(切记....

      每次实验修改完配置文件后需要重启nginx才会生效

              pkill -hup nginx     #热重启

    5. 实验1Nginx的状态统计

          a、安装nginx时将 --with-http_stub_status_module 模块开启

          b、修改nginx配置文件

          location /nginx_status{

      stub_status on;

      access_log off;

      }

          c、客户端访问网址:http://IP/nginx_status

              #"Active connections"表示当前的活动连接数;

              #"server accepts handled requests"表示已经处理的连接信息

              #三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数

    6. 实验2:目录保护

          a、原理和apache的目录保护原理一样(利用上一个实验接着完成)

          b、在状态统计的location中添加:

          auth_basic "Welcome to nginx!";

          auth_basic_user_file /usr/local/nginx/html/htpasswd.nginx;

          c、使用http的命令htpasswd进行用户密码文件的创建(生成在上面指定的位置)

          htpasswd -c /usr/local/nginx/html/htpasswd.nginx user

          d、重启nginx并再次访问统计页面

    7. 实验3:基于IP的身份验证(访问控制)

          a、接着上一个实验完成操作

          b、在状态统计的location中添加:

          allow 192.168.88.1;

          deny 192.168.88.0/24;

          #仅允许192.168.88.1访问服务器

    8. 实验4nginx的虚拟主机

      注:如果需要使用域名访问,则需要通过dns解析或者hosts文件解析

          格式:

          http{

              server{

                  listen 80;

                  .........;

                  location {

                      root html;

                  }

              }

              server{

                  listen 80;

                  .........;

              }

          }

          A、基于端口的虚拟主机

              server

          {

      listen 80;

      server_name www.lnmp.org;

      index index.html index.htm index.php;

      root /home/wwwroot/blog;

                      include enable-php.conf;

                      location ~ /\.

                       {

                       deny all;

                       }

                       access_log /home/wwwlogs/blog-access.log access;

                  }

          server

          {

      listen 8080;

      server_name www.lnmp.org;

      index index.html index.htm index.php;

      root /home/wwwroot/bbs;

                      include enable-php.conf;

                      location ~ /\.

                       {

                       deny all;

                       }

                       access_log /home/wwwlogs/bbs-access.log access;

                  }

          B、基于域名的虚拟主机

              server {

      listen 80;

      server_name www.xiao.com;

       

      location / {

      root html;

      index index.php index.html index.htm;

      }

      location ~ \.php$ {

      root html; #PHP网页文档根目录

      fastcgi_pass 127.0.0.1:9000; #php-fpm的监听地址

      fastcgi_index index.php; #PHP首页文件

      include fastcgi.conf; #include调用fastcgi.conf样本配置(查找文件所在位置并修改)

      }

                  location ~ /\. {

                       deny all;

                  }

      #拒绝访问隐藏文件

       

              }

              server {

      listen 80;

      server_name www.huang.com;

      location / {

      root html/huang;

      index index.php index.html index.htm;

      }

      location ~ \.php$ {

      root html/huang;

      fastcgi_pass 127.0.0.1:9000; #php-fpm的监听地址

      fastcgi_index index.php; #PHP首页文件

      include fastcgi.conf; #include调用fastcgi.conf样本配置(查找文件所在位置并修改)

      }

                  location ~ /\. {

                       deny all;

                  }

      #拒绝访问隐藏文件

      }

    9. 实验5nginx的反向代理

          a、在另外一台机器上安装apache,并填写测试页面

          b、在nginx服务器的配置文件中添加,apache服务器的ip

      location ~ \.php$ {

      proxy_pass http://192.168.10.100;

      }    

      #必须在原服务器下也有同名目录

      #取消nginx声明的解析php的设置

      # index index.php index.html index.htm;添加index.php

      #可以设置apache服务器其它端口

      c、重启nginx,并使用客户端访问测试

    10. 实验6:负载调度(负载均衡)

          a、使用默认的rr轮训算法,修改nginx配置文件

          http标签添加,upstream,表示轮替的IP

          upstream bbs {

              server 192.168.88.100:80;

              server 192.168.88.200:80;

          }

          server {

              location ~ \.php$ {

                  proxy_pass http://bbs;

              }

          #添加反向代理,代理地址填写upstream声明的名字

          }

          c、开启并设置两台88.100 & 88.200的主机

          安装apache并设置不同的index.html页面内容

          d、重启nginx,并使用客户端访问测试

      rr算法实现加权轮询

          upstream itxdl.com {

              server 192.168.88.100:80 weight=1;

              server 192.168.88.200:80 weight=2;

          }

    11. 实验7nginx实现https
      1. 安装nginx时,需要将--with-http_ssl_module 模块开启,重新编译覆盖安装
      2. 如果编译时没有添加该模块,安装yum -y install openssl openssl-devel
      3. 重新编译./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module && make && make install
      4. 新增server要进行加密的server标签中添加以下内容开启SSL,或开启模板

          e、生成证书和秘钥文件

          注意:在实验环境中可以用命令生成测试,在生产环境中必须要在https证书厂商注册(否则浏览器不识别)

          mkdir usr/local/nginx/conf/ssl/    

      cd ssl

      openssl genrsa -des3 -out itxdl.key 1024

          #建立服务器私钥(过程需要输入密码,请记住这个密码)生成RSA密钥

          openssl req -new -key itxdl.key -out itxdl.csr

          #需要依次输入国家,地区,组织,email最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书

          openssl x509 -req -days 365 -sha256 -in itxdl.csr -signkey itxdl.key -out itxdl.crt

          #命令生成v1版证书

      rewrite ^(.*)$ https://www.itxdl.com permanent;

      #在需要跳转的原IP或域名添加重写规则

          server {

      listen 443;

                  server_name www.xiao.com;

      location / {

      root html;

      index index.php index.html index.htm;

      }

      location ~ \.php$ {

      root html; #PHP网页文档根目录

      fastcgi_pass 127.0.0.1:9000; #php-fpm的监听地址

      fastcgi_index index.php; #PHP首页文件

      include fastcgi.conf; #include调用fastcgi.conf样本配置(查找文件所在位置并修改)

      }

                   ssl on;

      ssl_certificate /usr/local/nginx/conf/ssl/itxdl.crt;

      ssl_certificate_key /usr/local/nginx/conf/ssl/itxdl.key;

      ssl_session_timeout 5m;

      ssl_protocols SSLv2 SSLv3 TLSv1;

      # ssl_ciphers HIGH:!aNULL:!MD5;

      ssl_prefer_server_ciphers on;

      }

          #启动nginx,必须用以下命令,否则无法停止nginx

          killall -9 nginx

          nginx

    12. nginx-http2.0搭建

      环境要求:

      上传nginx-1.13.8.tar.gz和openssl-1.0.2h.tar.gz

      yum -y install pcre pcre-devel zlib zlib-devel gcc*

      tar xf openssl-1.0.2h.tar.gz

      tar xf nginx-1.13.8.tar.gz

      useradd -s /sbin/nologin -M nginx

      cd nginx-1.13.8

      ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-openssl=/root/openssl-1.0.2h

      #--with-openssl=/root/openssl-1.0.2h指定加密软件位置,必须先解压openssl

      make && make install

      openssl genrsa -des3 -out server.key 1024

      openssl req -new -key server.key -out server.csr

      openssl x509 -req -days 365 -sha256 -in server.csr -signkey server.key -out server.crt

      cp server.crt /usr/local/nginx/conf/

      cp server.key /usr/local/nginx/conf/

      server {

      listen 443 ssl http2;

      server_name www.huang.com;

      ssl_certificate /usr/local/nginx/conf/server.crt;

      ssl_certificate_key /usr/local/nginx/conf/server.key;

      }

      /usr/local/nginx/sbin/nginx -t

      /usr/local/nginx/sbin/nginx

  2. Postfix
    1. 邮件服务器

      邮件应用协议

      SMTP 简单邮件传输协议(发邮件)TCP 25端口,加密时使用TCP 465端口

      POP3 第三版邮局协议(收邮件)TCP 110 端口,加密时使用 TCP 995端口

      IMAP4 第四版互联网邮件访问协议(收邮件)TCP 143端口,加密时使用TCP 993端口

      邮件系统角色

      MUA    (邮件用户代理)    outlook foxmail(客户端)

      MTA    (邮件传输代理)    sendmail qmail postfix(服务端)

      MDA    (邮件分发代理)    maildrop naildrop(邮件存储位置)

      MRA    (邮件获取代理)    dovecot (那个软件获取邮件)

      Postfix配置文件

      主目录:/etc/postfix

      主配置文件:main.cf

      调优的文件:master.cf

      myhostname:邮件服务器主机名

      mydomain:邮件域

      myorigin:设置允许发信的用户的邮件域

      mydestination:设置允许收信的用户的邮件域

    2. 简单的邮件收发实验

      实验环境:必须搭建dns服务,hosts文件只能解析A主机

      yum -y install bind

      修改/etc/named.conflisten项科研写当前服务器ip

      修改区域文件/etc/named.rfc1912.zones

      修改数据文件

      将邮件服务器的dns指向dns服务器DNS1=192.168.64.24,之后测试,nslookup 域名

       

      能够解析邮件服务器域名的dns搭建完成后,再做邮件服务器的修改

      邮件服务器postfix默认是安装的,只需要修改主配置文件/etc/postfix/main.cf

      u

      #在用户家目录下的Maildir

      启动邮件服务

      测试

      建两个用户

      b)安装telnet连接工具

      "

      c)查看接收到的邮件

          查看收件用户家目录下Maildir下的new目录下

      安装邮件检索代理,来查看接收的邮件

      安装工具和依赖包yum -y install dovecot dovecot-devel

      启动:service dovecot restart

      测试查看邮件

    3. 企业级邮件服务(新环境)

      前提条件:要有一个DNS服务器,以及gcc、数据库,mailk

      yum -y install bind

      修改/etc/named.conf

      修改区域文件

      修改数据文件

      在另一台上测试dns是否能解析

      dns搭建完成后,再安装gcc环境yum -y install gcc*

      安装数据库及mailx, yum -y install mysql mysql-server mailx

      启动数据库service mysqld start

      chkconfig --add mysqld

      mysql -u root -p    #登入

      show databases;    #查看数据库

      use mysql;    #进入数据库

      show tables;    #查看表

      接下来,开始搭建。

      创建一个单独的目录mkdir /var/www/extsuite -p

      导入EXTMAIL.iso,邮件网站,挂载复制

      extmailextman解压到创建的目录中

      tar -xf extmail-1.2.tar.gz -C /var/www/extsuite/

      tar -xf extman-1.1.tar.gz -C /var/www/extsuite/

      mv extmail-1.2/ extmail

      mv extman-1.1/ extman

      去掉版本号

       

       

       

      /var/www/extsuite/extman/docs中模板和数据导入到数据库中

      mysql < extmail.sql

      vim /var/www/extsuite/extman/docs/init.sql

      init.sql该一下再导入数据库中(最后一部分)(先修改init.sql文件),修改登入邮件网站后台密码mysql < extmail.sql

      将虚拟目录的模板拷贝到邮件服务器的主目录下,用于创建数据库虚拟用户

      cp mysql_virtual_alias_maps.cf mysql_virtual_domains_maps.cf mysql_virtual_mailbox_maps.cf /etc/postfix/

      创建真实的映射用户

      修改邮件服务的主配置文件(vim /etc/postfix/main.cf

      添加以下内容,指定虚拟用户的相关配置

      virtual_mailbox_base = /home/vmail

      virtual_uid_maps = static:600

      virtual_gid_maps = static:600

      virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf        

      virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf

      virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf

      重启服务service postfix restart

      发送一个邮件

      查看cd家目录,supportpostmaster用户的别名

       

      1.安装dovecot相关软件

      安装收邮件的telnet

       

      接下来配置dovecot能够去数据库里读数据

      1)修改/etc/dovecot/conf.d/ 10-mail.conf

      修改/etc/dovecot/conf.d/10-auth.conf

      修改如何在数据库里读取数据的文件(需要拷贝模板)到/etc/dovecot目录下

       

      允许那些域可以访问数据库

      连接测试收信service dovecot restart

      MAIL+WEB

      yum -y install httpd 修改/etc/httpd/conf/httpd.conf    添加以下内容

      <VirtualHost *:80>

      DocumentRoot /var/www/html

      ServerName www.extmail.org

      </VirtualHost>

      <VirtualHost *:80>

      DocumentRoot /var/www/extsuite/extmail/html

      ServerName mail.extmail.org

      scriptalias /extmail/cgi /var/www/extsuite/extmail/cgi

      alias /extmail /var/www/extsuite/extmail/html

      scriptalias /extman/cgi /var/www/extsuite/extman/cgi

      alias /extman /var/www/extsuite/extman/html

      suexecusergroup vmail vmail

      </VirtualHost>

      extmail中更改cgi的属组属主,让vmail有权限执行

      cd /var/www/extsuite/

      chown -R root.root extman/

      chown -R root.root extmail/

      cd /var/www/extsuite/extmail/

      chown vmail.vmail cgi/ -R

      先生成配置文件,再修改配置文件cp webmail.cf.default webmail.cf

      extman中更改cgi的属组属主,让vmail有权限执行chown vmail.vmail cgi/ -R

      先生成配置文件,再修改配置文件

      安装Unix-Syslog这个软件

      cd

      tar -xf Unix-Syslog-1.1.tar.gz

      perl Makefile.PL && make && make install

       

      启动service httpd restart

      chkconfig --add httpd

      service postfix restart

      在浏览器上访问

      指向dns

      前台页面

      后台页面

       

       

  3. Linux+JDK+tomcat+Mysql+Nginx

    安装JDK

        1.    检查系统是否自动安装有java,若有安装则卸载掉

            rpm -q java

            rpm -e java

        2.    安装下载的源码JDK

            tar -xf jdk-8u181-linux-x64.tar.gz -C /usr/local

            #去掉版本号 mv jdk1.8.0_181 jdk1.8

        3.    配置jdk环境变量,用如下命令打开/etc/profile配置文件,

            vim /etc/profile

          将下面配置拷贝进去(JAVA_HOME路径按照自己实际解压路径配置)

            #set java environment

            JAVA_HOME=/usr/local/jdk1.8

            CLASSPATH=.:$JAVA_HOME/lib.tools.jar

            PATH=$JAVA_HOME/bin:$PATH

            export JAVA_HOME CLASSPATH PATH

            

    source /etc/profile        #重新加载/etc/profile配置文件

        4.    测试java命令是否可用

            java -version

    安装tomcat

        1.    tomcat配置很简单,只要解压到想要解压的文件夹就好了

            tar -xf apache-tomcat-8.5.32.tar.gz

            cp -a apache-tomcat-8.5.32 /usr/local/apache-tomcat

        2.    关闭防火墙,或者开放防火墙的8080端口(tomcat默认的使用端口)

        3.    启动tomcat

            /usr/local/apache-tomcat/bin/startup.sh        #启动脚本

            /usr/local/apache-tomcat/bin/shutdown.sh    #关闭脚本

            echo $?

        4.    启动成功后,访问指定主机的8080

        网页默认位置:

        /usr/local/apache-tomcat/webapps    相当于/var/www/html

        #webapps目录下新建网站的目录,存放网页

        /usr/local/apache-tomcat/webapps/ROOT 相当于 /etc/httpd/conf.d/welcome.conf

        #测试页面的位置

        配置文件位置:

        /usr/local/apache-tomcat/conf

        server.xml    #主配置文件

        默认:    8005    作为关闭端口

                 8080    作为监听端口(Listen

        复制/usr/local/apache-tomcat /usr/local/apache-tomcat-8090

        修改startup.sh

            export CATALINA_HOME=/usr/local/apache-tomcat-8090

        修改server.xml主配置文件:

            修改用于关闭的端口:默认为8005

            修改用于监听的端口:默认为8080

        启动tomcat的第二个进程

        修改nginx主机的upstream 的服务器列表

    安装Mysql

        1、查看当前CentOS系统是否存在mysql

        rpm -q mysqld

        rpm -e mysqld

        2、上传mysql-5.7.23-1.el6.x86_64.rpm-bundle.tarLinux

         3、解压mysql到想要解压的目录

        tar -xvf mysql-5.7.23-1.el6.x86_64.rpm-bundle.tar -C /usr/local/mysql-5.7.18/

      4、安装mysql的依赖(缺少依赖才安装,不缺少可跳过这一步)

        yum install -y libaio*

        yum install -y libnuma*

        5、安装mysql (安装解压出来的所有软件包)

        yum -y install *

        6、启动mysql

        service mysqld start

        7、将mysql加到系统服务中并设置开机启动

        加入到系统服务:chkconfig --add mysqld

      自动启动:chkconfig mysqld on

        8、接下来要登录mysql

        先获取mysql的初始生成的默认密码

        grep 'temporary password' /var/log/mysqld.log

        mysql -uroot -ppxqd-7aaFYZx        #利用获取到的密码登录

        9、登录后修改默认密码

        ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

        注:如果密码太简单时,报错时,可以进行如下修改,再修改密码

        set global validate_password_policy=0;

        set global validate_password_length=1;

    4.    Nginx 反向代理:

        单独一台服务器安装nginxpcre-develzlib-devel

        useradd -r -s /sbin/nologin nginx

        ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx

        make

        make install

        修改配置文件:

        server标签中添加

        location / {

            root html;

            index index.html index.htm index.jsp;        #nginx识别jsp后缀

        }

        location ~ \.jsp$ {

            proxy_pass http://192.168.88.20:8080;        #当访问的后缀为jsp时,代理到20

        }

  4. mysql服务
    1. 数据库简介

      社区版

      企业版

      集群版

      SQL:结构化查询语言

      去IOEC

      I        IBM HP             联想    浪潮    曙光    宝德

      O     ORACLE     达梦、Alisql

      E        EMC                华为    宏杉    (联想、神州数码属于OEM)(存储)

      C        cisco                华为    华三    锐捷

      为什么要有数据库

      1.数据冗余和不一致性

      2.大数据访问困难

      3.数据孤立

      4.完整性和原子性

      5.并发访问异常

      6.安全性问题

      常见数据库

      关系型

      非关系数据库

    数据库概述

    数据库:存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按照一定数据模型组织、描述和存储,具有较小的冗余度,较高的独立性和易扩展性,并为各种用户共享,即数据库有永久存储、有知识和可共享三个基本特点。

    数据库服务器的基本概念

    DBMS 数据库管理系统(能够操作和管理数据库的大型软件)

    1.层次模型(Hie`rchical)

    层次模型是数据库系统最早使用的一种模型,它的数据结构是一棵"有向树"。根结点在最上端,层次最高,子结点在下,逐层排字段。

    特征:

    有且仅有一个结点没有父结点,它就是根结点;其他结点有且仅有一个父结点。

      

    最有影响的层次模型的DBS是20世纪60年代末,IBM公司推出的IMS层次模型数据库系统。

    2.网状模型(Network)

    网状模型以网状结构表示实体与实体之间的联系。网中的每一个结点代表一个记录类型,联系用链接指针来实现。网状模型可以表示多个从属关系的联系,也可以表示数据间的交叉关系,即数据间的横向关系与纵向关系,它是层次模型的扩展。网状模型可以方便地表示各种类型的联系,但结构复杂,实现的算法难以规范化

    特征:

    允许结点有多于一个父结点;

    可以有一个以上的结点没有父结点。

      

    3.关系模型(Relation)

      关系模型以二维表结构来表示实体与实体之间的联系,它是以关系数学理论为基础的。关系模型的数据结构是一个"二维表框架"组成的集合。每个二维表又可称为关系。在关系模型中,操作的对象和结果都是二维表。关系模型是目前最流行的数据库模型。支持关系模型的数据库管理系统称为关系数据库管理系统,Access就是一种关系数据库管理系统。

      

    描述的一致性,不仅用关系描述实体本身,而且也用关系描述实体之间的联系;

    可直接表示多对多的联系;

    关系必须是规范化的关系,即每个属性是不可分的数据项,不许表中有表;

    关系模型是建立在数学概念基础上的,有较强的理论依据。

      在关系模型中基本数据结构就是二维表,不用像层次或网状那样的链接指针。记录之间的联系是通过不同关系中同名属性来体现的。例如,要查找"刘晋"老师所上的课程,可以先在教师关系中根据姓名找到教师编号"1984030",然后在课程关系中找到"1984030"任课教师编号对应的课程名即可。通过上述查询过程,同名属性教师编号起到了连接两个关系的纽带作用。由此可见,关系模型中的各个关系模式不应当是孤立的,也不是随意拼凑的一堆二维表,它必须满足相应的要求。

    RDBMS 关系式数据库

        1.数据以表格的形式出现

        2.每行为各种记录名称

        3.每字段为记录名称所对应的数据域

        4.许多的行和字段组成一张表单(table)

        5.若干的表单组成库(database)

    1. SQL语言最基本的数据类型

      字符串类型(char(0-255),varchar(0-65535))

      数值类型(int、float)

      日期和时间类型(date)

      NULL数据类型(任意类型)

      约束

              域约束:数据类型约束

              外键约束:引用完整性约束

              主键约束:某字段能惟一标识此字段所属的实体,并且不允许为空

                      一张表中只能有一个主键

              惟一性约束:每一字段都不允许出现相同值,可以为空

                      一张表中可以有多个

      索引

          索引是一个单独的、物理的数据库结构,它是某个表中一字段或若干字段值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。表的存储由两部分组成,一部分用来存放数据页面,另一部分存放索引页面。通常,索引页面相对于数据页面来说小得多。数据检索花费的大部分开销是磁盘读写,没有索引就需要从磁盘上读表的每一个数据页,如果有索引,则只需查找索引页面就可以了。所以建立合理的索引,就能加速数据的检索过程。

      数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

      加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

       

      数据库逻辑关系:

      表示层:表(数据)

      逻辑层:存储引擎(提供存储、创建、更新、查询数据的实现方法)

      物理层:文件

      数据库存储和查询:

      存储管理器(实现存储的功能,通过DDL创建数据表的结构,再通过DML来保存数据)

      事务管理器:提供事务功能

      文件管理器:保存数据库数据和文件的对应关系

      权限及完整性管理器:设置存储权限

      缓冲管理器:管理缓冲空间

      查询管理器:(实现查询的功能,接收用户的查询请求、理解用户查询请求,将查询请求提交给存储管理器、实现最终存储)

          DML    解析器:用来操作数据库中的数据

                  INSERT

                  DELETE

                  SELECT

                  UPDATE

          DDL    解析器:用来建立数据库、定义数据关系

                  CREATE

                  DROP

                  ALTER

      DCL    解析器:用来控制数据库组建的权限

                  GRANT

                  REVOKE

      程序跟数据库的连接方式:

          JDBC:(动态SQL):程序设计语言使用函数(mysql_connect())与RDBMS服务器建立连接,并进行交互;通过建立连接向SQL服务器发送查询语句,并将结果保存至变量中而后进行处理

          ODBC:(嵌入式SQL)与动态SQL类似,但其语言必须程序编译时完全确定下来

      mysql 支持的存储引擎:

      MYISAM

      默认引擎、插入和查询速度较快

      不支持事务、行级锁和外键约束等功能

      注:

      事务:一段sql语句的批处理、为了保证数据原子性

      锁:行级锁(冲突少、速度慢);表级锁(冲突多、速度快);页级锁(折中方案)

      INNODB

      支持事务、行级锁和外键约束等功能

      MEMORY

      工作在内存中,通过散字段保存数据,速度快、不能永久保存数据

      事务(Transaction)是并发控制的基本单位。

          所谓的事务,它是一个操作序字段,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。针对上面的描述可以看出,事务的提出主要是为了解决并发情况下保持数据一致性的问题。

      事务具有以下4个基本特征。

      Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。

      Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态。

      Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。

      Durability(持久性):事务结束后,事务处理的结果必须能够得到固化

      数据库工作模式:

      单进程多线程的工作模式

      守护线程

      应用线程(用户线程)

      mysql优化

      垂直扩展

      线程重用

      缓存机制(memcache、redis、mongodb)

      E-R模型

      实体关系模型

      实体:数据对象,即看得见摸得着

      联系:表示一个或多个实体之间的关联

    2. 数据库常用的配置选项

      -DCMAKE_INSTALL_PREFIX=/usr/local/mysql

      #指定安装路径(默认的就是/usr/local/mysql)

      -DMYSQL_DATADIR=/data/mysql     #mysql的数据文件路径

      -DSYSCONFDIR=/etc         #配置文件路径

      -DWITH_INNOBASE_STORAGE_ENGINE=1     #使用INNOBASE存储引擎

      -DWITH_READLINE=1                             #支持批量导入mysql数据

      -DWITH_SSL=system                                  #mysql支持ssl

      -DWITH_ZLIB=system                             #支持压缩存储

      -DMYSQL_TCP_PORT=3306     #默认端口3306

      -DENABLED_LOCAL_INFILE=1                     #启用加载本地数据

      -DMYSQL_USER=mysql                                     #指定mysql运行用户

      -DMYSQL_UNIX_ADDR=/tmp/mysql.sock     #默认套接字文件路径

      -DEXTRA_CHARSETS=all                                 #是否支持额外的字符集

      -DDEFAULT_CHARSET=utf8     #默认编码机制

      -DWITH_DEBUG=0     #DEBUG功能设置

      专用软件包管理器(二进制)

      deb    、rpm等

      mysql                     #MySQL客户端程序和共享库

      mysql-server             #MySQL服务器需要的相关程序

      服务:mysqld

      端口:3306

      主配置文件:/etc/my.cnf

      初始化脚本:mysql_install_db

      启动命令:mysqld_safe

      数据目录 :/var/lib/mysql

      套接字文件:/var/lib/mysql/mysql.sock

      #当意外关闭数据库时,再开启时假如开启不了,找到这个,删除再启动

      进程文件:/var/run/mysqld/mysqld.pid

    3. mysql密码实验

      mysqladmin -uroot password '123';            #root用户登入前设置密码

      grant all on *.* to root@'%' identified by '123';    #创建登录用户,%:指任意的远程终端

      mysql -u root -p -h 192.168.10.100        #测试用户远程登录

      set password=password('111111');        #用户为自己更改密码

      set password for huang@'%'=password('111');        #root用户为其他用户找回密码

      root找回自己的密码并修改

              service mysql stop

      vim /etc/my.cnf

      添加:

      skip-grant-tables            #添加到[mysqld]标签下

      service mysql stop

      mysql -u root -p                         #空密码登入

      update mysql.user set password=password('111111') where user='root';        #修改密码

      删除skip-grant-tables,重启数据库验证新密码

      或者

              mysqld_safe --skip-grant-tables &

              直接空密码进入mysql

    4. mysql基本命令

      mysqladmin -uroot password '123';         #不登入设置密码

      mysql -u 用户名 -p                                    #登录

      -p 用户密码

      -h 登陆位置(主机名或ip地址)

      -P 端口号(3306改了就不是了)

      -S 套接字文件(/var/lib/mysql/mysql.sock)

      exit && ctrl+d                        #退出

      show  databases;                    #查看服务器中当前有哪些数据库

      use  数据库名;                        #选择所使用的数据库

      create database 数据库名;            #创建数据库

      drop database 数据库名;                #删除指定的数据库

      drop table 表名;                #删除指定表

      create table 表名 (字段1 类型1,...);        #在当前数据库中创建数据表

      show tables;                        #显示当前数据库中有哪些数据表

      describe  表名;                    #显示当前或指定数据库中指定数据表的结构(字段)信息

      drop table 表名;                #删除当前或指定数据库中指定的数据表

      alter table 旧表名 rename 新表名;        #修改数据表的名称

      alter table 表名 modify 字段 类型;    #修改字段的类型

      alter table 表名 change 旧字段名 新字段名 类型;        #修改字段

      alter table 表名 add 字段 类型(first/after)                    #增加字段

      alter table 表名 drop 字段                        #删除字段

      insert into 表名(字段1,字段2,……) values(字段1的值, 字段2的值,……);

      #向数据表中插入新的记录

      update 表名 set 字段名=新数据  where 条件表达式;    #修改、更新数据表中的记录

      select 字段名1,字段名2……from 表名 where 条件表达式;        

      #从数据表中查找符合条件的记录

      select * from 表名;        #显示当前数据库的表中的记录

      delete from 表名 where 条件表达式;        #在数据表中删除指定的记录

      # between...and...        #指定范围

      delete from 表名;        #将当前数据库表中记录清空

      create database web;            #创建数据库

      show databases;                    #查看数据库

      use web;                            #选择要使用的数据库

      create table a1 (id int ,name char(30));        #创建a1表,并添加id和name字段以及类型

      Mysql>create table a2 (

              ->id int unsigned not null auto_increment    #字段要求为正数、且自增长、主键

              ->name char(30) not null default        #字符型长度30字节,默认值为空格

              ->age int not null default 0                            #字段默认值为0

              ->primary key (id));                                    #设置id为主键

      insert into xiao values (1,huang);            #指明插入记录

      select * from a2;

      insert into xiao values (2,'xiao');            #按顺序插入指定字段,不需要指定字段

      insert into xiao values (3,'laowang'),(4,'laoshong');        #插入多条数据

      将表a2的数据复制到表a1

      insert into a1 (id,name) select id,name from a2;        #查询a2值,并写入到a1

      delete from a2 where id=5;                                        #删除id=5的记录

      delete from a2 where age between 23 and 25;            #删除年龄在23-25之间的

      update a2 set age=21 where id=3;                #修改表中的数据

      Mysql>alter table a2 rename a1;                #修改数据表的名称

      Mysql>alter table a1 modify name char(50);            #修改数据表的字段类型

      Mysql> alter table xiao change name username char(50) not null default '';

      # username是字段名,修改数据表的字段类型详情

      Mysql>alter table a1 add age int            #添加字段age, 位置默认在末尾

       

      Mysql>alter table a1 add birthday year first;            #添加字段到第一列

      Mysql>alter table a1 add sex nchar(1) after id;        #添加到指定字段后

       

      删除字段

          Mysql>alter table a1 drop birthday;

       

      Mysql用户授权

       

      授予用户全部权限

          Mysql>select user from mysql.user;

          Mysql>grant all on aa.a1 to sans@'%';        #给已存在用户授权

          Mysql>grant all on aa.a1 to abc@'%' identified by '123456';    #创建用户并授权

       

      取消abc用户的删除库、表、表中数据的权限

          Mysql>revoke drop,delete on aa.a1 from abc@'%';    #取消删除权限(登录abc测试)

          Mysql>show grants for abc@'%';                        #查看指定用户的授权

          Mysql>show grants for sans@'%';                    

       

      Mysql备份和还原

      把数据库aa 备份到/root目录下

          #mysqldump –uroot –p aa > ~/aa.sql

      模拟数据库aa丢失(删除数据库aa)

          Mysql>drop database aa;

       

      通过aa.sql文件还原(指定导入到哪个库中)

          #mysql –uroot –p test < aa.sql

      备份多个数据库(--databases)

          #mysqldump –uroot –p --databases aa test > abc.sql

      还原(先模拟丢失)

          #mysql –uroot –p < abc.sql

      备份有规则的数据库

          Mysql>create database a1;        #连续创建三个a开头的数据库

          #mysqlhotcopy --flushlog –u='root' –p='456' --regexp=^a

      还原(先模拟丢失)

          Mysql>drop database a1;            #顺序删除a开头的数据库

          #cp –a /mnt/* /var/lib/mysql/        #复制产生的文件到数据库目录下

          #登录数据库查看即可

      用户权限设置

      grant 权限1,权限2 on 数据库.数据表 to 用户@登录位置 (identified by '密码');

      revoke 取消的权限1,取消的权限2 on 数据库.数据表 from 用户@登录位置;

      show grants for 用户@登录位置;

      备份和还原设置

      mysqldump

      备份:

      mysqldump -u 用户名 -p 数据库名 > /备份路径/备份文件名(备份整个数据库)

                  mysqldump -u 用户名 -p 数据库名 表名 > /备份路径/备份文件名(备份数据表)

                  --databases 库1,库2 (还原:mysql < 备份文件)

                  --all-databases —备份服务器中的所有数据库内容

      还原:mysql –uroot –p 数据库 < 备份文件

      mysqlhotcopy

      备份:mysqlhotcopy --flushlog -u='用户' -p='密码' --regexp=正则 备份目录

      还原:cp -rpf 备份目录 数据目录(/var/lib/mysql)

      补充的备份机制

      日志备份

      > show global variables like '%log%'

      #列出mysql中和日志相关的变量

      错误日志

      服务器启动和关闭时的信息

      服务器运行过程中的错误信息

      从服务器启动从服务器进程时产生的信息

      log-error    错误日志的路径

      一般日志(不启用)

      记录用户对数据库的查询操作

      general-log=ON     启动一般查询日志

      log=ON                    全局日志开关

      log-output                 日志的记录类型

      慢查询日志

      记录需要较长时间的查询操作

      log-slow-queries=保存路径 启动慢查询日志,并设置个路径

      二进制日志

      所有对数据库状态更改的操作(create、drop、update等)

      log-bin=位置 启动二进制日志

      > show binary logs 查看当前使用的二进制日志

      > show binlog events in '二进制日志(mysql-bin.000001)' 查看二进制日志的内容

      还原:(mysqlbinlog)

      按时间还原

      mysqlbinlog --start-datetime 'YY-MM-DD HH:MM:SS' --stop-datetime 'YY-MM-DD HH:MM:SS' 二进制日志 | mysql(-uroot -p)

      按文件大小还原

      --start-position

      --stop-position

      事务日志:记录事务相关的日志信息

      中继日志:记录从服务器的备份信息

       

    5. 二进制日志还原

          原理:根据产生的日志文件中的标签,恢复丢失文件或指定动作

      1.安装:yum -y install mysql mysql-server

      2.开启二进制日志:vim /etc/my.cnf

      [mysql]下添加:log-bin=mysql-bin

      3.重启:service mysqld start

      4.查看二进制日志文件:ls /var/lib/mysql/

      5.查看二进制日志内容:mysqlbinlog mysql-bin.000003

      例:

      # at 710(大小)

      #180802(年月日) 3:24:01 server id 1 end_log_pos 805 Query thread_id=2 exec_time=1089 error_code=0

      SET TIMESTAMP=1533151441/*!*/;

      create table a1 (id int,age int)(数据库中执行过的命令)

      /*!*/;

      按时间还原

      mysqlbinlog --start-datetime '2018-08-02 3:24:01' --stop-datetime '2018-08-02 3:25:35' mysql-bin.000003 | mysql

      注:所选时间段一定要完整包含所有动作(可以在原来基础上稍微增加点时间)

      按文件大小还原

      mysqlbinlog --start-position 710 --stop-position 1078 mysql-bin.000003 | mysql

    6. 主从备份
      1. 安装:yum -y install mysql mysql-server
      2. 主从都写入二进制日志:vim /etc/my.cnf

      log-bin=mysql-bin

      server-id=100        #mysql服务id,需要不一样

      3.在主服务器上授权,从服务器保存授权的信息

      主:

      grant replication slave on *.* to [email protected] identified by '111111';

                  show master status;    #特殊的授权权限

      从:

      change master to master_user='aa', master_password='111111', master_host='192.168.10.100', master_log_file='mysql-bin.000003', master_log_pos=255;        #根据主的master status修改,会产生master.info文件

      start slave;                #开启从服务器

      show slave status\G;        #查看是否开启成功,两个线程是否yes

      1. 测试,在主服务器上创建数据库和表
    7. 主主备份

      注:多主主,需要要注意主键冲突,奇偶轮替

      1. 安装:yum -y install mysql mysql-server
      2. 主从都写入二进制日志:vim /etc/my.cnf

      1

      log-bin=mysql-bin

      server-id=100

      replicate-do-db=test        #规定test数据库备份,删除就不受限

      binlog-ignore-db=mysql        #规定mysql数据库不备份

      binlog-ignore-db=information_schema        #规定information_schema不备份

      auto-increment-increment=2        #防止主键冲突,数据id号从1,3,5,7开始

      auto-increment-offset=1

              2

      log-bin=mysql-bin

      server-id=101

      replicate-do-db=test

      binlog-ignore-db=mysql

      binlog-ignore-db=information_schema

      auto-increment-increment=2

      auto-increment-offset=2

      1. 启动服务器service mysqld start
      2. 授权和保持授权信息(互为主从,互相授权和保存授权)

      主:grant replication slave on *.* to [email protected] identified by '111111';

      从:change master to master_user='bb', master_password='111111', master_host='192.168.10.101', master_log_file='mysql-bin.000004', master_log_pos=260;

    8. 一主多从

          原理:与主从服务一样操作,注意id

    9. 多主一从
      1. 安装:yum -y install mysql mysql-server
      2. 主从都写入二进制日志:vim /etc/my.cnf

      log-bin=mysql-bin

      server-id=100        #mysql服务id,需要不一样

      1. 主服务器授权(主1,主2)

      grant replication slave on *.* to asd@'192.168.10.102' identified by '111111';

      1. 修改从服务器my.cnf添加以下内容

        [mysqld_multi]

        mysqld=/usr/bin/mysqld_safe

        mysqladmin=/usr/bin/mysqladmin

        log=/tmp/multi.log

        [mysqld15]

        port=3306

        datadir=/var/lib/mysqla/

        pid-file=/var/lib/mysqla/mysqld.pid

        socket=/var/lib/mysqla/mysql.sock

        user=mysql

        server-id=17

        [mysqld16]

        port=3307

        datadir=/var/lib/mysqlb/

        pid-file=/var/lib/mysqlb/mysqld.pid

        socket=/var/lib/mysqlb/mysql.sock

        user=mysql

        server-id=17

        注意:mysqladmin 图片上多了一个d

      2. 从服务器初始化数据库,生成目录mysqla,mysqlb

        mysql_install_db --datadir=/var/lib/mysqla --user=mysql

        mysql_install_db --datadir=/var/lib/mysqlb --user=mysql

      3. 设置mysqla,mysqlb目录及以下文件的属主为mysql(防止出现权限问题)
      4. 启动从服务器线程(执行保持授权信息)

      mysqld_multi --defaults-file=/etc/my.cnf start 100

      mysqld_multi --defaults-file=/etc/my.cnf start 101

      1. 登录并保存授权信息

      change master to master_user='asd', master_password='111111', master_host='192.168.10.100', master_log_file='mysql-bin.000005', master_log_pos=491;

      start slave;

      show slave status\G;

      1. 从服务器测试登入

      mysql -P 3306 -S /var/lib/mysqla/mysql.sock

      mysql -P 3307 -S /var/lib/mysqla/mysql.sock

    10. 读写分离

      数据库的中间件:

          mysql proxy (官方版本) 性能低,需要lua脚本

          atlas 性能低,响应时间长

          amoeba 陈思儒研发的

      1. 先搭建一个主从关系的服务器

      #关闭从服务器线程,为了做读写分离时,测试有明显的实验效果(实际生产环境中不能停掉。。)

      1. 安装gcc(amoeba需要源码安装)
      2. 上传amoeba,解压,改名
      3. mkdir /amoeba
      4. 解压jdk,并改名成jdk或链接一个jdk目录
      5. 声明用java写出来的程序如何调用(/etc/profile)

        #set java environment

        JAVA_HOME=/amoeba/jdk

        CLASSPATH=.:$JAVA_HOME/lib.tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

        PATH=$JAVA_HOME/bin:$PATH

        export JAVA_HOME CLASSPATH PATH

        source /etc/profile    #加载

        java -version    #测试是否成功

      6. 解压amoeba,到/usr/local/amoeba
      7. chmod -R +x /usr/local/amoeba/bin/(最好给予相应权限)
      8. vim /usr/local/amoeba/conf/amoeba.xml(配置文件,注意标签)

      <server> #server 区域

      <property name="port">8066</property> #端口

      <property name="ipAddress">192.168.99.17</property> #本机 IP

      <property name="readThreadPoolSize">20</property> #默认

      <property name="clientSideThreadPoolSize">30</property> #默认

      <property name="serverSideThreadPoolSize">30</property> #默认

      <property name="netBufferSize">128</property> #默认

      <property name="tcpNoDelay">true</property> #默认

      <property name="user">huang</property> #登录 amoeba 的用户名

      <property name="password">123456</property> #登录 amoeba 的用密码

      </server>

      <dbServerList> #服务区域

      <dbServer name="server1"> #服务器名

      <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

      <property name="port">3306</property> #端口

      <property name="ipAddress">192.168.99.15</property> #登录的数据库

      <property name="schema">test</property> #同步的库

      <property name="user">amb</property> #登陆的数据库授权用户名

      <property name="password">123456</property> #登陆的数据库授权用户的密码

      </factoryConfig>

      <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

      #优化相关,可以不改

      </poolConfig>

      </dbServer>

      复制一个服务区域

      <dbServer name="server2"> #服务器名

      <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

      <property name="port">3306</property> #端口

      <property name="ipAddress">192.168.99.16</property> #登录的数据库

      <property name="schema">test</property> #同步的库

      <property name="user">amb</property> #登陆的数据库授权用户名

      <property name="password">123456</property> #登陆的数据库授权用户的密码

      </factoryConfig>

      <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

      #优化相关,可以不改

      </poolConfig>

      </dbServer>

      <dbServer name="master" virtual="true"> #池的名字 master,用于写授权

      <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

      <property name="loadbalance">1</property>

      <property name="poolNames">server1</property>

      </poolConfig>

      </dbServer>

      <dbServer name="slave" virtual="true"> #池的名字 slave,用于读授权

      <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

      <property name="loadbalance">1</property>

      <property name="poolNames">server1,server2</property> #读取顺序

      </poolConfig>

      </dbServer>

      </dbServerList>

      <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">

      <property name="defaultPool">master</property> #默认访问池

      <property name="writePool">master</property> #写入池

      <property name="readPool">slave</property> #读取池

      </queryRouter>

      1. vim /usr/local/amoeba/bin/amoeba

      58行修改:-Xss256k

      1. 授权amoeba能连接到主从服务器进行查询

      grant all on *.* to asd@'192.168.10.102' identified by '111111';

      1. 启动amoeba,如果exit提示报错,查看nohup.out文件

      nohup bash -x /usr/local/amoeba/bin/amoeba &

      1. ps aux | grep amoeba    
      2. 用amoeba或另一台客户机连接登入测试

      mysql -uhuang -p -h 192.168.10.100 -P 8066

      #如果测试读分离,需要关闭从slave,主从创建相同表,用select查看转换

  5. redis数据库

    NoSQL(NoSQL = Not Only SQL )

    NoSQLkey-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID属性、表结构等等。

            这类数据库主要有以下特点:非关系型的、分布式、开源的、水平可扩展的。

    处理超大量数据

    运行在便宜的服务器集群上

    击碎了性能瓶颈

    对数据高并发读写

    对海量数据的高效率存储和访问

    对数据的高扩展性和高可用性

    Redis

    Redis是一个开源的,先进的key-value存储。它通常被称为数据结构服务器,因为键可以包含string(字符串)、hash(哈希)、list(链表)、set(集合)和zsetsorted-set--有序集合)。这些数据类型都支持push/popadd/remove及取交集并集和差集及更丰富的操作。

    RedisMemcached类似,它支持存储的value类型相对更多,与memcached一样,为了保证效率,数据都是缓存在内存中,区别是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    Redis支持语言

    ActionScriptCC++C#

        ClojurCommon LispDart

        ErlangGoHaskellHaxe

        IoJavaNode.jsLua

        Objective-CPerlPHP

        Pure DataPythonRRuby

        ScalaSmalltalkTcl

    1. Redis安装

      Redis的官方网站是:http://redis.io

      步骤一:

              下载安装包:

              wget http://download.redis.io/releases/redis-2.8.6.tar.gz

      步骤二:

              编译安装:

              tar –xf redis-2.8.6.tar.gz

              cd redis-2.8.6

              make

              make PREFIX=/usr/local/redis install

              mkdir /usr/local/redis/etc/

      cp ./redis.conf /usr/local/redis/etc/

      #指定安装位置,如果没有指定安装位置PREFIX=/usr/local/redis,则make install会把redis安装到/usr/local/bin/目录下

    2. Redis启动与关闭

          启动:

      1. vi /usr/local/redis/etc/redis.conf

      修改daemonize yes    后台启动

      1. usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

      #启动redis服务

      #不加配置文件会提示警告

      1. /usr/local/redis/bin/redis-cli

      #客户端启动操作

      -h IP            #连接指定的redis服务器

              -p 6379            #指定redis服务器的端口

              -a 密码            #使用密码登录

              -n 数据库号        #指定连接哪个数据库

              --raw                 #redis支持存储中文

          关闭:

      1. usr/local/redis/bin/redis-cli shutdown
      2. pkill -9 redis

      Redis配置文件

      /usr/local/redis/bin/下的可执行文件的作用

      redis-server     #服务器端

      redis-cli     #客户端

      redis-benchmark     #调试

      redis-check-dump     #数据导出

      redis-check-aof     #数据导入

          /usr/local/redis/etc/redis.conf配置文件

      daemonize     #如果需要后台运行,改成yes

      pidfile         #配置多个pid的地址,默认在/var/run/redis.pid

      bind             #绑定ip,设置后只接受来自该ip的请求

      port             #监听端口,默认为6379

      timeout         #设置客户端连接时的超时时间,单位为秒

      loglevel         #分为4级,debugverbosenoticewarning

      logfile         #配置log文件地址

      databases     #设置数据库的个数,默认使用的数据库为0,最大为16

      save             #设置Redis进行数据库镜像的频率(快照)

      rdbcompression #在进行镜像备份时,是否进行压缩

      dbfilename     #镜像备份文件的文件名

      dir             #数据库镜像备份的文件放置位置

      slaveof         #设置数据库为其他数据库的从数据库

      masterauth     #主数据库连接需要的密码验证

      requirepass     #设置登录时需要使用密码

      maxclients     #限制同时连接的客户数量

      maxmemory     #设置redis能够使用的最大内存

      appendonly     #开启append only模式

    3. Redis的数据类型与命令

      redis提供五种数据类型:stringhashlistsetzset(sorted set)

      string类型及操作

      string是最简单的类型,一个key对应一个valuestring类型是二进制安全的。redisstring可以包含任何数据,比如jpg图片或者序列化的对象

      命令

      用法

      作用

      set

      set name lamp

      设置key对应的值为string类型的value

      string类型一个键值对应一个value

      setnx

      setnx name linux

      #设置key值,如果 key已经存在,返回0nxnot exist的意思

      setex

      setex age 10() 18key

      设置key值,指定有效期

      ttl    

      ttl age

      以秒为单位,返回给定 key 的剩余生存时间当 key 不存在时,返回 -2

      key 存在但没有设置剩余生存时间时,返回 -1

      否则,返回 key 的剩余生存时间

      setrange

      setrange name 9 itxdl.com

      替换第9个开始的字符串为itxdl.com

      mset

      mset key1 aa key2 bb

      一次设置多个key,成功ok,失败0

      msetnx

      msetnx key1 aa key2 bb

      一次设置多个key,成功ok,失败0,不覆盖

      get

      get name

      获取key对应的string值,不存在返回nil

      getset

      getset name aa

      设置key的值,并且返回key的旧值

      getrange

      getrange name 0 7

      获取指定范围内的字符

      mget

      mget key1 key2 key3

      获取多个key的值,如果没有,返回nil

      incr

      incr key

      key的值做加加操作(递增)

      incrby

      incrby key 5

      key的值做指定值得的加操作

      decr

      decr key

      key的值做加加(递减)操作,返回新的值

      append

      append key bb

      给指定的key的字符串追加值

      strlen

      strlen key

      获取key值的长度

      del

      del key

      删除一个已创建的key

          hash类型及操作

      Redis hash是一个string类型的field(字段)和value的映射表,它的添加、删除操作都是0(1)平均;hash特别适合用于存储对象,相较于将对象的每个字段存成单个string类型,将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象

      命令

      用法

      作用

      hset

      hset num1 name aa

      num1表创建一个叫name字段(key),键值是liuchuan

      hsetnx

      hsetnx num name aa

      key不存在,则先创建,如果存在则返回0

      hmset

      hmset num name aa age 18

      同时设置hash的多个field

      hget

      hget num name

      获取hash表里面的某一个字段

      hmget

      hmget num name age

      获取hash表里面的多个字段

      hincrby

      hincrby num age 5

      指定的hash field加上给定值,数字叠加

      hexists

      hexists num age

      测试field是否存在,1存在,0不存在

      hlen

      hlen num

      返回指定hashfield数量

      hdel

      hdel num age

      删除指定hashfield

      hkeys

      hkeys num

      返回hash的所有的field

      hvals

      hvals num

      返回hash的所有value

      hgetall

      hgetall num

      同时返回指定hash表中的全部fieldvalue

          list类型及操作

      list是一个链表结构,主要功能是pushpop、获取一个范围内的所有值等等,操作中key理解为链表的名字。Redislist类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过pushpop操作从链表的头部或尾部添加删除元素,这样list既可以做为栈,又可以作为队列

      命令

      用法

      作用

      lpush

      lpush list world

      key对应list的头部添加字符串元素

      rpush

      rpush list world

      key对应list的尾部添加字符串元素

      linsert

      linsert list before aa bb

      key对应的listaa前或后添加字符串,after之后添加

      lset

      lset list 0 aa

      设置list中指定下标的元素值

      lrem

      lrem list 1 aa

      key对应list中删除n个"指定值"的元素n 代表删除"指定值"元素的数量

      n > 0 从头向尾删除n"指定值"元素

      n < 0 从尾向头删除n"指定值"元素

      n = 0删除所有值为"指定值"的元素

      lpop

      lpop list

      list的头部删除元素,并返回删除元素

      rpop

      rpop list

      list的尾部删除元素,并返回删除元素

          Set类型及操作

      set是集合,他是string类型的无序集合。Set是通过hash table实现的,对集合我们可以取并集、交集、差集。通过这些操作我们可以实现社交网站中的好友推荐和blogtag功能。集合不允许有重复值

      命令

      用法

      作用

      sadd

      sadd mset 1 2 3 4

      添加一个或多个元素到集合中

      smembers

      smembers mset

      获取集合里面所有的元素

      srem

      srem mset 2 3

      从集合中删除指定的一个或多个元素

      spop

      spop mset

      随机从集合中删除一个元素,并返回

      srandmember

      srandmember mset

      随机返回集合中一个元素,但不删除

      scard

      scard mset

      获取集合里面的元素个数

      sismember

      sismember mset 3

      确定一个指定的值是否是集合中的元素,返回1是有,返回0是无

      sdiff

      sdiff mset1 mset2

      返回集合1与集合2的差集,前为标准

      sinter

      sinter mset1 mset2

      获得两个集合的交集

      sinterstore

      sinterstore a b c

      获得集合1和集合2的交集,并把结果存入新集合,第一个是新集

      sunion

      sunion a b

      获得指定集合的并集

      sunionstore

      sunionstore a b c

      获得指定集合的并集,并把结果保存如新集合

      smove

      smove a b 2

      将指定的值从源集合移动到目标集合,a

          zset类型及操作

      zsetset的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存的value,一列存的顺序。操作中key理解为zset的名字。

      命令

      用法

      作用

      zremrangebyrank

      zremrangebyrank a 0 1

      删除有序集合中,下标在指定区间的元素

      zcard

      zcard zset

      返回有序集合元素的个数

      zadd

      zadd zset 1 a 2 b

      向一个指定的有序集合中添加元素,每一个元素会对应的有一个分数,必须是一个表示数字的字符串

      zrange

      zrange zset 0 -1 withscores

      返回有序集合中,指定区间内的成员。其中成员按照score(分数)值从小到大排序。具有相同score值的成员按照字典顺序来排列,withscores:返回集合中元素的同时,返回其分数

      zrevrange

      zrevrange zset 0 -1

      返回有序集合中,指定区间的成员。其成员按照score从大到小来排列

      zrangebyscore

      zrangebyscore zset 2 3

      返回有序集合中score在指定区间的值

      zrem

      zrem zset a

      删除有序集合中指定的值

      zincrby

      zincrby zset 5 a

      给有序集合中指定值的成员的分数(score)值加上增量,如果集合中没有这个值,则给添加一个分数是增加的值。

      zrank

      zrank zset a

      返回有序集合中指定值的下标

    4. Redis常用命令

      命令

      用法

      作用

      keys

      keys *

      按照键名查找指定的键,支持通配符

      exists

      exists name

      确认一个键是否存在

      expire

      expire age 20

      设置一个键的过期时间,如果键已经过期,将会被自动删除

      select

      select 1

      选择一个数据库。默认连接的数据库是0,可以支持共16个数据库。在配置文件中,通过databases 16 关键字定义

      move

      move age 1

      将当前数据库的键移动到指定的数据库中

      randomkey

      randomkey

      从当前数据库返回一个随机的键。如果当前库没有任何键,则返回nil

      rename

      rename name name_new

      对键名进行重命名

      type

      type age

      返回键的类型

      quitctrl+d

       

      退出redis数据库

      save

      保存所有的数据。很少在生产环境直接使用SAVE 命令,因为它会阻塞所有的客户端的请求,可以使用BGSAVE 命令代替. 如果在BGSAVE命令的保存数据的子进程发生错误的时, SAVE命令保存最新的数据是最后的手段

      dbsize

      dbsize

      返回当前库中键的数量

      info

      info

      获取服务器的详细信息

      config get

      config get *

      获取redis服务器配置文件中的参数。支持通配符

      flushdb

      flushdb

      删除当前数据库中所有的数据

      flushall

      flushall

      删除所有数据库中的所有数据

      Redis高级应用

      安全性

          设置客户端连接后进行任何其他指定前需要使用密码。

      警告:因为redis速度非常快嗖,所以在一台比较好的服务器下,一个外部的用户可以在一秒内进行150K次的密码尝试,这意味着你要指定非常强大的密码来防止暴力破解。

          密码三原则:复杂性、易记性、时效性

      持久化

      Redis是一个支持持久化的内存数据库,也就是说需要经常将内存中的数据同步到硬盘来保证持久化。

      snapshotting(快照)--默认方式

      RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。这种持久化方式被称为快照 snapshotting(快照)

              # 过了900秒并且有1key发生了改变就会触发save动作

              # 过了300秒并且有10key发生了改变就会触发save动作

              # 过了60秒并且至少有10000key发生了改变也会触发save动作

      append-only file(缩写aof

      使用AOF 会让你的Redis更加耐久: 你可以使用不同的持久化策略:每次写的时候备份、每秒备份、无备份。使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。

              appendonly no

              #默认不使用AOF持久化(450行)将no改成yes

              appendfsync always    

              #有写操作,就马上写入磁盘。效率最慢,但是最安全

              appendfsync everysec

              #默认,每秒钟写入磁盘一次

              appendfsync no

              #不进行AOF备份,将数据交给操作系统处理。最快,最不安全

      事务处理

      Redis对事务的支持还是比较简单的。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其它的client命令。

      当一个client在连接中发出multi命令时,这个链接会进入一个事务处理模式,该链接后续的命令不会立即执行,而是先储存在一个队列中,当执行对应结束命令时,redis才会对队列当中存储的命令进行依次顺序执行或取消执行。

          实验:

              multi            #开启事务

              set age 30

              set age 40

              exec            #结束事务

              discard        #结束事务事务处理输入,并且清空队列当中的命令

      发布及订阅消息

      发布订阅(pub/sub)是一种消息通讯模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/subserver,在订阅者和发布者之间起到了消息路由的功能。

      订阅者可以通过subscribepsubscribe命令向redis server订阅自己感兴趣的消息类型,redis将信息类型称为通道。

      当发布者通过publish命令向redis server 发送特定类型的信息时,订阅该信息类型的全部client都会收到此消息。

          实验:开启三个终端,全部登入redis client

              终端1subscribe tv1            #订阅消息

              终端2subscribe tv1 tv2    #订阅消息

              终端3publish tv1 hello    #发布消息

    5. redis服务器设置密码

              1.修改配置文件

                  vim /usr/local/redis/etc/redis.conf

                  修改 requirepass 123456

              2.重启redis

                  .../bin/redis-cli shutdown

                  …/bin/redis-server …/etc/redis.conf

      3.redis连接

              …/bin/redis-cli

              or     !!!历史命令会明文保存密码    

      Redis主从复制特点:

      1. master可以拥有多个slave
      2. 多个slave可以连接同一个master外,还可以连接到其它slave
      3. 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
      4. 提高系统的伸缩性

        Redis主从复制过程:

      5. Slavemaster建立连接,发送sync同步命令
      6. Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。
      7. 后台完成保存后,就将此文件发送给slave
      8. Slave将此文件保存到硬盘上
    6. 不同服务器配置主从
      1. slave服务器上vim /usr/local/redis/etc/redis.conf

      slaveof 主服务器IP 主服务器端口

      masterauth 主服务器密码

      bind 绑定服务器连接IP,需要注释了

      1. 重启slave服务器
      2. 测试
    7. 同一服务器配置主从
      1. 复制从服务器

      cp -r /usr/local/redis/ /usr/local/redis-slave

      1. 修改从服务器配置文件vim /usr/local/redis-slave/etc/redis.conf

      pidfile /usr/local/redis-slave/redis.pid #指定pid文件

      port 63791                 #指定端口号

      dir /usr/local/redis-slave/     #指定数据库文件存放位置

      slaveof 127.0.0.1 6379     #指定主服务器IP和端口

      masterauth flzx_3QC     #指定主服务器密码

      1. 启动slave服务…/bin/redis-server …/etc/redis.conf

      #查看两个redis端口是否都启动了

      1. 连接服务器…/bin/redis-cli

猜你喜欢

转载自www.cnblogs.com/hxqxiaoqi/p/9720115.html
今日推荐