Web 服务器的搭建
Apache
服务器搭建
安装Apache
yum install -y httpd
systemctl start httpd.service
# /etc/httpd/conf:该目录存放Apache服务器的配置文件
# /var/www/html:该目录是Apache服务器的默认站点根目录
# /etc/httpd/logs: Apache服务器的日志文件目录
浏览器输入localhost测试
部署网站:
cp exam /var/www/html/exam
# 网站源代码
vi /etc/httpd/conf/httpd.conf
# 修改默认网站
##############
DocumentRoot "/var/www/html/exam"
##############
systemctl restart httpd
# 重启服务
常用配置文件:
ServerRoot "/etc/httpd"
# 服务器的根目录。存放配置文件、记录文件、模块文件。
Listen 80
# Apache服务器监听的端口号,默认为80
User apache
Group apache
# 设置Apache工作时使用的用户和组
# 'Main' server configuration
# 主服务器配置
ServerAdmin root@localhost
# 管理员的电子邮件地址
#ServerName www.example.com:80
# 主机名称
DocumentRoot "/var/www/html"
# 设置Apache主服务器网页存放位置
<ifModule dir_module>
DirectoryIndex index.html default.asp
</ifModule>
# 设置站点默认首页
<Directory >
Options FollowSymLinks
AllowOverride None
</Directory>
# 设置Apache根目录的访问权限和访问方式
systemctl stop firewalld
# 关闭防火墙
虚拟主机配置
基于域名
vi /etc/hosts
#################
192.168.75.128 www.hr.com
192.168.75.128 www.exam.com
#################
cp exam /var/www/exam
# 将需要发布的网站放到/var/www目录下
vim /etc/httpd/conf/httpd.conf
# 修改配置
###############
Listen 80
DirectoryIndex index.html
# 在末尾增加:
Include conf/vhost/*.conf
###############
mkdir /etc/httpd/conf/vhost
# 创建/etc/httpd/conf/vhost目录
touch hr.conf exam.conf
# 并在下面分别为不同域的网站新建hr.conf与exam.conf两配置文件。
vim hr.conf
# 分别修改其对应文件
##################
<VirtualHost 192.168.75.128>
ServerName www.hrcom
DocumentRoot /var/www/hr
<Directory “/var/www/hr”>
Options Indexes FollowSymLinks
# 显示网页文件列表
AllowOverride NOne
# 忽略.htaccess 文件
Require all granted
# 允许所有
</Directory>
</VirtualHost>
##################
httpd -t
# 检查虚拟主机的配置
systemctl restart httpd
基于IP
主机需要分配多个IP
vim hr.conf
# 分别修改其对应文件
##################
# 修改对应IP即可 ↓
<VirtualHost 192.168.75.129>
ServerName www.hrcom
DocumentRoot /var/www/hr
<Directory “/var/www/hr”>
Options Indexes FollowSymLinks
基于端口
vim hr.conf
# 分别修改其对应文件
##################
# 修改对应端口即可 ↓
<VirtualHost 192.168.75.130:8080>
ServerName www.hrcom
DocumentRoot /var/www/hr
<Directory “/var/www/hr”>
Options Indexes FollowSymLinks
虚拟目录配置
虚拟目录是主网站的下一级子目录
,要依附于主网站,但它的物理位置并不在主目录下
,以前面配置的www.hr.com网站为例,配置如下:
mkdir /tmp/movie
echo ‘virtual directory’> /movie/index.html
# 创建虚拟目录
vi hr.conf
# 修改配置文件
#############
<virtualHost 192.168.75.128>
DocumentRoot /var/www/gxa
ServerName www.hr.com
Alias /movie "/tmp/movie"
# (/movie 网站路径 "/movie" 真实路径)
</virtualHost>
#############
配置目录权限
1.基于目录配置文件
配置文件示例:
<Directory "/Users/jackma/htdocs">
Options FollowSymLinks Multiviews
MultiviewsMatch Any
AllowOverride None
Require all granted
</Directory>
Options 配置项
配置项 | 说明 |
---|---|
All | 表示除MultiViews之外的所有特性。这也是Options指令的默认设置 |
None | 表示不启用任何的服务器特性 |
FollowSymLinks | 服务器允许在此目录中使用符号连接 |
Indexes | 如果输入的网址对应服务器上的一个文件目录,而此目录中又没有DirectoryIndex指令(例如:DirectoryIndex index.html index.php),那么服务器会返回由mod_autoindex模块生成的一个格式化后的目录列表。 |
MultiViews | 允许使用mod_negotiation模块提供内容协商的"多重视图"。 |
SymLinksIfOwnerMatch | 仅在符号连接与目标文件或目录的所有者具有相同的用户ID时才使用它。 |
ExecCGI | 允许使用mod_cgi模块执行CGI脚本 |
Includes | 允许使用mod_include模块提供的服务器端包含功能 |
IncludesNOEXEC | 允许服务器端包含但禁用"#exec cmd"和"#exec cgi"。但仍可以从ScriptAlias目录使用"#include virtual"虚拟CGI脚本。 |
AllowOverride 配置项
该配置项用于指定是否使用.htaccess文件,参数有如下表
配置项 | 说明 |
---|---|
All | 开启.htaccess文件 |
None | 关闭.htaccess文件 |
Require 配置项
该配置项用于指定允许、拒绝列表。
配置项 | 说明 |
---|---|
Require all granted | 允许所有的访问 |
Require all denied | 拒绝所有访问 |
Require ip 10.2.2.32 | 允许10.2.2.32这个地址访问 |
Require not ip 10.3.3.21 | 拒绝10.3.3.21这个地址访问 |
Reuquire host baidu.com | 允许名为baidu.com的域访问 |
Reuquire not host baidu.com | 拒绝名为baidu.com的域访问 |
2.基于客户端地址
目录的访问控制可以通过Order、Allow、Deny
等语句来实现。
-
Order语句用于定义默认的访问权限;
Order allow,deny
:默认拒绝所有客户端访问Order deny,allow
:默认允许所有客户端访问
-
Allow语句用于定义允许访问目录的主机列表;
Allow from 192.168.80.0/24
:允许192.168.80.0网段内的客户端访问
-
Deny语句用于定义拒绝访问目录的主机列表。
Deny from 192.168.80.101
:拒绝IP为192.168.80.101的客户端访问
拒绝192.168.80.0网段访问网站:
<VirtualHost 192.168.75.128:80>
ServerName www.hrcom
DocumentRoot /var/www/hr
DirectoryIndex index.html
<Directory "/var/www/hr">
order allow,deny
allow from 192.168.80.0
</Directory>
</VirtualHost>
3.基于用户的访问控制
配置项 | 作用 |
---|---|
AuthName | 定义受保护的领域名称,客户端访问时在弹出的认证登录对话框中将显示该名称 |
AuthUserFile | 设置用于保存用户帐号、密码的认证文件路径 |
AuthType | 配置认证类型(基本认证:Basic;摘要认证:Digest) |
require v;alid-user | 授权给认证文件中的所有有效用户,如果写成 require user [用户名]表示只允许该用户访问 |
访问网站时需要输入用户名和密码:
- 在www.exam.com的虚拟主机部分中添加如下的内容:
<virtualHost 192.168.10.1>
DocumentRoot /var/www/exam
ServerName www.exam.com
Alias /movie “/movie”
<Directory “/movie”>
AuthName “movie”
AuthType Basic
AuthUserFile /etc/httpd/conf/.htpasswd
require valid-user
<Directory>
</virtualHost 192.168.10.1>
- 创建.htpasswd文件并向其中添加用户
htpasswd -cm /etc/httpd/conf/.htpasswd harry
# -c 创建认证文件
# -m MDB5加密
# -D 删除一个用户
systemctl restart httpd
Apache 日志分析
- 目录:
/var/log/httpd
- 日志文件:
access_log
- 错误日志文件:
error_log
1.访问日志
1. 访问日志字段说明
日志字段 | 说明 |
---|---|
127.0.0.1(%h) | 这是发送请求到服务器的客户的IP地址,即远程主机的地址,即它表明访问网站的究竟是谁。 |
-(%l) | 这是由客户端identd进程判断的RFC1413身份(identity),输出中的符号"-"表示此处的信息无效。除非在严格控制的内部网络中,此信息通常很不可靠,不应该被使用。只有在将IdentityCheck指令设为On时,Apache才会试图得到这项信息。 |
frank(%u) | 这是HTTP认证系统得到的访问该网页的客户标识(userid),环境变量REMOTE_USER会被设为该值并提供给CGI脚本。如果状态码是401,表示客户未通过认证,则此值没有意义。如果网页没有设置密码保护,则此项将是"-"。 |
[09/Sep/2019:23:08:36 +0800](%t) | 这是服务器完成请求处理时的时间,其格式是:[日/月/年:时:分:秒 时区] |
“GET /images/apache_pb.gif HTTP/1.1” | 引号中是客户端发出的包含许多有用信息的请求行。该客户的动作是GET,请求的资源是/images/apache_pb.gif,使用的协议是HTTP/1.1。 |
304(%>s) | 这是服务器返回给客户端的状态码。这个信息非常有价值,因为它指示了请求的结果,或者是被成功响应了(以2开头),或者被重定向了(以3开头),或者出错了(以4开头),或者产生了服务器端错误(以5开头)。完整的状态码列表参见HTTP规范(RFC2616第10章)。 |
-(%b) | 最后这项是返回给客户端的不包括响应头的字节数。如果没有信息返回,则此项应该是"-",如果希望记录为"0"的形式,就应该用%B。 |
“http://localhost:8080/” ("%{Referer}i") | "Referer"请求头。此项指明了该请求是被从哪个网页提交过来的,这个网页应该包含有/apache_pb.gif或者其连接。 |
“Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0” “%{User-Agent}i” | "User-Agent"请求头。此项是客户端提供的浏览器识别信息。 |
2.apache格式字符串及其含义
格式字符串 | 含义 |
---|---|
%% | 百分号(Apache2.0.44或更高的版本) |
%a | 远端IP地址 |
%A | 本机IP地址 |
%B | 除HTTP头以外传送的字节数 |
%b | 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-'而不是0。 |
%{Foobar}C | 在请求中传送给服务端的cookieFoobar的内容。 |
%D | 服务器处理本请求所用时间,以微为单位。 |
%{FOOBAR}e | 环境变量FOOBAR的值 |
%f | 文件名 |
%h | 远端主机 |
%H | 请求使用的协议 |
%{Foobar}i | 发送到服务器的请求头Foobar:的内容。 |
%l | 远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为"On",否则将得到一个"-"。 |
%m | 请求的方法 |
%{Foobar}n | 来自另一个模块的注解Foobar的内容。 |
%{Foobar}o | 应答头Foobar:的内容。 |
%p | 服务器服务于该请求的标准端口。 |
%P | 为本请求提供服务的子进程的PID。 |
%{format}P | 服务于该请求的PID或TID(线程ID),format的取值范围为:pid和tid(2.0.46及以后版本)以及hextid(需要APR1.2.0及以上版本) |
%q | 查询字符串(若存在则由一个"?"引导,否则返回空串) |
%r | 请求的第一行 |
%s | 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,—%>s则指的是最后请求的状态。 |
%t | 时间,用普通日志时间格式(标准英语格式) |
%{format}t | 时间,用strftime(3)指定的格式表示的时间。(默认情况下按本地化格式) |
%T | 处理完请求所花时间,以秒为单位。 |
%u | 远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的) |
%U | 请求的URL路径,不包含查询字符串。 |
%v | 对该请求提供服务的标准ServerName。 |
%V | 根据UseCanonicalName指令设定的服务器名称。 |
2.错误日志
1.字段说明
字段 | 说明 |
---|---|
[Mon Sep 09 23:50:23.195490 2019] | 错误发生的日期和时间; |
[core:notice] | 错误的严重性,LogLevel指令使只有高于指定严重性级别的错误才会被记录; |
[pid 5929] | 导致错误的进程号 |
AH00094: Command line: ‘/usr/sbin/httpd -D FOREGROUND’ | 具体的错误信息 |
2.错误日志级别
Level | 描述 | 举例 |
---|---|---|
emerg | 紧急(系统无法使用) | “Child cannot open lock file. Exiting” |
alert | 必须立即采取措施 | “getpwuid: couldn’t determine user name from uid” |
crit | 致命情况 | “socket: Failed to get a socket, exiting child” |
error | 错误情况 | “Premature end of script. headers” |
warn | 警告情况 | “child process 1234 did not exit, sending another SIGHUP” |
notice | 一般重要情况 | “httpd: caught SIGBUS, attempting to dump core in …” |
info | 普通信息 | “Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)…” |
debug | 调试信息 | “Opening config file …” |
3.监视错误日志
tail -f error_log
日志分割
常用的工具有Apache自带的日志分割工具rotatelogs或是第三方日志分割cronolog工具等。
利用Apache自带的日志分割工具rotatelogs对日志进行分割存储:
ServerRoot "/var/www/zlt/"
ErrorLog "|/usr/sbin/rotatelogs -l logs/www.book.com.Error_%Y%m%d.log 86400"
CustomLog "|/usr/sbin/rotatelogs -l logs/www.book.com.Access_%Y%m%d.log 86400" common
........