Apache浅识

admin 2022年1月6日01:41:44安全博客评论8 views9891字阅读32分58秒阅读模式

Apache是使用最广泛的Web服务器应用程序。之前都是照着网上的命令配置,没有真正去理解一下配置的缘由,这次就好好学习一下啦。

ubuntu

安装

1
apt install apache2

目录文件

1
2
3
[email protected]:/etc/apache2$ ls
apache2.conf conf-enabled magic mods-enabled sites-available
conf-available envvars mods-available ports.conf sites-enabled
文件/目录 功能
apache2.conf Apache在启动时会自动读取这个文件的配置信息而其他的一些配置文件,通过Include指令包含一些文件。在apache2.conf中可以找到这些Include行:例IncludeOptional mods-enabled/*.load
ports.conf Apache使用的端口,必须在这里开启端口的监听,不然只在virtualhosts里设置的端口不起作用
sites-enabled/ apache2.conf中引用了这里面的虚拟主机配置,通过ls -l可以发现,这里得到文件都是链接向../sites-available/的,而apache2.conf只引用sites-enabled/而不引用/sites-available/,所以我们在/sites-available/里面配置好虚拟主机配置后,还要连接到sites-enabled/目录
sites-available/ 虚拟主机的配置目录,但是不会被引用,需要链接到../site-enabled
mods-enabled/ 存放apache功能模块,与sites-enabled类似,是链接目录,而且被apache2.conf引用
mods-available/ 存放apache功能模块,与sites-available类似,是真实配置,不被引用,需要连接
envvars 存放相关变量

网站配置

配置流程

新建虚拟主机/网站

1
2
[email protected]:/# cd /etc/apache2/sites-available
[email protected]:/etc/apache2/sites-available# vi test-site.conf

虚拟主机/网站配置规则
语法

1
2
3
<VirtualHost 地址[:端口号] [地址[:端口号]] >
具体规则
</VirtualHost>

端口号需要在ports.conf里添加监听 一个端口号只能被一个VirtualHost监听

建立连接

1
ln -s /etc/apache2/sites-available/test-site.conf /etc/apache2/sites-enabled/test.site.conf

将网站根目录

1
chown -R www-data:www-data /var/www/html/xxx

重启Apache

1
/etc/init.d/apache2 restart

配置实例

虚拟主机

1
2
3
4
5
6
ServerName  主机名/域名
ServerAdmin 管理员邮箱
DocumentRoot 网站目录
ErrorLog 日志目录
CustomLog 日志目录
Deny from 阻止访问IP

基于ip

需有多个ip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<VirtualHost IP1:80>
ServerName a.com
ServerAdmin [email protected]
DocumentRoot /home/data/www/a
ErrorLog /home/data/log/a_error.log
CustomLog /home/data/log/a_access.log combined
</Virtualhost>
<VirtualHost IP2:80>
ServerName b.com
ServerAdmin [email protected]
DocumentRoot /home/data/www/b
ErrorLog /home/data/log/b_error.log
CustomLog /home/data/log/b_access.log combined
</Virtualhost>

基于域名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<VirtualHost *:80>
ServerName a.com
ServerAdmin [email protected]
DocumentRoot /home/data/www/a
ErrorLog /home/data/log/a_error.log
CustomLog /home/data/log/a_access.log combined
</Virtualhost>
<VirtualHost *:80>
ServerName b.com
ServerAdmin [email protected]
DocumentRoot /home/data/www/b
ErrorLog /home/data/log/b_error.log
CustomLog /home/data/log/b_access.log combined
</Virtualhost>

基于端口

需要开启端口监听配置

1
2
Listen 80
Listen 8080

网站配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<VirtualHost IP:80>
ServerName a.com
ServerAdmin [email protected]
DocumentRoot /home/data/www/a
ErrorLog /home/data/log/a_error.log
CustomLog /home/data/log/a_access.log combined
</Virtualhost>
<VirtualHost IP:8080>
ServerName b.com
ServerAdmin [email protected]
DocumentRoot /home/data/www/b
ErrorLog /home/data/log/b_error.log
CustomLog /home/data/log/b_access.log combined
</Virtualhost>

反向代理

启用代理模块

1
a2enmod proxy proxy_balancer proxy_http

修改配置

1
vi /etc/apache2/sites-available/000-default.conf

在最前面添加

1
2
3
4
5
6
7
8
9
10
11
<VirtualHost *:80>
Servername 代理服务器ip或者域名
ProxyRequests Off
#off表示开启反向代理,on表示开启正向代理
ProxyPass / 被代理的网站
ProxyPassReverse / 被代理的网站
<Proxy *>
Order Deny,Allow
Allow from all
</Proxy>
</VirtualHost>

重启生效

1
/etc/init.d/apache2 restart

centos

安装

1
yum install httpd

启动

1
2
3
service httpd start
sudo systemctl enable httpd
sudo systemctl start httpd

配置文件

1
2
[[email protected] httpd]$ ls
conf conf.d conf.modules.d logs modules run

Apache配置片段

配置片段容器的类型

<IfDefine>,<IfModule>和<IfVersion>容器仅在服务器启动和重新启动时进行评估。

<IfDefine>指令包含只有在httpd命令行中定义了适当参数时才会应用的指令。

1
2
3
4
#使用httpd -DClosedForNow启动服务器时,所有请求才会重定向到另一个站点
<IfDefine ClosedForNow>
Redirect "/" "http://otherserver.example.com/"
</IfDefine>

<IfModule>指令与上面<IfDefine>指令也非常相似,除了它包含只有在服务器中有特定模块可用时才会应用的指令.

1
2
3
4
#仅当mod_mime_magic可用时才会应用MimeMagicFile指令。
<IfModule mod_mime_magic.c>
MimeMagicFile conf/magic
</IfModule>

<IfVersion>指令包含的指令只会在特定版本的服务器执行时才会应用。

1
2
3
4
<IfVersion >= 2.4>
# this happens only in versions greater or
# equal 2.4.0.
</IfVersion>

<IfDefine>,<IfModule>和<IfVersion>可以通过在测试前加上!符号来应用否定条件

文件系统和网站空间

文件系统是操作系统可以看到的磁盘视图。网站空间是由Web服务器提供并由客户端查看的站点视图。

文件系统

包含在<Directory>部分中的指令适用于指定的文件系统目录和该目录的所有子目录(以及这些目录中的文件)

1
2
3
4
#以下配置中,将为/var/web/dir1目录和所有子目录启用目录索引。
<Directory /var/web/dir1>
Options +Indexes
</Directory>

包含在<Files>部分中的指令适用于具有指定名称的任何文件,无论它位于何种目录中。

1
2
3
4
#以下配置指令在放置在配置文件的主部分时将拒绝访问任何文件。文件名为private.html,无论它在哪里找到。
<Files "private.html">
Require all denied
</Files>

可以组合<Files>和<Directory>片段

1
2
3
4
5
6
#拒绝访问/var/www/dir1/ 目录下的所有private.html文件
<Directory "/var/web/dir1">
<Files "private.html">
Require all denied
</Files>
</Directory>

Webspace容器

<Location>指令及其正则表达式对应方更改了Webspace中内容的配置

1
2
3
4
#以下配置可防止访问以/private开头的任何URL路径 
<LocationMatch "^/private">
Require all denied
</LocationMatch>

<Location>指令不需要与文件系统有任何关系

1
2
3
4
#将特定URL映射到mod_status提供的内部Apache HTTP Server处理程序 
<Location "/server-status">
SetHandler server-status
</Location>

重叠Webspace

为了有两个重叠的URL,必须考虑评估某些部分或指令的顺序。对于<Location>将是:

1
2
3
4
<Location "/foo">
</Location>
<Location "/foo/bar">
</Location>

另一方面,<Alias>映射反之亦然:

1
2
Alias "/foo/bar" "/srv/www/uncommon/bar"
Alias "/foo" "/srv/www/common/foo"

ProxyPass指令也是如此:

1
2
ProxyPass "/special-area" "http://special.example.com" smax=5 max=10
ProxyPass "/" "balancer://mycluster/" stickysession=JSESSIONID|jsessionid nofailover=On

通配符和正则表达式

<Directory>,<Files>和<Location>指令都可以使用shell样式的通配符,如C标准库中的fnmatch。

  • *匹配任何字符序列
  • ? 匹配任何单个字符
  • [seq]匹配seq中的任何字符
  • /字符不会被任何通配符匹配
1
2
3
4
#可以一次拒绝访问多种类型的图像文件 
<FilesMatch "\.(?i:gif|jpe?g|png)$">
Require all denied
</FilesMatch>

布尔表达式

<If>指令根据可由布尔表达式表示的条件更改配置。

1
2
3
4
#如果HTTP Referer标头不以http://www.example.com/开头,则以下配置拒绝访问。
<If "!(%{HTTP_REFERER} -strmatch 'http://www.example.com/*')">
Require all denied
</If>

proxy

1
2
3
4
# 只允许客户使用代理服务器访问www.example.com网站的一个子集
<Proxy "http://www.example.com/*">
Require host yournetwork.example.com
</Proxy>

配置文件httpd.conf

基本配置

1
2
3
4
5
6
ServerRoot "/mnt/software/apache2" #你的apache软件安装的位置。其它指定的目录如果没有指定绝对路径,则目录是相对于该目录。
PidFile logs/httpd.pid #第一个httpd进程(所有其他进程的父进程)的进程号文件位置。
Listen 80 #服务器监听的端口号。
ServerName www.clusting.com:80 #主站点名称(网站的主机名)。
ServerAdmin [email protected] #管理员的邮件地址。
DocumentRoot "/mnt/web/clusting" #主站点的网页存储位置。

对主站点的目录进行访问控制:

1
2
3
4
5
6
<Directory "/mnt/web/clusting"> 
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

参数详解:

  1. Options:配置在特定目录使用哪些特性,常用的值和基本含义如下:

    • ExecCGI: 在该目录下允许执行CGI脚本。
    • FollowSymLinks: 在该目录下允许文件系统使用符号连接。
    • Indexes: 当用户访问该目录时,如果用户找不到DirectoryIndex指定的主页文件(例如index.html),则返回该目录下的文件列表给用户。
    • SymLinksIfOwnerMatch: 当使用符号连接时,只有当符号连接的文件拥有者与实际文件的拥有者相同时才可以访问。
  2. AllowOverride:允许存在于.htaccess文件中的指令类型(.htaccess文件名是可以改变的,其文件名由AccessFileName指令决定)

    • None: 当AllowOverride被设置为None时。不搜索该目录下的.htaccess文件(可以减小服务器开销)。
    • All: 在.htaccess文件中可以使用所有的指令。
  3. Order:控制在访问时Allow和Deny两个访问规则哪个优先:

    • Allow:允许访问的主机列表(可用域名或子网,例如:Allow from 192.168.0.0/16)。
    • Deny:拒绝访问的主机列表。
  4. DirectoryIndex index.html index.htm index.php #主页文件的设置

服务器的优化 (MPM: Multi-Processing Modules)

apache2主要的优势就是对多处理器的支持更好,在编译时同过使用--with-mpm选项来决定apache2的工作模式。

  • prefork:如果httpd -l列出prefork.c,则需要对下面的段进行配置。

    1
    2
    3
    4
    5
    6
    7
    <IfModule prefork.c>
    StartServers 5 #启动apache时启动的httpd进程个数。
    MinSpareServers 5 #服务器保持的最小空闲进程数。
    MaxSpareServers 10 #服务器保持的最大空闲进程数。
    MaxClients 150 #最大并发连接数。
    MaxRequestsPerChild 1000 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
    </IfModule>

    在该工作模式下,服务器启动后起动5个httpd进程(加父进程共6个,通过ps -ax|grep httpd命令可以看到)。当有用户连接时,apache会使用一个空闲进程为该连接服务,同时父进程会fork一个子进程。直到内存中的空闲进程达到MaxSpareServers。该模式是为了兼容一些旧版本的程序。我缺省编译时的选项。

  • worker:如果httpd -l列出worker.c,则需要对下面的段进行配置:

    1
    2
    3
    4
    5
    6
    7
    8
    <IfModule worker.c> 
    StartServers 2 #启动apache时启动的httpd进程个数。
    MaxClients 150 #最大并发连接数。
    MinSpareThreads 25 #服务器保持的最小空闲线程数。
    MaxSpareThreads 75 #服务器保持的最大空闲线程数。
    ThreadsPerChild 25 #每个子进程的产生的线程数。
    MaxRequestsPerChild 0 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
    </IfModule>

    该模式是由线程来监听客户的连接。当有新客户连接时,由其中的一个空闲线程接受连接。服务器在启动时启动两个进程,每个进程产生的线程数是固定的(ThreadsPerChild决定),因此启动时有50个线程。当50个线程不够用时,服务器自动fork一个进程,再产生25个线程。

  • perchild:如果httpd -l列出perchild.c,则需要对下面的段进行配置:

    1
    2
    3
    4
    5
    6
    7
    8
    <IfModule perchild.c> 
    NumServers 5 #服务器启动时启动的子进程数
    StartThreads 5 #每个子进程启动时启动的线程数
    MinSpareThreads 5 #内存中的最小空闲线程数
    MaxSpareThreads 10 #最大空闲线程数
    MaxThreadsPerChild 2000 #每个线程最多被请求多少次后退出。0不受限制。
    MaxRequestsPerChild 10000 #每个子进程服务多少次后被重新fork。0表示不受限制。
    </IfModule>

    该模式下,子进程的数量是固定的,线程数不受限制。当客户端连接到服务器时,又空闲的线程提供服务。 如果空闲线程数不够,子进程自动产生线程来为新的连接服务。该模式用于多站点服务器。

如果知道当前的apache2使用什么工作机制,可以通过httpd -l命令列出apache的所有模块,就可以知道其工作方式

HTTP返头回信息配置

  • ServerTokens Prod #该参数设置http头部返回的apache版本信息,可用的值和含义如下:
    1
    2
    3
    4
    5
    6
    Prod:仅软件名称,例如:apache
    Major:包括主版本号,例如:apache/2
    Minor:包括次版本号,例如:apache/2.0
    Min:仅apache的完整版本号,例如:apache/2.0.54
    OS:包括操作系统类型,例如:apache/2.0.54(Unix)
    Full:包括apache支持的模块及模块版本号,例如:Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7g
  • ServerSignature Off #在页面产生错误时是否出现服务器版本信息。推荐设置为Off

持久性连接设置

1
2
3
KeepAlive On #开启持久性连接功能。即当客户端连接到服务器,下载完数据后仍然保持连接状态。
MaxKeepAliveRequests 100 #一个连接服务的最多请求次数。
KeepAliveTimeout 30 #持续连接多长时间,该连接没有再请求数据,则断开该连接。缺省为15秒。

别名设置

对于不在DocumentRoot指定的目录内的页面,既可以使用符号连接,也可以使用别名。别名的设置如下:

1
2
3
4
5
6
7
8
Alias /download/ "/var/www/download/" #访问时可以输入:http://www.custing.com/download/ 

<Directory "/var/www/download"> #对该目录进行访问控制设置
Options Indexes MultiViews
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>

CGI设置

1
2
3
4
5
6
7
8
9
# 访问时可以:http://www.clusting.com/cgi-bin/,但是该目录下的CGI脚本文件要加可执行权限
ScriptAlias /cgi-bin/ "/mnt/software/apache2/cgi-bin/"

<Directory "/usr/local/apache2/cgi-bin"> #设置目录属性
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

日志的设置

(1) 错误日志的设置

1
2
ErrorLog logs/error_log #日志的保存位置
LogLevel warn #日志的级别

(2) 访问日志设置
日志的缺省格式有如下几种:

1
2
3
4
5
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common #common为日志格式名称
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog logs/access_log common

格式中的各个参数如下:

1
2
3
4
5
6
7
8
9
%h --客户端的ip地址或主机名 
%l --The 这是由客户端 identd 判断的RFC 1413身份,输出中的符号 "-" 表示此处信息无效。
%u --由HTTP认证系统得到的访问该网页的客户名。有认证时才有效,输出中的符号 "-" 表示此处信息无效。
%t --服务器完成对请求的处理时的时间。
"%r" --引号中是客户发出的包含了许多有用信息的请求内容。
%>s --这个是服务器返回给客户端的状态码。
%b --最后这项是返回给客户端的不包括响应头的字节数。
"%{Referer}i" --此项指明了该请求是从被哪个网页提交过来的。
"%{User-Agent}i" --此项是客户浏览器提供的浏览器识别信息。

.htaccess文件

.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

可以在服务器配置文件中按以下方法配置:

1
2
AccessFileName .config #将.htaccess修改为.config
AllowOverride None #禁用.htaccess文件的使用

下面两个配置是等同的

.htaccess文件在目录/www/htdocs/example之中:

1
AddType text/example ".exm"

httpd.conf文件中的内容:

1
2
3
<Directory "/www/htdocs/example">
AddType text/example ".exm"
</Directory>

在.htaccess文件中找到的配置指令将应用于找到.htaccess文件的目录。
特定目录中的.htaccess文件可能会覆盖在目录树中较高位置的.htaccess文件中找到的指令。
例如:/www/htdocs/example1/example2下的.htaccess覆盖了/www/htdocs/example1/下的.htaccess 。

参考文章:
Apache HTTP 服务器 2.4 文档
Apache学习
Apache配置实例
Apache 反向代理
Apache教程
Apache配置文件httpd.conf详解

FROM :blog.cfyqy.com | Author:cfyqy

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:41:44
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Apache浅识 http://cn-sec.com/archives/722252.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: