httpd用来实现http协议的,可用来搭建web服务器的应用程序。下面就针对搭建web服务器的各种配置进行一一描述。

使用的操作系统为centos7.2


修改监听的ip端口

Listen [ip:]port

注意: 1>. Listen 默认监听在本机上的所有ip地址之上

  2>. 可定义多个接听端口。

编辑地方:

Listen 127.0.0.1:80

测试结果:  192.168.203.157为服务器另外一个ip地址

[root@centos 7 html]# curl http://192.168.203.157  
curl: (7) Failed connect to 192.168.203.157:80; Connection refused
[root@centos 7 html]# curl http://127.0.0.1
magedu.com


编辑地方:

Listen 80
Listen 8080

测试结果:

[root@centos 7 html]# curl http://192.168.203.157
magedu.com
[root@centos 7 html]# curl http://192.168.203.157:8080
magedu.com


设置是否持久连接:

判断是否为持久连接:

1>. 首先telnet命令使用验证服务器当前支持的连接状态:

[root@centos6 ~]# telnet 192.168.203.157 80
Trying 192.168.203.157...
Connected to 192.168.203.157.
Escape character is '^]'.
GET /index.htmlhttp/1.1
Host: 192.168.203.157
 
HTTP/1.1 200 OK
Date: Thu, 29 Sep 2016 12:57:50 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 29 Sep 2016 12:36:35 GMT
ETag: "b-53da4ba7495b0"
Accept-Ranges: bytes
Content-Length: 11
Content-Type: text/html; charset=UTF-8
 
magedu.com
Connection closed by foreign host.

客户端接收到数据后,等待一会时间连接关闭,说明当前服务器支持的是长连接,只是有时间限制。


修改配置文件:

第一种情况:

]# vim /etc/httpd/conf.d/keepalive.conf
KeepAlive off


第二种情况:

]# vim /etc/httpd/conf.d/keepalive.conf
KeepAlive on


第三种情况(第二种情况的扩展):

]# vim keepalive.conf 
KeepAlive on
KeepAliveTimeout 20   //  请求时间超过20秒,则断开连接,默认秒为单位
MaxKeepAliveRequests 10 // 请求资源数量超过10个的话,则断开链接


DSO(动态的装载和卸载模块文件)

配置文件:/etc/httpd/conf.modules.d/

