Httpd(apache) 工作模式(FPM) prefork 多进程模型,一个进程相应一个请求,消耗内存 worker 多线程模型,多进程生成,一个进程生成多个线程 一个线程相应一个请求 event 事件驱动模型(异步),一个线程相应多个请求 Centos6:httpd2.2 安装方式 rpm安装 编译安装 安装httpd # yum install httpd -y 启动httpd service httpd start 开机启动httpd chkconfig httpd on 重启httpd service httpd restart 查看安装的httpd的软件包 # rpm -qa httpd 返回结果: httpd-2.2.15-53.el6.centos.x86_64 查看安装的httpd的配置文件 # rpm -qc httpd 返回结果: /etc/httpd/conf.d/welcome.conf /etc/httpd/conf/httpd.conf /etc/httpd/conf/magic /etc/logrotate.d/httpd /etc/sysconfig/htcacheclean /etc/sysconfig/httpd /var/www/error/HTTP_BAD_GATEWAY.html.var /var/www/error/HTTP_BAD_REQUEST.html.var /var/www/error/HTTP_FORBIDDEN.html.var /var/www/error/HTTP_GONE.html.var /var/www/error/HTTP_INTERNAL_SERVER_ERROR.html.var /var/www/error/HTTP_LENGTH_REQUIRED.html.var /var/www/error/HTTP_METHOD_NOT_ALLOWED.html.var /var/www/error/HTTP_NOT_FOUND.html.var /var/www/error/HTTP_NOT_IMPLEMENTED.html.var /var/www/error/HTTP_PRECONDITION_FAILED.html.var /var/www/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var /var/www/error/HTTP_REQUEST_TIME_OUT.html.var /var/www/error/HTTP_REQUEST_URI_TOO_LARGE.html.var /var/www/error/HTTP_SERVICE_UNAVAILABLE.html.var /var/www/error/HTTP_UNAUTHORIZED.html.var /var/www/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var /var/www/error/HTTP_VARIANT_ALSO_VARIES.html.var /var/www/error/contact.html.var /var/www/error/include/bottom.html /var/www/error/include/spacer.html /var/www/error/include/top.html 解释: /etc/httpd/conf/httpd.conf httpd主配置文件 /etc/httpd/conf.d/ httpd的虚拟主机配置文件存放位置以.conf结尾 /var/www/error/ 错误页面存放目录如404,302,500等错误页面 /etc/logrotate.d/httpd 启动脚本,启动文件 配置文件/etc/sysconfig/httpd 启动模型的配置文件 /usr/sbin/httpd prefork启动文件(默认启动模式) /usr/sbin/httpd.event event模型的启动文件(2.2的event测试阶段的,不建议使用) /usr/sbin/httpd.worker worker模型的启动文件 日志文件目录 /var/log/httpd/ access_log 访问日志 error_log web服务程序启动运行中的错误日志 站点文档目录 /var/www/html/ 配置文件的组成 # grep "Section" /etc/httpd/conf/httpd.conf 返回结果: ### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Host 解释:(第二段和第三段不建议同时使用) Section 1: Global Environment 全局环境配置 Section 2: 'Main' server configuration 主服务器配置 Section 3: Virtual Host 虚拟主机配置 常用配置: 先备份httpd.conf主配置文件 cp /etc/httpd/conf/httpd.conf{,.bak} 修改httpd监听IP和(port)端口 vim /etc/httpd/conf/httpd.conf 利用/查找指定的内容如查找Listen,先在飞编辑模式下按/然后后面跟上Listen 如果不是自己要找的,可以按n键向下搜索 默认Listen监听的是所有IP地址端口是80 省略ip表示监听本机所有IP,Listen可重复出现多次 LISTEN格式 Listen {ip:}port 如: Listen 10.0.1.1:80 这里是只监听10.0.1.1的80端口 Listen 10.0.1.1:81 这里只监听10.0.1.1的81端口 Listen 83 这里监听所有的IP地址的83端口 可以写多个监听地址和端口如下 Listen 80 Listen 10.0.1.1:82 修改好以后重启或者重新加载httpd的配置文件 service httpd reload 重新加载配置文件 service httpd restart 重启httpd Listen 80 利用命令查看httpd监听端口和IP # netstat -lntup 返回结果: ...... tcp 0 0 :::80 :::* LISTEN 1580/httpd ...... 这里可以看到httpd监听的是所有的IP地址,监听端口是80 持久链接(会话保持时间) 连接建立后,每个资源获取完成后不会断开连接,而是继续等待其他资源的请求的完成 如何断开: 数量限制:100个 获取100个资源以后自动断开,哪怕你的时间没有到期 时间限制:可以自己定义比如60秒 副作用 对并发访问量较大的服务器,有的服务器已经请求完资源,还有没有访问到的在排队等待 持久连接功能会使有些请求得不到相应 折中方案: 使用较短的持久时间,比如5秒钟 httpd2.4支持毫秒级的持久化设置 配置httpd持久化设置 vim /etc/httpd/con/httpd.conf 找到KeepAlive Off KeepAlive Off 默认是关闭状态 如果不启用MaxKeepAliveRequests 100和KeepAliveTimeout 15就没有作用 启用KeepAlive KeepAlive On MaxKeepAliveRequests 100 最大连接请求连接数 KeepAliveTimeout 15 连接超时时长,单位默认是秒 利用telnet测试长连接 先来安装telnet yum install telnet -y 利用命令测试连接 telnet 10.0.1.1 80 然后输入 GET / HTTP/1.1 Host: 10.0.1.1 回车再回车,这时候发现连接并没有断开,说明持久连接生效了 MPM,HTTPD各种模型,多路并发相应模型是如何实现的 httpd-2.2不支持同时编译多个模块,最多在编译时选定一个 rpm安装的包提供了三个二进制程序文件,分别用于实现不同MPM机制的实现和切换 确认自己使用的哪种MPM模型 # ps aux|grep httpd 返回结果: root 2184 0.0 0.3 177400 3824 ? Ss Oct22 0:00 /usr/sbin/httpd apache 2186 0.0 0.2 177400 2464 ? S Oct22 0:00 /usr/sbin/httpd apache 2187 0.0 0.2 177400 2468 ? S Oct22 0:00 /usr/sbin/httpd apache 2188 0.0 0.3 177536 3156 ? S Oct22 0:00 /usr/sbin/httpd apache 2189 0.0 0.3 177536 3068 ? S Oct22 0:00 /usr/sbin/httpd apache 2190 0.0 0.3 177536 3052 ? S Oct22 0:00 /usr/sbin/httpd apache 2191 0.0 0.2 177400 2464 ? S Oct22 0:00 /usr/sbin/httpd apache 2192 0.0 0.2 177400 2464 ? S Oct22 0:00 /usr/sbin/httpd apache 2193 0.0 0.2 177400 2464 ? S Oct22 0:00 /usr/sbin/httpd root 2297 0.0 0.0 103312 872 pts/0 S+ 00:04 0:00 grep httpd 这里是prefork模型运行的httpd(/usr/sbin/httpd) 如果是/usr/sbin//usr/sbin/httpd.worker就是worker模式 如果是/usr/sbin//usr/sbin/httpd.event就是event模型 更换httpd模型,改成worker模型 vim /etc/sysconfig/httpd 原 #HTTPD=/usr/sbin/httpd.worker 改后(把前面的#号注释去掉) HTTPD=/usr/sbin/httpd.worker 修改好 重启服务,这样启动起来以后以worker模型启动 # service httpd restart 利用ps命令查看httpd的启动模型 # ps aux|grep httpd root 2341 0.0 0.4 177608 4048 ? Ss 00:35 0:00 /usr/sbin/httpd.worker apache 2343 0.0 0.5 521868 5324 ? Sl 00:35 0:00 /usr/sbin/httpd.worker apache 2344 0.0 0.5 521868 5332 ? Sl 00:35 0:00 /usr/sbin/httpd.worker apache 2345 0.0 0.5 521868 5332 ? Sl 00:35 0:00 /usr/sbin/httpd.worker root 2456 0.0 0.0 103312 872 pts/0 S+ 00:35 0:00 grep httpd 这里可以看到启动的进程是/usr/sbin/httpd.worker 更换httpd模型,改成event模型 vim /etc/sysconfig/httpd 原 #HTTPD=/usr/sbin/httpd.worker 改后(把前面的#号注释去掉) HTTPD=/usr/sbin/httpd.event 修改好 重启服务,这样启动起来以后以event模型启动 # service httpd restart 利用ps命令查看httpd的启动模型 # ps aux|grep httpd 返回结果: root 2488 0.0 0.4 177604 4024 ? Ss 00:40 0:00 /usr/sbin/httpd.event apache 2490 0.0 0.5 521864 5316 ? Sl 00:40 0:00 /usr/sbin/httpd.event apache 2491 0.0 0.5 521864 5320 ? Sl 00:40 0:00 /usr/sbin/httpd.event apache 2492 0.0 0.5 521864 5336 ? Sl 00:40 0:00 /usr/sbin/httpd.event root 2575 0.0 0.0 103312 872 pts/0 S+ 00:40 0:00 grep httpd 先把httpd的模型改回prefork模型 vim /etc/sysconf/httpd 原 HTTPD=/usr/sbin/httpd.worker 改为先给注释掉,前面加一个#号就行 #HTTPD=/usr/sbin/httpd.worker 重启服务 server httpd restart preforkr模型配置文件详解 vim /etc/httpd/con/httpd.conf 下面的这段话是以if判断来是否生效,根据启动MPM模型来判断是否生效 根据模块来判断是启用那个配置文件生效 这是prefork模型的配置文件详解 <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule> 解释: <IfModule prefork.c> prefork模型模块运行的模块 StartServers 8 服务启动时服务器启动的进程数 MinSpareServers 5 最小空闲进程数 MaxSpareServers 20 最大空闲进程数 ServerLimit 256 为MaxClients生命周期内的进程数量最大值 MaxClients 256 最大并发请求数,最大启动进程数量 MaxRequestsPerChild 4000 一个服务最多能相应多少次的请求 </IfModule> worker模型配置文件详解 修改成worker模型请往上看 启动/etc/sysconf/httpd下的HTTPD=/usr/sbin/httpd.worker 然后重启服务即可 if判断启动模块来生效哪个模块的配置文件 <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> 解释: <IfModule worker.c> StartServers 4 服务启动时服务器启动的进程数 MaxClients 300 服务器启动时最大的线程数 MinSpareThreads 25 最小空闲线程数 MaxSpareThreads 75 最大空闲线程数 ThreadsPerChild 25 每个进程,所启动的线程数 MaxRequestsPerChild 0 每个线程数所能最大相应请求的数量 </IfModule> 查看httpd直接编译进核心的模块列表 # httpd -l 返回结果: Compiled in modules: core.c(核心模块) prefork.c(prefork模块) http_core.c(httpd功能核心模块) mod_so.c(支持模块动态装卸载) 查看httpd静态及动态装卸载的模块 # httpd -M 返回结果: httpd: apr_sockaddr_info_get() failed for Centos6-1 httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName Loaded Modules: core_module (static) mpm_prefork_module (static) http_module (static) so_module (static) auth_basic_module (shared) auth_digest_module (shared) authn_file_module (shared) authn_alias_module (shared) authn_anon_module (shared) authn_dbm_module (shared) authn_default_module (shared) authz_host_module (shared) authz_user_module (shared) authz_owner_module (shared) authz_groupfile_module (shared) authz_dbm_module (shared) authz_default_module (shared) ldap_module (shared) authnz_ldap_module (shared) include_module (shared) log_config_module (shared) logio_module (shared) env_module (shared) ext_filter_module (shared) mime_magic_module (shared) expires_module (shared) deflate_module (shared) headers_module (shared) usertrack_module (shared) setenvif_module (shared) mime_module (shared) dav_module (shared) status_module (shared) autoindex_module (shared) info_module (shared) dav_fs_module (shared) vhost_alias_module (shared) negotiation_module (shared) dir_module (shared) actions_module (shared) speling_module (shared) userdir_module (shared) alias_module (shared) substitute_module (shared) rewrite_module (shared) proxy_module (shared) proxy_balancer_module (shared) proxy_ftp_module (shared) proxy_http_module (shared) proxy_ajp_module (shared) proxy_connect_module (shared) cache_module (shared) suexec_module (shared) disk_cache_module (shared) cgi_module (shared) version_module (shared) Syntax OK DSO动态共享对象 支持模块动态装卸载 模块装载目录 /usr/lib64/httpd/modules/ 配置指令实现模块加载 LoadModule <mod_name> <mod_path> 模块路径可使用相对路径(地址) 相对于ServerRoot指定的路径而言(/etc/httpd) /etc/httpd/modules这是一个软连接,连接到/usr/lib64/httpd/modules/ 装载模块的配置文件 /etc/httpd/conf/httpd.conf 如果要注释掉指定的模块只需要把模块LoadModule前面加上#号注释小即可比如 #LoadModule auth_basic_module modules/mod_auth_basic.so 默认是启用的 禁用掉的模块想启用只需要把前面的#号注释掉就启用了 定义网站根路径 DocumentRoot指向的丼为URL路径的起始位置 如:www.9527edu.org/ = DocumentRoot /var/www/html 默认网站根路径目录是在/var/www/html/下 修改默认网站根目录 单独创建一个目录做网站目录 mkdir -p /html/www/ 修改网站目录 vim /etc/httpd/con/httpd.conf 原 DocumentRoot "/var/www/html" 改后 DocumentRoot "/html/www 保存退出 重启apache service httpd restart 添加一个测试的页面到新的目录里面 echo "now test web index" > /html/www/index.html 利用curl命令测试访问 # curl 10.0.1.1 返回结果: now test web index 站点访问控制机制 可基于两种类型的路径指定对那些资源进行控制 文件系统路径: <Directory ""> </Direcotry> 单个目录 <File ""> </File> 单个文件 <FileMatch ""> </FileMatch> 正则表达式(尽量不使用正则表达式,效率低) URL路径: <location ""> </location> 访问控制机制: 基于来源地址: 基于用户账号密码: Direcotry中基于来源地址实现访问控制 Options选项,根据用户访问控制的选项或机制 所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews Indexes索引: 如果启用这个选项,你所在目录如果没有默认的索引页面,它会把你的网站下所有内容展示出来 实例: 启用状态, <Directory "/html/www"> Options Indexes FollowSymLinks Order allow,deny Allow from all </Directory> 禁用状态在Indexes前面加上-(减号) <Directory "/html/www"> Options -Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> FollowSymLinks 符号连接访问(软连接) 允许跟踪符号软连接到的连接文件 启用状态 <Directory "/html/www"> Options -Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> 禁用状态 <Directory "/html/www"> Options None Order allow,deny Allow from all </Directory> SymLinksifOwnerMatch 允许追踪,属主匹配的时候允许追踪原文件和符号连接的属主匹配的时候,否则就不允许 ExecCGI MultiViews 根据浏览器语言或者指定的选项去做匹配一般不启用,性能差 下面语句块解释: 基于来源地址的访问控制机制 <Directory "/html/www"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> 解释: Order 检查次序 Order allow,deny,只有你允许的才允许,需要做白名单 Order deny,deny,默认的都允许,只有deny的才deny,也就是做黑名单处理 allow deny ip:限制 NetAddr: 10.0. 10.0.0.0 10.0.0.0/16 10.0.0.0/255.255.0.0 实例: 拒绝10.0.1主机访问,允许10.0.0.0/24网段内的主机访问 vim /etc/httpd/con/httpd.conf 修改 <Directory "/html/www"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Deny from 10.0.0.1 Allow from 10.0.0.0/24 </Directory> 保存退出 重启服务以后10.0.0.1这台主机就无法访问了,但是其他主机照样可以访问 重启服务 service httpd restart 日志设定: 错误日志路径 ErrorLog logs/error_log 真实路径L:/etc/httpd/logs/error_log 日志级别: 默认是warn LogLevel warn 级别如下 debug, info, notice, warn, error, crit,alert, emerg 访问日志: CustomLog logs/access_log combined 解释: combined 日志格式 定义日志格式 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 解释: %h 客户端访问者的IP地址 %l 访问者用户名一般为空(不重要) %u 用户认证时的用户名,(一般为空)需要输入用户名和密码的 %t 服务器收到请求时的时间,提供服务的时间 \"%r\ 请求报文的首行信息(请求时的方法,请求时的URL,请求时的协议版本) %>s 记录访问请求时的状态码如200,302,302,404,403,500等 %b 相应报文的主体部分大小,单位是字节不包含相应报文首部 \"%{Referer}i\"{%{Foobar}i} 请求报文当中"referer"首部的值,当前资源的访问入口,从自于哪个超链接请求跳转而来 \"%{User-Agent}i\" 请求报文中的头部信息,也就是客户端的浏览器信息 即发出请求用到的应用程序, 详细的一段访问日志记录 10.0.0.1 - - [23/Oct/2021:19:11:27 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36" 路径别名: 21:00分 定义默认主页面可以要多个,自左而右生效 DirectoryIndex index.html index.html.var Centos7:httpd2.4 安装httpd yum install httpd -y 查看安装的httpd的软件包 # rpm -qa httpd 返回结果: httpd-2.4.6-97.el7.centos.1.x86_64 查看安装的httpd的配置文件 # rpm -qc httpd 返回结果: /etc/httpd/conf.d/autoindex.conf /etc/httpd/conf.d/userdir.conf /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.modules.d/00-base.conf /etc/httpd/conf.modules.d/00-dav.conf /etc/httpd/conf.modules.d/00-lua.conf /etc/httpd/conf.modules.d/00-mpm.conf /etc/httpd/conf.modules.d/00-proxy.conf /etc/httpd/conf.modules.d/00-systemd.conf /etc/httpd/conf.modules.d/01-cgi.conf /etc/httpd/conf/httpd.conf /etc/httpd/conf/magic /etc/logrotate.d/httpd /etc/sysconfig/htcacheclean /etc/sysconfig/httpd 解释: