Linux之Web服务Httpd服务配置之一

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之Web服务Httpd服务配置之一相关的知识,希望对你有一定的参考价值。

Linux之Web服务(2)Httpd服务配置之一

Apache HTTP Server

Apache HTTP 服务器,简称Apache,是非常留下的Web服务器软件。通常和脚步语言比如php,数据库mysql一起工作,合成为LAMP(Linux, Apache, MySQL, PHP). 当然流行的Web服务器还有nigix,但是nigix虽然轻量级很稳定,但是功能并不如Apache HTTP功能丰富,并且现在的Apache HTTP还支持模块化功能,及可以开发自己的功能模块并加入到此Web服务器软件中,更灵活的满足Web业务甚至是和http协议相关的实现。

本篇主要讲解在CentOS 7 上安装Httpd2.4和相应的配置。

 

Httpd2.4具体配置介绍

 

1、Httpd2.4的安装

#使用yum安装

[[email protected] ~]# yum install httpd -y

#安装后查看httpd信息,可以检查是否已经安装

[[email protected] ~]# yum info httpd 
Loaded plugins: fastestmirror
Determining fastest mirrors
Installed Packages
Name        : httpd
Arch        : x86_64
Version     : 2.4.6
Release     : 40.el7.centos
Size        : 9.4 M
Repo        : installed
From repo   : centos6
Summary     : Apache HTTP Server
URL         : http://httpd.apache.org/
License     : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
            : web server.


2Httpd2.4 默认配置

主程序文件:/usr/sbin/httpd

模块文件:/usr/lib64/httpd/modules/*.so

注:可以使用httpd -M 查看当前服务加载的模块文件列表

主配置文件:

/etc/httpd/conf/httpd.conf

/etc/httpd/conf.d*/.conf

