• Apache服务介绍


    http服务器程序 

         httpd             服务名称

         apache         软件包名

         特性:

            高度模块化:   core + modules

            DSO:  Dynamic Shared Object       动态加/卸载

            MPM: multi-processing moudule    多路处理模块

        MPM工作模式:

           1.  prefork  多进程IO模型,每个进程响应一个请求,默认模型

                一个主进程:    生成和回收N个子进程,创建套接字,不响应请求

                多个子进程:    工作work进程,每个子进程处理一个请求,系统初始化时候,预先生成多个空闲进程,等待请求,最大不超过1024个(系统打开文件描述符的最大极限)

           2.  worker  复用的多进程IO模型,多进程多线程

                 一个主进程:    生成m个子进程,每个子进程负责生成n个线程,每个线程响应一个请求,并发响应请求 m*n

           3.event  事件驱动模型(worker模型的变种)

                一个主进程:   生成m个子进程,每个子进程生成n个线程,在n个线程中有个单独的线程专门来管理其它的(keep-alive)线程,当有真实的请求时候管理线程会将真实请求传递给服务线程,执行完毕后,又允许释放执行任务的线程继续执行下一个请求任务

           4.线(进)程的的角色切换

               监听 (从空闲队列中取出一个线程进行监听)       》   工作(处理用户请求)    》      空闲(加入空闲线程队列)

               每个线程和进程工作一段时间后会被回收掉,然后生成一个新的线程或者进程来响应用户请求.

    HTTPD服务配置

        检查配置文件语法是否正确        httpd -t

       1.如果在/var/www/html目录下没有index.html的话,就会去找/etc/httpd/conf.d/welcome.conf配置的页面,如果没有welcome.conf的配置文件,那么访问网站的根路径就会显示出文件列表,此种情况适合搭建yum源,但不适合其它网站应用(会把所有的文件数据展示给用户,没有安全保障)

        1.根目录下的index.html   > 2.welcome.conf配置下的noindex.html >  3.根目录下的文件列表(默认情况)

         

       2.隐藏服务器响应头中系统版本号  servertokens prod

          1.添加httpd服务的配置不建议直接在主配置文件中直接修改,可以在/etc/httpd/conf.d添加一个以.conf结尾的配置文件,写好配置项后直接重启服务即可生效

       3.修改端口只能修改主配置文件的端口,在其它配置文件中添加端口配置相当于启动了两个监听端口.

       4.修改Listen配置项目         不仅仅是设置监听端口,还可设置监听的IP

       5.配置持久连接

       6.配置多路处理模块      /etc/httpd/conf.modules.d/00-mpm.conf

          1.prefork        开启的进程数就是等于用户的连接数

       7.如果需要访问一个文件夹,必须要给此文件夹授权访问,如果没有授权,将无法访问此文件夹的任何文件

       8.网站根目录中可以存在子文件夹,软连接等

       

     搭建https服务器

     1.搭建CA证书  在CA服务器端执行
      1.cd /etc/pki/CA
      2.创建私钥
        (umask 077;openssl genrsa -out private/cakey.pem 2048 )
      3.自签名证书
        openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
      4.touch index.txt
      5.echo 01 > serial
    
     2.在httpd服务端执行CA客户端
       1.mkdir /etc/httpd/conf.d/ssl
       2.生成私钥
         (umask 077;openssl genrsa -out httpd.key 1024)
       3.生成申请文件
        openssl req -new -key httpd.key -out httpd.csr
       4.scp httpd.csr 复制到 CA服务器上
       5.在CA服务器上颁发CA证书
         openssl ca -in httpd.csr -out certs/ca.yxh.com.crt -days 720
       6.把证书拷贝到httpd服务器主机
         scp certs/ca.yxh.com.crt 192.168.231.7:/etc/httpd/conf.d/ssl/
         scp cacert.pem 192.168.231.7:/etc/httpd/conf.d/ssl/
       7.yum install mod_ssl
       8.[root@node7 ssl]# ls
         cacert.pem          CA服务器自签名证书
         ca.yxh.com.crt      CA服务器颁发给客户端的CA证书
         httpd.csr           客户端的CA申请证书
         httpd.key           私钥
       9.修改 /etc/httpd/conf.d/ssl.conf
         SSLCertificateFile /etc/httpd/conf.d/ssl/ca.yxh.com.crt
         SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key
         SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem
    View Code

    将http重定向到https

    1、打开url重定向支持
       (1)在apache目录下找到httpd.conf文件,并且找到#LoadModule rewrite_module modules/mod_rewrite.so 去掉#号
       (2)找到<Directory "/var/www/html">字段,如下所示:

       <Directory "/var/www/html">
           AllowOverride None 改为 AllowOverride  ALL
       </Directory>
    

        (3)修改后重启apache服务
    2、在网站根目录下,即"/var/www/html" 目录下新建文件,文件名为(.htaccess)

         RewriteEngine On
         RewriteCond %{HTTPS} off
         RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

    https会话过程解析

         SSL会话的简化过程

              (1) 客户端发送可供选择的加密方式,并向服务器请求证书

              (2) 服务器端发送证书以及选定的加密方式给客户端

              (3) 客户端取得证书并进行证书验证 

                    如果信任给其发证书的CA 

                      (a) 验证证书来源的合法性;用CA的公钥解密证书上数字签名 

                      (b) 验证证书的内容的合法性:完整性验证 

                      (c) 检查证书的有效期限 

                      (d) 检查证书是否被吊销 

                      (e) 证书中拥有者的名字,与访问的目标主机要一致

            (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器, 完成密钥交换

            (5) 服务器用此密钥加密用户请求的资源,响应给客户端 

           注意:SSL是基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机 

    访问控制配置

           配置文件有冲突的话,后面的配置文件优先级高会覆盖前面的配置文件

           如果想访问某个目录或者目录下的文件,必须给这个目录授权,否则默认是不能访问的

    documentroot "/data/website"
    <Directory "/data/website">
         Require all granted
    </Directory>
    访问控制
    不能有失败,至少有一个成功匹配才成功,即失败优先
    <Directory "/data/website">
         <RequireAll>
               Require   all   granted
               Require   not  ip  192.168.231.1
         </RequireAll>
    </Directory>

    多个语句有一个成功,则成功,即成功优先
    <Directory "/data/website">
         <RequireAny>
                Require    all    denied
                require   ip   172.16.1.1 允许特定IP
        </RequireAny>
    </Directory>

         基于IP的访问控制:

              无明确授权的目录,默认拒绝

              允许所有主机访问:Require   all   granted

              拒绝所有主机访问:Require   all   denied

           控制特定的IP访问:

                   Require   ip    IPADDR:授权指定来源的IP访问

                   Require   not   ip  IPADDR:拒绝特定的IP访问

           控制特定的主机访问:

                  Require  host   HOSTNAME:授权特定主机访问

                  Require  not  host   HOSTNAME:拒绝
           HOSTNAME:

                 FQDN:特定主机

                domin.tld:指定域名下的所有主机

    配置服务监听注意项

         配置监听一般不仅仅是可以配置服务的监听端口,还有监听的网卡IP

         0-1023端口 只能给管理员用,普通用户是无法使用这些端口的

         127.0.0.1             80              这个时候只有本机可以访问80端口,其它任何主机是不能访问的

         192.168.30.7       80              只有30网段的机器机器可以访问这台主机的80端口

          0.0.0.0                80              可以通过服务器主机的任何一个IP来访问服务器的80端口

    root@centos7 ~]# ss -ntul
    Netid State      Recv-Q Send-Q          Local Address:Port                         Peer Address:Port              
    udp   UNCONN     0      0                           *:41579                                   *:*                  
    udp   UNCONN     0      0                           *:41881                                   *:*                  
    udp   UNCONN     0      0               192.168.122.1:53                                      *:*                  
    udp   UNCONN     0      0                    *%virbr0:67                                      *:*                  
    udp   UNCONN     0      0                           *:68                                      *:*                  
    udp   UNCONN     0      0                           *:5353                                    *:*                  
    udp   UNCONN     0      0                          :::55387                                  :::*                  
    tcp   LISTEN     0      128                         *:111                                     *:*                  
    tcp   LISTEN     0      5               192.168.122.1:53                                      *:*                  
    tcp   LISTEN     0      128                         *:22                                      *:*                  
    tcp   LISTEN     0      128                 127.0.0.1:631                                     *:*                  
    tcp   LISTEN     0      100                 127.0.0.1:25                                      *:*                  
    tcp   LISTEN     0      128                        :::111                                    :::*                  
    tcp   LISTEN     0      128                        :::22                                     :::*                  
    tcp   LISTEN     0      128                       ::1:631                                    :::*                  
    tcp   LISTEN     0      100                       ::1:25                                     :::*   
    查看服务端口的占用情况

    基于身份验证配置

    htpasswd -c /etc/httpd/conf.d/.httpuser user1
    htpasswd  /etc/httpd/conf.d/.httpuser user2
    [root@node7 conf.d]# cat .httpuser 
    user1:$apr1$/vggiUOi$Svh202puSmvzrpn5zuX/10
    user2:$apr1$II5vUPxh$m4vzva.dzpJ6Sv4xlBIqT0
    
    vi  /etc/httpd/conf.d/yxh.conf
    <Directory "/data/website">
       AuthType Basic
       AuthName "welcome to access admin website"
       AuthUserFile "/etc/httpd/conf.d/.httpuser"
       Require user user1
    </Directory>
    View Code
    authconfig和.htaccess两者必须配合使用
    <Directory "/data/website">
      allowoverride authconfig
    </Directory>
    
    cd /data/website && vi .htaccess
     AuthType Basic
     AuthName "welcome to access admin website"
     AuthUserFile "/etc/httpd/conf.d/.httpuser"
     Require user user1
    第二种实现方式

    查看apache服务器的状态

    <Location "/status">
      SetHandler server-status
      Require all granted
    </Location>
    View Code

    打开浏览器输入地址:   http://192.168.231.7/status

    虚拟主机配置

    touch /data/website1/index.html
    touch /data/website2/index.html
    touch /data/website3/index.html
    
    <Directory "/data">
      Require all granted
    </Directory>
    
    listen 81
    listen 82
    listen 83
    
    <VirtualHost *:81>
       DocumentRoot "/data/website1"
       ServerName www.a.com
       ErrorLog "logs/a.com.err_log"
       TransferLog "logs/a.com-access_log"
    </VirtualHost>
    <VirtualHost *:82>
       DocumentRoot "/data/website2"
       ServerName www.b.com
       ErrorLog "logs/b.com.err_log"
       TransferLog "logs/b.com-access_log"
    </VirtualHost>
    <VirtualHost *:83>
       DocumentRoot "/data/website3"
       ServerName www.c.com
       ErrorLog "logs/c.com.err_log"
       TransferLog "logs/c.com-access_log"
    </VirtualHost>
    基于端口实现
    ip a add 192.168.231.8/24 dev ens33
    ip a add 192.168.231.9/24 dev ens33
    
    <Directory "/data">
      Require all granted
    </Directory>
    
    <VirtualHost 192.168.231.8:80>
       DocumentRoot "/data/website1"
       ServerName www.a.com
       ErrorLog "logs/a.com.err_log"
       TransferLog "logs/a.com-access_log"
    </VirtualHost>
    <VirtualHost 192.168.231.9:80>
       DocumentRoot "/data/website2"
       ServerName www.b.com
       ErrorLog "logs/b.com.err_log"
       TransferLog "logs/b.com-access_log"
    </VirtualHost>
    <VirtualHost 192.168.231.10:80>
       DocumentRoot "/data/website3"
       ServerName www.c.com
       ErrorLog "logs/c.com.err_log"
       TransferLog "logs/c.com-access_log"
    </VirtualHost>
    基于IP实现
    修改客户端hosts文件或者搭建dns解析
    192.168.231.7    www.a.com
    192.168.231.7    www.b.com
    192.168.231.7    www.c.com
    
    修改httpd服务端的配置文件
    <VirtualHost *:80>
       DocumentRoot "/data/website1"
       ServerName www.a.com
       ErrorLog "logs/a.com.err_log"
       TransferLog "logs/a.com-access_log"
    </VirtualHost>
    
    <VirtualHost *:80>
       DocumentRoot "/data/website2"
       ServerName www.b.com
       ErrorLog "logs/b.com.err_log"
       TransferLog "logs/b.com-access_log"
    </VirtualHost>
    
    <VirtualHost *:80>
       DocumentRoot "/data/website3"
       ServerName www.c.com
       ErrorLog "logs/c.com.err_log"
       TransferLog "logs/c.com-access_log"
    </VirtualHost>
    基于主机头实现

    Sendfile机制

        不用 sendfile 的传统网络传输过程: 

             硬盘   >>     kernel buffer    >>    user buffer   >>    kernel socket buffer    >>    协议栈 

             上面4个步骤有4次上下文切换,有4次拷贝,如果能减少切换次数和拷贝次数将会有效提升性能 

          使用sendfile

              sendfile() 不但能减少切换次数而且还能减少拷贝次数 

              硬盘      >>         kernel buffer (快速拷贝到kernel socket buffer)     >>       协议栈 

             系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer

    反向代理

        正向代理               离客户端近

        反向代理               离服务端近

        fastcgi                  apache是反向代理         把用户的请求转发给fastcgi服务端        浏览器发送请求 .php 》 apapche  》 fastcgi  响应

  • 相关阅读:
    Shell编程进阶 2.2 shell数组
    Shell编程进阶 2.1 shell函数
    win7将 esc与 capslock 互换
    Vimium 快捷键记录
    mysql-server 的一些记录
    2003服务器断开rdp后会自动注销。
    CentOS云服务器数据盘分区和格式化
    autoproxy 规则
    理解MySQL——索引与优化
    Spinnaker简介
  • 原文地址:https://www.cnblogs.com/yxh168/p/9202127.html
Copyright © 2020-2023  润新知