apache

Web服务器一般是网站服务器,是安装在计算机中的一个程序,可以向浏览器等Web客户端发送文档,你可以在Web服务器上放置数据文件,让全世界的人来浏览。
image.png
目前世界主流的Web服务有

  • Apache
  • Nginx
  • IIS
  • lighttpd

Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。同时Apache音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在美国的西南部。也是一个基金会的名称、一种武装直升机等等。
Apache HTTP服务器是一个模块化的服务器,源于NCSAhttpd服务器,经过多次修改,成为世界使用排名第一的Web服务器软件。 它可以运行在几乎所有广泛使用的计算机平台上。
Apache是市场占有率很高的一款Web服务器,跨平台和安全性被广泛认可,可以运行在WIndows、Linux、Unix系统中。支持虚拟主机功能(ip、port、FQDN)、高度集成模块、https加密,检测用户访问日志、反向代理,负载均衡,用户认证等功能。

安装apchae

linux安装软件的方式选择

  • 源代码编译
  • rpm包安装
  • yum自动化安装

源代码编译安装可以自定义些第三方功能,添加额外参数,最大化定制软件安装,缺点是编译时间较长。
rpm包需手动解决依赖关系,因此不推荐
yum需配置好仓库源,推荐使用

  1. 1.安装命令
  2. [root@chaogelinux ~]# yum install httpd -y
  3. 2.添加httpd开机自启
  4. [root@chaogelinux ~]# systemctl start httpd
  5. [root@chaogelinux ~]# systemctl enable httpd
  6. 3.检查程序进程和端口
  7. [root@chaogelinux ~]# netstat -tunlp|grep httpd
  8. tcp6 0 0 :::80 :::* LISTEN 2344/httpd
  9. [root@chaogelinux ~]# ps -ef|grep httpd
  10. root 2344 1 0 15:34 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
  11. apache 2345 2344 0 15:34 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
  12. apache 2346 2344 0 15:34 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
  13. apache 2347 2344 0 15:34 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
  14. apache 2348 2344 0 15:34 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
  15. apache 2349 2344 0 15:34 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
  16. 4.此时启了一个web服务端,可以用客户端访问 ,注意关闭防火墙
  17. http://192.168.178.185/

apache配置文件

Linux下学习软件使用,以及针对软件定制各种功能,其实就是在修改配置文件,因此我们得知道各配置文件的位置
rpm -ql httpd | grep ".conf"

