Apache http server简称Apache,是Apache软件基金会的一个高性能、功能强大、健壮可靠、又灵活的开放源代码的web服务软件,它可以运行在广泛的计算机平台上如Linux、Windows。因其平台性和很好的安全性而被广泛使用,是互联网最流行的web服务软件之一
httpd 为apache http server服务提供的工具
-c:在读取配置?件前,先执?选项中的指令。
-C:在读取配置?件后,再执?选项中的指令。
-d<服务器根?录>:指定服务器的根?录。
-D<设定?件参数>:指定要传?配置?件的参数。
-f<设定?件>:指定配置?件。
-h:显示帮助。
-l:显示服务器编译时所包含的模块。
-L:显示httpd指令的说明。
-S:显示配置?件中的设定。
-t:测试配置?件的语法是否正确。
-v:显示版本信息。
-V:显示版本信息以及建?环境。
-X:以单?程序的?式来启动服务器。
安装httpd
yum install -y httpd
echo '<h1>It works!</h1>' > /var/www/html/index.html
systemctl start httpd
systemctl stop firewalld
setenforce 0
在本地进行测试
curl <IP地址> -I
wget <http://IP地址>
/etc/httpd/:主配置文件目录
/etc/httpd/conf/httpd.conf:服务配置文件
/etc/httpd/conf.d/:服务配置目录(模块化)
/etc/httpd/conf.modules.d/:模块配置目录
/etc/sysconfig/httpd:守护进程配置文件
/usr/lib64/httpd/modules/:可用模块
/usr/sbin/:相关命令目录
/var/log/httpd/:日志目录
/var/www/:站点目录
##主配置说明##
[root@node3 ~]# grep "^[^ #]" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd" # 服务器的根
Listen 80 # 监听的端口
Include conf.modules.d/*.conf # 包含模块
User apache # 用户
Group apache # 属组
ServerAdmin root@localhost # 服务器管理员
<Directory />
AllowOverride none
Require all denied
</Directory> # <Directory>和</Directory>用于封装一组指令,使之仅对某个 目录及其子目录生效。
DocumentRoot "/var/www/html"
ErrorLog "logs/error_log" # 错误日志
LogLevel warn # 日志等级
EnableSendfile on # 开启
IncludeOptional conf.d/*.conf # 虚拟服务器配置文件
说明:<></>此类称之为容器,针对某个容器做配置
httpd -l
和 httpd -M
查看/usr/lib64/httpd/modules/
/etc/httpd/conf/httpd.conf
文件中指定加载模块配置文件[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)
范例:查看模块加载的配置文件
[root@localhost ~]# ls /etc/httpd/conf.modules.d/
00-base.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-proxy.conf 00- systemd.conf 01-cgi.conf
[root@localhost ~]# cat /etc/httpd/conf.modules.d/00-base.conf
# 可以看到加载的模块
vim /etc/httpd/conf/httpd.conf
#Servername www.example.com:80
Servername 192.168.64.129:80
httpd -t #检查语法
vim /etc/httpd/conf/httpd.conf
Listen 80
systemctl reload httpd
非持久连接表示的是:客户端和服务端完成操作之后,立即断开
持久连接,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成
vim /etc/httpd/conf/httpd.conf
KeepAlive On #默认是on,默认的超时时间是5秒。
KeepAliveTimeout 15 # 连接超时
MaxKeepAliveRequests 500# 最大保持连接请求数,默认值是100
yum install telnet -y
echo 'this is test!' > /var/www/html/index.html
[root@server ~]# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET / HTTP/1.1
Host:127.0.0.1
HTTP/1.1 200 OK
Date: Wed, 14 Jul 2021 14:17:29 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Wed, 14 Jul 2021 14:16:40 GMT
ETag: "e-5c71600ca9dad"
Accept-Ranges: bytes
Content-Length: 14
Content-Type: text/html; charset=UTF-8
this is test!
Connection closed by foreign host.
[root@server ~]# cat /etc/httpd/conf.d/keeplive.conf
KeepAlive on
KeepAliveTimeout 30
MaxKeepAliveRequests 100
[root@server ~]# systemctl restart httpd.service
[root@server ~]# telnet 127.0.0.1 80
MPM工作模式
多进程单线程
优点:适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的mpm,这样若一个请求出现问题就不会影响到其他请求。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。
httpd -V
[root@server ~]# cat /etc/httpd/conf.modules.d/00-mpm.conf | grep -Ev "^#|^$"
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
若要使用worker和event工作模型,只需要在/etc/httpd/conf.modules.d/00-mpm.conf中取消 对应注释即可
默认参数:
StartServers 5 # 服务启动时的进程数
MaxSpareServers 10 # 最大空闲服务进程数
MinSpareServers 5 # 最小空闲进程数
MaxRequestWorkers 256 # 单个进程最多接受的进程数
[root@server ~]# vim /etc/httpd/conf.d/mpm.conf
StartServers 10
MaxSpareServers 15
MinSpareServers 10
MaxRequestWorkers 256
MaxRequestsPerChild 4000
[root@localhost ~]# systemctl restart httpd
[root@server ~]# ps -ef | grep httpd
[root@localhost ~]# ab -n 1000000 -c 1000 http://127.0.0.1/
# -n 即requests,用于指定压力测试总共的执行次数
# -c 即concurrency,用于指定的并发数
watch -n 0.5 "ps aux | grep httpd |wc -l"
ps aux |grep httpd |wc -l
watch -n 0.5 'pstree -p|grep httpd|wc -l'
ps aux|grep httpd |wc -l
work使用了多进程和多线程的混合模式,worker模式也同样会先派生一下子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务
优点:线程比进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发高流量的场景下会比prefork有更多可用的线程,表现会更优秀一些。
缺点:如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全。
StartServers #服务器启动时建立的子进程数量,在workers模式下默认是3.
ServerLimit #系统配置的最大进程数量
MinSpareThreads #空闲子进程的最小数量,默认75
MaxSpareThreads #空闲子进程的最大数量,默认250
ThreadsPerChild #每个子进程产生的线程数量,默认是64
MaxRequestWorkers /MaxClients #限定服务器同一时间内客户端最大接入的请求数量.
MaxConnectionsPerChild #每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束, 如果设置为0,子进程将永远不会结束。在Apache2.3.9之前称之为MaxRequestsPerChild。
这个是apache中最新的模式,在现在的版本里已经是稳定可用的模式,它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂载哪里等待,中间几乎没有请求过来,一直等到超时)
event中会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻塞
vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html" #文档根路径
<Directory "/var/www">
Require all granted
</Directory>
httpd -M |grep dir
dir_module (shared) #由本模块控制授权主页文件
vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
/var/www/html
目录下,下面修改默认资源存放路径,指定为/data/html
mkdir -p /data/html
echo "<h1>hello world</h1>" > /data/html/index.html
vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/html" #修改资源存放路径
<Directory "/data/html"> #给权限
AllowOverride None
Require all granted
</Directory>
httpd -t
systemctl restart httpd
setenforce 0
chcon -R -t hhtpd_sys_content_t /data/html #设置selinux权限,或者直接setenforce 0
dir_mod
中添加index.htm
echo "<h1>hello linux</h1>" > /data/html/index.htm
vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.html index.htm #修改两个文件的顺序,可以更改优先访问的页面顺序
</IfModule>
systemctl restart httpd
DocumentRoot
目录下没有任何文件,会发现有一个默认的页面,也就是显示Testing 123...
的那个页面,这个是因为有一个welcome.conf
的配置文件导致的cat /etc/httpd/conf.d/welcom.conf
<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /.noindex.html
</LocationMatch>
#基于目录
<Directory "/path”>
...
</Directory>
#基于文件
<File "/path/file">
...
</File>
# 基于文件通配符
<Files "/path/*file*">
...
</Files>
#基于正则表达式
<FileMatch “regex”>
...
</FileMatch>
修改配置文件
<FilesMatch ".+\.(gif|jpe?g|png)$"> # 匹配图片xxx.gif|jpg|jpeg|png
Require all denied
</FilesMatch>
重启服务然后测试
<Location "URL">
...
</Location>
<LocationMatch "regex">
...
</LocationMatch>
#/private1, /private1/, /private1/file.txt 匹配
#/private1other 不匹配
<Location "/private1">
#... #注意斜线
</Location>
#/private2, /private2/, /private2/file.txt 匹配
#/private2other 不匹配
<Location "/private2">
#...
</Location>
[root@localhost ~]# cd /data/html/dir
[root@localhost dir]# touch f1 f2
访问ip/dir
这样是不安全的。因为如果没有index.html文件就会把其他的目录显示出来。所以要修改配置
[root@localhost dir]# ln -s /etc/hosts hosts
访问ip/dir/hosts
AllowOverride指令与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName 指令指定,AccessFileName .htaccess 为默认值)文件中,覆盖之前的配置指令,只对语句有效,直接在对应的文件目录中新建一个.htaccess的文件
Indexes
和FollowSymLinks
,但是在.htaccess
中打开vim /etc/httpd/conf/httpd.conf
<Directory "/data/html">
Options -Indexes -FollowSymLinks
AllowOverride options=FollowSymLinks,Indexes
</Directory>
systemctl reload httpd
.htaccess
文件,echo "Options Indexes FollowSymLinks" > /data/html/dir/.htaccess
systemctl reload httpd
.htaccess
对应的文件拒绝全部访问,所以相对是安全的<Files ".ht*">
Require all denied
</Files>
Require all granted
Require all denied
Require ip <IPADDR>
Require not ip <IPADDR>
Require host <HOSTNAME>
Require not host <HOSTNAME>
</Directory "/data/html"
<RequireAll>
Require all granted
Require not ip 172.16.1.1 #拒绝特定IP
</RequireAll>
#Require all granted这一行记得注释掉,要不然里面写的生效不了
</Directory>
<RequireAny>
Require all denied
require ip 172.16.1.1 #允许特定IP
</RequireAny>
<Directory "/data/html">
<requireany>
Require all denied
Require ip 192.168.39.0/24
</requireany>
</Directory>
<Directory "/data/html">
<Requireany>
Require all denied
Require ip 192.168.32.7 #只允许特定的主机访问
</Requireany>
</Directory>
<Directory "/path">
Options None
AllowOverride None
AuthType Basic
AuthName "String" #文字提示符
AuthUserFile "/path/..." #指定存放密码文件
Require user username1 username2 ... #限制特定的人才能访问
</Directory>
htpasswd [options] /path username
先取消掉权限控制
创建用户文件,为用户认证做准备
[root@server1 ~]# htpasswd -c -m /etc/httpd/conf.d/.htpassword lisi
New password:
Re-type new password:
Adding password for user lisi
[root@server1 ~]# htpasswd -b -m /etc/httpd/conf.d/.htpassword zhangsan zhangsan
Adding password for user zhangsan
mkdir -p /data/www/html
cd /data/www/html
echo "hello linux" > index.html
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/data/www/html">
AuthType Basic
AuthName "Restricted Resource"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf.d/.htpassword
Require user lisi
</Directory>
[root@server1 ~]# systemctl restart httpd.service
[root@server1 ~]# htpasswd -c -m /etc/httpd/conf.d/.htpassword lisi
New password:
Re-type new password:
Adding password for user lisi
[root@server1 ~]# htpasswd -b -m /etc/httpd/conf.d/.htpassword zhangsan zhangsan
Adding password for user zhangsan
[root@server1 ~]# cat /etc/httpd/conf.d/.htpassword
AllowOverride
选项为ALLvim /etc/httpd/conf.d/test.conf
<Directory "/data/www/html">
AllowOverride Authconfig
Require all granted
</Directory>
.htaccess
文件,针对admin目录下的文件进行访问控制vim /data/www/html/admin/.htaccess
AuthType Basci
AuthName "FBI warning"
AuthUserFile "/etc/httpd/conf.d/.htpassword"
Require user lisi
systemctl restart httpd
<Directory "/data/www/html">
AuthType Basic
AuthName "Restricted Resource"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf.d/.htpassword
AuthGroupFile /etc/httpd/conf.d/.htgroup
Require group group1
</Directory>
vim /etc/httpd/conf.d/.httpgroup
webadmin:lisi zhangsan
vim /etc/httpd/conf.d/test.conf
<Directory "/data/www/html">
AuthType Basic
AuthName "Restricted Resource"
AuthUserFile /etc/httpd/conf.d/.htpassword
AuthGroupFile /etc/httpd/conf.d/.htgroup
Require group webadmin
</Directory>
vim /etc/httpd/conf/httpd.conf
<IFModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined # 默认日志存放路径格式
</IFModule>
%h Remote hostname
%l Remote logname
%u Remote user
%t Time the request was received, in the format [18/Sep/2011:19:18:28 -0400]
%r First line of request
%s Status
%b Size of response in bytes, excluding HTTP headers
Referer 有利于分析用户是通过哪个网站转发的如通过baidu转发的,也可以监控网站盗链的发生。
User-Agent 记录浏览器的类型。防止爬虫一定程度上,爬虫可以伪造浏览器类型。curl -A "evan"
http://I(伪造名字叫evan的浏览器)
[root@localhost ~]# ls /var/log/httpd/
access_log error_log
alias别名,可以隐藏真实文件系统路径。这里实现的目的是用news文件目录来代替newsdir/index.html访问文件路径,从而起到隐藏真实文件系统路径的目的
dir
目录隐藏,让其可以被news
路径访问vim /etc/httpd/conf/httpd.conf
<IFModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin"
Alias /news/ /data/html/dir
</IFModule>
systemctl reload httpd
vim /etc/httpd/conf.d/test.conf
<Location "/status">
<requireany>
require all denied
require ip 192.168.64.0/24
</requireany>
SetHandler server-status
</Location >
ExtendedStatus On
systemctl reload httpd
httpd 支持在一台物理主机上实现多个网站,即多虚拟主机
网站的唯一标识
多虚拟主机有三种实现方案
虚拟主机的配置方法
<VirtualHost IP:PORT>
Servername FQDN
DocumentRoot "/path"
</VirtualHost>
# 建议,上述配置存放在独立的配置文件中
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog:错误日志
CustomLog:访问日志
<Directory "/path"> </Directory>
mkdir /data
mkdir /data/site{1..6}
cd /data/site1
vim index.html
this is site1
[root@node3 data]# cat /etc/httpd/conf.d/site1.conf
Listen 8080
<Directory "/data/">
Require all granted
</Directory>
<VirtualHost 192.168.239.10:8080>
Servername www.site1.com
DocumentRoot "/data/site1/"
</VirtualHost>
<VirtualHost 192.168.239.20:8080>
Servername www.site2.com
DocumentRoot "/data/site2/"
</VirtualHost>
[root@node3 data]# cat /etc/httpd/conf.d/site2.conf
Listen 9080
Listen 9090
<Directory "/data/">
Require all granted
</Directory>
<VirtualHost *:9080>
DocumentRoot "/data/site3/"
</VirtualHost>
<VirtualHost *:9090>
DocumentRoot "/data/site4/"
</VirtualHost>
[root@node3 data]# cat /etc/httpd/conf.d/site3.conf
Listen 10101
<Directory "/data/">
Require all granted
</Directory>
<VirtualHost 192.168.239.10:10101>
Servername www.site5.com
DocumentRoot "/data/site5/"
</VirtualHost>
<VirtualHost 192.168.239.10:10101>
Servername www.site6.com
DocumentRoot "/data/site6/"
</VirtualHost>
[root@server1 ~]# vim /etc/hosts
192.168.239.10 www.site5.com www.site6.com
[root@server1 ~]# curl www.site5.com:10101
this is site5
[root@server1 ~]# curl www.site6.com:10101
this is site6
Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是由两部分组成:HTTP+SSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
https实现过程如下:
Redirect [status] URL-path URL