/etc/httpd/conf.modules.d/*.conf

站点文档路径:

/var/www/html

日志文件路径:

/var/log/httpd/access_log :访问日志

/var/log/httpd/error_log:  错误日志

Systemd Unit File

/usr/ib/systemd/system/httpd.service

自带脚步文件:

/usr/sbin/apachectl

注意:在CentOS6及以前使用SysV风格启动的服务脚步使用的就是此脚本。

 

3、Http2.4 服务的启动和关闭

#启动服务

[[email protected] ~]# systemctl start httpd.service

#关闭服务

[[email protected] ~]# systemctl stop httpd.service

#查看服务是否启动成功

[[email protected] ~]# systemctl status httpd.service

#通过查看默认端口80查看是否开启监听

[[email protected] ~]# netstat -tnlp | grep ‘:80\>‘
tcp     0      0 0.0.0.0:80       0.0.0.0:*        LISTEN      88660/httpd

  

#也可以通过查看进程来查看httpd相关的进程组

[[email protected] ~]# ps -axu | grep ‘httpd\>‘ | grep -v ‘\<grep\>‘
root      88660  0.0  0.5 222032  5104 ?     Ss   12:47      0:00 /usr/sbin/httpd -DFOREGROUND
apache    88661  0.0  0.3 222032  3108 ?        S    12:47   0:00 /usr/sbin/httpd -DFOREGROUND
apache    88662  0.0  0.3 222032  3108 ?        S    12:47   0:00 /usr/sbin/httpd -DFOREGROUND
apache    88663  0.0  0.3 222032  3100 ?        S    12:47   0:00 /usr/sbin/httpd -DFOREGROUND
apache    88664  0.0  0.3 222032  3100 ?        S    12:47   0:00 /usr/sbin/httpd -DFOREGROUND
apache    88665  0.0  0.3 222032  3108 ?        S    12:47   0:00 /usr/sbin/httpd -DFOREGROUND


解析:这里发现进程的发起者居然都是apache,这是为了保护系统而产生的一个系统用户,该用户只负责Httpd守护进程操作,这样如果Httpd服务被入侵,而保护了操作系统。在某些低版本如Httpd2.2版本中使用的系统账户名可能为httpd

 

4Http2.4 准配前工作

#80Httpd指定监听的端口开发防火墙

[[email protected] ~]# iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

#保存此防火墙规则配置

[[email protected] ~]# iptables-save

 

5Httpd2.4 基础配置检查

 

配置文件格式:

DIRECTIVE  VALUE

DIRECTIVE:指令,不区分字符大小写;例如ServerRoot

VALUE:该值除了文件系统指定路径除外,大多数也不区分大小写;

配置修改完后注意事项:

    (1)检查语法;  注:可以使用 httpd -t 来检查,如果显示OK则无错误

(2)让服务重新重载配置文件

实例:

#检查配置文件语法是否有误,OK表示无语法错误

[[email protected] ~]# httpd -t

Syntax OK

#重载服务配置

[[email protected] ~]# systemctl reload httpd.service

#当然也可以通过发送1号信号让 Httpd守护进程重新生成

[[email protected] ~]# pkill -SIGHUP -f ‘.*\/httpd\>‘

 

6、具体的配置指令及其选项介绍

1、基本配置指令

ServerTokens  OS      #会显示当前apache版本和系统版本
ServerRoot "/etc/httpd"   #默认服务器配置跟目录
PidFile  run/httpd.pid   #进程信息的存放路径,相对路径,相对于/etc/httpd/下
Timeout 60               #超时时间,60秒后端口并重新连接
Listen [ip:]port         #监听的地址和端口

注:Listend可以重复定义多次,默认监听本机可用的所有地址;当需要修改监听多个监听端口或者添加多个监听端口时,需要重新启动httpd服务守护进程,及:

$ systecml restart httpd.service

     

2、保存连接的限制类指令

提示persistent connection : tcp连接建立后,资源获取完成后不会断开连接,而会继续等待。

而如何进行控制其他多个资源通过端口访问进程?

方案猜想:进行访问的数量限制,进行同一进程访问的时间限制。

具体配置举例说明:

是否开启保存连接

KeepAlive  on|off

举例说明:在Tcp进行通信需要3次握手来建立连接,而假设如果需要进行传输文件时使用此协议,则传送一次文件后端口连接然后再次3次连接建立一次连接来进行下一次文件传输。

如果改为On,则表示只在传输第一个文件时建立一次Tcp连接,而不会断开,接下来继续进行下面的传输不在进行建立连接的请求过程。

单一用户的保持连接最大请求次数

MaxKeepAliveRequest  100

解析:当输出此时为100次才端口一次连接,然后再次建立Tcp连接。

注意:只有KeepAlive 设为为On 时此选项才会跟着生效。因为传输文件时不能总保持不断开连接,因此这里设置一个最大的传输请求次数来控制,防止网络请求队列堵塞。

单一用户的一次保持连接的超时时间,默认为s秒,httpd2.4可以设置ms表示毫秒

KeepAliveTimeout  15

解析:假设当进行文件传输时,速度很慢,那么此此文件传输超过15秒会自动断开进行如下一次传输连接的建立。

 

2MAP多处理模块

prefork MAP 可靠性、兼容性强的MAP,多进程,一个进程处理一次请求;

worker MAP  更高伸缩性的线程MAP,多线程,一个线程程处理一个请求;

event MAP   多线程,每线程处理一次请求,基于事件驱动机制;

 

这里主要列出perfork MAP介绍

StartServers   8         #httpd进程组默认会开启8个守护进程
MinSpareServers   5      #当有多个用户来进行访问,会至少有5个进程用来备份使用
MaxSpareServers   20    #最大值预留
ServerLimit   256        #限制允许多少个用户进行连接
MaxClients   256        #允许多少个用户同时连接,及同一时间段的并发量
MaxRequestsPerChild 4000  #最大请求模块子进程


3、模块的加载和查看

使用httpd 命令选项查看已经加载的模块

 -t -D DUMP_MODULES : show all loaded modules

 -M : a synonym for -t -D DUMP_MODULES

模块加载具体配置LoadModule

#httpd服务启动时默认加载的模块

LoadModule  mod_name  modules/mod_filename

注意:这里的LoadModule指定的模块名会在httpd -M命令中显示,而后面第二个参数才是真正对应的模块文件路径,此路径为相对路径,相对于ServerRoot配置节点指定的路径,一般默认为:

ServerRoot  /etc/httpd/       #Httpd服务的根目录
Include conf.d/*.conf        #读取包含指定目录下的配置文件

 

4、用户相关配置:

User apache    #系统用户,用于执行httpd守护进程
Group apache   #系统组,用于此组用户来管理httpd

注意:此系统用户一般不会轻易修改,就算要修改也要指定为一个系统用户,并且此用户的默认shell类型为/sbin/nologin,一次来就算Web服务站点出现的问题或被入侵,但是此进程的执行为系统用户,保证了系统的安全。

 

5、网站Main Server主要配置

#web服务站点邮箱,如:

ServerAdmin  [email protected]

解析:一般为管理员邮箱,当站点出现问题会发送服务的相关日志信息给指定邮箱。

#设置站点域名,可以设置,如:

ServerName  www.example.com:80

注意:此域名默认一般机器不会有,当启动服务时会出现一个提示说找不到ServerName指定域名,因此,可以设置为直接的主机名或者DNS配置的域名即可

#站点文档及网页根路径

DocumentRoot  “/var/www/html”

   

6、站点文档访问授权及众多服务特性的配置:

1、基于文件系统路径:

<Directory /PTATH/TO/DIR>

</Directroy>

<File “”>

</File>

2、基于URL访问:

<Location URL>

</Location>

<Location "URL">

</Location>

<LocationMatch ~ "URL_PATTERN">

</LocationMatch>

3、访问的选项节点

Options

选项固定参数:

Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None             #表示都不选
All            #表示选择所有参数功能
Indexes:         #索引
FollowSymLinks:  #允许使用符号链接访问资源
ExecCGI:      #允许执行CGI模块配置的脚本


 

具体案例解析:

 

1Indexes  功能展示

#修改默认配置添加

<Directoiry "/var/www/html">

Options Indexes FollowSymLinks

AllowOverride  None

Require all granted

<DIrectoiry/>

说明:Indexes表示当访问这个设定的目录下是,如果没有index.html文件,则把此目录下的所有文件列表显示在网页中。如:

#在默认站点文档根目录/var/www/html 下创建xx目录

[[email protected] ~]# mkdir /var/www/html/xx

#切换到xx目录

[[email protected] ~]# cd /var/www/html/xx/

#创建两个带测试内容的文本文件

[[email protected] xx]# echo aa > aa.txt
[[email protected] xx]# echo bb > bb.txt
[[email protected] xx]# sync

#重新启动服务

[[email protected] xx]# service httpd restart

#再次进行访问

[[email protected] xx]# links http://10.1.249.185:80/xx/

解析:这里因为没有检查当前目录下有index.html文件,所以会把当前目录下的其它所有文件列表给列出来。

 技术分享

说明:如果去掉Indexes 则表示如果目录下没有index.html文件,则会隐藏该目录下的其它所有文件,如显示以下信息:

[[email protected] xx]# links http://10.1.249.185:80/xx/

技术分享

Forbidden#forbidden   #表示为被禁用的意思

解析:这里最后一行就把系统的版本以及web站点服务器软件的版本以及端口后都显示出来。也是当全局设置有ServerTokens OS才会显示。这里显示的Forbidden就是上篇所列出的response响应介接收返回的状态码status code对应的403,及无权限访问此目录下除了默认文件名的默认文档及index.html的其它任何文件。

 

注意:Directory配置不能指定文件访问,为全局的,因此但如果指定该目录有文件,任然可以直接全路径进行访问指定资源,如查找 aa.txt,如:

[[email protected] xx]# links http://10.1.249.185/xx/aa.txt
aa

解析:那为什么任然可以通过此指定资源全路径来访问呢?因为这里的配置只是对Directory定义的整个目录生效,但是如果目录里的资源文件路径被获取,那么文件还是可以访问的,要拒绝通过指定文件资源路径访问可以通过配置File标签,及添加:

<Files ~ "/var/www/html/xx/.*\.txt$">
       Require all deiend  
</Files>

说明:这里访问/var/www/thml/xx/.txt结尾的文件都不能访问了。当然如果建立了其它非以.txt 结尾的文件还是可以访问的,如:

#新建一个以为.txt的文件,这时访问此文件时无权限的

[[email protected] ~]# echo hello > /var/www/html/xx/hello.txt

#那么给这个修改此文件名的后缀为.log

[[email protected] ~]# rename txt log  /var/www/html/xx/hello.txt

#则再次使用资源文件全路径去访问hello.log

[[email protected] ~]# links http://10.1.249.185/xx/hello.log

技术分享 

说明:这里可以访问说明只对.txt后缀的文件做了访问限制,那么是不是通过全资源路径就无法访问刚才的aa.txt路径了呢?非也,使用curl命令就可以抓取资源,如:

#使用curl将指定路径资源文档页面源代码读取打印

[[email protected] ~]# curl http://10.1.249.185/xx/aa.txt
aa

#当然直接打印此路径下的所有文件列表还是不行的

[[email protected] ~]# curl http://10.1.249.185/xx/

技术分享 

解析:curl能够根据资源记录来捕获对应的资源的源代码,当然在/var/www/html/xx目录下是没有index.html命名的文件,所以要想打印出下面的文件列表,还是不行的。那么添加一个index.html 文件。

 

#xx目录下添加一个index.html默认首页文档

[[email protected] ~]# echo ‘<html><head><title>新的默认页<title></head><body><h1>Default<h1></body></html>‘ >  > /var/www/html/xx/index.html


#使用curl尝试访问并读取其资源

[[email protected] ~]# curl http://10.1.249.185/xx

 技术分享

解析:这里似乎明白了什么,curl只是抓取资源的原代码或原内容,并不会解析对应的html标记,显示了301状态码表示这个目录下的文件被移动过。

 

#那么显示刚刚建立的/var/www/html/xx/index.html

[[email protected] ~]# curl http://10.1.249.185/xx/index.html
<html><head><title>新的默认页<title></head><body><h1>Default<h1></body></html>

说明:这样直接就将源码截获了,那么怎么办,只有给此文件设置访问控制facl了吗?和linux中的rwx基本权限类似,如果一个目录不能访问那么其下的所有资源如果设置了不能访问,那么就完全不能访问了。如,修改Directory/var/www/html/xx目录的配置:

<Directory "/var/www/html/xx">
        Options FollowSymLinks
        AllowOverride AuthConfig
        Require all deined#将允许所有修改过为拒绝所有
</Directory>

#这次再次使用curl去抓取资源源码

[[email protected] ~]# curl http://10.1.249.185/xx/index.html

技术分享 

说明:这样设置了直接对当前整个目录设置了访问控制,那么想要访问此目录的任何文件都不行了,403表示没有权限,curl使用读取web资源内容来打印,但是现在也没有权限去获取此资源文件了,那么使用浏览器或者links更没法了。

 

总结:

其实这里没必要这么麻烦,一般如果在一个目录下有多种类型的文件,这时可以通过设置对应的<Files> 标签来对指定文件名设置访问权限。而去掉<Directory>Options中的Indexes是为了安全考虑。Indexes的生效主要跟是否有index.html默认页有关,如果没有此默认页,那么去掉此项并设置访问拒绝才不会显示访问到所有文件。如果需要将不想让指定的文件在此目录下被访问,如果在现在的CentOS系统中,就好办了,直接将不想被访问并且被打印在文件列表中:

1、将此文件设置为隐藏文件

2、给对应的文件设置<Files >标签控制访问

 

验证总结案例实现:

#删除刚才创建的index.html默认页

[[email protected] ~]# rm -f /var/www/html/xx/index.html

#修改FIles标签拒绝所有人html/xx目录下所有以.开头并以txt结尾的文件

[[email protected] ~]# vim /etc/httpd/conf/http.conf
<Directory "/var/www/html/xx">
        Options Indexes FollowSymLinks
        AllowOverride AuthConfig
Require all granted       
<Files ~ "/var/www/html/xx/\..*txt$">
        Require all deined   
</Files>

#修改aa.txt文件名为.aa.txt及为隐藏文件

[[email protected] ~]# rename aa .aa /var/www/html/xx/aa.txt

#此时通过ls默认选项查看xx目录已经无法找出隐藏文件.aa.txt

[[email protected] ~]# ls /var/www/html/xx/
bb.txt

#通过links访问此目录

[[email protected] ~]# links  http://10.1.249.185/xx/

技术分享 

解析:因为没有index.html及默认页,所有打印当前目录下的所有资源文件,但不包括隐藏文件,因此.aa.txt并没有被打印。

 

#同时为了防止curl抓取内容,删除所有用户的r及读权限

[[email protected] ~]# chmod -r /var/www/html/xx/.aa.txt

#只是通过curl命令来通过web读取资源,就不行了

[[email protected] ~]# curl http://10.1.249.185/.aa.txt
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /.aa.txt was not found on this server.</p>
<hr>
<address>Apache/2.2.3 (Red Hat) Server at 10.1.249.185 Port 80</address>
</body></html>

说明:curl是需要是一个二进制执行程序,默认有x及执行权限,而对应的文件没有读权限,因此此curl获取资源源码失效。

#当然如果使用root用户直接在本地读取此文本还是可以的,只是对web做了限制

[[email protected] ~]# whoami
root
[[email protected] ~]# cat /var/www/html/xx/.aa.txt 
aa


 

2Options FollowSymLinks  允许符号链接

说明:允许Directory定义指定目录下创建符号链接来访问其他路径文件。

 

功能展示

#/var/www/html默认文档路路径对应的Directory标签中添加此选项:

<Directory “/var/ww/html>
Options FollowSymLinks
..........

#在根目录下创建一个目录 :

[[email protected] ~]# mkdir /xx

#xx目录下预习建立一个默认页面

[[email protected] ~]# echo echo aa > /xx/index.html

#切换到默认文档根路径

[[email protected] ~]# cd /var/www/html/

#给创建的默认页index.html添加httpd服务所需的安全上下文

[[email protected] html]# chcon -R -t httpd_sys_content_t /xx/

#在根路径下创建一个符号链接yy文件执行刚才的/xx目录

[[email protected] html]# ln -s /xx/ yy

#查看文档目录下的所有文件的安全上下文

[[email protected] html]# ll -Z
-rw-r--r--  root root root:object_r:httpd_sys_content_t index.html
drwxr-xr-x  root root root:object_r:httpd_sys_content_t xx
lrwxrwxrwx  root root root:object_r:httpd_sys_content_t yy -> /xx/

#发送 SIGHUP 信号重载Httpd服务配置

[[email protected] html]# pkill -HUP ‘httpd.*‘

#进行站点下的yy服务链接,显示结果实际为文件系统根路径下的xx目录,及/xx

[[email protected] html]# links http://10.1.249.185:80/yy
echo aa

说明:这里显示的内容并不是根据规则目录标签里定义的指定为/var/www/html目录下的相对路径yy,这个yy为一个软连接,而连接的指定的是一个目录,而目录里有index.html则执行的是这个网页。

 

3AllowOverride  访问控制配置

httpd的访问控制配置,允许每目录单独进行;在每个目录下建立一个.htaccess文件;

AllowOverride 表示是否允许目录中的.htaccess文件中的配置来覆盖当前配置段中的配置;

具体的参数:

  Options            多选项

  FileInfo         详细文件配置,一般用于文件Files标签配合

  AuthConfig        允许使用Auth配置文件来读取配置设定

  Limit             允许限制访问范围控制

  All           所有设定

  None           不使用任何设定

 


本文出自 “孟天霸-IT的垃圾回收站” 博客,转载请与作者联系!

以上是关于Linux之Web服务Httpd服务配置之一的主要内容,如果未能解决你的问题,请参考以下文章

Linux之Web服务Httpd服务配置之二

Linux之Web服务Httpd服务配置之四

Web服务之Apache的安装及配置

httpd笔记之理论详解优化配置(Apache)web入门

Linux——搭建Apache(httpd)服务器

Apache httpd服务