web服务之httpd基础配置与源码安装apache

前言

前言有点长,请耐心看看,也许对你有用呢…

一个多月前,我在写一篇初始化脚本里面就写过了什么一键编译安装apache,那只是实现了最最基础
的web页面功能,简单的几行代码,其实只能起到一定的学习作用,然而在生产中意义是不大的,因为,
根据实际需要的不同,他们的htppd服务基本都是自定义的,基础的功能已经不能满足他们的需求,
他们注重的细节,是每一个页面的权限,是如何细分每一个功能。

在初创公司,政府网页,或是没有什么流量的小型网站,因为没有太多过于复杂的功能需求,也没有可
怕的用户并发量,只需要提供最基础的功能,他们追求的是稳定,一般都会直接使用rpm安装的方式使
用老旧版本的htppd服务,而且用不了几台服务器就能解决。

而在中大型互联网公司或是电商网站,他们因为会有恐怖的用户并发量,他们可能所需要的服务器是一
个天文数字,而且,多用lvs做开始的调度器,然后用nigix做反向代理,再用apache做web服务器,然
后再使用memcached做缓存服务器,在使用php或是perl或是python来处理动态资源,最后使用mysql
或是mariadb来做数据库(市场的走向是mariadb)。
可以简单的说成:LNAMPM,这只是一个轮廓,如果再往细分那要用到的东西就太多了…

而这一篇博客我所要讲述的就是其中的:
apache做为web服务器的一些功能的实现,
与如何自定义编译安装apache。

httpd的基础配置介绍

安装

# yum install httpd 
# rpm -qc httpd     //查看安装程序生成的配置文件

基础配置文件