文件路径 作用
/etc/httpd/conf/httpd.conf apache主配置文件
/etc/httpd apache主配置目录,这个目录下的资料,都是控制apache的
/etc/httpd/conf.d/*.conf apache子配置文件
/usr/sbin/httpd 二进制脚本
/var/log/httpd/ 日志路径access_log error_log
/var/www/html 站点资源目录
/usr/lib/systemd/system/httpd.service httpd服务脚本文件
/usr/lib64/httpd/modules/ httpd模块文件路径

【http主配置文件学习】

/etc/httpd/conf/httpd.conf

  1. 1.检查apache安装了那些文件,通过yum安装的软件,如何检查其安装信息
  2. rpm -ql httpd | grep ".conf"
  3. 2.apache主配置文件,在/etc/httpd目录
  4. /etc/httpd/conf/httpd.conf # 主配置文件绝对路径
  5. 3.查看著配置文件中的信息(排除空白+注释行)
  6. [root@localhost conf]# grep -Ev "^[ #]|^$" /etc/httpd/conf/httpd.conf
  7. ServerRoot "/etc/httpd" # httpd主配置目录定义
  8. Listen 80 # 定义apache运行的端口
  9. Include conf.d/*.conf
  10. Include conf.modules.d/*.conf # 通过include语法,把其他目录中的配置文件包含进来,实现配置文件简洁化。
  11. User apache # 定义apache运行的用户名
  12. Group apache # 定义httpd服务运行的用户组
  13. ServerAdmin root@localhost # 定义主机名
  14. # 当用户访问网站的根目录,返回某些资源
  15. <Directory />
  16. </Directory>
  17. DocumentRoot "/var/www/html" # 定义httpd的网页根目录
  18. <Directory "/var/www">
  19. </Directory>
  20. <Directory "/var/www/html">
  21. </Directory>
  22. <IfModule dir_module>
  23. </IfModule>
  24. <Files ".ht*">
  25. </Files>
  26. ErrorLog "logs/error_log"
  27. LogLevel warn
  28. <IfModule log_config_module>
  29. </IfModule>
  30. <IfModule alias_module>
  31. </IfModule>
  32. <Directory "/var/www/cgi-bin">
  33. </Directory>
  34. <IfModule mime_module>
  35. </IfModule>
  36. AddDefaultCharset UTF-8
  37. <IfModule mime_magic_module>
  38. </IfModule>
  39. EnableSendfile on
  40. IncludeOptional conf.d/*.conf

主配置文件中,主要分为3类

  • 全局配置,全局性
  • 主服务器配置
  • 虚拟主机

image.png

常见参数解析

参数 解析
ServerRoot “/etc/httpd” 定义服务工作目录
ServerAdmin root@localhost 管理员邮箱地址
User apache 运行服务的用户信息
Group apache 运行服务的用户组
ServerName www.example.com:80 填写服务器域名
DocumentRoot “/var/www/html” 定义网站根目录

| 定义网站数据目录的权限 | | Listen | 监听的IP地址和端口号 | | DirectoryIndex index.html | 默认的首页页面文件 | | ErrorLog “logs/error_log” | 定义错误日志位置 | | CustomLog “logs/access_log” combined | 定义访问日志路径 |

apache常见配置

【修改首页内容】

image.png

【修改网站资源目录路径】

  1. 1.修改配置文件如下,两处修改
  2. [root@chaogelinux ~]# cat /etc/httpd/conf/httpd.conf
  3. # 此处需要修改
  4. DocumentRoot "/www" # 代表网页根目录
  5. # 此处需要修改
  6. <Directory "/www"> # 定义该目录的属性,与上边一致
  7. AllowOverride None # 不允许其他文件覆盖当前的配置
  8. # Allow open access:
  9. Require all granted # 允许所有的请求能够进来
  10. </Directory>
  11. 2.创建资源目录,创建html文件
  12. # 建立新的站点
  13. mkdir -p /www/html
  14. [root@chaogelinux conf]# cat /www/index.html
  15. <meta charset=utf8>
  16. 我是新的首页,你好兄弟们
  17. 3.修改了配置文件,还得重启http服务才能生效
  18. systemctl restart httpd
  19. 4.注意关闭防火墙和selinux,影响实验
  20. [root@chaogelinux conf]# systemctl stop firewalld
  21. # 禁止防火墙开机自启
  22. [root@chaogelinux conf]# systemctl disable firewalld
  23. [root@chaogelinux conf]# iptables -F
  24. # 关闭自带selinux防火墙,获取其状态
  25. [root@localhost conf]# getenforce
  26. Disabled
  27. [root@chaogelinux conf]# setenforce 0 #临时关闭selinux
  28. [root@chaogelinux conf]# grep -i '^selinux' /etc/selinux/config
  29. SELINUX=disabled #永久关闭selinux,重启机器生效
  30. SELINUXTYPE=targeted

此时可以访问新资源目录的内容了

  1. [root@chaogelinux conf]# curl 127.0.0.1
  2. <meta charset=utf8>
  3. 我是新的首页,你好兄弟们

image.png

【修改监听端口】

  1. [root@chaogelinux ~]# grep -i "^listen" /etc/httpd/conf/httpd.conf
  2. Listen 85

访问效果

  1. [root@chaogelinux ~]# curl 127.0.0.1:85
  2. <meta charset=utf8>
  3. 我是新的首页,你好兄弟们

image.png

【apache的工作模式】

apache是经典的网站黄金架构lanmp中的a
Apache提供了三种稳定的(多进程处理模块)MPM(Mutli-Processing Modules 多通道处理模块),使得Apache能够使用更多不同的工作环境,扩展了Apache的功能。

  1. 检查默认的apache工作模式
  2. [root@chaogelinux ~]# httpd -V|grep -i "server mpm"
  3. Server MPM: prefork

可以在编译apache软件时候,添加编译参数,更改mpm模式

  1. --with-mpm=prefork|worker|event

apache提供了三种工作模式

  1. 1.prefork
  2. Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
  3. (银行无论生意好坏,都得预先开通很多个窗口,造成了人员、场地的浪费,无法处理业务高峰期)
  4. 优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。
  5. 缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。
  6. 2.worker
  7. 使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
  8. (银行有多个窗口,窗口后边还有多个工作人员)
  9. 优点:占据更少的内存,高并发下表现更优秀。
  10. 缺点:必须考虑线程安全的问题。
  11. 3.event
  12. 它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。
  13. HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的,但不能在HTTPS访问下工作。

【Userdir】

userdir模块可以很方便的与他人共享目录资源
修改/etc/httpd/conf.d/userdir.conf

  1. 1.启用userdir
  2. <IfModule mod_userdir.c> # 标签开头
  3. #
  4. # UserDir is disabled by default since it can confirm the presence
  5. # of a username on the system (depending on home directory
  6. # permissions).
  7. #
  8. #UserDir disabled #添加注释,表示启用
  9. #
  10. # To enable requests to /~user/ to serve the user's public_html
  11. # directory, remove the "UserDir disabled" line above, and uncomment
  12. # the following line instead:
  13. #
  14. UserDir public_html
  15. </IfModule> # 标签结尾
  16. <Directory "/home/*/public_html">
  17. #AllowOverride FileInfo AuthConfig Limit Indexes
  18. AllowOverride all # 允许所有配置文件修改它的配置
  19. authuserfile "/etc/httpd/passwd" # 定义一个文件,里边是账号密码登录apache
  20. authname "input your account" # 用户输入的名字,提示
  21. authtype basic # 认证类型
  22. require user chao # 用chao这个用户登录apache
  23. #Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
  24. #Require method GET POST OPTIONS
  25. </Directory>
  26. 2.创建网站数据文件夹,注意权限
  27. [root@chaogelinux conf.d]# su - chaoge
  28. [chaoge@chaogelinux ~]$ mkdir public_html
  29. 3.创建首页文件
  30. [chaoge@chaogelinux ~]$ echo "超哥带你学apache,666" > public_html/index.html
  31. [chaoge@localhost public_html]$ cat index.html
  32. <meta charset=utf8>
  33. 超哥带你学apache666
  34. 4.设置权限
  35. [root@chaogelinux www]# chmod -Rf 755 /home/chaoge/
  36. 5.创建需要验证的账户密码,生成数据库文件
  37. 创建apache的用户认证文件,注意要退回到root用户
  38. # 这里的chao是跟配置文件相对应的
  39. [root@chaogelinux www]# htpasswd -c /etc/httpd/passwd chao
  40. New password:123456
  41. Re-type new password:
  42. Adding password for user chao
  43. 6.重启httpd,注意退回root
  44. [root@chaogelinux conf.d]# systemctl restart httpd
  45. 7.可以访问http://192.168.178.187/~chaoge/ 格式是 ip/~用户名
  46. http://192.168.58.130/~chaoge/
  47. 8.访问目录下资源
  48. [root@chaogelinux public_html]# pwd
  49. /home/chaoge/public_html
  50. [root@chaogelinux public_html]# ls
  51. hehe.html index.html

image.png
image.png

【虚拟主机】

虚拟主机,也叫“网站空间”,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。
image.png
如果每台Linux服务器,只能跑一个网站,那一些只有简单业务的网站,或者个人博客站点,对于硬件资源来说是浪费的,且需要支付服务器的费用。
对于Apache是支持虚拟主机的,能够以用户请求的不同的IP、域名、端口来区分不同的站点。

基于IP的虚拟主机

在一台服务器上绑定多个IP地址,每个IP地址部署一个站点,访问不同的IP地址,apache服务器返回不同的网站资源。

  1. 服务器绑定三个ip地址
  2. [root@chaogelinux ~]# ip a|grep 'inet'
  3. inet 127.0.0.1/8 scope host lo
  4. inet6 ::1/128 scope host
  5. inet 192.168.178.187/24 brd 192.168.178.255 scope global noprefixroute dynamic ens33
  6. inet 192.168.178.111/24 scope global secondary ens33
  7. inet 192.168.178.112/24 scope global secondary ens33
  8. inet6 fe80::22c3:376e:b0ae:5076/64 scope link noprefixroute

配置三个文件夹,对应三个站点资料

  1. [root@chaogelinux ~]# mkdir -p /www/{hanju,cartoon,football}
  2. [root@chaogelinux ~]# echo "我是韩剧,来自于192.168.178.187" > /www/hanju/index.html
  3. [root@chaogelinux ~]# echo "我是卡通,来自于192.168.178.111" > /www/cartoon/index.html
  4. [root@chaogelinux ~]# echo "我是足球,来自于192.168.178.112" > /www/football/index.html

