Apache服务介绍

无人久伴 提交于 2020-02-29 04:53:42

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  响应

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!