配置文件:

    /etc/httpd/conf/httpd.conf
    /etc/httpd/conf.d/*.conf        //为主配置文件提供额外的配置片段。当一个程序的配置文件过大的时候往往就会将其切割成多个片段进行维护

注:httpd的主配置文件并没有在/etc/httpd下面,而是在/etc/httpd/conf目录下,是因为它将/etc/httpd目录作为
程序的安装目录,也就是程序运行的根目录。在主配置文件中有定义。

服务脚本:
一般就是服务的启动或者关闭

    /etc/rc.d/init.d/httpd 
    脚本的配置文件:/etc/sysconfig/httpd

主程序文件:服务程序

    /usr/sbin/httpd         //默认使用的是prefork
    /usr/sbin/httpd.event 
    /usr/sbin/httpd.worker

日志文件目录:

    /var/log/httpd 
        access_log: 访问日志(至关重要,用于大数据)
        error_log: 错误日志(web服务器启动或者停止过程中产生的错误信息,以及运行过程中的错误或者警告信息)

站点文档目录:

    /var/www/html

httpd常用配置

修改监听的IP和Port

可以在住配置文件里面直接修改,也可以在conf.d/目录下自己以.conf结尾的方式自定义的写一小段代码文件,我比较
推荐后者,方便管理,不用老是去主配置文件里面,面对那一大堆代码去搜索。
在主配置文件中有这么一小段代码:

#
#Listen 12.34.56.78:80
Listen 80

可以直接修改,也可以在去conf.d下创建个文件单独管理。
1、修改了监听的端口之后只能重启
2、省略IP表示监听本机所有IP
3、Listen可重复监听多次

持久连接

Persistent Connection: 连接建立,每个资源获取完成后不会断开连接,而是继续等待其他的请求完成
    每个客户端连接到服务器都要进行三次握手四次断开,这样会浪费大量的时间,所以就推出了持久连接。但是有副作用
    如何断开:
        数量限制:100
        时间限制:可配置
    副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到响应
    折中办法:使用较短的持久连接时间
httpd-2.4 支持毫秒级持久时间

代码片:

    # vim /etc/httpd/conf/httpd.conf
     keepAlive On

     #
     # MaxKeepAliveRequests: The maximum number of requests to allow
     # during a persistent connection. Set to 0 to allow an unlimited amount.
     # We recommend you leave this number high, for maximum performance.
     #
     MaxKeepAliveRequests 100

     #
     # KeepAliveTimeout: Number of seconds to wait for the next request from the
     # same client on the same connection.
     #
     KeepAliveTimeout 15

MPM,多道处理模块

    prefork, worker, event 

    httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个,rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的实现,确认方法:
    # ps aux | grep httpd 
    默认为/usr/sbin/httpd, 其使用prefork

    查看模块列表:
    查看静态编译模块(如果使用的是event模式,那么则要使用httpd.event -l查看)
        # httpd -l
        Compiled in modules:
        core.c
        prefork.c
        http_core.c
        mod_so.c
    查看动态加载模块:
        # httpd -M
更换httpd程序的工作模式:
    # vim /etc/sysconfig/httpd
    HTTPD=/usr/sbin/httpd.worker    //取消注释,将从prefork变成worker模式
    HTTPD=/usr/sbin/httpd.event     //将worker变成event,表示httpd从worker模式变成event模式
重启才能生效
prefork的配置:
    <IfModule prefork.c>
    StartServers       8        //服务器启动时,启动的进程数
    MinSpareServers    5        //最小空闲进程数
    MaxSpareServers   20        //最大空闲进程数
    ServerLimit      256        //服务器进程的最大数目值
    MaxClients       256        //最大并发请求数
    MaxRequestsPerChild  4000   //服务器进程能够响应的最大请求数目
    </IfModule>
worker的配置:
    <IfModule worker.c>
    StartServers         4
    MaxClients         300
    MinSpareThreads     25
    MaxSpareThreads     75      //最大空闲线程数   
    ThreadsPerChild     25      //每个进程所能够启用的线程数
    MaxRequestsPerChild  0      // 每个线程所能够响应的最大请求数,0表示不作限制
    </IfModule>

DSO:动态装/卸载模块的实现

    # httpd -M   //查看内核编译以及没有编译的httpd模块
    配置指令实现模块加载
        LoadModule <mod_name> <mod_path>
    也可以直接在配置文件中注释或者取消注释实现模块的装/卸载
    配置之后平滑重启:
        # service httpd reload

定义”Main” server的文档页面路径

代码片:

[ root@centos6 /etc/httpd/conf ]# vim httpd.conf 

# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"   //修改成你想要的路径,一般都是在conf.d目录下,自定义根路径。

站点访问控制

可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:

<Directory ""> </Directory> 基于对目录的访问控制
<File ""> </File>  基于对文件的访问控制
<FileMatch ""> </FileMatch>  基于正则表达式。但是建议不要使用,因为效率低
URL路径:
    <Location ""> </Location> 基于位置来实现访问

访问控制机制:
基于来源地址:但是风险比较大,
基于账号

Directory中”基于来源地址”实现访问控制

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

(1) Options: 定义用户在对该目录下的资源进行访问时的访问机制
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
Indexs: 页面索引(这是一项很有用但是很危险的选项,如果是一个提供下载的网站,那么又非常有用)
FollowSymLinks: 是否允许跟踪符号链接
All:表示开启options中所有的选项(测试环境中使用这个)
None:表示禁止options中所有的选项(生产环境中一般用这个)

一般的一个网站都有自己定义的默认主页面,定义在DocumentRoot路径下的两个文件
(index.html,index.html.var),如果没有这两个文件,那么在访问该站点时系统会自动显示
默认的欢迎信息(/etc/httpd/conf.d/welcome.conf)。如果这个文件也没有,而且选项Indexs是
启用的,那么系统就会将你在该目录下<Directory "/var/www/html">的所有文件全部列出来,
可以下载,可以查看。
所有这是一个很危险的用法,但是当我们要用这个网站提供下载的时候又非常有用。
实现方式如下:以/var/www/html路径为例.

1、删除或者重命名/var/www/html下的index.html/index.html.var文件
    # mv /var/www/html/index.html{,.bak}
2、删除或者重命名/etc/httpd/conf.d/welcome.conf
    # mv /etc/httpd/conf.d/welcome.conf{,.bak}
3、在主配置文件中将Indexs启用起来
    <Directory "/var/www/html">
    Options Indexs
    </Directory>
4、重读配置文件
    # service httpd reload

(2) AllowOverride None(无关紧要,一般都是none)

(3) 基于来源地址的访问控制机制

Order: 检查次序(allow和deny谁在后面,就是谁对全局进行默认设定)
    Order allow, deny  //白名单,默认deny(禁止)
    Order deny, allow  //黑名单,默认allow(允许)
Allow from
Deny from
设置白名单/黑名单之后也可以通过Allow from/Deny from设置特殊的ip,例如:
    Order allow, deny   表示禁止所有主机访问
    Deny from 192.168.64.129    表示禁止该ip访问
    Allow from 192.168.64.128   表示允许该ip访问
    来源地址的写法:
        192.168     表示该网络地址中的所有主机
        192.168.0.0
        192.168.0.0/16
        192.168.0.0/255.255.0.0
    如果是不同的ip则使用多次Allow/Deny

定义默认主页面

[ root@centos6 /etc/httpd/conf ]# vim httpd.conf 
DirectoryIndex index.html index.html.var   //设置你想要定义的文件为默认主页面文件

日志设定

[ root@centos6 /var/log/httpd ]# ls
access_log  error_log
错误日志:
    ErrorLog logs/error_log
日志级别(由低到高):debug, info, notice, warn, error, crit, alert, emerg.
    LogLevel warn:默认为warn,表示从wran到emerg级别的日志都会被记录
访问日志:
CustomLog logs/access_log combined(表示使用combined日志格式记录)
日志记录格式:
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    %h: 客户端IP地址
    %I: 不怎么重要,一般都是空
    %u:基于认证的用户,一般也是空
    %t: 服务器收到请求的时间
    %r: 请求报文的首行信息
    %>s: 响应状态码
    %b:响应报文的大小,大小是字节,不包括响应报文首部
    %{Referer}i:请求报文当中"referer"首部的值,当前资源的访问入口,即从哪个页面中的超链接跳转而来
    %{User-Agent}i:请求报文当中"User-Agent"首部的值,即发出请求用到的应用程序
自己对照着/var/log/httpd/access_log中的记录信息

路径别名

在配置文件中的Alias中创建一个别名映射Alias /index.html “/var/www/html/1.html”
将/var/www/html/index.html映射到/var/www/html/1.html上
注:从上面的例子可以看出,要映射的路径是相对路径,想对于你定义的DocumentRoot。
而映射之后的路径一定是绝对路径,而且要加引号 。

设定默认字符集

[ root@centos6 /etc/httpd/conf ]# vim httpd.conf
AddDefaultCharset UTF-8

(一般稍微有点规模的网站都是用的支持UTF-8格式,可以显示中文)

基于用户的访问控制(重要)

这个访问控制就是让用户输入用户名与密码,才能访问该路径下的资源。,如果是一个大型的项目的话一般都是基于表单认证(用户通过网页进入了某一个网站,而要想访问这个网站必须输入用户名和密码)的方式进行认证,而不是基于httpd网页进行认证。

认证类型:
    basic:明文
    digest:消息摘要
    (虽然这个是加密的,但是很多老版本不支持这个功能,所以一般都是明文的)

basic认证:
(1)定义安全域(按以下格式在主配置文件中任何地方输入)

<Directory "">
    Options None 
    AllowOverride None
    AuthType Basic                  //基于basic认证
    AuthName "String"               //提示名称
    AuthUserFile "/etc/httpd/conf.d/.htpasswd"  //用户名放置的位置,一般都是这个目录
    Require user username1..        //用户白名单
    Require valid-user              //表示允许所有的用户登录
</Directory>

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

使用htpasswd命令进行管理
    htpasswd [options] passwordfile username
        -c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用
        -m:md5加密用户密码
        -s:sha1加密用户密码
        -D:删除指定用户s

# htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom
# htpasswd -m /etc/httpd/conf.d/.htpasswd jerry

注:这里只有第一次创建这个文件的时候才需要使用-c选项.

(3) 实现基于组进行认证

<Directory "">
    Options None 
    AllowOverride None
    AuthType Basic                  //基于basic认证
    AuthName "String"               //提示名称
    AuthUserFile "/etc/httpd/conf.d/.htpasswd"  //用户名放置的位置,一般都是这个目录
    AuthGroupFile "/etc/httpd/conf.d/.htgroup"  //组存放的位置
    Require group GROUP1...
</Directory>

(a) 创建组文件

# vim /etc/httpd/conf.d/.htgroup
    webadmin: tom jerry

(b) 修改配置文件

AuthUserFIle "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmin

虚拟主机

有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址(实际用的比较少)
基于port:为每个虚拟主机准备至少一个专用port(实际用的更少)
基于hostname:为每个虚拟主机准备至少一个专用hostname(常用)

注意:可以混合使用上述三种方式中任意方式。一般虚拟主机不与中心主机混用,所以,要使用虚拟主机,先禁用中心主机。
还有注意DNS的配置。
基于虚拟主机的hostname的那个可以使用三台机器来做,第一台最DNS服务器,第二台做web虚拟主机,第三台做客户机。
禁用中心主机方式:注释DocumentRoot

实现方式:
首先注释DocumentRoot
a) 基于ip实现虚拟主机

(1) 为主机配置多块网卡
# ip addr add 192.168.64.127/24 dev eth0
# ip addr    //只能用这个命令才能查看增加的ip
(2) 修改主配置文件,添加虚拟主机
<VirtualHost 192.168.64.129:80>
     ServerName web1.magedu.com
     DocumentRoot "/web/web1"
</VirtualHost>
<VirtualHost 192.168.64.128:80>
     ServerName web2.magedu.com
     DocumentRoot "/web/web2/htdocs"
</VirtualHost>
<VirtualHost 192.168.64.127:80>
     ServerName web3.magedu.com
     DocumentRoot "/web/web3/htdocs"
</VirtualHost>
(3) 检查语法
# httpd -t
(4) 重载
# service httpd reload
(5) 验证
# curl http://192.168.64.128
# telnet 192.168.64.128 80

b) 基于port实现虚拟主机,与基于ip实现虚拟主机相同,最后就是要重启一下httpd,注意是重启。

c) 基于hostname实现虚拟主机。这是当下常用的方法

(1) 注释主配置文件中第1000行中的NameVirtualHost,并将其IP:Port修改成与虚拟主机一样
    NameVirtualHost 192.168.64.129:80
(2) 修改主配置文件,添加基于hostname的虚拟主机
    <VirtualHost 192.168.64.129:80>
         ServerName web1.magedu.com
         DocumentRoot "/web/web1"
    </VirtualHost>

    <VirtualHost 192.168.64.129:80>
         ServerName web2.magedu.com
         DocumentRoot "/web/web2/htdocs"
    </VirtualHost>
    <VirtualHost 192.168.64.129:80>
         ServerName web3.magedu.com
         DocumentRoot "/web/web3/htdocs"
    </VirtualHost>
(3) 检查语法与重载
(4) 这也是很关键的一点
    # vim /etc/hosts
    192.168.64.129 web1.magedu.com web2.magedu.com web3.magedu.com 
    '''
    当我们实现基于hostname的虚拟主机时,其他客户端想通过hostname访问就必须用到DNS域名解析。但是这个比较麻烦,最简单的办法就是在客户端修改hosts文件。注意,这里是客户端,而不是服务端
    '''
(5) 验证
    # curl http://web1.magedu.com

虚拟主机中的日志可以专门定义,实现方式如下:

<VirtualHost 192.168.64.129:80>
     ServerName web3.magedu.com
     DocumentRoot "/web/web3/htdocs"
     CustomLog /var/log/httpd/web3_access_log   //注意,这里不加引号
     ErroLog /var/log/httpd/web3_error_log
</VirtualHost>

使用 mod_deflate 模块压缩页面优化传输速度

使用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老的浏览器不支持
(2) 压缩适用于压缩的资源,例如文本文件

SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/plain 
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

注:在conf.d目录下创建一个文件,把代码写进去就可以了,
记得一硬要用httpd -t 先检查一边语法后再重启。

以上的配置都是指的是CentOS6上面的配置。
而在CentOS7上

httpd-2.4新特性:
(1) MPM支持运行DOS机制
(2) 支持event MPM
(3) 支持异步读写
(4) 支持每模块及每个目录分别使用各自的日志级别
(5) 每请求配置,<if>
(6) 增强版的表达式分析器
(7) 支持毫秒级的keepalive timeout
(8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令
(9) 支持用户自定义变量

新模块:
(1) mod_proxy_fcgi
(2) mod_ratelimit
(3) mod_remoteip

修改了一些配置机制:
不再支持使用Order, Deny, Allow来基于IP的访问控制机制

编译安装apache

在CentOS6上面使用rpm安装的apache版本是十分老旧的版本。

[ root@centos6 /etc/httpd/conf.d/conf ]# rpm -q httpd
httpd-2.2.15-59.el6.centos.x86_64

在CentOS7上rpm安装的是较新的apache版本。

[ root@ygl ~ ]# rpm -q httpd
httpd-2.4.6-45.el7.centos.x86_64

而接下来,我将直接在CentOS6上安装最新版的apache,
只是起到一个学习的作用,讲道理,在CentOS6上强行装最新版的apache
那个莫名其妙的bug啊,深坑啊,是真的多….

准备工作

首先CentOS6默认的apr版本是:
apr-1.3.9, apr-util-1.3.9
而安装最新的httpd-2.4.28依赖于于apr-1.4+, apr-util-1.4+。
下载源代码
httpd-2.4.28.tar.bz2
apr-1.6.2.tar.bz2
apr-util-1.6.0.tar.bz2

解压与编译安装

①:首先我们要安装开发环境包组:

yum groupinstall "Development tools"

②:然后安装其他我实验时候发现缺少的包,你也可以什么时候报错,
看提示再来装这些包,我就一次性都提前安上了。

yum install openssl-devel pcre-devel expat-devel

注:友情提示,就算你是一台最小化安装的机器,刚开始是没有安装apr这些包的,但是开发包组Development tools,里面会带有apr1.3.9版本的包…
因为我在实验的时候总会出些很奇怪的bug,我直接卸载了老版本的apr,然后bug玄学消失了…
但是在编译安装的时候是指定了路径的,按道理来说是不会有任何冲突的…

③:解压所有压缩包

tar xvf apr-1.6.2.tar.gz apr-util-1.6.0.tar.gz   httpd-2.4.28.tar.bz2

④:配置

cd apr-1.6.2
./configure --prefix=/app/apr
make & make install
cd ../apr-util-1.6.0
./configure --prefix=/app/apr-util --with-apr=/app/apr
make & make install
useradd -r -d  /app/website -s /sbin/nologin apache
cd ../httpd-2.4.28
./configure --prefix=/app/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/app/apr/ --with-apr-util=/app/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
make & make install

⑤:修改apache服务所有者和所属组

[ root@YGL /app/httpd24/logs ]# vim /app/httpd24/conf/httpd.conf 
#User daemon
#Group daemon
user apache
group apache

⑥:加PATH变量

[ root@YGL /app/httpd24/logs ]# vim /etc/profile.d/httpd24
.sh 
PATH=/app/httpd24/bin:$PATH

⑦:配置服务脚本,设置开机启动。
从另一台CentOS6上面用scp把/etc/init.d/httpd的脚本复制过来,在修改..
注:这是偷懒的做法,也可以自己编写…

[ root@YGL /etc/profile.d ]# vim /etc/init.d/httpd24 
apachectl=/app/httpd24/bin/apachectl
httpd=${HTTPD-/app/httpd24/bin/httpd}
pidfile=${PIDFILE-/app/httpd24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

然后加入开机启动列表里面

chkconfig --add httpd24
chkconfig httpd24 on
service httpd24 start

⑧:测试
关了防火墙,还有SELINUX,用浏览器访问一下,
或是使用curl测试一下就好了…







ღ ღ ღ 如果觉得文章对您有用,不妨赞一下ღ ღ ღ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章