http协议--Apache-Httpd服务基本配置-rpm安装-编译安装(HTTP2.2,HTTP2.4)
socket: OSI七层: 上三层:用户空间 下四层:通信子网,内核空间 ip:主机到主机通信 MAC:设备到设备 传输层:提供进程地址 POrt number tcp:传输协议,面向连接的协议,通信前需要建立虚拟链路,结束后拆除链路 数据流同信 udp:非面向连接的协议 数据报文通信 Socket:IPC的一种实现(共享内存等都是IPC实现),位与同一主机或不同主机,不同进程之间通信,从而完成数据交换 Socket API:库调用接口 TCP:端口0-65535 UDP:端口0-65535 socket 有三种类型: 使用TCP:SCOK_SEREAM 使用UDP:SOCK_DGRAM IP报文直接通信:SOCK_RAW TCP层功能:提供端口(向内核申请) 0-1023:只有root使用,永久的分配给固定的程序 1024-41951:注册端口,分配给程序注册为某应用使用 41951-65535:客户端随机使用的端口,动态端口。 双方通信 是建立了 一对套接字,客户端使用 41952以上的随机端口,服务器 是固定使用端口 [root@node1 ~]# cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999 TCP特性: 半关闭:你可以理我,我可以不理你 工作在传输层 面向连接协议 错误检查 将数据打包成段,排序 确认机制 数据恢复:重传 流量控制:滑动窗口(自己能接收报文的空闲有多大,也就是接收方的缓存有多大) 拥塞控制:慢启动和拥塞避免算法 (可能数据量大,但是此时的带宽很小) Socket Domain:根据使用的地址 AF_INET:基于ipv4的 AF_INET6:基于ipv6 AF_UNIX:同一主机上的(应用程序,绕过TCP/IP协议栈,不往下再走,直接返回) 每类套接字都至少提供了两种socket,流,数据报 流: 可靠的传递,面向连接,无报文边界,只要建立连接,就一直可以传数据 数据报: 不可靠的传递,有边界,非面向连接(因为面向非连接,所以必须有开始,有结束,即边界) 套接字相关的系统调用: socket():创建套接字 bind():绑定套接字 listen():j监听 accept():接受请求 connect():请求连接建立 write():发送数据 reead();从缓存接受数据 send(),recv(), sendto(),recvfrom() 10Mbps=10*1024Kbps=10*1024*1024bps=10*1024*1024/8 Byte/s=10/8 MB/s=1.25 MB/s http协议:超文本传输协议 html:编程语言,超文本标记语言 <html> <head> <h1></h1> <p>.....<a href="www.baidu.com">‘’‘’</a></p> </head> </html> CSS: javascript MIME:通过文本协议发送非文本协议 工作机制: http请求 http相应 web资源:web resource 静态文件:jpg,gif,txt,js,css,mp3,avi 动态文件:php,jsp 媒体: 媒体类型:(MIME是对其分别编码的),major/minor --主类型/次类型 text/html image/jpeg URI:同一资源标识符 URL:统一资源定位符,用于描述某服务器特定资源的位置 <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag> scheme:方案,访问服务器以获取资源时要使用哪种协议 user:用户,某些方案访问资源时需要的用户名 password:密码,用户对应的密码,中间用:分隔 Host:主机,资源宿主服务器的主机名或IP地址 port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号 path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔 params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔 query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔 frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔 定位到某个位置 相对URL:同一个站点内的 绝对URL:夸站 URN:统一资源命名 http协议版本: HTTP/0.9:源版本 HTTP/1.1:增强了缓存 HTTP/2.0: 无状态的: 不会记录谁访问的服务器 引入cookie追踪同一个用户 客服端第一次访问服务器端,服务器端会发一个随机数据,唯一标识用户信息, 客户端会将其保存到本地磁盘。之后在访问,将相应的服务器的cookie信息带上。 服务器端利用seeion保存会话信息 http事物: 请求:request 响应:reaponse 报文语法格式: request报文: <nethod> <url> <version> <headers>:很多请求首部 换行 <entity-body> response报文: <version> <status> <响应短语> <headers> <emtity-body> method:请求方法,客户端希望服务器端希望对资源执行的动作 GET,HEAD, POST URL: version:HTTP/主版本号.次版本号 status: 响应短语:状态码的简要描述 headers:标记请求或响应的属性的。 每个请求或响应报文可包含任意个首部0,1或多个 每个首部有名称,后面跟一个冒号,再跟一个可选空格,接着是一个值 entity-body: 有用的数据块,请求的报文可能为空 method: GET:从服务器获取一个资源 HEAD:只从服务器获取响应首部(<version> <status> <响应短语> <headers>这两行) POST:向服务器发行要处理的数据 PUT:将请求的主体部分存储在服务器上(危险) DELETE:删除服务器上指定的文档 TRACE:追踪请求到达服务器中间经过的代理服务器 OPTIONS:请求服务器返回对指定资源支持的使用方法 status: 1xx:100-101,信息提示 2xx:200-206,成功类的信息 3xx:300-305,重定向类的状态码,301 永久重定向,302 临时重定向 4xx:400-415:客户端错误 5xx:500-505,服务器错误 常用的状态码: 200:成功响应 -- ok 301:永久重定向 -- Moved Permanently 302:临时重定向 -- Moved Temporarily 304:本地有缓存,问服务器端,资源是否发生变化,服务器端资源未发生改变 -- Not Modified 401:需要输入账号密码访问 Unauthorized 403:请求别禁止Forbidden 404:服务器无法找到客户端请求的资源, Not Found 500:服务器内部错误 Intrenal Server Error 502:代理服务器从后端服务器收到了一条伪响应,如无法连接到网关:Bad Gateway 503:服务器不可用,临时服务器维护或过载,服务器无法处理请求 504:网关超时 首部的分类: 通用首部:即可用在响应也可用在请求 请求首部 响应首部 实体首部 扩展首部 通用首部: Date:报文的创建时间 Connecion:连接方式 Via:显示报文经过的中间节点 Cache-Control:控制缓存 Pragma:也是缓存相关 请求首部: Accept:通过服务器自己可接受的媒体类型 Accept—Charset Accept-Ecoding:接受的编码格式,如gip Accept-Language Client-IP Host:请求的服务器名称和端口号 Referer:包含当前正在请求的资源的上一级资源 User-Agent:客户端代理(浏览器类型等) 条件式请求首部: Expect IF-Modified-Since:自从指定的时候之后,请求的资源是否修改 IF-Unmodified-Since IF-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag不匹配 IF-Match 安全请求的首部: Authorization:向服务器发送认证信息,如账号密码 Cookie:向服务器端发送cookie Cookie2 代理请求首部: Proxy-Authorization:向待服务器认证 响应首部: 信息性: Age:有效期限,响应持续时长 Server:服务器类型 ,软件名称和版本 协商首部:某资源有多种昂表示方法时使用 Accept-Range:服务器可接受的请求范围类型 Vary:服务器查看的其他首部列表 安全响应首部: Set-Cookie:向客户端设置cookie www.Authenticate:来自副武器的对客户端的质询认证表单 实体首部: Allow:列出对此实体可使用的请求方法 Location:告诉客户端真正实体位与何处 Content-Encoding:内容编码模式 Content-Language Content-Length:主体的长度 Content-Location:实体真正所处的位置 COntent-Type:主体的对象类型 缓存相关的: ETag:实体的扩展标签 Expires:实体的过期时间 Last-Modified:最后一次修改的时间 一次完整的http请求过程: 1、建立或处理连接的过程 --- 接受请求或s拒绝请求 2、接受请求,客户端http请求报文是什么 --- 接受来自于网络的请求报文中对某一资源的一次请求的过程 并发访问响应模型(web IO) 单进程IO结构:启动一个进程处理用户请求,而且一次只能处理一个,多个请求被串行响应 多进程IO结构:并行启动多个进程,每个进程响应一个请求 IO 复用:一个进程响应N 个请求 --- 多线程模型,一个进程生成n 个线程,一个线程响应一个用户请求 --- 事件驱动:event-driven 复用的多进程IO结构:启动多个进程,每个进程响应n个请求 3、处理请求--- 对请求报文进行解析,并获取请求的资源及请求方法等相关信息 元数据:请求报文首部 <method> <url> <version> Host:www.baidu.com 请求的主机名称 connection: 4、访问资源 --- 获取报文中指定请求的资源 web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放在某路径下,此路径称为 DocRoot web服务器资源路劲映射方式: docroot alias 虚拟主机映射 用户家目录docroot 5、构建响应报文 --- MIME类型 显示分类 魔法分类 协商分类 URL重定向: 6、发送响应报文 7、记录日志 http服务器程序: httpd(apache) nginx lighttpd(类似nginx) 应用程序服务器: IIS:解析.net tomcat,jetty,jboss,resin 重量级:webshpere,weblogic,oc4j httpd的安装和配置 httpd:apache httpd的特性: 高度模块化设计(动态)core + modules DSO:动态共享对象 MPM:多路处理模块 prefork:多进程模型,每个进程响应一个请求 一个主进程:负责生产N 个子进程,子进程也称为工作进程,每个子进程处理一个用户请求,即便没有用户请求,也会生产多个空闲进程,随时等待请求到达。 最大不会超过1024个 被用后的子进程,还会回到空闲进程,以便下次用 worker:多进程多线程模型,每个线程处理一个用户请求 一个主进程:负责生产子进程,负责创建套接字,赋值接受请求,并将其派发给某子进程进行处理, 多个子进程:每个子进程负责生产多个线程 每个线程:负责响应用户请求 并发响应数量:m*n m:子进程 n:每个子进程的最大线程数 event:事件驱动,多进程模型,每个进程响应多个请求 一个主进程:f负责生产子进程, 子进程:基于事件驱动机制直接响应多个请求 http-2.4:event可以用于生产环境 httpd的功能特性: 虚拟主机 IP、Port、FQDN CGI:Common Gateway Interface,通用网关接口; 反向代理 负载均衡 路径别名 丰富的用户认证机制 basic digest 支持第三方模块 安装: CentOS6 2.2 CentOS7 2.4 安装httpd: rpm包 源码编译安装 CentOS 6: rpm安装 rpm -qc httpd 配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf 服务脚本: /etc/rc.d/init.d/httpd -- 配置文件:/etc/syscongfig/httpd MPM:默认使用prefork 主程序文件 /usr/sbin/httpd /usr/sbin/httpd.event /usr/sbin/httpd.worker 日志文件: /var/log/httpd access_log:访问日志 error_log:错误日志 web启动停止信息,运行中的错误信息 站点文档目录: /var/www/html 模块文件路径: /usr/lib64/httpd/mpdules 配置文件的组成: [root@node1 ~]# grep 'Section' /etc/httpd/conf/httpd.conf ### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Hosts 配置格式:direcctive value directive:不区分大小写 value:为路径时,取决于文件系统是否区分大小写 任何文本信息服务,都可以使用telnet连接 PV,UV: PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量 UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的 常用配置: 1、修改监听port和IP:可以出现多条 Listen 80 Listen ip:port 2、持久连接: 长连接:持久连接,每个资源获取成功后,不会断开连接,继续等待其他请求的完成 如何断开: 数量限制:默认获取100个资源,之后就断开 时间限制:可配置,不建议太长,有可能空闲的时间太长 副作用:对并发访问量较大的服务器,持久连接,会使得有些请求得不到相应。 折中的方案:使用较短的链接时间,5s httpd2.4 支持毫秒级的 httpd 1.0 默认持久连接 短连接:每次(每个资源)都要三次握手 KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 15 测试: telnet host port Get /url HTTP/1.1 Host: ip or hostname 3、MPM: 多道处理模块 httpd-2.2 不支持同时编译多个模块,所以只能编译时选定一个,rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持,确认方法: ps aux | grep httpd 默认为/usr/sbin/httpd ,其使用prefork 查看模块列表的方式: httpd -l:查看静态编译的模块 [root@node1 conf]# httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c 如果程序是work: httpd.work -l 如果是event httpd.event -l httpd -M:当前httpd加载的所有模块 更换使用的httpd程序; /etc/sysconfig/httpd 重启服务才能生效 prefork的配置: <IfModule prefork.c> StartServers 8 --- 服务启动时启动的进程数,与cpu相关 MinSpareServers 5 --- 最小空闲进程数 MaxSpareServers 20 --- 最大空闲进程数 ServerLimit 256 --- 为下面一条所准备的在其服务器生命周期的最大值 MaxClients 256 --- 最多只允许这么多同时访问 MaxRequestsPerChild 4000 --- 一个服务器进程最多响应多少次的服务请求,之后kill掉,再重新建立连接 </IfModule> worker的配置 <IfModule worker.c> StartServers 4 --- 启动的进程数,不包含默认主控的root MaxClients 300 --- 最大请求 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 --- 所以刚开始启动4个,一会就变成3个,因为最多 75个线程 MaxRequestsPerChild 0 </IfModule> 300 * 86400 4、DSO:模块的动态装卸载 LoadModule <mod_name> <mod_path> 模块路径可以使用相对地址,但是相对于 ServerRoot(/etc/httpd)指向的路径而言。 /etc/httpd/modules/ 5、定义'Main' server 的文档页面路径 DocumentRoot --- 文档路径映射 文档路径映射: DocumentRoot指向的路径为URL路径的起始位置 把selinux,IPtables关掉 6、站点访问控制: 可基于两种类型的路径指明对那些资源进行访问控制 文件系统路径: <Directory ''></Directory> 目录 <File ''></File> 单个文件 <FileMatch ''></FileMatch> 模式匹配 URL:路径控制: <Location ''></Location> 访问控制机制: 基于来源地址: 基于用户账号: 7、Directory中 基于来源地址 实现访问控制 options: 所有可用选项: Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews 常用: ALL: None: Indexes:默认返回(默认是打开的,显示文件,例如下载站点那样) apache的httpd是提供了欢迎页面的,在conf.d下 FollowSymLinks:某文件连接到DocumentRoot下是否允许访问 SymLinksifOwnerMatch:属主匹配才可以访问 AllowOverride: None:不用太多关注 基于原地址的访问控制机制 Order:检查次序(后面的是默认的) order allow,deny order dengy,allow Allow from 。。。 Deny from 。。。 来源地址: IP 网络地址: 172.16 172.16.0.0 172.16.0.0/16 172.16.0.0/255.255.0.0 8、定义默认主页面:url没有指定主页面,就会从默认页面访问,从左往右依次,第一个没有,则访问第二个。如果都没有,则需要Directory 的 Indexes DirectoryIndex index.html denx.html 9、日志定义 错误日志: ErrorLog logs/error_log LogLevel: debug, info, notice, warn, error, crit,alert, emerg. 默认:warn 访问日志: CustomLog logs/access_log 日志格式: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" "%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent %h:客户端IP地址 %l:logname, - 表示为空,是一个模块功能 %u:远程 user %t:服务器收到请求时的时间 \:转义 %r:请求报文的首行信息(method,url,version) %>s:响应状态码 %b:响应报文主体大小,不包括响应报文首部大小 %{Referer}i:请求报文当中 ‘referer’首部的值 到达当前页面的入口,即来自原哪个页面请求跳转过来的超链接 %{User-Agent}i:请求报文当中User-agent首部的值,即发出请求用到的应用程序 10、路径别名: DocumentRoot '/www/htdocs' http://www.jerry.com/download/bash-4.x86.rpm ---/www/htdocs/download Alias /URL/ '/path/to/somedir/' ---- RUL后的 / 和 后面对应,要不全有,要不全没有 Alias /bbs/ '/forum/' http://www.jerry.com/bbs/index.html --- /forum/index.html 11、设定默认字符集 AddDefaultCharset UTF-8 12、基于用户做访问控制; 认证质询:输入框(同时给一个错误响应) www.Authentitacate: 401,先拒绝请求,要提供账号密码 认证: Authoriazation:客户端用户提供账号密码,再次请求。 认证类型: basic:明文认证(base64) digest:消息摘要 安全域:需要用户认证后才能访问的路径 应该通过名称对其进行标识,并用于告知用户认证的原因。 用户的账号和密码存储何处: 虚拟账号:仅用于访问某服务时用到的认证标识 存储: 文本文件 sql数据量 ldap NIS basic认证: 定义安全域 <Directory ''> Option None AllowOveride None AuthType Basic AuthName 'string;' AuthUserFile '.htpasswd' Require User username1,username2... </Directiory> 允许招行文件中的所有用户登录访问: Require valid-user 提供账号和密码存储(文本文件) 使用htpasswd命令生成 htpasswd [options] username -c:自动创建file,第一次创建用户使用 -m:md5 -s:ssha1加密 -D:删除指定用户 基于组账号认证: <Directory ''> Option None AllowOveride None AuthType Basic AuthName 'string;' AuthUserFile '.htpasswd' AuthGroupFile '.htgroup' Require group group_name... </Directiory> 要提供:用户账号文件和组文件 组文件:每一行一个组 GROUP_NAME: user1,user2.... 13、虚拟主机 hostname 服务器端是可以看见的,通信报文会在应用层加上,并不是为了通信,因为通信之前都会根据dns解析出IP地址 三种实现: 基于IP: 每个虚拟主机准备至少要一个IP地址 -- 很少用,变化的,而且外网还得租用 基于端口: 每个虚拟主机准备至少一个专用port--很少用,改了端口,别人就不知道了 配置的时候,这个端口一定要监听:Listen 8080 基于主机名: 2.2版本,要启动 NameVirtualHost *:80这一项 如果这里使用*:80 虚拟机也使用,否则同一使用ip:80 为每个虚拟主机提供专用的hostname 可以混合使用上述三种方式 虚拟主机不要跟中心主机混用,所以要使用虚拟主机,先禁用中心主机 ---注释DocumentRoot 每个虚拟主机都有专用的配置 <VirtualHost 'IP:PORT'> ServerName DocumentRoot </VirtualHsot> 中心主机的基本都可以使用 ServerAlias:虚拟主机的别名 ErrorLog CustomLog <Directory ''> </Directory> service httpd configtest(-t)测试配置文件是否正常 测试: 网卡上配置两个ip 写一个virtual.conf 本地测试:/etc/reslov.conf 使用curl 测试 否则修改win的hosts文件 14、内置的status页面: <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from .example.com </Location> 15、curl的使用: -A/--user-agent <string> 设置用户代理发送给服务器 -basic 使用HTTP基本认证 --tcp-nodelay 使用TCP_NODELAY选项 -e/--referer <URL> 来源网址 --cacert <file> CA证书 (SSL) --compressed 要求返回是压缩的格式 -H/--header <line>自定义首部信息传递给服务器 -I/--head 只显示响应报文首部信息 --limit-rate <rate> 设置传输速度 -u/--user <user[:password]>设置服务器的用户和密码 -0/--http1.0 使用HTTP 1.0 elinks: links: 16、使用mod_deflate模块压缩页面优化传输速率 适用场景: (1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持; (2) 压缩适于压缩的资源,例如文件文件; SetOutputFilter DEFLATE # mod_deflate configuration # Restrict compression to these MIME types AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/css # Level of compression (Highest 9 - Lowest 1) DeflateCompressionLevel 9 # Netscape 4.x has some problems. BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html 17、https 基于服务器端口443的连接; ssl连接; http over ssl = https 443/tcp ssl: v3 tls: v1 https:// SSL会话的简化过程 (1) 客户端发送可供选择的加密方式,并向服务器请求证书; (2) 服务器端发送证书以及选定的加密方式给客户端; (3) 客户端取得证书并进行证书验正: 如果信任给其发证书的CA: (a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名; (b) 验正证书的内容的合法性:完整性验正 (c) 检查证书的有效期限; (d) 检查证书是否被吊销; (e) 证书中拥有者的名字,与访问的目标主机要一致; (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换; (5) 服务用此密钥加密用户请求的资源,响应给客户端; 注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机; 回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3) 配置httpd支持https: (1) 为服务器申请数字证书; 测试:通过私建CA发证书 (a) 创建私有CA (b) 在服务器创建证书签署请求 (c) CA签证 (2) 配置httpd支持使用ssl,及使用的证书; # yum -y install mod_ssl 配置文件:/etc/httpd/conf.d/ssl.conf DocumentRoot ServerName SSLCertificateFile SSLCertificateKeyFile (3) 测试基于https访问相应的主机; # openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename] 18、httpd自带的工具程序 htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具; apachectl:httpd自带的服务控制脚本,支持start, stop; apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具; rotatelogs:日志滚动工具; access.log --> access.log, access.1.log access.log, access.1.log, access.2.log suexec: 访问某些有特殊权限配置的资源时,临时切换至指定用户运行; ab: apache benchmark 19、http压力测试工具 简易: ab webbench http_load 强大的: jmeter loadrunner 网易: tcpcopy ab [OPTIONS] URL -n: 总的请求数 -c:模拟的并发数 -k: 以持久连接模式测试 ulimit -n #: 调整当前用户所同时打开的文件数; http-2.4 新特性: (1) MPM支持运行DSO机制;以模块形式按需加载; (2) 支持event MPM; (3) 支持异步读写; (4) 支持每模块及每个目录分别使用各自的日志级别; (5) 每请求配置;<If> (6) 增强版的表达式分析器; (7) 支持毫秒级的keepalive timeout; (8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令; (9) 支持用户自定义变量; 新模块: (1) mod_proxy_fcgi:可以是httpd和php服务器连接 (2) mod_ratelimit (3) mod_remoteip 修改了一些配置机制: 不再支持使用Order, Deny, Allow来做基于IP的访问控制; 安装httpd-2.4 httpd依赖于apr-1.4+, apr-util-1.4+, [apr-icon] apr: apache portable runtime运行时环境 CentOS 6:推荐编译安装,不建议升级apr,会影响别的程序 默认:apr-1.3.9, apr-util-1.3.9 编译安装步骤: 1.4+版的apr和apr-util 前提: 安装开发环境,相关的开发包租,安装pcre-devel(支持正则) (1) apr # ./configure --prefix=/usr/local/apr # make && make install (2) apr-util # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr # make && make install # groupadd -r apache # useradd -r -g apache apahce # ./configure --prefix=/usr/local/apache --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork # make && make install 启动服务: apachectl CentOS 7: 配置文件:httpd -l 下 就没有mpm 模块了,因为动态共享了 主配置文件:/etc/httpd/conf/httpd.conf 模块配置文件:/etc/httpd/conf.modules.d/*.conf 辅助配置文件:/etc/httpd/conf.d/*.conf MPM:以DSO机制提供,配置文件00-mpm.conf 服务控制:systemctl {start|stop|restart|status|reload} httpd.service 配置: (1) 切换使用MPM LoadModule mpm_NAME_module modules/mod_mpm_NAME.so NAME: prefork, event, worker (2) 修改'Main' server的DocumentRoot (3) 基于IP的访问控制法则:每个路径默认都是无法访问的,必须提供控制 允许所有主机访问:Require all granted 拒绝所有主机访问:Require all deny 控制特定IP访问: Require ip IPADDR:授权指定来源地址的主机访问 Require not ip IPADDR:拒绝指定来源地址的主机访问 IPADDR: IP: 172.16.100.2 Network/mask: 172.16.0.0/255.255.0.0 Network/Length: 172.16.0.0/16 Net: 172.16 控制特定主机(HOSTNAME)访问 Require host HOSTNAME Require not host HOSTNAME HOSTNAME: FQDN: 特定主机 DOMAIN:指定域内的所有主机 <RequireAll> #单独的主机能否访问,要放在这个容器中 Require all granted Require not ip 10.252.46.165 </RequireAll> (4) 虚拟主机 基于IP、Port和FQDN都支持; 基于FQDN的不再需要NameVirtualHost指令; (5) ssl 启用模块: LoadModule ssl_module modules/mod_ssl.so (6) 服务脚本(centos6编译安装,所以需要 一个服务脚本,否则手动到安装目录下启动apachectl 只需要将centos6 上默认安装的HTTP2.2的服务脚本/etc/rc.d/init.d/下复制一份,并修改如下: apachectl=/usr/local/apache/bin/apachectl httpd=/usr/local/apache/bin/httpd prog=httpd pidfile=${PIDFILE-/var/run/httpd/httpd24.pid} lockfile=${LOCKFILE-/var/lock/subsys/httpd24} 在加到服务中 chkconfig --add httpd24 就可以直接使用 service httpd24 start
脚本路径别名(CGI接口):现在极少用 URL-->FileSystem Directory CGI:Common Gateway Interface(通用网关接口)使WEB可以跟一个应用程序进行通信,从通信环境中获得结果。 没有CGI:通过文件后缀识别,如果不能处理,就下载,没有后缀,直接读取 但是后端程序支持CGI协议才可以,bash就是其中之一。 CGI是不安全的,后端必须以root身份执行。 请求的数据,在本地执行后,如果: 在第一行写入 echo “Content-Type:text/html:表示支持CGI的 mod_alias,mod_cgi ScriptAlias /URL/ "/path/to/somewhere" somewhere下的文件可以被执行 也可以在目录中实现 格式一般为 cat << EOF Content-Type:text/html <pre> The time is : `date`. </pre> EOF
为什么要坚持,想一想当初!