Apache概述
??? Apache是世界上使用排名第一的Web服务器。因为其强大的跨平台与安全性被广泛使用,是最流行的Web服务器端软件之一。他快速,可靠并且通过简单的API扩充,将PERL/Python/php等解释器编译到服务器中。 ???Apache有多种产品,可以支持ssl技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不适合多处理环境,因此在一个Apache Web站点扩容时,通常是增加服务器或扩充群集点而不是增加处理器。
工作模式
三种稳定的MPM模式(MPM:多进程处理模块) prefork模式 ???Apache在启动前,就预先开放一些子进程,然后等待请求进来。之所以这么做,是为了减少频繁创建和销毁进程的开销。每一个子进程只有一个线程,在一个时间内只能处理一个要求。 优点:成熟稳定,兼容所有新老模块,不用担心线程安全的问题 缺点:占用更多的系统资源,不适合多并发处理
worker工作模式 ???多进程与多线程的混合模式。它也预先开放了几个子进程(数量较少),由每一个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到一个线程来服务。线程通常会共享父进程的内存空间,所以在高并发的场景下,会比prefork更优秀。 优点:占据更少的内存,高并发下表现优秀 缺点:必须考虑线程安全的问题
event工作模式 ???与worker很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event 中,会有一个专门的线程来管理这些keep-alive线程,当有真实请求过来的时候,将请求传递给服务器线程,执行完毕后,又允许它释放。增强了高并发场景下的请求处理能力。
查看方式
ln -s /usr/local/apache2/bin/* /usr/local/bin/
创建apache的软连接
httpd -V |grep -i "server mpm"
查看当前工作模式
相关文件保存位置
配置文件位置: 源码包安装: 主配置文件:vim /usr/local/apache2/etc/httpd.conf 子配置文件:cd /usr/local/apache2/etc/extra/
rpm包安装:/etc/httpd/conf/httpd.conf
网页文件位置: 源码包安装:cd /usr/local/apache2/htdocs/ rpm包安装:/var/www/html/
日志文件位置: 源码包安装:cd /usr/local/apache2/logs/ yum包安装:/var/log/httpd
配置文件详解 针对主机环境的基本配置参数:
ServerRoot /usr/ local/apache2
Listen :80
LoadModule php7
User
Group
ServerAdmin
ServerName
ErrorLog "logs/error_log #服务器错误日志
CustomLog "logs/access_log"common
DirectoryIndex index.html index.php
Include etc/extra/httpd-vhosts.conf
主页目录及权限
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
Options Indexes FollowSymLinks
None
All
Indexes
FollowSymLinks
MultiViews
AllowOverride None
None
All
AuthConfig
Require all granted (denied)
</Directory>
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
相关实验
目录别名: 通过设置别名的方式将URL指向特定的目录,不在是默认目录 1.修改主配置文件
vim /usr/local/apache2/etc/httpd.conf
Include etc/extra/httpd-autoindex.conf
去掉注释即可
2.修改子配置文件:
vim usr/local/apache2/etc/extra/httpd-autoindex.conf
Alias /a/ "/a/b/c/" //设置别命
<Directory "/a/b/c/"> //赋予一些权限设置
Options Indexes MultiViews
AllowOverride None
Require all granted
</Directory>
重启:/usr/local/apache2/bin/apachectl restart
目录登录保护
1.在需要进行登录认证的目录标签中加入如下配置:
<Directory "/usr/local/apache2/htdocs/admin">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
2、在指定目录下创建权限文件 切换到/usr/local/apache2/htdocs/admin,创建 .htaccess 文件,并添加下面的内容
AuthName "Welcome to atguigu"
AuthType basic
AuthUserFile /usr/local/apache2/htdocs/admin/apache.passwd
require valid-user
3、建立密码文件,加入允许访问的用户。(此用户和系统用户无关)
/usr/local/apache2/bin/htpasswd -c /usr/local/apache2/htdocs/admin/apache.passwd user1
-c 建立密码文件,只有添加第一个用户时,才能-c
/usr/local/apache2/bin/htpasswd -m /usr/local/apache2/htdocs/admin/apache.passwd user2
-m 再添加更多用户时,使用-m 参数
虚拟主机 ???只是一个虚拟空间,主要功能是实现一个机器上多个网站共同部署的一个形式,不过只能进行网站部署。
虚拟主机的分类:
基于 IP 的虚拟主机:一台服务器,多个 ip,搭建多个网站
基于端口的虚拟主机:一台服务器,一个 ip,搭建多个网站,每个网络使用不同端口访问
基于域名的虚拟主机:一台服务器,一个 ip,搭建多个网站,每个网站使用不同域名访问
实验准备: 1.域名解析:准备两个域名
www.sohu.com
www.sina.com
使用本地 hosts 文件进行解析
2.网站主页目录规划 在/htdocs/目录下分别创建 sohu 和 sina 两个目录,并在新建目录内创建 index.html 文件(分别写不一样的内容)
试验步骤:
修改主配置文件开启文件关联
Include etc//extra/httpd-vhosts.conf
编辑子配置文件,编写虚拟主机标签
添加下方内容,有几个虚拟主机就写几组(添加之前先把原先存在的示例删除掉)
<VirtualHost 192.168.1.20:80>
ServerAdmin webmaster@sina.com
DocumentRoot "/usr/local/apache2/htdocs/sina"
ServerName www.sina.com
ErrorLog "logs/sina-error_log"
CustomLog "logs/sina-access_log" common
</VirtualHost>
重启服务,验证结果
Windows 下:浏览器下输入两个不同的域名验证网页内容(提前修改 windows 的 hosts 文件) Linux 下:通过 elinks/curl 命令验证:elinks/curl URL 地址(提前修改 windows 的 hosts 文件)
域名跳转 临时跳转:302 永久跳转:301
实验条件: 虚拟主机能正常访问 打开主配置文件开启重写模块
LoadModule rewrite_modulemodules/mod_rewrite.so
实验步骤:
1.修改虚拟主机配置文件
<Directory "/usr/local/apache2/htdocs/souhu">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
创建规则匹配文件
在指定的网站目录下创建文件,并添加以下内容
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.souhu.com
RewriteRule ^(.*)$ http://www.sina.com/$1 [R=permanent,L]
Apache+openssl实现https 1.准备工作: 检查Apache 是否支持 SSL,检查相应模块是否安装,若安装则将模块启用模块存放目录:/usr/local/apache2/modules
检查模块是否启用:apachectl -M 没启用打开主配置文件:LoadModule ssl_module modules/mod_ssl.so 删掉注释重启服务
2.CA 证书申请:
openssl genrsa -out ca.key 1024
openssl req -new -key ca.key -out sudo.csr
openssl x509 -req -days 365 -sha256 -in sudo.csr -signkey ca.key -out sudo.crt
注意 1:生成完秘钥和证书文件后,将文件存放在 Apache 的安装目录下的cert 目录下
注意 2:在生产环境中必须要在 https 证书厂商注册(否则浏览器不识别)
3.调用 ssl 模块,并启用 ssl 独立配置文件
LoadModule ssl_module modules/mod_ssl.so
Include etc/extra/httpd-ssl.conf
4.修改 conf/extra/httpd-ssl.conf 配置文件,调用证书等文件
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
SSLCertificateFile cert/atguigu.crt
SSLCertificateKeyFile cert/ca.key
5.修改主配置文件,添加虚拟主机
<VirtualHost _default_:443>
DocumentRoot "/usr/local/apache2/htdocs" ServerName localhost:443
SSLCertificateFile cert/sudo.crt
SSLCertificateKeyFile cert/ca.key
SSLCertificateChainFile cert/sudo.crt
</VirtualHost>
6.强制跳转https访问
<Directory "/usr/local/apache2/htdocs">
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
</Directory>
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L]
日志切割 1.首先简单设置日志的路径名称
编辑添加内容如下:
ErrorLog "logs/error.log"
CustomLog "logs/access.log" combined
指定了日志存放在/usr/local/apache2/logs 目录下分别为 error.log 和 access.log,combined 为日志显示的格式,日志格式可以参考配置文件 httpd.conf 中格式的指定,如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common
2.设置 apache 日志分割 同样编辑配置文件httpd.conf
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined
注意 1:以上仅为两条命令(一条错误日志,一条访问日志),路径太长写不开
注意 2:若开启了 https,则需要修改 http-ssl.conf 配置文件中的日志记录条目
ErrorLog 是错误日志,CustomLog 是访问日志。|就是管道符,意思是把产生的日志交给 rotatelog 这个
工具,而这个工具就是 apache 自带的切割日志的工具。-l 的作用是校准时区为 UTC,也就是北京时间。86
400,单位是秒,正好是一天,那么日志会每天切割一次。而最后面的 combined 为日志的格式,在httpd.conf 中有定义。
不记录指定文件类型的日志 1、配置日志不记录图片的访问
相关配置为:
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
说明:在原来的访问日志配置基础上,增加了一些 image-request 的定义,比如把 gif、jpg、bmp、 swf
、js、css 等结尾的全标记为 image-request,然后在配置日志后加一个标记 env=!image-request,表示取反。
禁止解析 PHP 某个目录下禁止解析 PHP,这个很有作用,我们做网站安全的时候,这个用的很多,比如某些目录可以上传文件,为了避免上传的文件有木马,所以我们禁止这个目录下面的访问解析 PHP。
配置禁止解析 php
<Directory /usr/local/apache2/htdocs/data>
php_admin_flag engine off
<filesmatch "(.*)php">
Order deny,allow
Deny from all
</filesmatch>
</Directory>
|