Apache服务器编译安装以及配置详解
简介
安装
下载
下载地址:https://httpd.apache.org/download.cgi,我这里下载的是httpd-2.2.31.tar.gz
安装Apache
- 解压
tar -zxvf httpd-2.2.31.tar.gz
cd httpd-2.2.31
- 配置
./configure
默认的安装路径是/usr/local/apache2,如果需要指定自己的安装目录,使用
./configure --prefix=_PREFIX_
比如:
./configure --prefix=/usr/bin/apache2
- 编译
make
- 安装
make install
- 配置
vi /usr/local/apache2/conf/httpd.conf
配置文件就在安装目录下,现在我们就只简单的配置下,只是修改ServerName:
ServerName localhost:80
- 测试
/usr/local/apache2/bin/apachectl -k start
我这里为了方便,就做了一个软连接
ln -s /usr/local/apache2/bin/apachectl /usr/bin/
直接用
apachectl -k start
启动,如果端口被占用,先把其它的停了或者修改下apache监听的端口号。 现在打开浏览器输入
http://localhost:80就可以看到apache启动了。
启动和停止Apache服务器
启动Apache
- httpd的主进程已root用户的权限运行,而它的子进程将会已一个较低权限的用户运行。
- 调用httpd可执行文件的推荐方法是使用apachectl控制脚本。apachectl里有一行:
HTTPD='/usr/local/apache2/bin/httpd'
指向的是httpd可执行文件的位置,可以通过修改来指定要执行的httpd。或者使用-f 选项来指定配置文件
apachectl -f /usr/local/apache2/httpd.conf
- 启动:
apachectl -k start
开机启动Apache
如果需要开机启动Apache,需要把apachectl的调用过程加入到系统启动的文件中,在/etc/目录下,有很多 rcN.d文件夹和rc.local文件。
停止和重启Apache
- 立即停止:
apachectl -k stop
所有进行中的请求都会被强行终止,而且不在接受其它请求,不建议使用这种方式。
- 优雅的停止
apachectl -k graceful-stop
只有当进行中的请求都完成后才会退出,建议使用。
- 立即重启
apachectl -k restart
重新载入配置文件,重新打开日志文件。
- 优雅的重启
apachectl -k graceful
如果修改了配置文件,需要重新载入,建议使用graceful。
- 检查配置文件
apachectl configtest
或者
apachectl -t
修改了配置文件后,可以使用configtest选项来检查配置文件是否正确。
配置详解
主配置文件
Apache的主配置文件是httpd.conf,可以用Include指令和通配符附加其他配置文件,我们下面讲解的内容主要是针对httpd.conf。
配置文件语法
- Apache配置文件的每一行包含一个指令,配置文件中的指令是不区分大小写的。
- 可以用 apachectl configtest 或者命令行选项 -t 检查配置文件中的错误,而无须启动Apache服务器。
模块
- Apache是模块化的服务器,这意味着核心中只包含实现最基本功能的模块。扩展功能可以作为模块动态加载。
- 默认情况下,只有base组的模块被编译进了服务器。
- 如果服务器在编译时包含了DSO模块,那么各模块可以独立编译,并可随时用LoadModule指令加载; 否则,要增加或删除模块必须重新编译整个Apache。
- 用于特定模块的指令可以用< Ifmodule >指令包含起来,使之有条件地生效。
- 用命令行参数 -l 可以查看已经编译到服务器中的模块。
指令的作用域
相关的模块:
<Directory>
<DirectoryMatch>
<Files>
<FilesMatch>
<Location>
<LocationMatch>
<VirtualHost>
- 主配置文件中的指令对整个服务器都有效。如果你只想改变某一部分的配置,你可以把指令嵌入到 < directory >、< directorymatch >、< files >、< filesmatch >、< location >、< locationmatch >配置段中,这样就可以限制指令的作用域为文件系统中的某些位置或特定的URL。这些配置段还可以进行嵌套,以进行更精细的配置。
- Apache还具备同时支持多个站点的能力,称为虚拟主机。 < virtualhost >配置段中的指令仅对该段中的特定站点(虚拟主机)有效。
服务器全局配置
- ServerRoot "/usr/local/apache2" -->Apache的安装位置。
- Listen 80 -->服务器监听的端口号,具体可以看地址和端口的绑定小节。
- ServerName www.lengchuan.com:80 -->站点名称,也就是我们网站的主机名。
- ServerAdmin you@example.com -->管理员邮箱地址。
- DocumentRoot "/www/lengchuan/test/" -->网站文件存储位置。
访问控制
- 我们只允许本机访问 我们的发布目录在/www/lengchuan/test/,我们需要使用< Directory />来配置:
<Directory '/www/lengchuan/test/'>
Order deny,allow
Deny from all
allow from 192.168.1.103
</Directory>
这样,就只有我们本机192.168.1.103才可以访问这个< Directory >
- 我们只允许一个网段内用户访问
<Directory '/www/lengchuan/test/'>
Order deny,allow
Deny from all
allow from 192.168.0.0/24
</Directory>
在网段192.168.0.0/24内的所有用户都可以访问。
< Directory >配置属性 详细的配置参考:https://httpd.apache.org/docs/2.2/mod/core.html#directory
<directory>
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</directory>
-
Options:配置在特定目录使用哪些特性,常用的有:
- ExecCGI: 在该目录下允许执行CGI脚本。
- FollowSymLinks: 在该目录下允许文件系统使用符号连接。
- Indexes: 当用户访问该目录时,如果用户找不到DirectoryIndex指定的主页文件(例如index.html),则返回该目录下的文件列表给用户。
- SymLinksIfOwnerMatch: 当使用符号连接时,只有当符号连接的文件拥有者与实际文件的拥有者相同时才可以访问。
-
AllowOverride:允许存在于.htaccess文件中的指令类型(.htaccess文件名是可以改变的,其文件名由AccessFileName指令决定):
- None: 当AllowOverride被设置为None时。不搜索该目录下的.htaccess文件(可以减小服务器开销)。
- All: 在.htaccess文件中可以使用所有的指令。
-
Order:控制在访问时Allow和Deny两个访问规则哪个优先:
- Allow:允许访问的主机列表(可用域名或子网,例如:Allow from 192.168.0.0/24)。
- Deny:拒绝访问的主机列表。
地址和端口的绑定
Apache在启动时会默认监听本机所有的地址。但其实我们在使用的时候需要监听特定的地址或者地址与端口的组合, 当我们使用虚拟主机的时候,就必须对明确指定监听的端口或者地址。
- 让服务器接收来自80和8080端口的请求
Listen 80
Listen 8080
- 接收来自多个指定的地址+端口的组合:
Listen 123.45.67.89:80
Listen 111.12.23.6:8080
- IPV6地址需要用中括号括起来
Listen [2001:db8::a00:20ff:fea7:ccea]:80
主页文件设置
通过DirectoryIndex来设置默认的主页:
DirectoryIndex index.html index.jsp
日志文件
Apache的日志包括错误日志(Error Log)和访问日志(Access Log)。
错误日志
错误日志的配置由ErrorLog指定:
ErrorLog "logs/error_log"
访问日志
访问日志的配置由CustomLog指定:
CustomLog "logs/access_log" common
日志文件格式
LogFormat指令可以指定日志的输出格式。
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
这里定义了两种日志的格式,combined和common。
参数含义
我这里有两条记录:
common:
%h %l %u %t "%r" %>s %b
127.0.0.1 - - [03/Aug/2016:16:05:18 +0800] "GET / HTTP/1.1" 200 44
combined:
%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"
127.0.0.1 - - [03/Aug/2016:17:17:40 +0800] "GET / HTTP/1.1" 200 44 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"
-
%h(127.0.0.1): 客户端的ip地址。如果HostnameLookups设为On ,则服务器会尝试解析这个IP地址的主机名, 并替换此处的IP地址, 但并不推荐这样做,因为它会显著拖慢服务器,最好是用一个日志后续处理器来判断主机名,比如logresolve 。如果客户和服务器之间存在代理,那么记录中的这个IP地址就是那个代理的IP地址,而不是客户机的真实IP地址。
-
%l(-):这是由客户端identd进程判断的RFC1413身份(identity)。
-
%u(-):这是HTTP认证系统得到的访问该网页的客户标识(userid),环境变量REMOTE_USER会被设为该值并提供给CGI脚本。如果状态码是401,表示客户未通过认证,则此值没有意义。如果网页没有设置密码保护,则此项将是"-"。
-
%t([03/Aug/2016:16:05:18 +0800]):这是服务器完成请求处理时的时间,其格式是: [日/月/年:时:分:秒 时区] 日 = 2数字 月 = 3字母 年 = 4数字 时 = 2数字 分 = 2数字 秒 = 2数字 时区 = (+|-)4数字。 可以在格式字符串中使用 %{format}t 来改变时间的输出形式。
-
"%r"("GET / HTTP/1.1"):引号中是客户端发出的包含许多有用信息的请求行。可以看出,该客户的动作是GET ,请求的资源是网站首页(/) ,使用的协议是HTTP/1.1 。另外,还可以记录其他信息,如:格式字符串"%m %U%q %H"会记录动作、路径、查询字符串、协议,其输出和"%r"一样。
-
%>s (200):这是服务器返回给客户端的状态码。这个信息非常有价值,因为它指示了请求的结果,或者是被成功响应了(以2开头),或者被重定向了(以3开头),或者出错了(以4开头),或者产生了服务器端错误(以5开头)。
-
%b(44):最后这项是返回给客户端的不包括响应头的字节数。如果没有信息返回,则此项应该是"-",如果希望记录为"0"的形式,就应该用%B
-
"%{Referer}i" (-):"Referer"请求头。此项指明了该请求是被从哪个网页提交过来的,这个网页应该包含有我们网站的地址或者其连接。
-
"%{User-agent}i" ("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"): "User-Agent"请求头。此项是客户端提供的浏览器识别信息。
配置多个访问日志文件
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"
条件日志
# 不记录本机发出的请求
SetEnvIf Remote_Addr "127.0.0.1" dontlog
# 不记录对robots.txt文件的请求
SetEnvIf Request_URI "^/robots.txt$" dontlog
# 记录其他请求
CustomLog logs/access_log common env=!dontlog