修改httpd.conf配置文件,最底行添加apache虚拟主机的配置

  1. <VirtualHost 192.168.178.187>
  2. DocumentRoot /www/hanju
  3. #ServerName
  4. <Directory /www/hanju >
  5. AllowOverride None
  6. Require all granted
  7. </Directory>
  8. </VirtualHost>
  9. <VirtualHost 192.168.178.111>
  10. DocumentRoot /www/cartoon
  11. #ServerName
  12. <Directory /www/cartoon >
  13. AllowOverride None
  14. Require all granted
  15. </Directory>
  16. </VirtualHost>
  17. <VirtualHost 192.168.178.112>
  18. DocumentRoot /www/football
  19. #ServerName
  20. <Directory /www/football >
  21. AllowOverride None
  22. Require all granted
  23. </Directory>
  24. </VirtualHost>

重启httpd

  1. systemctl restart httpd

image.png
大功告成

多域名虚拟主机

刚才的操作是多IP虚拟主机,那么当服务器仅允许有一个IP地址的时候,就无法实现多虚拟主机了,Apache还支持基于不同的域名、返回不同的站点资源。
image.png
这种配置方式,需要配置多个域名,可以使用本地hosts文件,也可以配置DNS记录。

  1. 1.配置hosts文件解析
  2. [root@chaogelinux ~]# cat /etc/hosts
  3. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  4. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  5. 192.168.178.189 www.chao.com www.pyyu.com
  6. 2.分别创建不同的虚拟主机站点,且创建前端文件
  7. [root@chaogelinux ~]# mkdir -p /www/{chao,pyyu}
  8. [root@chaogelinux ~]# echo "超哥666" > /www/chao/index.html
  9. [root@chaogelinux ~]# echo "pyyu带你学apache" > /www/pyyu/index.html
  10. 3.修改apache的配置文件,写入虚拟主机的参数
  11. [root@chaogelinux ~]# cat /etc/httpd/conf/httpd.conf
  12. <VirtualHost 192.168.178.189>
  13. DocumentRoot "/www/chao"
  14. ServerName "www.chao.com"
  15. <Directory "/www/chao" >
  16. AllowOverride None
  17. Require all granted
  18. </Directory>
  19. </VirtualHost>
  20. <VirtualHost 192.168.178.189>
  21. DocumentRoot /www/pyyu
  22. ServerName "www.pyyu.com"
  23. <Directory "/www/pyyu" >
  24. AllowOverride None
  25. Require all granted
  26. </Directory>
  27. </VirtualHost>
  28. 4.检测页面内容
  29. [root@chaogelinux ~]# curl www.chao.com
  30. 超哥666
  31. [root@chaogelinux ~]# curl www.pyyu.com
  32. pyyu带你学apache

【多端口号虚拟主机】