模块文件都被写入到/etc/httpd/conf.modules.d/*.conf文件中

httpd2.4版本管理模块的的配置文件都放在/etc/httpd/conf.modules.d/*.conf文件,而httpd2.2配置文件则放到/etc/httpd/modules/*.so文件

比如:

vim /etc/httpd/conf.modules.d/00-lua.conf
LoadModule lua_module modules/mod_lua.so

httpd默认是加载lua这个模块的。

[root@centos 7 conf.modules.d]# httpd -M | grep lua
 lua_module (shared)

/etc/httpd/conf.modules.d/00-lua.conf中这一条目注释后,再去查看。

vim /etc/httpd/conf.modules.d/00-lua.conf
#LoadModule lua_module modules/mod_lua.so

重新加载httpd程序。

systemctl reload httpd
httpd -M | grep lua

httpd并没有加载mod_lua这一模块。


日志文件配置

日志文件有两种类型:错误日志error_log、访问日志access_log

error_log   错误日志文件被定义在/etc/httpd/conf/httpd.conf文件中,且日志的级别为warn

access_log  文件的特别有用,在生产坏境下,可以分析到访问源的ip地址、从哪里跳转来等.

access_log非常有用,所以在实际生产坏境下,经常要自己特定日志的格式.


官方站点解析:http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#logformat

access_log日志中各参数表示的意思:

%h:访问源ip地址

%l:.....

%u:.....

%t: time 访问的时间

\  \为转移字符,表示

%r: First line of request.

%>s:  记录最后一次的状态码    

%s: 第一次状态码

%{VARNAME}i:......

%{Referer}i: 从哪里跳转来。


使用本地官方站点文件

1>. 安装httpd-manual安装包。

2>. 重载服务。

通过http://ip/manual  来实现对官方文档的访问


DocumentRoot的配置

在httpd2.4版本,指定新的DocumentRoot后,必须再去指定相应目录的参数选项才可以。

DocumentRoot "/website/html"
<Directory "/website/html">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

在httpd2.2版本,指定新的DocumentRoot后,不需要指定目录的参数选项。

 

目录中常用选项总结:

(1) Options:用于定义资源的展示方式; 后跟以空白字符分隔的“选项”列表

子选项:

        Indexes (Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews)

        None

        All

注意:

1>.Indexes当系统没有给定相应的首页文件的话,会将DocumentRoot指定的目录中文件以列表的形式展示出来。

2>.Indexes有一定的安全的漏洞,在生产坏境下建议使用None功能将此功能关闭

 

(2) AllowOverride:httpd允许在网页文档的各目录下使用隐藏文件.htaccess来各自的访问控制;此指令定义哪此指令可以在.htaccess中定义

AllowOverride的各个选项:

FileInfo AuthConfig Limit

None

All

注意: Options也有安全漏洞,建议使用None选项将此功能关闭


(3) Require:

允许所有客户端访问:Require all granted

拒绝所有客户端访问:Require all denied


另外一种表示的方法:

<RequireAll>

Require ip 10.1.0.0/16

Require all denied

</RequireAll>


控制特定的客户端访问:

Require ip IP|NETWORK

Require not ip IP|NETWORK


Require host HOSTNAME

Require not  host HOSTNAME

HOSTNAME的表示方法:FQDN.或则是domain.tld.


定义站点主页面:

<IfModule dir_module>
    DirectoryIndex default.html
</IfModule>


路径别名

编辑配置文件/etc/httpd/conf/httpd.conf

 Alias /myweb/ /website/myweb/
 <Directory "/website/myweb/">
    AllowOverride None
    Require all granted
</Directory>

 测试:

httpd2.4版本的葵花宝典_httpd


虚拟主机:

虚拟主机的实现可以基于ip、端口、主机名称实现虚拟主机。

第一种: 基于ip地址实现虚拟主机.

步骤: 给网卡添加一个别名地址

#ip a add 192.168.203.200 dev eno33554984
#ip a
inet 192.168.203.157/24 brd 192.168.203.255 scope global eno33554984
     valid_lft forever preferred_lft forever
inet 192.168.203.200/32 scope global eno33554984
     valid_lft forever preferred_lft forever


修改配置文件: vhost_ip.conf

<VirtualHost 192.168.203.157:80>
    DocumentRoot "/vhost/www1/html"
    ServerName www1.magedu.com
    <Directory "/vhost/www1/html">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>
 
<VirtualHost 192.168.203.200:80>
    DocumentRoot "/vhost/www2/html"
    ServerName www2.magedu.com
    <Directory "/vhost/www2/html">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

测试结果:

httpd2.4版本的葵花宝典_Linux_02

httpd2.4版本的葵花宝典_配置_03


第二种情况:基于端口实现虚拟主机:

修改配置文件:

<VirtualHost 192.168.203.157:80>
    DocumentRoot "/vhost/www1/html"
    ServerName www1.magedu.com
    <Directory "/vhost/www1/html">
Options None
        AllowOverride None
Require all granted
    </Directory>
</VirtualHost>
 
<VirtualHost 192.168.203.157:8080>
    DocumentRoot "/vhost/www3/html"
    ServerName www1.magedu.com
    <Directory "/vhost/www3/html">
Options None
        AllowOverride None
Require all granted
    </Directory>
</VirtualHost>


测试结果:

httpd2.4版本的葵花宝典_配置_04

httpd2.4版本的葵花宝典_配置_05


第三种情况: 基于ServerName实现虚拟主机(这个是最常用的)

配置文件的修改:

<VirtualHost *:80>
    DocumentRoot "/vhost/www1/html"
    ServerName www1.magedu.com
    <Directory "/vhost/www1/html">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>
<VirtualHost *:80>
    DocumentRoot "/vhost/www2/html"
    ServerName www2.magedu.com
    <Directory "/vhost/www2/html">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>
 
<VirtualHost *:80>
    DocumentRoot "/vhost/www3/html"
    ServerName www3.magedu.com
    <Directory "/vhost/www3/html">
        Options None
        AllowOverride None

测试结果:

httpd2.4版本的葵花宝典_Linux_06



status页面 (查看服务器的状态页面信息)

[root@centos 7 conf.d]# vim status.conf

<Location /status>

SetHandler server-status

Requireall granted

</Location>

测试页面:

httpd2.4版本的葵花宝典_httpd_07


MPM: prework worker event ...

httpd主要的工作模式prework.

因为Linux系统下进程和线程的轻量级差不多。所以worker模式效果并不是很好

event还不是很稳定,所以生产线上使用prework工作模式。


如何修改httpd的工作模式.

这三种模式被修改为被做成内核模块。 只要加载相应的内核模块就OK了。

/etc/httpd/conf.modules.d/00-mpm.conf 模块中有三种模式。 注释或则起作用就OK了。
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:
 
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
 
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module moules/mod_mpm_worker.so
 
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so


这三种模式有许多参数:

prefork
ServerLimit      主进程最多可开启进程数
StartServers     服务开启后, 开启多少个子进程
MinspareServers   至少有多少个进程空闲
MaxSpareServers   最多有多少个进程空闲
MaxConnectionsPerchild    一个进程处理多少个请求后,杀掉,产生一个新的进程
MaxRequestWorkers   最多有多少个连接请求


worker:
ServerLimit
StartServers
MinSpareThreads
MaxSpareThreads
MaxRequestWorkers
ThreadsPerChild


event:
ThreadsPerChild
MaxRequestWorkers
AsyncRequestWorkerFactor


修改配置文件:

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

StartServers 5

MinspareServers 3

MaxSpareServers 15

MaxConnectionsPerChild 0

MaxRequestWorkers 50


用户认证:

httpd认证分为表单认证和http协议的认证。

表单认证就是我们互联网上浏览网页经常遇到的,需要提供账号和密码。由服务器端的应用程序提供。


http协议认证:

认证质询:

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

认证:

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

认证的方式有两种:

basic:明文

digest:摘要

虚拟账号:仅用于访问某服务使用。

用户信息存储于何处:文本文件、SQL数据库、ldap目录中。

 

基于basic认证实例:

基于用户身份认证:
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    AuthType basic
    AuthName "Admin Area, Enter your name/password."
    AuthUserFile "/etc/httpd/.htpasswd"
    Require valid-user
</Directory>


认证文件的生成:

htpasswd -c -m /etc/httpd/.htpasswd jack

htpasswd -m /etc/httpd/.htpasswd bob

 

基于组的认证:

配置文件:

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    AuthType basic
    AuthName "Admin Area, Enter your admin,admin_user"
    AuthUserFile "/etc/httpd/.htpasswd"
    AuthGroupFile "/etc/httpd/.grouppasswd"
    Require group admin
</Directory>


组认证是不是单纯的验证组信息,而是要结合用户验证来进行。


worker进程的运行者身份的验证:

User apache
Group apache


进程运行者和运行的所属组都是apache, 这样其实也比较好。

即使黑客截获了httpd的服务, 也只能获得httpd用户的权限,对整个系统构成不了毁灭性的破坏。

也不介意将网页文件的所属组或则所属者修改为httpd。这样一般文件可以随意删除网页文件,这样其实也不好。