一、回顾
1、http协议:web,html,http,httpd
2、httpd:2.2,2.4
3、MPM:多路处理模块
a、prefork:两级进程模型,父进程管理子进程,每个子进程响应一个请求。
b、worker:三级模型,父进程管理子进程,子进程通过线程响应用户请求,每线程处理一个用户请求。
c、event:两级模型,父进程管理子进程,子进程通过event-driven机制直接响应n个请求。
二、httpd-2.4的常用配置
1、主配置文件:/etc/httpd/conf/httpd.conf
a、第一部分(section1):Global Environment,定义进程自己的工作特点或对所有的虚拟主机都通用的工作设定。
b、第二部分(section2):"Main" server configuration,主服务器配置段,对于httpd来讲,去配置一个网站有两种模型。
(1)、第一种是我们直接一个httpd服务器上运行了一个服务站点,所以这个站点我们不需要额外的其它设定就直接去配置这样一个站点,这种我们称之为中心主机,也叫主服务器。
(2)、有可能有些网站访问量非常少,一天估计就几万访问量而已,在这样的环境下一个服务器直接去承载一个站点太大材小用了,因此我们可以使用单台服务器去承载多个站点,即在一个物理服务器上可以做多个虚拟主机,每一个虚拟主机去维护一个独立的网站,他有自己独立的主机名,也叫做域名。有自己独立的网页文件路径。比如第一个网站在/var/www1/目录下,第二个网站在/var/www2/目录下等等...。
(3)、在httpd2.4中只要你启用了虚拟服务器主服务器就自动生效了。而2.2中要启用虚拟服务器需要将主服务器关掉。
c、第三部分(section3):Virtual Hosts
2、配置格式
a、directive value
directive:不区分字符大小写
value:为路径时,是否区分字符大小写,取决于文件系统
3、常用配置
a、修改监听的IP和PORT
Listen [IP:] PORT
(1)、省略IP表示为0.0.0.0
(2)、Listen指令可重复出现多次
Listen 80
Listen 8080
(3)、修改监听socket,重启服务器进程方可生效
(4)、限制其必须通过ssl通信时,protocol需要定义为https
b、持久连接(保持连接,长连接)
(1)、Persistent Connection:tcp连接建立后,每个资源获取完成后不完全断开连接,而是继续等待其它资源请求的进行
(2)、如何断开?
1)、数量限制
2)、时间限制
(3)、副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应。
(4)、折中:使用较短的持久连接时长,以及较少的请求数量
(5)、要启用持久连接功能
1)、KeepAlive On|Off (ON表示启用,Off表示不启用)
2)、KeepAliveTimeout 15(启用长连接后超时时间为15秒)
3)、MaxKeepAliveRequests 100(15秒钟之内如果获取的资源数量超过100个就提前断开)
(6)、测试
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
host:WEB_SERVER_IP
(7)、配置长连接关闭(默认也是关闭的)
1)、创建相应的配置文件并检查语法是否有错
[root@www conf]# cat /etc/httpd/conf.d/keepalive.conf KeepAlive Off [root@www conf]# httpd -t Syntax OK
2)、我们通过telnet连接后可以发送相应的请求,可以看到请求后就断开了
[root@www conf]# telnet 192.168.10.13 80 Trying 192.168.10.13... Connected to 192.168.10.13. Escape character is '^]'. GET /index.html HTTP/1.1 #手动输入我们使用GET方法请求index.html资源,使用HTTP/1.1协议然后回车 Host: 192.168.10.13 #输入我们的主机名 (这儿敲两次回车,下面的内容是回显) HTTP/1.1 404 Not Found Date: Wed, 13 May 2020 06:58:48 GMT Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips mod_fcgid/2.3.9 Content-Length: 208 Connection: close Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>404 Not Found</title> #告诉你主机上没有主页 </head><body> <h1>Not Found</h1> <p>The requested URL /index.html was not found on this server.</p> </body></html> Connection closed by foreign host
(8)、配置长连接打开。可以在三十秒内请求一百个资源,无论先到达哪个指标我们服务器端都会端开
1)、配置相应参数并检查语法错误
[root@www conf.d]# cat /etc/httpd/conf.d/keepalive.conf KeepAlive On KeepAliveTimeout 30 MaxKeepAliveRequests 100 [root@www conf.d]# httpd -t Syntax OK
2)、然后我们在/var/www/html/目录下创建index.html文件,并写上Test Page内容,再重启服务并telnet我们的80端口。可以看到此次我们可以请求到我们的index.html资源,并且请求后不会马上断开。等三十秒到达后就会自动断开。
[root@www conf.d]# systemctl restart httpd [root@www conf.d]# telnet 192.168.10.13 80 Trying 192.168.10.13... Connected to 192.168.10.13. Escape character is '^]'. GET /index.html HTTP/1.1 Host: 192.168.10.13 HTTP/1.1 200 OK Date: Wed, 13 May 2020 07:09:55 GMT Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips mod_fcgid/2.3.9 Last-Modified: Wed, 13 May 2020 07:09:14 GMT ETag: "a-5a58241fadba3" Accept-Ranges: bytes Content-Length: 10 Content-Type: text/html; charset=UTF-8 Test Page [root@www conf.d]#
(9)、注意:httpd-2.4的keepAliveTimeout可以是毫秒级,不加单位时默认的是秒
KeepAliveTimeout num[ms]
c、MPM(httpd-2.2相应配置信息)
(1)、httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的哪个;CentOS6的rpm包为此专门提供了三个应用程序文件,httpd(prefork),httpd.worker,httpd.event,分别用于实现对不同的MPM机制的支持;确认现在使用的是哪个程序文件的方法:ps -aux |grep httpd
(2)、默认使用的为/usr/sbin/httpd,其为prefork的MPM模块
1)、查看httpd程序的模块列表,即显示静态编译的模块: httpd -l
2)、查看静态编译及动态编译的模块:httpd -M(shared表示动态模块,需要使用LoadModule来装载然后才能工作,static表示静态模块,直接随程序自带,是直接工作的)
(3)、更换使用httpd程序,以支持其它MPM机制(CentOS6中httpd2.2)
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}
(4)、注意:重启服务进程方可生效
(5)、MPM配置(2.2和2.4配置都一样,2.4要添加相应的配置文件将下属标签中的内容添加至/etc/httpd/conf.modules.d/00-mpm.conf中即可)
1)、prefork的配置
<IFModule prefork.c> #如果程序中使用的是prefork.c这个模块那么标签中的指令就生效
StartServers 8 #httpd服务进程启动以后不管有没有人访问我们就立即创建出几个空闲的子进程出来。可以通过ps -aux|grep httpd查看httpd的进程数。
MinSpareServers 5 #最小空闲进程数,即无论怎么访问你至少得有5个空闲进程等待着新请求进来以后响应他们,这样才有prefork的价值和意义。
MaxSpareServers 20 #最大空闲子进程,他至少要大于StartServers的数量或者要等于他。
ServerLimit 256 #和MaxClients一样的
MaxClients 256 #最大允许启动的服务器子进程数量
MaxRequestsPerChild 4000 #一个子进程最多处理4000个请求,如果超过了4000个无论如何都要把它干掉,如果值为0就表示永不过期
</IFModule>
2)、worker的配置
<IFModule>
StartServers 4 #启动四个空闲进程
MaxClients 300 #允许同时在线的线程数量
MinSpareThreads 25 #最小空闲线程数
MaxSpareThreads 75 #最大空闲线程数
ThreadsPerChild 25 #每个子进程上来生成多少个线程
MaxRequestsPerChild 0 #
</IFModule>
(6)、httpd-2.4换MPM
1)、直接编辑/etc/httpd/conf.modules.d/00-mpm.conf文件,注释掉打开对应行的注释即可,比如我们要使用event可以进行如下配置
[root@www conf.modules.d]# cat 00-mpm.conf # Select the MPM module which should be used by uncommenting exactly # one of the following LoadModule lines: # prefork MPM: Implements a non-threaded, pre-forking web server # See: http://httpd.apache.org/docs/2.4/mod/prefork.html #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # worker MPM: Multi-Processing Module implementing a hybrid # multi-threaded multi-process web server # See: http://httpd.apache.org/docs/2.4/mod/worker.html # #LoadModule mpm_worker_module modules/mod_mpm_worker.so # event MPM: A variant of the worker MPM with the goal of consuming # threads only for connections with active processing # See: http://httpd.apache.org/docs/2.4/mod/event.html # LoadModule mpm_event_module modules/mod_mpm_event.so
2)、然后重启服务即可,可以通过httpd -M|grep mpm命令查看是否生效
[root@www conf.modules.d]# httpd -M |grep mpm mpm_event_module (shared)
d、PV,UV,IP
(1)、PV:Page View。一个网站包括很多资源,里面有文件,css,图片等组成,这些合并起来才能组织成一个网页,对于我们网站来讲,我们用户一次请求了一个页面(注意是页面不是图片)就叫一次页面访问,就叫一次PV。我们网站的页面数量可能不是特别多,如果一个页面中包含10个资源,意味着10次请求平均下来才能组成一个页面,所以如果有一百万的请求产生应该就是10万次的浏览。
(2)、UV:User View。独立浏览量,比如一个网站上面有10个页面,也就是说每个页面访问一次就是一次PV,有可能有个用户在上面访问了5个页面,另外一个用户访问了6个页面,总共访问了11个页面,一共有11个PV,但是访问的用户只有两个,所以这就叫两个UV。
(3)、IP:一个用户一个IP
(4)、衡量网站是否繁忙就是通过PV,UV,IP来实现
(5)、假如一个资源为5k,一个页面有100个资源就是500k,然后我们有10000个访问就是多少流量呢?这就是高并发流量预算。
e、DSO:动态共享对象,所有我们通过 httpd -M命令查看显示为share类型的模块都是可以使用LoadModule来装载的,如果不想要的话也可以将其卸载掉。
(1)、配置指定实现模块加载。
1)、LoadModule <mod_name> <mod_path>。这个mode_path是相对路径,是相对于httpd的根的,其根是在/etc/httpd/conf/httpd.conf中定义的,第一个就是,我们可以看到是/etc/httpd
[root@www conf.modules.d]# cat /etc/httpd/conf/httpd.conf|less [root@www conf.modules.d]# cat /etc/httpd/conf/httpd.conf|grep ServerRoot # with "/", the value of ServerRoot is prepended -- so 'log/access_log' # with ServerRoot set to '/www' will be interpreted by the # ServerRoot: The top of the directory tree under which the server's # ServerRoot at a non-local disk, be sure to specify a local disk on the # same ServerRoot for multiple httpd daemons, you will need to change at ServerRoot "/etc/httpd"
我们来看这个目录
[root@www conf.modules.d]# ls -ld /etc/httpd/* drwxr-xr-x. 2 root root 76 5月 13 17:33 /etc/httpd/conf drwxr-xr-x. 2 root root 178 5月 13 15:06 /etc/httpd/conf.d drwxr-xr-x. 2 root root 186 5月 13 17:27 /etc/httpd/conf.modules.d lrwxrwxrwx 1 root root 19 10月 21 2019 /etc/httpd/logs -> ../../var/log/httpd lrwxrwxrwx 1 root root 29 10月 21 2019 /etc/httpd/modules -> ../../usr/lib64/httpd/modules lrwxrwxrwx 1 root root 10 10月 21 2019 /etc/httpd/run -> /run/httpd
可以看到我们对应的模块文件在/usr/lib64/httpd/modules下
2)、对应文件在/etc/httpd/conf.modules.d/00-mpm.conf中,不需要的时候直接注释掉相应行即可,注释后都不用重启或重载,直接就可以动态卸载掉
[root@www conf.modules.d]# cat /etc/httpd/conf.modules.d/00-proxy.conf # This file configures all the proxy modules: LoadModule proxy_module modules/mod_proxy.so LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_express_module modules/mod_proxy_express.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so #LoadModule proxy_scgi_module modules/mod_proxy_scgi.so LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
f、定义"Main" server(中心服务器)的文档页面路径
(1)定义
ServerName #主要标明当前主机主要服务于谁的,和真正的主机名没有关系。如果其值没定义,那么httpd启动时会试图反解本地的IP地址当做servername来用。
(2)、DocumentRoot "":网站的站点的URL映射到本地的哪一个文件系统路径下
1)、文档路径映射:
DoucmentRoot指向的路径为URL路径的起始位置
其相当于站点URL的根路径:
(SileSystem)/web/host1/index.html --> (URL)/index.html
2)、URL PATH与FileSystem PATH不是等同的,而是存在一种映射关系
即URL的根有可能对应的是文件系统的是/var/www/html/
/images/logo.jpg --> /var/www/html/images/logo.jpg
3)、实验
i、我们现在来创建对应的目录并修改配置文件的DocumentRoot指向相应的目录
[root@www /]# mkdir -pv /data/web/www mkdir: 已创建目录 "/data" mkdir: 已创建目录 "/data/web" mkdir: 已创建目录 "/data/web/www" [root@www /]# echo "Main Server" >> /data/web/www/index.html [root@www /]# cat /etc/httpd/conf/httpd.conf |grep -E "^Docu" DocumentRoot "/data/web/www"
ii、然后我们重启服务后发现还是无法访问的,这是因为我们还没有定义目录的访问权限,具体见下节内容。