apache默认端口是80提供web服务器功能,可以基于多个端口实现多虚拟主机

  1. 1.生成多个数据文件夹
  2. [root@chaogelinux ~]# mkdir -p /www/{66,99}
  3. [root@chaogelinux ~]# echo "端口号66的虚拟主机" > /www/66/index.html
  4. [root@chaogelinux ~]# echo "端口号99的虚拟主机" > /www/99/index.html
  5. 2.修改配置文件,支持多端口的虚拟主机
  6. #######
  7. <VirtualHost 192.168.178.189:66>
  8. DocumentRoot "/www/66"
  9. ServerName "www.chao.com"
  10. <Directory "/www/66" >
  11. AllowOverride None
  12. Require all granted
  13. </Directory>
  14. </VirtualHost>
  15. <VirtualHost 192.168.178.189:99>
  16. DocumentRoot "/www/99"
  17. ServerName "www.pyyu.com"
  18. <Directory "/www/99" >
  19. AllowOverride None
  20. Require all granted
  21. </Directory>
  22. </VirtualHost>
  23. 3.重启httpd
  24. [root@chaogelinux ~]# systemctl restart httpd
  25. 4.查看不同端口的页面内容
  26. [root@chaogelinux ~]# curl www.chao.com
  27. 超哥666
  28. [root@chaogelinux ~]# curl www.chao.com:66
  29. 端口号66的虚拟主机
  30. [root@chaogelinux ~]# curl www.pyyu.com
  31. pyyu带你学apache
  32. [root@chaogelinux ~]# curl www.pyyu.com:99
  33. 端口号99的虚拟主机

资源限制访问

当我们有部分资源不希望被别人访问的时候,可以通过参数拒绝资源目录被访问
【案例】
拒绝其他人访问站点资源

  1. http://192.168.178.189:99/

image.png

  1. 1.创建一个资源文件,禁止用户访问
  2. [root@chaogelinux ~]# mkdir -p /www/denyhtml/
  3. [root@chaogelinux ~]# echo "小样,想偷看我?" > /www/denyhtml/index.html
  4. 2.修改httpd配置文件
  5. <Directory "/www/99" >
  6. Order allow,deny
  7. #Allow from 192.168.178.0/24
  8. </Directory>
  9. </VirtualHost>
  10. 3.打开注释,允许某个网段访问
  11. 4.重启httpd
  12. [root@chaogelinux ~]# systemctl restart httpd
  13. 5.即可访问资源了

image.png

注意!httpd的版本问题

  1. apache目录站点 访问限制总结:
  2. 2.4之前版本的:
  3. 语法是
  4. Order Deny,allow
  5. Allow from 192.168.178.190
  6. 2.4版本开始:
  7. 不再使用上述的语法了
  8. 改为
  9. Require all granted # 允许所有ip访问
  10. Require ip 192.168.178.190 #只允许某个ip访问
  11. Require ip 192.168.178.0/24 # 允许某个我那网段访问

