一、Apache的工作流程
客户端通过随机端口连接到Apache的80端口,服务器开启线程进程请求处理,匹配用户的请求是静态的还是动态的:
静态:服务器直接回传页面给客户端
动态:服务器–>PHP–>回传解析后的页面给客户端
工作流程:守护进程(httpd)–>工作进程–>产生线程(任务处理请求)
二、Apache的三种工作模式(MPM)
1.prefork工作模式(单进程只能同时处理一个线程请求)
优点:成熟稳定,兼容新老模块,不用考虑线程安全问题。
缺点:单进程消耗资源多,不擅长高并发。
2.worker工作模式(多进程,多线程同时处理)
优点:占用内存相对较少,支持高并发处理请求 缺点:必须考虑线程安全。
3.event工作模式 HTTP中采用了keepalived的方式减少了tcp连接的数量,这会导致线程被占用过长。用event工作模式可以断开tcp连接,将线程分配给新来的请求。 支持http请求但不支持https请求。
注:在编译时指定Apache的工作模式 ,–with-mpm=xxx
三、配置文件
1、apache文件目录位置:
| 服务目录 | /etc/httpd |
| 主配置文件 | /etc/httpd/conf/httpd.conf |
| 网站数据目录 | /var/www/html |
| 访问日志 | /var/log/httpd/access_log |
| 错误日志 | /var/log/httpd/error_log |
2、配置文件主要参数:
| ServerRoot | 服务目录 |
| ServerAdmin | 管理员邮箱 |
| User | 运行服务的用户 |
| Group | 运行服务的用户组 |
| ServerName | 网站服务器的域名 |
| DocumentRoot | 网站数据目录 |
| Listen | 监听的IP地址与端口号 |
| DirectoryIndex | 默认的索引页页面 |
| ErrorLog | 错误日志文件 |
| CustomLog | 访问日志文件 |
| Timeout | 网页超时时间,默认为300秒 |
3、Apache的目录别名设置: 修改主配置文件httpd.conf,将此行注释取消:
Include conf/extra/httpd-autoindex.conf /usr/local/apache/conf/extra/httpd-autoindex.conf -->配置访问文件的别名 #/usr/local/apache/bin/apachectl -t -->检查配置文件是否正确 Syntax OK
4、Apache的用户认证:
编辑主配置文件httpd.conf 在需要进行登陆认证的目录标签中加入如下配置:
<Directory “/a”> ------>声明被保护的目录
AllowOverride All ---->开启权限认证文件
.htaccess Options None
Require all granted
在指定目录/a/下创建权限文件
.htaccess AuthName “Welcome to atguigu” ----->提示信息
AuthType basic ------>加密类型
AuthUserFile /usr/local/apache/apache.passwd ------>密码文件的路径
require valid-user ----->允许密码文件中的所有用户访问
建立密码文件,加入用户到密码文件: /usr/local/apache/bin/htpasswd -c /usr/local/apache/htdocs/apache.passwd test1
---->第一次创建用户 -c 之后用-m 访问IP+加密文件路径,输入用户密码就可访问。
四、虚拟主机 apche支持3种类型虚拟主机:
基于IP的虚拟主机
基于端口的虚拟主机
重点 基于域名的虚拟主机 ---->添加虚拟主机配置修改配置文件:/usr/local/apache/conf/extra/httpd-vhosts.conf 配置httpd.conf:去掉Include conf/extra/httpd-vhosts.conf 前面的注释 添加内容格式如下
<VirtualHost 192.168.10.10>
DocumentRoot “/home/wwwroot/www”
ServerName “www.123456.com”
<Directory “/home/wwwroot/www”>
AllowOverride None
Require all granted
五、域名跳转
编辑主配置文件httpd.conf,将 LoadModule rewrite_module modules/mod_rewrite.so 注释去掉,开启rewrite模块。
编辑网站目录文件的.htaccess文件,添加rewrite规则
<IfModule mod_rewrite.c> //需要mod_rewrite模块支持
RewriteEngine on //打开rewrite功能
RewriteCond %{HTTP_HOST} !^111.com$ //定义rewrite的条件,主机名(域名)111.com满足条件
RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L] //定义rewrite规则,当满足上面的条件时,这条规则才会执行。301表示永久重定向的状态码,L表示跳转一次。
编辑httpd-vhost.conf文件,修改目录访问权限 AllowOverride All //将访问权限修改为All
六、Apache+openssl实现https (重点)
1、准备工作: 检查SSL模块是否安装是否启用。 #apachectl -M
2、openssl genrsa -out ca.key 1024 创建服务器私钥,生成RSA密钥
openssl req -new -key ca.key -out atguigu.csr 生成csr文件交给CA签名后形成服务端自己的证书
openssl x509 -req -days 365 -sha256 -in atguigu.csr -signkey ca.key -out atguigu.crt 使用CA服务器签发证书,设置证书的有效期等信息。
注意:1、生成完密钥文件和证书文件后,将文件存放在Apache的安装目录下的cert目录下
2、在生产环境必须要在https证书场商注册(否则浏览器不识别)
3、配置文件修改 调用ssl模块,并启用ssl独立配置文件,修改主配置文件httpd.conf Include conf/extra/httpd-ssl.conf 开启ssl配置文件,去掉#号 打开 apache 安装目录下 conf/extra/httpd-ssl.conf 文件
添加 SSL 协议支持协议,去掉不安全的协议
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
4、修改主配置文件,添加虚拟主机。
ServerName localhost:443
DocumentRoot “/usr/local/apache/htdocs” # 证书公钥配置
SSLCertificateFile cert/atguigu.crt # 证书私钥配置
SSLCertificateKeyFile cert/ca.key(拿到的key) # 证书链配置,如果该属性开头有 '#'字符,请删除掉
SSLCertificateChainFile cert/atguigu.crt
六、Apache的日志切割
修改主配置文件httpd.conf 找到这两行的errorlog和customlog
将其改为
ErrorLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_error_log 86400 480” // 86400秒 可以改为 大小2M
CustomLog “| /usr/local/apache/bin/rotatelogs /home/logs/www/%Y_%m_%d_access_log 86400 480” common
配置文件中CustomLog日志格式的标签有common和combined两种选择。
rotatelogs说明:
rotatelogs logfile [ rotationtime [ offset ]] | [ filesizeM ]
rotationtime指的是设定多少秒后进行日志切割,如这里的300秒,在设定的时间之后系统将自动切割日志;
offset指的是日志时间的偏移量,如果不设置该偏移量,则默认为0,且显示的时间与北京时间会不一样,与北京时间相差8个小 时,故建议将其设置为+480,单位为分钟;
filesizeM指的是日志多大之后自动切割,可接受的单位为K,M,G,上面的ErrorLog设置为400M之后自动切割日志
七、配置Apache不记录指定文件类型的日志 编辑虚拟机配置文件
#vim /usr/local/apache/conf/httpd.conf
ErrorLog “logs/test.com-error_log”
SetEnvIf Request_URI “._\.gif$” p_w_picpath-request
SetEnvIf Request_URI “._\.jpg$” p_w_picpath-request
SetEnvIf Request_URI “._\.png$” p_w_picpath-request
SetEnvIf Request_URI “._\.bmp$” p_w_picpath-request
SetEnvIf Request_URI “._\.swf$” p_w_picpath-request
SetEnvIf Request_URI “._\.js$” p_w_picpath-request
SetEnvIf Request_URI “.*\.css$” p_w_picpath-request
CustomLog “|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/test.com-access_%Y%m%d_log 86400” combined env=!p_w_picpath-request
解释说明: SetEnvIf 设置匹配条件,声明 p_w_picpath-request 定义的别名 env=!p_w_picpath-request 排除别名是p_w_picpath-request的项
八、Apache配置静态缓存
编辑主配置文件httpd.conf,启用静态缓存模块 expires_module LoadModule expires_module modules/mod_expires.so
添加配置模板缓存类型
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType p_w_picpath/gif “access plus 1 days”
ExpiresByType p_w_picpath/jpeg “access plus 24 hours”
ExpiresByType p_w_picpath/png “access plus 24 hours”
ExpiresByType text/css “now plus 2 hours”
ExpiresByType application/x-javascript “now plus 2 hours”
ExpiresByType application/x-shockwave-flash “now plus 2 hours”
ExpiresDefault “now plus 0 min”
这个单位可以是‘天、小时、分钟、月
查看缓存情况命令: curl -x192.168.0.50:80 ‘192.168.0.50/1.jpg’ -I
九、禁止解析PHP 为了网站安全,某个目录下禁止解析PHP,防止上传木马文件。 修改主配置文件,添加防止解析PHP规则
<Directory /data/www/data> # 对应所在的Directory
php_admin_flag engine off # 关闭php解析引擎
<filesmatch “(.*)php”> # php相关的文件