零、最前沿
介绍第一款网页软件服务,操作简单,在全球也应用广泛,可能文中有不足之处,但我已经尽可能地去实现这个教程,结合实际和教程的入门到掌握,一步步由浅到深。希望一起学习的同学,不要感到学习困难,坑是一步步走过去的,记录下坑的位置,下次就不会再踩了。越踩越深,等解决问题之后,就会发现这个坑只是很简单的问题。哈哈哈~
一、简介
1.通俗介绍
Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。Apache HTTP服务器是一个模块化的服务器,源于NCSAhttpd服务器,经过多次修改,成为世界使用排名第一的Web服务器软件。同时Apache音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在美国的西南部。也是一个基金会的名称、一种武装直升机等等。
2.工作模式介绍 Apache 一共有3种稳定的 MPM 模式(多进程处理模块),它们分别是 prefork、worker、event。http-2.2版本的httpd默认的mpm工作模式为prefork,2.4版本的httpd默认是event工作模式。
2.1 prefork 工作模式 Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:兼容所有新老模块,而且不需担心线程安全。 缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。
2.2 worker 工作模式 使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
优点:占据更少的内存,高并发下表现更优秀。 缺点:线程安全问题需要考虑
2.3 event 工作模式 它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。 HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的,但不能在HTTPS访问下工作。
二、安装
1.快速安装
[root@leo ~]# yum update #更新仓库源
[root@leo ~]# yum install -y httpd #安装Apache服务
[root@leo ~]# systemctl status httpd #查看Apache服务状态
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: man:httpd(8)
man:apachectl(8)
[root@leo ~]# systemctl start httpd #启动Apache服务
[root@leo ~]# systemctl enable httpd #设置开机自启动服务
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@leo ~]#
1.1 访问网页
在网页上输入服务器的IP
1.2 设置自定义主页
2.源码安装
2.1安装环境包
[root@leo ~]# yum install -y gcc gcc-c++ expat-devel
2.2下载源码安装包
[root@leo ~]# mkdir -p /server/source
[root@leo ~]# cd /server/source/
[root@leo source]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/httpd/httpd-2.4.34.tar.gz
[root@leo source]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.6.3.tar.gz
[root@leo source]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-util-1.6.1.tar.gz
[root@leo source]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
2.3 解压各个软件包
[root@leo source]# ls
apr-1.6.3.tar.gz apr-util-1.6.1.tar.gz httpd-2.4.34.tar.gz pcre-8.40.tar.gz
[root@leo source]# tar -xf apr-1.6.3.tar.gz
[root@leo source]# tar -xf apr-util-1.6.1.tar.gz
[root@leo source]# tar -xf httpd-2.4.34.tar.gz
[root@leo source]# tar -xf pcre-8.40.tar.gz
2.4 编译安装Apr
[root@leo source]# cd apr-1.6.3
[root@leo apr-1.6.3]# ./configure --prefix=/usr/local/apr && make && make install
2.5 编译安装Apr-utils
[root@leo apr-1.6.3]# cd ..
[root@leo source]# cd apr-util-1.6.1
[root@leo apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install
2.6 编译安装PCRE
[root@leo pcre-8.40]# pwd
/server/source/pcre-8.40
[root@leo pcre-8.40]# ./configure -prefix=/usr/local/pcre && make && make install
2.7 编译安装Apache服务
[root@leo pcre-8.40]# cd ..
[root@leo source]# cd httpd-2.4.34
[root@leo httpd-2.4.34]# ./configure --prefix=/usr/local/httpd --sysconfdir=/etc/httpd --enable-so --enable-rewrite --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre && make && make install
2.8 设置Apache服务启动
[root@leo httpd-2.4.34]# cd /usr/local/httpd/bin/
[root@leo bin]# vim /etc/httpd/httpd.conf
ServerName localhost:80
[root@leo bin]# ./apachectl start
[root@leo bin]# netstat -tunlp |grep 80
tcp6 0 0 :::80 :::* LISTEN 47744/httpd
[root@leo bin]#
2.9 设置开机自启动
[root@leo bin]# cp apachectl /etc/init.d/httpd
[root@leo bin]# vim /etc/init.d/httpd #在/bin/sh下添加那两行
#!/bin/sh
# chkconfig: 2345 70 30
# description: httpd
[root@leo bin]# chkconfig --add httpd
[root@leo bin]# chkconfig --list httpd
Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by native
systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'.
To see services enabled on particular target use
'systemctl list-dependencies [target]'.
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@leo bin]#
2.10 访问网页
三、用户认证
[root@leo conf.d]# pwd
/etc/httpd/conf.d
[root@leo conf.d]# vim identified.conf
[root@leo conf.d]# cat identified.conf
<VirtualHost *:80>
DocumentRoot "/server/web"
ServerName www.leo.com
ServerAlias www.leo1.com
<Directory /server/web/index.php>
AllowOverride AuthConfig
AuthName "Please input you acount."
AuthType Basic
AuthUserFile /server/data/.htpasswd
require valid-user
</Directory>
</VirtualHost>
[root@leo conf.d]# htpasswd -c /server/data/.htpasswd leo
[root@leo conf.d]# htpasswd -m /server/data/.htpasswd 000000
[root@leo conf.d]# systemctl restart httpd
四、设置默认主机
[root@leo conf.d]# pwd
/etc/httpd/conf.d
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# mkdir -p /server/web
[root@leo conf.d]# vim /server/web/index.html
<VirtualHost *:81>
DocumentRoot "/server/web"
ServerName 192.168.116.129
<Directory /server/web>
Order allow,deny
Deny from all
</Directory>
</VirtualHost>
[root@leo conf.d]# cat /server/web/index.html
vhost
[root@leo conf.d]# systemctl restart httpd
五、301域名跳转
1、配置域名跳转
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.leo.com$
RewriteRule ^/(.*)$ http://www.leo1.com/$1 [R=301,L]
</IfModule>
[root@leo conf.d]#
2、配置多域名跳转
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.leo.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.test.com$
RewriteRule ^/(.*)$ http://www.leo1.com/$1 [R=301,L]
</IfModule>
[root@leo conf.d]#
3、重启Apache服务
[root@leo conf.d]# systemctl restart httpd
六、日志切割
1.设置路径名称
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
ErrorLog "logs/error.log"
CustomLog "logs/access.log" combined
[root@leo conf.d]#
2.设置日志分割
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
ErrorLog "|/server/logs/rotatelogs -l /server/logs/aaa-error_%Y%m%d.log 86400"
CustomLog "|/server/logs/rotatelogs -l /server/logs/aaa-access_%Y%m%d.log 86400" combined
[root@leo conf.d]#
ErrorLog是错误日志,CustomLog是访问日志。|就是管道符,意思是把产生的日志交给rotatelog这个工具,而这个工具就是apache自带的切割日志的工具。-l的作用是校准时区为UTC,也就是北京时间。86400,单位是秒,正好是一天,那么日志会每天切割一次。而最后面的combined为日志的格式,在httpd.conf中有定义
七、不记录指定文件类型的日志
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
SetEnvIf Request_URI ".*\.gif$" image-request
SetEnvIf Request_URI ".*\.jpg$" image-request
SetEnvIf Request_URI ".*\.png$" image-request
SetEnvIf Request_URI ".*\.bmp$" image-request
SetEnvIf Request_URI ".*\.swf$" image-request
SetEnvIf Request_URI ".*\.js$" image-request
SetEnvIf Request_URI ".*\.css$" image-request
CustomLog "|/usr/local ... _%Y%m%d.log 86400" combined env=!image-request
[root@leo conf.d]#
说明:在原来日志配置基础上,增加了一些image-request的定义,比如把gif、jpg、bmp、swf、js、css等结尾的全标记为image-request,然后在配置日志后加一个标记env=!image-request,表示取反。
八、配置静态缓存
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "access plus 1 days"
ExpiresByType image/jpeg "access plus 24 hours"
ExpiresByType image/png "access plus 24 hours"
ExpiresByType text/css "now plus 2 hour"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
</IfModule>
[root@leo conf.d]#
说明:这里的时间单位可以 days、 hours 甚至是 min,两种不同的方法,上面使用的是mod_expires,而下面用的是 mod_headers,要想使用这些模块,必须要事先已经支持。
九、配置防盗链
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
SetEnvIfNoCase Referer "^http://.*\.leo\.com" local_ref
SetEnvIfNoCase Referer ".*\.leo\.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
[root@leo conf.d]#
说明:在这段配置中涉及到一个名词referer,其实就是上次访问的网站链接。配置referer是根据来源链接做限制的,如果来源链接不是我们想要的,就直接拒绝,这就是防盗链的原理。当然不止是图片,mp3、rar、zip等文件同样支持。上述配置中默认是除了定义的列表中的referer,其它都拒绝。
十、访问控制
对apache的访问进行控制,可以设置白名单或黑名单。 更改httpd.conf时候就已经看到了allow,deny这两个关键词,先来看看allow和deny的规则。 1、例1
Order deny,allow
deny from all
allow from 127.0.0.1
我们的判断依据是这样的:
看Order后面的,哪个在前,哪个在后
如果deny在前,那么就需要看deny from这句,然后看allow from这句
规则是一条一条匹配的,不管是deny在前还是allow在前,都会生效的。
2、例2
Order allow,deny
deny from all
allow from 127.0.0.1
这个就会deny所有,127.0.0.1也会被deny。因为顺序是先allow然后deny,虽然开始allow了127,但是后面又拒绝了。
3、例3
Order allow,deny
deny from all
上面的规则就表示,全部都不能通过。
4、例4
Order deny,allow
deny from all
上面的规则表示,全部都不能通。
Order deny,allow
只有顺序,没有具体规则,表示全部都可以通行(默认的),因为allow在最后了。
Order allow,deny
这个表示,全部都不能通行(默认的),因为deny在最后。
5、针对某个目录限制
比如这个目录很重要,只允许我们公司的IP访问,当然这个目录可以是网站根目录,也就是整个站点。
<Directory /usr/local/httpd/htdocs>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directory>
6、针对请求的URL去限制
<filesmatch "(.*)admin(.*)">
Order deny,allow
Deny from all
Allow from 127.0.0.1
</filesmatch>
这里用到了filesmatch语法,表示匹配的意思。
7、验证
# curl -x192.168.116.129:80 www.leo.com/admin.php -I
HTTP/1.1 403 Forbidden
Date: Wed, 26 Oct 2016 06:24:54 GMT
Server: Apache/2.2.31 (Unix) PHP/5.6.38
Content-Type: text/html; charset=iso-8859-1
# curl -x127.0.0.1:80 www.leo.com/admin.php -I
HTTP/1.1 401 Authorization Required
Date: Wed, 26 Oct 2016 06:25:03 GMT
Server: Apache/2.2.31 (Unix) PHP/5.6.38
WWW-Authenticate: Basic realm="Please input you acount."
Content-Type: text/html; charset=iso-8859-1
十一、禁用解析PHP
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
<Directory /server/web>
php_admin_flag engine off
<filesmatch "(.*)php">
Order deny,allow
Deny from all
</filesmatch>
</Directory>
[root@leo conf.d]#
说明:php_admin_flag engine off这个语句就是禁止解析php的控制语句,但只这样配置还不够,因为这样配置后用户依然可以访问php文件,只不过不解析了,但可以下载,用户下载php文件也是不合适的,所以有必要再禁止一下。
十二、禁止指定的user_agent
user_agent叫做浏览器标识,目前主流的浏览器有IE、chrome、Firefox、360、iphone的Safari、Android手机上的百度搜索引擎、google搜索引擎等很多,每一种浏览器都有对应的user_agent。为了避免一些无用的搜索引擎或机器爬虫之类引起的带宽的无辜消耗。
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.leo.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.test.com$
RewriteRule ^/(.*)$ http://www.leo.com/$1 [R=301,L]
RewriteCond %{HTTP_USER_AGENT} ".*Firefox.*" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ".*Tomato Bot.*" [NC]
RewriteRule .* - [F]
</IfModule>
[root@leo conf.d]#
十三、限制目录
可以allow和deny去现在网站根目录下的某个子目录,当然这个rewrite也可以实现,这段配置,会把只要是包含 /manage/ 字样的请求都限制
[root@leo conf.d]# vim vhost.conf
[root@leo conf.d]# cat vhost.conf
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^.*/manage/* [NC]
RewriteRule .* - [F]
</IfModule>
[root@leo conf.d]#
十四、从入门到掌握
完成上面的练习,证明已经入门,在掌握的路上还需要多加练习和记忆,后面的运维进阶会结合以上内容做服务器架构项目试验。请一起学习的同学,记录笔记。