限制访问详解

  1. 给指定的文件夹配置对应的访问权限是Apache配置中的基础应用,也是Apache使用者的必备技能之一。
  2. Apache配置文件中,给指定目录设置基本的访问权限,主要是靠AllowDenyOrder三个指令的配合使用来实现的。
  3. 1.Allow指令
  4. Allow指令的作用与其英文单词的含义一致,用于设置允许访问当前目录(及其子目录)或文件的用户范围。例如,Allow from all表示允许所有用户访问。下面,我们参考更多的例子,以帮助理解(DenyOrder用法一致):
  5. <Directory /web>
  6. #只允许IP为123.10.10.2的用户访问/web目录
  7. Allow from 123.10.10.2
  8. </Directory>
  9. <Directory /web>
  10. #只允许IP以10.10开头的用户访问/web目录
  11. Allow from 10.10
  12. </Directory>
  13. <Directory /web>
  14. #只允许域名为365mini.com的用户访问
  15. Allow from 365mini.com
  16. </Directory>
  17. 2.Deny指令
  18. 同样的,Deny指令的作用就是“Deny(拒绝)”,用于设置拒绝访问当前目录或文件的用户范围。例如,Deny from all表示拒绝所有用户访问。
  19. 3.Order指令
  20. Apache的配置文件中,Order指令用于控制Allow指令和Deny指令的生效顺序。例如,Order Allow,Deny表示当前配置段中的Allow指令先生效,Deny指令后生效。
  21. Apache中,Allow指令和Deny指令在同一配置段中都可以有多条。不过,对于AllowDeny指令而言,如果先生效的指令与后生效的指令的作用范围存在冲突,则起冲突的作用范围部分以后生效的指令为准。
  22. 下面,我们同样参考几个具体的例子以帮助大家理解:
  23. <Directory /web>
  24. Order Allow,Deny
  25. Allow from all
  26. Deny from 112.2.10.2
  27. #先允许所有用户访问,再拒绝112.2.10.2
  28. #总结:允许除IP为112.2.10.2外的所有用户访问
  29. </Directory>
  30. <Directory /web>
  31. Order Allow,Deny
  32. Deny from 112.2.10.2
  33. Allow from all
  34. #先允许所有用户访问,再拒绝112.2.10.2
  35. #总结:允许除IP为112.2.10.2外的所有用户访问
  36. #(即使Deny指令在Allow指令之前,但是根据Order Allow,Deny语句,仍然先看Allow,再看Deny)
  37. </Directory>
  38. <Directory /web>
  39. Order Deny,Allow
  40. Deny from 112.2.10.2
  41. Allow from all
  42. Deny from 123.10.10.1
  43. #先拒绝112.2.10.2访问
  44. #再拒绝123.10.10.1访问
  45. #最后允许所有用户访问
  46. #总结:允许所有用户访问
  47. #(即使Allow指令在Deny指令前,但是根据Order Deny,Allow语句,仍然先看Deny,再看Allow)
  48. </Directory>

定义访客日志格式

有时候我们需要定制apache默认显示的日志格式,增加或者减少日志记录的内容,更好的让运维人员掌握用户访问信息。
并且日志可能会给系统造成大量的IO操作,造成较多的负担,如果关闭日志功能,甚至可能提高40%的性能,那当然是不能关闭,而是调整日志级别。
查看httpd配置文件

  1. ErrorLog "logs/error_log" #错误日志存放位置
  2. #
  3. # LogLevel: Control the number of messages logged to the error_log.
  4. # Possible values include: debug, info, notice, warn, error, crit,
  5. # alert, emerg.
  6. #
  7. LogLevel warn
  8. <IfModule log_config_module>
  9. #
  10. # The following directives define some format nicknames for use with
  11. # a CustomLog directive (see below).
  12. #
  13. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
  14. LogFormat "%h %l %u %t \"%r\" %>s %b" common
  15. <IfModule logio_module>
  16. # You need to enable mod_logio.c to use %I and %O
  17. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
  18. </IfModule>
  19. #
  20. # The location and format of the access logfile (Common Logfile Format).
  21. # If you do not define any access logfiles within a <VirtualHost>
  22. # container, they will be logged here. Contrariwise, if you *do*
  23. # define per-<VirtualHost> access logfiles, transactions will be
  24. # logged therein and *not* in this file.
  25. #
  26. #CustomLog "logs/access_log" common
  27. #
  28. # If you prefer a logfile with access, agent, and referer information
  29. # (Combined Logfile Format) you can use the following directive.
  30. #
  31. CustomLog "logs/access_log" combined
  32. </IfModule>

日志级别

  1. # LogLevel: Control the number of messages logged to the error_log.
  2. # Possible values include: debug, info, notice, warn, error, crit,
  3. # alert, emerg.
  4. #
  5. LogLevel warn
  6. #解释
  7. emerg 紧急 - 系统无法使用。 "Child cannot open lock file. Exiting"
  8. alert 必须立即采取措施。 "getpwuid: couldn't determine user name from uid"
  9. crit 致命情况。 "socket: Failed to get a socket, exiting child"
  10. error 错误情况。 "Premature end of script headers"
  11. warn 警告情况。 "child process 1234 did not exit, sending another SIGHUP"
  12. notice 一般重要情况。 "httpd: caught SIGBUS, attempting to dump core in ..."
  13. info 普通信息。 "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..."
  14. debug 出错级别信息 "Opening config file ..."

