http(1)
开启httpd服务,注意selinux 和防火墙设置。出现错误查看系统日志和http错误日志。
进程间通信:IPC socket:套接字 IP:PORT
Client <--> Server Server: listen Client: IP:PORT <--> IP:PORT IANA: 0-1023:永久地分配给固定的应用使用,80/http, 21/ftp, 25/smtp, 110/pop3, 143/imap4;仅root有权限使用,特权端口; 1024-41951:注册端口,但不严格,3306/mysql, 11211/memcached, 41952+:客户端程序使用的随机端口,动态端口,或称为私有端口; /proc/sys/net/ipv4/ip_local_port_range BSD Socket API: SOCK_STREAM, SOCK_DGRAM, SOCK_RAW 地址格式: IPv4: AF_INET IPv6: AF_INET6 Unix_Sock:AF_UNIX
http协议: 应用层协议:超文本传输 http/0.9 http/1.0:cache, MIME MIME: multipurpose internet mail extensions http/1.1:缓存功能,条件式请求; speedy: SPDY http/2.0:
html: <html> <head> <title>MageEdu</title> </head> <body> </body> </html> css, js, images, ... major/minor: images/ images/jpeg, images/png, images/gif, ... text/ text/plain, text/html, text/js, ... application/ ... http协议的实现: 开源实现:httpd(apache), nginx, lighttpd, ... C/S: C: browser, user agent, chrome, ie, firefox, safari, opera, ... elinks, curl, wget, ... S:httpd(apache), nginx, lighttpd, ... 通信模型: 请求/响应 stateless, cookie, ... 一次完整的Http请求处理过程: (1) 建立或处理连接请求; (2) 接收请求; (3) 解析请求,处理请求; (4) 加载用户请求的资源; (5) 构建响应报文; (6) 发送响应报文; (7) 记录访问于日志中; web资源: URL: 统一资源定位符; scheme://host[:port]/URL URL的根通常要映射为文件系统上的某路径; DocumentRoot /var/www/html/ /index.html --> /var/www/html/index.html /admin/index.html --> /var/www/html/admin/index.html /images/logo.jpg --> /var/www/html/images/logo.jpg Alias /images/ /data/imgs/ /images/logo.jpg --> /data/imgs/logo.jpg /images/a/3.gif --> /data/imgs/a/3.gif 事务:request/response request: <method> <url> <version> HEADERS <body> response: <version> <status> <reason-phrase> HEADERS <body> HEADERS: name: value name: value <method>:GET,HEAD,POST, PUT, DELETE, OPTIONS, TRACE, ... <status>: 1xx: 2xx: 成功响应 3xx: 重定向响应 4xx: 客户端错误 5xx: 服务端错误
httpd:
http://httpd.apache.org httpd: a patchy server, apache ASF: Apache Software Foundation http://www.netcraft.com httpd特性: 高度模块化设计:core modules + standard modules + 3rd party modules DSO: Dynamic Shared Object MPM: multipath process modules prefork:process 每进程响应一个请求; worker: thread 每线程响应一个请求; event: thread 每进程响应多个请求; 丰富功能: CGI:动态网站; 虚拟主机:IP,PORT,ServerName 反向代理:http, fcgi, wsgi, ajp, ... 负载均衡: ... 版本: httpd程序版本: httpd-1.x httpd-2.0 httpd-2.2 httpd-2.4 安装使用httpd: base epel 程序环境: 主程序文件: /usr/sbin/httpd 模块文件: /usr/lib64/httpd/modules/*.so 主配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf /etc/httpd/conf.modules.d/*.conf 站点文档路径: /var/www/html 日志文件路径: /var/log/httpd/ access_log:访问日志 error_log:错误日志 Unit File: /usr/lib/systemd/system/httpd.service 自带脚本: /usr/sbin/apachectl systemctl start httpd.service systemctl enable httpd.service ~]# ss -tnlp | grep ":80\>"
回顾: http协议: C/S:
事务:request/response start line HEADERS <BODY> request: <method> <url> < version> HEADERS <BODY> response: <version> <status> <reason-phrase> HEADERS <body> httpd: httpd-2.2 httpd-2.4 MPM: prefork:每进程响应一个请求; worker:每线程响应一个请求; event:每进程响应多个请求;
httpd(2)
httpd-2.4的基础配置
配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf /etc/httpd/conf.modules.d/*.conf 配置文件: DIRECTIVE VALUE DIRECTIVE: 不区分字符大小写;例如ServerRoot; VALUE:除了文件系统路径,大多数也不区分字符大小写; 配置修改完成后: (1) 测试语法; (2) 让服务程序重载配置文件: ~]# service httpd reload ~]# systemctl reload httpd.service 注意:不是所有修改都是重载就能生效,又时候需要重启服务。 不到万不得已,不要重启服务。!!!!尤其是线上的服务。
常见配置修改
1、监听的地址和端口 Listen [ip:]port Listen可重复使用多数;默认监听本地可用的所有地址;
2、保持连接 persistent connection:tcp连接建立后,资源获取完成之后不会断开连接,而是继续等待请求其它资源; 如何断开? 数量限制 时间限制
KeepAlive On|Off MaxKeepAliveRequests 100 KeepAliveTimeout 10 两个阈值,限制次数或时间,那个先到期都断开。默认开启保持连接 创建文件/etc/httpd/conf.d/keeplive.conf KeepAlive Off 即是关闭该功能。
浏览器默认每域名开启2线程或4线程。所以站点页面内容量大,加载会慢,所以有网站会使用多个域名。
3、DSO httpd命令: -t -D DUMPMODULES : show all loaded modules -M : a synonym for -t -D DUMPMODULES显示已经加载的模块
LoadModule mod_name modules/mod_file_name 相对路径: 相对于ServerRoot指令的值来说;/etc/httpd/ [root@centos7 ~]# ls /etc/httpd/ -l total 8 drwxr-xr-x. 2 root root 57 Oct 8 10:11 conf drwxr-xr-x. 2 root root 4096 Sep 11 15:14 conf.d drwxr-xr-x. 2 root root 4096 Oct 8 16:43 conf.modules.d lrwxrwxrwx. 1 root root 19 Sep 11 15:12 logs -> ../../var/log/httpd lrwxrwxrwx. 1 root root 29 Sep 11 15:12 modules -> ../../usr/lib64/httpd/modules lrwxrwxrwx. 1 root root 10 Sep 11 15:12 run -> /run/httpd 模块之间存在依赖关系。关闭模块时应注意~! [root@centos7 ~]# ls /etc/httpd/conf.modules.d/ 00-base.conf 00-mpm.conf 00-systemd.conf 00-dav.conf 00-proxy.conf 01-cgi.conf 00-lua.conf 00-ssl.conf 10-fcgid.conf 00-base.conf只需要注释掉相应的模块,再systemctl reload httpd 即可取消某模块加载。 或修改配置文件语法 LoadModule mod_name modules/mod_file_name
2.4使用 Include conf.modules.d/*.conf
模块都配置在上目录中。当然也可以直接配置在主配置文件中。
[root@centos7 ~]# ll /etc/httpd/conf.modules.d/ total 28 -rw-r--r--. 1 root root 3739 Nov 19 2015 00-base.conf ###基本模块 -rw-r--r--. 1 root root 139 Nov 19 2015 00-dav.conf -rw-r--r--. 1 root root 41 Nov 19 2015 00-lua.conf -rw-r--r--. 1 root root 742 Nov 19 2015 00-mpm.conf ###mpm配置模块 -rw-r--r--. 1 root root 957 Nov 19 2015 00-proxy.conf ##代理 -rw-r--r--. 1 root root 88 Nov 19 2015 00-systemd.conf -rw-r--r--. 1 root root 451 Nov 19 2015 01-cgi.conf ###CGI功能模块
以后有需要可以自己创建配置文件放到该目录下。
4、定义站点主页:
DirectoryIndex filename1 filename2 ... 定义主页文件,可以定义多个。 <IfModule dir_module> DirectoryIndex index.html </IfModule> /var/www/html/ 目录下或其子目录下有index.html文件,如果不只当访问的那个网页,直接访问该主页。
5、Main Server相关配置
(1) DocumentRoot 站点文档根路径; DocumentRoot "/var/www/html"
定义了中心服务器的网页放置那个路径下。
(2) ServerName 服务器名称; #ServerName www.example.com:80
默认是被注释掉的。服务器会反向解析主机地址到主机名。把反解析(hosts文件或DNS)的结果,与本机主机名(hostname)不一致会报错。防止报错,可直接修改该参数。取消注释,修改为正确的主机名。
站点文档访问授权及众多服务特性的配置:
默认httpd要对路径做授权,否则都不允许访问。 放置在一个容器中进行控制。 <> … </>
(1)基于文件系统路径:
<Directory "/PATH/TO/DIR"> ... </Directory> <DirectoryMatch ~ "正则表达式"> ... </DirectoryMatch> <File ""> 定义单个文件的访问授权 ... </File> ... 还有很多种访问控制方式。
例如禁止访问根
<Directory /> AllowOverride none Require all denied </Directory>
(2)基于URL进行:
<Location "URL"> ... </Location> <LocationMatch ~ "URL_PATTERN"> 使用正则表达式 ... </LocationMatch>
(3) Options 定义服务方式
Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
常用选项
Indexes:索引(除非是下载站,否则都是拒绝的) FollowSymLinks:允许跟踪符号链接 网页文件是链接过来的。不在/var/www/html路径下。(默认是不允许的。) ExecCGI:允许执行CGI脚本
(4) AllowOverride
httpd的访问控制配置,允许每目录单独进行;在每个目录下建立一个.htaccess文件; AllowOverride表示是否允许目录中的.htaccess文件中的配置来覆盖当前<>...</>配置段中的配置; Options FileInfo AuthConfig Limit All None
一般而言,为了性能使用none,否者文件被访问时,将从起始路径开始检查.htaccess文件。
(5) 基于源地址的访问控制 允许所有地址访问:Require all granted 拒绝所有地址访问:Require all denied
<RequireAll> </RequireAll> 基于IP控制: Require ip ADDRESS 允许 Require not ip ADDRESS 禁止 ADDRESS: ip network: 10.1.0.0/255.255.0.0 10.1.0.0/16 10.1 基于主机名控制: Require host HOSTNAME Require not host HOSTNAME HOSTNAME: FQDN DOMAIN.TLD
示例 除了10.0.0.1的所有主机都允许访问
<RequireAll> Require not ip 10.0.0.1 Require all granted </RequireAll>
违规的主机访问会记录到日志。
6、User/Group 定义httpd服务运行身份
User apache Group apache
7、路径别名
Alias /URL/ /PATH/TO/SOME_DIR/
在Alias命令段加入即可 但是需要给加入的目录授权,否者不能访问。2.4需要给目录显示授权。
Alias /furmo/ /websit/bbs/ <Directory "/websit/bbs"> AllowOverride none Require all granted Options None </Directory>
修改配置文件需要检查配置。
8、httpd-manual
# yum -y install httpd-manual 安装后重载服务 配置文件:conf.d/manual.conf [root@centos7 ~]# cat /etc/httpd/conf. conf.d/ conf.modules.d/ [root@centos7 ~]# cat /etc/httpd/conf.d/manual.conf # # This configuration file allows the manual to be accessed at # http://localhost/manual/ # AliasMatch ^/manual(?:/(?:de|en|fr|ja|ko|ru))?(/.*)?$ "/usr/share/httpd/manual$1" <Directory "/usr/share/httpd/manual"> Options Indexes AllowOverride None Require all granted </Directory> http://host/manual/
注意:这里使用的是别名匹配机制。也是别名。
9、status page 显示httpd服务当前工作状态的页面。是自动生成的。
通过stauts模块扩展实现的。 status_module httpd -M 查看是否加载了该模块
创建一个配置文件,/etc/httpd/conf.d/stauts.conf
<Location /status> SetHandler server-status ###使用SetHandler 调用模块生成页面。 Require all granted </Location>
基于url要是使用location授权
10、日志设定 两类日志
错误日志: ErrorLog "/var/log/httpd/error_log" LogLevel warn Possible values include: debug, info, notice, warn, error, crit, alert, emerg. 访问日志: LogFormat "FORMAT_STRINGS" LOG_FORMAT_NAME CustomLog "/PATH/TO/LOG_FILE" LOG_FORMAT_NAME format_strings: %h:Remote hostname. Will log the IP address if HostnameLookups is set to Off, which is the default. %l:Remote logname (from identd, if supplied). 无有效值时,使用“-”表示; %u: Remote user if the request was authenticated. May be bogus if return status (%s) is 401 (unauthorized). http协议认证时由客户端输入的用户名; %t:Time the request was received, in the format [18/Sep/2011:19:18:28 -0400]. %r:First line of request. %>s:Status. For requests that have been internally redirected, this is the status of the original request. Use %>s for the final status. %b:Size of response in bytes, excluding HTTP headers. %{VARNAME}i:记录由VARNAME所表示的请求报文首部的值,例如%{Referer}i,则表示记录请求报文中Referer首部的值;
可以定制记录的日志格式。
11、虚拟主机
主机标识方式: IP不同 ip资源不足,费用大。需要多个公网ip PORT不同 不同端口造成访问困难。 ServerName: 这个比较常用 在请求报文的首部,有一项内容标识要访问的主机
配置格式
使用<VirtualHost>容器进行配置。最需要的配置是server name 和document root两项 <VirtualHost IP:PORT> ServerName DocumentRoot <Directory ""> ... Require all granted </DIrective> ErrorLog CustomLog </VirtualHost> httpd-2.2中使用基于ServerName的虚拟主机时,需要先取消中心主机,要使用专用配置指令 NameVirtualHost IP:PORT 2.4配置中部需要此配置。也不需要取消中心主机,才能启动虚拟主机。 使用不同方式配置虚拟主机需要注意 ip方式配置,ip不能重复 端口方式配置,端口不能重复 server name方式,主机名不能相同(FQDN) 不同虚拟机的配置尽量放到不同配置文件中。便于管理配置。 注意:可以混合使用,比如前两个事端口方式配置,最后一个使用ip方式配置。
示例
<VirtualHost 10.1.0.68:80> ServerName www1.magedu.com DocumentRoot "/vhosts/www1" <Directory "/vhosts/www1"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.1.0.68:8080> ServerName www2.magedu.com DocumentRoot "/vhosts/www2" <Directory "/vhosts/www2"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 10.1.0.69:80> ServerName www3.magedu.com DocumentRoot "/vhosts/www3" <Directory "/vhosts/www3"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
如果全部使用servername配置虚拟主机
测试时使用域名测试,如果使用本机测试,修改本机的hosts文件,使用links访问三个域名即可实现三个虚拟主机访问。
测试结果
[root@centos7 ~]# curl http://www1.magedu.com w1 [root@centos7 ~]# curl http://www2.magedu.com w2 [root@centos7 ~]# curl http://www3.magedu.com w3 [root@centos7 ~]#
虚拟机配置文件
oot@centos7 ~]# vim /etc/httpd/conf.d/virtualhost.conf ▽ <VirtualHost 192.168.136.129:80> ServerName www1.magedu.com DocumentRoot "/websit/www1" <Directory "/websit/www1"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.136.129:80> ServerName www2.magedu.com DocumentRoot "/websit/www2" <Directory "/websit/www2"> Options None AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.136.129:80> ServerName www3.magedu.com DocumentRoot "/websit/www3" <Directory "/websit/www3"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
虚拟主机默认访问第一个虚拟主机(如果没有指定访问那个具体的主机) 也可以定义一个默认虚拟主机
<VirtualHost default:80>
12、基于用户的访问控制
Require user USERLIST Require group GRPLIST 虚拟用户: 确定访问服务器某个服务的用户身份,用户为虚拟用户。 认证方式: basic digest 需要浏览器支持 http协议认证过程 : 认证质询: WWW-Authencate:响应码为401,拒绝客户端请求,并说明用户需要输入正确的账号和密码之后方可访问; 认证: Authorization:客户端填入账号和密码,再次发送请求报文;认证通过,服务器发送响应内容; <Directory ""> Options None AllowOverride None AuthType Basic AuthName "STRING" AuthUserFile "" Require user USER1 USER2 ... </Directory> 也可以使用Require valid-user 文件中全部用户 账号文件生成工具htpasswd htpasswd [options] "/PATH/TO/HT_PASSWD_FILE" username -c:创建此文件; -m:md5加密密码存放; -s:sha加密 -D: 删除指定用户 [root@centos7 ~]# cat /etc/httpd/conf/.www1passwd tom:$apr1$dWA1eyPX$BCWKMy3K2KAdvThSMNk/a/ jerry:$apr1$fUXrpG9t$8Aj7wNwAnSXzj7gaONa0M1 [root@centos7 ~]# tree /websit/www1/ /websit/www1/ ├── admin │ └── index.html └── index.html <VirtualHost *:80> ServerName www1.magedu.com DocumentRoot "/vhosts/www1" <Directory "/vhosts/www1"> Options None AllowOverride None Require all granted </Directory> <Directory "/vhosts/www1/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin Area, Enter your name/pass" AuthUserFile "/etc/httpd/conf/.htpasswd" Require valid-user </Directory> ErrorLog "logs/www1-error_log" CustomLog "logs/www1-access_log" combined </VirtualHost> Require的使用方式: (1) Require valid-user (2) Require user USER1 USER2 ... 指定用户 基于组进行认证: <Directory "/vhosts/www1/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin Area, Enter your name/pass" ###该内容随便写 (会在将来提示输入用户名和密码的窗口上显示) AuthUserFile "/etc/httpd/conf/.htpasswd" AuthGroupFile "/etc/httpd/conf/.htgroup" Require group GRPNAME1 GRPNAME 2 </Directory> 创建组账号文件: 每行定义一个组 group_name: user1 user2 ...
任何要进程要读取数据,就要与之对应的数据载体(方式)有对应的交互接口。 文件系统–系统调用 mysql–要能读取mysql套接字,支持mysql协议。
获取任何数据,就要有与之对应的实现,库,协议,驱动…
练习:(1) 基于主机名实现三个虚拟主机 (2) 每虚拟主机使用独立的访问日志和错误日志 (3) 第三个虚拟主机的/admin要进行用户访问认证 (4) 在第二个虚拟主机上提供/status; (5) 在第三个虚拟主机提供路径别名/bbs,访问其它文件系统路径; (6) 尝试使用混合类型的虚拟主机: 基于IP,PORT和ServerName 练习2:使用脚本实现基于主机名的虚拟主机按需创建; 每虚拟使用单独的配置文件; 脚本可接受参数,参数虚拟主机名称;
是否创建虚拟主机 是 输入主机名 检查/etc/httpd/conf.d/目录下是否有重名的。
指定主机doucumentroot 是否使用认证 是 创建用户名和密码文件
自动创建目录并授权配置认证
是否创建路劲别名 是 提示输入别名 输入目标路径
创建配置文件到/etc/httpd/conf.d/NAME-vhost.conf
创建脚本文件。创建配置文件
原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/56556