http: 超文本传输协议,工作在应用层
CentOS 6程序环境:httpd-2.2
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
检查配置语法:
httpd –t
service httpd configtest
服务脚本:/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
服务控制和启动:
chkconfig httpd on|off
service {start|stop|restart|status|configtest|reload} httpd
站点网页文档根目录:
/var/www/html
模块文件路径:
/etc/httpd/modules
/usr/lib64/httpd/modules
主程序文件: /usr/sbin/httpd /usr/sbin/httpd.worker /usr/sbin/httpd.event
主进程文件: /etc/httpd/run/httpd.pid
日志文件目录:
/var/log/httpd
access_log: 访问日志
error_log:错误日志
帮助文档包:
httpd-manual
httpd配置文件的组成:
grep "Section" /etc/httpd/conf/httpd.conf
Section 1: Global Environment
Section 2: ‘Main‘ server configuration
Section 3: Virtual Hosts
配置格式:directive value 变量 值
directive: 不区分字符大小写
value: 为路径时,是否区分大小写,取决于文件系统
MPM工作模式:
prefork:多进程I/O模型,每个进程响应一个请求,默认模型
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n
event:事件驱动模型(worker模型的变种)
一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
/etc/sysconfig/httpd MPM
HTTPD=/usr/sbin/httpd.worker 取消该项以启用worker模式,查看该模式使用的模块httpd.worker -l
/etc/httpd/conf/httpd.conf
ServerTokens prod 返回版本信息,prod仅显示apache,是显示最少信息的选项。
Lister 80 默认监听本机所有IP地址,可以修改为某个IP的某个端口,可以指定监听多个IP端口
KeepAlive on|off 长连接开关,
KeepAliveTimeout 15 长连接关闭时间,以秒为单位,httpd2.4支持毫秒,副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到相应,处理方式是减短持久连接时间
<IfModule prefork.c> httpd默认模式的模块配置,httpd -l查看使用的模块
StartServers 8 初始子进程
MinSpareServers 5 空闲时最小子进程
MaxSpareServers 20 空闲时最大子进程
ServerLimit 256 服务器最高连接数
MaxClients 256 客户端最高连接数 应该与服务器连接数相等
MaxRequestsPerChild 4000 服务器进程服务的最大请求数,达到数量后终止进程,释放内存
<IfModule worker.c> httpd.worker模式的模块配置,httpd.work -l 可以查看使用哪些模块
StartServers 4 初始子进程
MaxClients 300 支持的并发客户访问最大数量
MinSpareThreads 25 最小的空闲线程
MaxSpareThreads 75 最大的空闲线程
ThreadsPerChild 25 每个子进程线程数
MaxRequestsPerChild 0 服务器进程服务的最大请求数,达到数量后终止进程,重新打开新进程,0永远不释放
httpd -M 查看动态加载模块
User apache 启动服务的用户
Group apache 启动服务的组
DocumentRoot "/var/www/html" 修改服务路径,网页的存储位置
<Directory "/var/www/html">
设置文件夹属性,如果要下面的属性生效需要重命名welcome.conf,以使它失效,否则会自动转到noindex.html,无法显示文件列表
1、Options Indexes FollowSymLinks
Options:后跟1个或多个以空白字符分隔的选项列表
在选项前的+,- 表示增加或删除指定选项
常见选项:
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
FollowSymLinks:允许访问符号链接文件所指向的源文件
None:全部禁用
All: 全部允许
2、 AllowOverride
与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令,该文件路径为访问数据路径下,默认为/var/www/html/下,和.html文件位置一致,需要手工创建
只对<directory>语句有效 下列语句需要写在/etc/httpd/conf/httpd.conf/里相关的<directory>下以定义AllowOverride语句的生效范围
AllowOverride All: .htaccess 中所有指令都有效
AllowOverride None:.htaccess 文件无效
AllowOverride AuthConfig Indexes 除了AuthConfig和Indexes的其它指令都无法覆盖
3、order和allow、deny ip访问控制
放在directory, .htaccess中
order:定义生效次序;写在后面的表示默认法则,如果冲突,排后面的生效
Order allow,deny 默认没有记入白名单的都不准访问,下面要跟上允许访问的白名单,否则任何地址无法访问
allow from 192.168.1.100
Order deny,allow 默认没有记入黑名单的都可以访问,下面要跟上黑名单,否则任何地址都可以访问
deny from 192.168.1.189
例:
<Files ~ "*\.txt$">
Order allow,deny
Deny from all
allow from 192.168.1.100,10.10.0.0
</Files>
日志设定
日志类型:
访问日志
错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn 可选值: debug, info, notice, warn,error,crit, alert, emerg
访问日志:
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
CustomLog logs/access_log combined 选择启用的日志格式combined,common,referer,agent
帮助文档:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h 客户端IP地址
%l 远程用户,启用mod_ident才有效,通常为减号“-”
%u 验证(basic,digest)远程用户,非登录访问时,为一个减号“-”
%t 服务器收到请求时的时间
%r First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本
%>s 响应状态码
%b 响应报文的大小,单位是字节;不包括响应报文http首部
%{Referer}i 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的
%{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的应用程序
默认字符集
AddDefaultCharset UTF-8 建议UTF-8,全球语言都可以支持,避免乱码
定义路径别名
alias /download/ /data/bbs/ 别名自己定义,路径根据需要设置,可以放置在本配置文件任意位置
aliasmatch ^/imgs/(.*)?$ "/data/images/pic$1" 支持扩展正则表达式
aliasmatch ^(.*\.(jpe?g|gif|png))$ "/data/images/$1"
基于用户的访问控制
认证方式两种:
basic:明文
digest:消息摘要认证,兼容性差
定义安全域 一般创建在/etc/httpd/conf.d/下,
<directory "/app/website/secret/"> 对某个文件夹进行限制
AuthType Basic 选择认证方式
AuthName "String“ 提示
AuthUserFile "/etc/httpd/conf.d/.httpusers" 指定用户和密码的存放文件
require user http1 http2 指定可以访问的用户,require valid-user为文件内所有用户皆可登陆
</directory>
提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /etc/httpd/conf.d/.httpdusers username 目录要和AuthUserFile一致
-c:自动创建文件,仅第一次创建时使用,再次使用会覆盖
-p:明文密码
-d:CRYPT格式加密,默认
-m:MD5格式加密
-s:sha格式加密
-D:删除指定用户
基于组账号进行认证 基于用户认证,需要用到用户账号密码文件
定义安全域
一般创建在/etc/httpd/conf.d/下,
<directory "/app/website/secret/"> 对某个文件夹进行限制
AuthType Basic 选择认证方式
AuthName "String“ 提示
AuthUserFile "/etc/httpd/conf.d/.httpusers" 指定用户和密码的存放文件,文件位置自己选择
AuthGroupFile "/etc/httpd/conf.d/.httpdgroups" 指定用户属于的组,文件位置自己选择
require group admin
</directory>
创建用户账号和组账号文件
vim /etc/httpd/conf.d/.httpdgroups
admin: http1 http2
users: http3 http4
远程客户端和用户验证的控制
Satisfy ALL|Any
ALL 客户机IP和用户验证都需要通过才可以
Any客户机IP和用户验证,有一个满足即可
示例:
Require valid-user
Order allow,deny
Allow from 192.168.1
Satisfy Any
实现用户家目录的http共享
基于模块mod_userdir.so实现
<IfModule mod_userdir.c>
# UserDir disabled 将此行注释
UserDir publicweb 该目录在用户家目录下,比如~wang/publicweb,并没有定义哪些用户的家目录,所以只要用户有这个目录,都可以申请访问,但是要有权限
</IfModule>
此时httpd的进程是apache运行的,apache没有其他家目录的访问权限
setfacl -m u:apache:x /home/wang/ 为apache添加进入wang的家目录的权限
ServerSignature On | Off | EMail
当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息如果不对外显示这些信息,就可以将这个参数设置为Off设置为Email,将显示ServerAdmin 的Email提示
status页面
LoadModule status_module modules/mod_status.so 依赖的模块
<Location /server-status> 访问该页面时自动显示网站状态信息,该文件名自定义,访问自动跳转
SetHandler server-status 关键字,不可更改
Order allow,deny 权限控制
Allow from 172.16 仅允许172.16网段访问
</Location>
ExtendedStatus On 显示更详细的扩展信息
虚拟主机
站点标识: socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同:
请求报文中首部
Host: www.magedu.com
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机使用至少一个独立的port
基于FQDN:为每个虚拟主机使用至少一个FQDN
注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机
禁用方法:注释中心主机的DocumentRoot指令即可 /etc/httpd/conf/httpd.conf
虚拟主机的配置方法: 一般将配置文件建在/etc/httpd/conf.d/下
vim /etc/httpd/conf.d/vhosts.conf
根据IP配置
<VirtualHost 192.168.1.101> 不同的虚拟主机需要定义不同的IP地址
DocumentRoot “/app/website1" 网站文件路径
Errorlog logs/website1-error_log 路径/var/log/httpd/,为每个网站定义单独的错误日志
Customlog logs/website1-access_log common 路径/var/log/httpd/,定义单独的日志,common为定义的日志模式
</VirtualHost>
根据端口
<VirtualHost 192.168.1.101:90>
DocumentRoot “/app/website2"
Errorlog logs/website2-error_log
Errorlog logs/website2-error_log
Customlog logs/website1-access_log common
</VirtualHost>
listen 90 监听90端口,根据端口来区分主机,需要在配置文件下加上此行
基于FQDN:为每个主机定义不同的FQDN
namevirtualhost *:80 此项可以在主配置文件打开,或者在本文件中添加,2.4版本不需要
<VirtualHost *:80>
DocumentRoot “/app/website2"
servername www.linux123.tech 域名需要注册
serveralias www.aa.com www.aaa.com 需要域名支持
Errorlog logs/website2-error_log
Errorlog logs/website2-error_log
Customlog logs/website1-access_log common
</VirtualHost>
当通过IP访问网站,默认是放在第一位的网站回应,这个发生在使用FQDN区分的主机里
/etc/httpd/conf.d/welcome.conf
ErrorDocument 403 /error/noindex.html 在没有页面显示时,显示noindex.html,重命名welcome.conf,不再显示该页面,因为会透露版本信息
/etc/httpd/conf/httpd.conf
DirectoryIndex index.html index.html.var 默认系统会在主站点找这两个文件,找到了就显示,找不到就显示noindex.html,如果修改了welcom.conf,则显示下图
ab命令 测试并发连接
ab -c 2000 -n 10000 http://192.168.1.101/test.txt
并发2000个连接,一共发送10000个,地址.....