HTTP 配置与编译安装

HTTP 配置与编译安装

HTTP 相关配置

注意: 多个配置文件之间有冲突的话,排在后面的配置文件生效

DSO

加载动态模块配置
/etc/httpd/conf/httpd.conf

配置指定实现模块加载格式:
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)
示例:

# 要加载的模块名 模块路径
LoadModule auth_basic_module modules/mod_auth_basic.so

定义‘Main’ Server 的文档页面路径

**DocumentRoot “/path”**

文档路径映射:DocumentRoot指向的路径为URL路径的起始位置
示例:

DocumentRoot "/app/data“
访问该路径: http://HOST:PORT/test/index.html
对应实际linux中的路径为 --> /app/data/test/index.html

注意:SELinux和iptables的状态

定义站点主页面

DirectoryIndex index.html index.html.var

站点访问控制常见机制

可基于两种机制指明对哪些资源进行何种访问控制访问控制机制有两种:客户端来源地址,用户账号

在Apache2.2版本中,访问控制是基于客户端的主机名、IP地址以及客户端请求中的其他特征,使用Order(排序), Allow(允许), Deny(拒绝),Satisfy(满足)指令来实现。

在Apache2.4版本中,使用mod_authz_host这个新的模块,来实现访问控制,其他授权检查也以同样的方式来完成。旧的访问控制语句应当被新的授权认证机制所取代,即便Apache已经提供了mod_access_compat这一新模块来兼容旧语句。

注意,如果修改网站根目录后,发现没有权限,优先查看selinux和iptables是否关闭

Apache2.2

配置案例

 #该路径指定我们要访问的路径
 <Directory "/data/website">
    Order allow,deny #排序,先允许后拒绝
    Allow from all #允许所有
 </Directory>
 

 
 allow from 192.168.30.6
deny from 192.168.30.0/24 
当定义的域冲突的时候,在后面的那个权限生效,所以这里是拒绝访问,allow和deny的次序很重要

#这样最终的结果是:禁止100.100.*.* 允许172.16.*.*
<files "*.txt">
    order deny,allow
    deny from 172.16. 100.100
    allow from 172.16
</files>

<filematch “.*\.(conf|ini)$">
    order allow,deny
    deny from 172.16.100.100
    allow from 172.16
</filematch>

Apache2.4

基于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:指定域名下的所有主机
 <Directory "/data/website">
        Require all granted #允许所有
 </Directory>
 
 #表示不允许访问目录下所有conf为后缀的文件
<Files "*.conf">
    Require all denied
</Files>

<FilesMatch "\.(gif|jpe?g|png)$">

</FileMatch>


#URL 写法,表示限制用户在网址栏中输入的url地址权限的控制 比如www.magedu.com/test/  这个 /test/就属于url
<Location /status>
    Require all denied
</Location>

#表示在URL匹配路径中使用表达式
<LocationMatch "/(extra|special)/data">
...
</LocationMatch>


不能有失败,至少有一个成功匹配才成功,即失败优先
<RequireAll>
    Require all granted
    Require not ip 172.16.1.1 拒绝特定IP
</RequireAll> 

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

基于源地址实现访问控制

中“基于源地址”实现访问控制
(1) Options:后跟1个或多个以空白字符分隔的选项列表在选项前的+,- 表示增加或删除指定选项。这种方式就等于直接在Directory中填写,并且生效。

常见选项:

  • Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
  • FollowSymLinks:允许访问符号链接文件所指向的源文件
  • None:全部禁用
  • All: 全部允许

示例


#表示该路径不存在主页时,返回索引列表,并且允许访问软连接文件指向源文件
<Directory /web/docs>
    Options +Indexes +FollowSymLinks
</Directory>

<Directory /web/docs/spec>
    Options +FollowSymLinks
</Directory>

<Directory /web/docs/spec>
    Options +Includes -Indexes
</Directory>


#该目录下禁止软连接功能
<Directory "/data/website">
    Options -FollowSymLinks
    Require all granted
</Directory>

(2) AllowOverride
与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令 只对语句有效。使用该命令的话,你需要在指定的目录下创建.htaccess文件,并在其中编写配置。相当于把.htaccess的内容附加到Directiory语句块中去。

  • AllowOverride All: 所有指令都有效
  • AllowOverride None:.htaccess 文件无效
  • AllowOverride AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都无法覆盖

示例

documentroot "/data/website"

<Directory "/data/website/admin">
     AllowOverride authconfig
</Directory>
 
那么他就是读取 admin 这个目录下的 .htaccess 文件中的设置,然后根据AllowOverride 来应用

<Directory "/data/website">
     AllowOverride options=FollowSymLinks
    Require all granted
</Directory>

日志设定

日志类型:

  • 访问日志 :记录用户的访问情况
  • 错误日志 :记录语句执行,http服务相关的错误,用户的访问错误记录在访问日志中