日志格式

  1. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined #组合日志
  2. LogFormat "%h %l %u %t \"%r\" %>s %b" common #通用日志格式
  3. %…a: 远程IP地址
  4. %…A: 本地IP地址
  5. %…B: 已发送的字节数,不包含HTTP
  6. %…b: CLF格式的已发送字节数量,不包含HTTP头。例如当没有发送数据时,写入‘-’而不是0
  7. %…{FOOBAR}e: 环境变量FOOBAR的内容
  8. %…f: 文件名字
  9. %…h: 远程主机
  10. %…H 请求的协议
  11. %…{Foobar}i: Foobar的内容,发送给服务器的请求的标头行。
  12. %…l: 远程登录名字(来自identd,如提供的话)
  13. %…m 请求的方法
  14. %…{Foobar}n: 来自另外一个模块的注解“Foobar”的内容
  15. %…{Foobar}o: Foobar的内容,应答的标头行
  16. %…p: 服务器响应请求时使用的端口
  17. %…P: 响应请求的子进程ID
  18. %…q 查询字符串(如果存在查询字符串,则包含“?”后面的部分;否则,它是一个空字符串。)
  19. %…r: 请求的第一行,如 "GET / HTTP/1.1"
  20. %…>s: 状态。对于进行内部重定向的请求,这是指*原来*请求 的状态。如果用%…>s,则是指后来的请求。
  21. %…t: 以公共日志时间格式表示的时间(或称为标准英文格式)
  22. %…{format}t: 以指定格式format表示的时间
  23. %…T: 为响应请求而耗费的时间,以秒计
  24. %…D: Apache 2.0 开始,提供了一个新的参数 %D。可以记录服务器处理请求的微秒时间
  25. %…u: 远程用户(来自auth;如果返回状态(%s)是401则可能是伪造的)
  26. %…U: 用户所请求的URL路径
  27. %…v: 响应请求的服务器的ServerName
  28. %…V: 依照UseCanonicalName设置得到的服务器名字
  29. %…{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
  30. %…{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;

日志显示格式

  1. 192.168.178.1 - - [17/Jan/2020:09:24:14 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"
  2. 192.168.178.1 - - [17/Jan/2020:09:24:24 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Mobile Safari/537.36"
  3. 192.168.178.1 - - [17/Jan/2020:09:24:35 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Mobile Safari/537.36"

image.png

status状态页

对于运维人员来说,需要实时监控httpd实时运行情况,负载情况,连接数等,能够更好的掌握服务器情况,需要在编译安装apache的时候,开启mod_status模块

  1. /etc/httpd/conf/httpd.conf配置文件中添加状态参数
  2. <Location /server-status>
  3. SetHandler server-status
  4. <RequireAll>
  5. Require ip 192.168.178.0/24
  6. </RequireAll>
  7. </Location>
  8. 重启httpd
  9. 访问状态页路径
  10. http://192.168.178.191/server-status

【针对apache进行压力测试】
使用Apache自带的压力测试工具

  1. 1.可能需要单独安装软件包
  2. [root@chaogelinux ~]# yum install httpd-tools

ab命令常用参数

  1. 此外,我们再根据上面的用法介绍界面来详细了解每个参数选项的作用。
  2. -n requests,用于指定压力测试总共的执行次数。
  3. -c concurrency,用于指定的并发数。
  4. -t timelimit,等待响应的最大时间(单位:秒)。
  5. -b windowsizeTCP发送/接收的缓冲大小(单位:字节)。
  6. -p postfile,发送POST请求时需要上传的文件,此外还必须设置-T参数。
  7. -u putfile,发送PUT请求时需要上传的文件,此外还必须设置-T参数。
  8. -T content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded,默认值为text/plain
  9. -v verbosity,指定打印帮助信息的冗余级别。
  10. -w HTML表格形式打印结果。
  11. -i 使用HEAD请求代替GET请求。
  12. -x 插入字符串作为table标签的属性。
  13. -y 插入字符串作为tr标签的属性。
  14. -z 插入字符串作为td标签的属性。
  15. -C 添加cookie信息,例如:"Apache=1234"(可以重复该参数选项以添加多个)。
  16. -H 添加任意的请求头,例如:"Accept-Encoding: gzip",请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。
  17. -A 添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。
  18. -P 添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。
  19. -X 指定使用的和端口号,例如:"126.10.10.3:88"
  20. -V 打印版本号并退出。
  21. -k 使用HTTPKeepAlive特性。
  22. -d 不显示百分比。
  23. -S 不显示预估和警告信息。
  24. -g 输出结果信息到gnuplot格式的文件中。
  25. -e 输出结果信息到CSV格式的文件中。
  26. -r 指定接收到错误信息时不退出程序。
  27. -h 显示用法信息,其实就是ab -help

案例

  1. 1.发出100个并发数,总共发出10000个请求
  2. [root@chaogelinux ~]# ab -c 100 -n 100000 http://192.168.178.191/
  3. 2.检查状态页的信息
  4. http://192.168.178.191/server-status

状态页参数解析
image.png

  1. 1.检查服务器的进程数量,apache每一请求会启动一个进程
  2. 开启100个并发,发出一万个请求
  3. [root@chaogelinux ~]# ab -c 100 -n 10000 http://192.168.178.191/
  4. 2.检查进程数
  5. [root@chaogelinux ~]# ps -ef|grep httpd |wc -l
  6. 107

curl命令

curl是基于URL语法在命令行下工作的传输工具,支持诸多协议,FTP、HTTP、HTTPS、等。

  1. -A/--user-agent <string> 设置用户代理发送给服务器
  2. -b/--cookie <name=string/file> cookie字符串或文件读取位置
  3. -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
  4. -C/--continue-at <offset> 断点续转
  5. -D/--dump-header <file> header信息写入到该文件中
  6. -e/--referer 来源网址
  7. -f/--fail 连接失败时不显示http错误
  8. -o/--output 把输出写到该文件中
  9. -O/--remote-name 把输出写到该文件中,保留远程文件的文件名
  10. -r/--range <range> 检索来自HTTP/1.1FTP服务器字节范围
  11. -s/--silent 静音模式。不输出任何东西
  12. -T/--upload-file <file> 上传文件
  13. -u/--user <user[:password]> 设置服务器的用户和密码
  14. -w/--write-out [format] 指定输出内容
  15. -x/--proxy <host[:port]> 在给定的端口上使用HTTP代理
  16. -#/--progress-bar 进度条显示当前的传送状态

1.保存网页html元素

获取网页html元素
[root@chaogelinux ~]# curl www.pythonav.cn > /tmp/index.html

2.参数保存网页

同于第一条命令,-o 指定文件名字
[root@chaogelinux ~]# curl -o /tmp/luffy.html www.pythonav.cn

3.测试页面返回值

-o 输出内容到文件
-s 不输出页面内容
-w 指定输出内容
[root@chaogelinux ~]# curl -o /dev/null -s -w %{http_code} www.pythonav.cn

4.保存站点cookie

  1. [root@chaogelinux tmp]# curl -c cookiec.txt www.baidu.com
  2. [root@chaogelinux tmp]# cat cookiec.txt
  3. # Netscape HTTP Cookie File
  4. # http://curl.haxx.se/docs/http-cookies.html
  5. # This file was generated by libcurl! Edit at your own risk.
  6. .baidu.com TRUE / FALSE 1579334979 BDORZ 27315

5.模拟客户端

伪装user-agent

  1. #原本客户端地址
  2. 222.35.242.113 - - [17/Jan/2020:16:17:06 +0800] "GET / HTTP/1.1" 200 9503 "-" "curl/7.64.1" "-"
  3. #指定客户端地址
  4. yumac: ~ yuchao$curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36" www.pythonav.cn

6.下载资源

-O 大写字母O参数,直接保存资源到本地,用源文件名

  1. curl -O http://hcdn1.luffycity.com/static/frontend/public_class/PY1@2x_1566529821.1110113.png

7.断点续传

  1. curl -O -C http://hcdn1.luffycity.com/static/frontend/public_class/PY1@2x_1566529821.1110113.png