错误日志:

  • ErrorLog logs/error_log
  • LogLevel warn
  • LogLevel 可选值:debug, info, notice, warn,errorcrit, alert, emerg

访问日志

定义日志格式:LogFormat format strings

LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined

使用日志格式:
CustomLog logs/access_log combined
参考帮助:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

参数详解

%h 客户端IP地址
%l 远程用户,启用mod_ident才有效,通常为减号“-”
%u 验证(basic,digest)远程用户,非登录访问时,为一个减号“-”

Httpd 2.2常见配置
%t 服务器收到请求时的时间
%r First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本
%>s 响应状态码
%b 响应报文的大小,单位是字节;不包括响应报文http首部
%{Referer}i 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的,但是这个参数检测到的不一定是真实跳转连接,是可以伪造的。我们可以通过分析这个值,来分析用户是从哪些路径来访问我们的网址的
%{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的应用程序

修改日志文件日期格式
%{%F %T}t
修改完成后,要通过下面的 customlog 来调用 ,最后的参数为 这个logformat 最后的名字参数

设定默认字符集

优先设置,建议搭建完服务就确认好字符集,否则后期乱码麻烦。

AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030 

定义路径别名

定义路径别名, 需要注意一点,定义的目录路径,是从linux上相对于根开始的绝对路径,而不是相对于DocumentRoot的路径。

格式: Alias /URL/ "/PATH/"

DocumentRoot "/www/htdocs"
http://www.magedu.com/download/bash.rpm
==>/www/htdocs/download/bash.rpm

Alias /download/ "/rpms/pub/"
http://www.magedu.com/download/bash.rpm
==>/rpms/pub/bash.rpm

http://www.magedu.com/images/logo.png
==>/www/htdocs/images/logo.png

基于用户的访问控制

认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因

用户的账号和密码

  • 虚拟账号:仅用于访问某服务时用到的认证标识
  • 存储:文本文件,SQL数据库,ldap目录存储,nis等

定义指定目录认证方式 ,模式为 basic:明文,表示如果用户访问该路径,需要输入正确的账户密码后,才能访问,否则无法访问。

#认证模式
AuthType Basic
#登录时的提示语句
AuthName "String"
#指定用户名密码文件,使用命令htpasswd来创建该文件
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
#指定使用该文件中的哪些用户名是可以访问的 每个用户用空格隔开,并且不能有多余的空格!!!
Require user username1 username2 ...

#创建访问用户账户 该文件名称路径不限,只要配置中指定即可
htpasswd -s /etc/httpd/conf.d/.httpuser user1 user2 user3


定义安全域
<Directory “/path">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "String“
    AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
    Require user username1 username2 ...
</Directory> 

允许账号文件中的所有用户登录访问:
Require valid-user

提供账号和密码存储(文本文件),使用专用命令完成此类文件的创建及用户管理

htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
-c:自动创建文件,仅应该在文件不存在时使用
-p:明文密码
-d:CRYPT格式加密,默认
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户

基于组账号进行认证

#首先创建认证配置文件
<Directory "/path">
    AuthType Basic
    AuthName "visit wang home"
    AuthUserFile "/etc/httpd/conf.d/.httpuser"
    AuthGroupFile "/etc/httpd/conf.d/.httpgroup"
    Require group g1 g2 g3
</Directory >

cd /etc/httpd/conf.d 
#创建认证文件 第一次创建的时候可以加c 后面都不要加c 否则会覆盖所有的旧账户
htpasswd -c .httpuser httpwang
htpasswd .httpuser httpmage
htpasswd .httpuser httpzhang

vim .httpgroup
g1:httpwang,httpmage
g2:httpmage
g3:httpzhang,httpmage

共享用户家目录

实现用户家目录的http共享
基于模块mod_userdir.so实现
SELinux: http_enable_homedirs

相关设置:

vim /etc/httpd/conf/httpd.conf
<IfModule mod_userdir.c>
#UserDir disabled
#指定共享目录的名称,只要在用户的家目录下创建该文件夹,之后这个家目录赋予apache acl 权限,那么http就可以访问用户家目录。每个用户的家目录,都可以进行共享
UserDir public_html 
</IfModule>

准备目录
su – wang;mkdir ~/public_html
setfacl –m u:apache:x ~wang

访问
http://localhost/~wang/index.html

ServerSignature On | Off | EMail

当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息

如果不对外显示这些信息,就可以将这个参数设置为Off,生产环境中建议修改为Off!!
设置为Email,将显示ServerAdmin 的Email提示

status

显示系统中的状态信息 用于监控服务器状态,这个页面一定不要开放给任意用户访问,通常只允许运维进行查阅

配置方法

curl 192.168.1.30/status 这样就可以显示服务器当前状态
<Location /status>
    SetHandler server-status
    #设置访问权限,只允许指定网段可以访问
    Order allow,deny
    Allow from 172.16
</Location>
posted @ 2019-04-12 23:59  DreamDZhu  阅读(687)  评论(0编辑  收藏  举报