apache
Table of Contents
http://httpd.apache.org/docs/2.4/mod/directives.html
apache
高度模块化 (core + modules)
- DSO: Dynamic Shared Object 动态模块对象, 动态指的是想用就启动, 不用也可以禁止
- MPM: Multipath Processing Module, 多道处理模块, 非一个模块, 而是对一种特性的称谓
- prefork: 一个进程一个请求 (预先创建多个进程), 非线程型, 每个请求相互独立
select(): 1024
- worker: 一个进程多个线程, 一个线程一个请求 (由于资源竞争, 性能并一定比 prefork 高)
- event: 一个进程响应多个请求, 不生成线程
event-driven: 事件驱动, 主要目的在于实现单线程响应多个请求
- prefork: 一个进程一个请求 (预先创建多个进程), 非线程型, 每个请求相互独立
httpd 的功能特性:
- 路径别名: alias
- 用户认证: authentication
- 虚拟主机: virtual host
- 反向代理:
- 负载均衡:
- 用户站点:
- CGI:Common Gateway Interface
日志滚动:
- 日志切割
- 时间, 空间
Docroot: 文档根目录
key value
配置指令不区分字符大小写
值有可能区分大小写
有些指令可以重复出现多次
配置文件格式
全局配置
主机配置: 用于仅提供一个站点时
虚拟主机配置: 用于提供多个站点时
配置文件语法测试
serviice httpd configtest
httpd -t
service httpd reload
监听套接字
Listen 80 Listen 8080 此指令可以出现多次, 用于指定监听多个不同的套接字
Keepalive
KeepAlive {On|Off} KeepAliveTimeout 50 超时时间 50 秒 MaxKeepAliveRequests 50 最多请求 50 次连接
MPM
多道处理模块
httpd -l 查看编译进内核的模块
想使用不同的机制, 修改配置文件即可 /etc/syconfig/httpd 文件
<IfModule preforck.c> 判断模块是否存在 StartServers 8 默认启动的工作进程数 MinSpareServers 5 最少空闲进程数 MaxSpareServers 20 最大空闲进程数 ServerLimit 256 最大活动进程数 MaxClients 256 最大并发连接数, 最多允许发起的连接请求的个数 MaxRequestsPerChild 4000 每个子进程在生命周期内最大允许服务的最多请求个数 </IfModule>
<IfModule worker.c> StartServers 4 启动的子进程的个数 MaxClients 300 最大并发连接数, 最多允许发起的连接请求的个数 MinSpareThreads 25 最少空闲线程数 MaxSpareThreads 75 最大空闲线程数 ThreadsPerChild 25 每个子进程生成的线程数 MaxRequestsPerChild 0 每个子进程在声明周期内最大允许服务的最多请求个数 </IfModule>
DSO 模块的加载方式
LoadModule module_name /path/to/module
如果使用相对路径, 则对于 ServerRoot 所定义的位置而言
LoadMoudule php5_module /usr/lib64/httpd/modules/php.so
让服务重载配置文件方能生效
httpd -M 列出与加载到所有 DSO 模块与非 DOS 模块
配置站点根目录
DocumentRoot /path/to/somewhere
页面访问属性
<Directory "xxx"> Options Indexes # 不存在 index.html 的时候, 列出当前目录的所有文件 Options FollowSymLinks # 允许符号连接, 降低服务器性能, 不安全, ln -s /etc/fstab DOCUMENT_ROOT/b.thml 然后打开 localhost/b.html Options SymLinksIfOwnerMatch # 在链接文件属主属组与原始文件的属主属组相同时, 允许跟随符号连接所指向的原始文件 Options Includes # 允许执行服务端脚本 Options IncludesNOEXEC # 允许包含但不允许执行脚本 Options ExecCGI # 是否允许运行 CGI 脚本 Options MultiViews # 内容协商, 根据不同地区提供不同的内容, 比如语言, 消耗资源 Options None Options All </Directory>
Options Indexes FollowSymLinks 同时开启两个
可以使用正则表达式, 使用~
目录访问权限
Forbidden You don‘t have permission to access /index.html on this server.
如果根目录被禁止
<Directory /> AllowOverride none Require all denied </Directory>
那么以后设置虚拟主机的权限的时候一定要开启
<Directory ...> AllowOverride all # Allow open access: Require all granted </Directory>
基于主机的访问控制
基于 IP 访问控制:
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all denied
控制某主机的访问
Require ip IPADDR Require not ip IPADDR # 无法使用, 报错
IPADDR:
单个 IP 地址,例如 172.16.100.7
network/netmask 例如 172.16.0.0/255.255.0.0
network/Length 例如 172.16.0.0/16
Net 例如 172.16
Require host IPADDR Require not host IPADDR
下面的内容 2.4 已经废除
<Direcotry "/path/to/somewhere"> Options AllowOverride None 不禁用 order 次序, 写在后面的为默认 allow,deny: 没有允许的都拒绝 deny,allow: 没有拒绝的都允许 Allow from Deny from </Direcotry> order allow, deny # 禁用全部 allow from 192.168.1/24 # 允许...
如果 allow 匹配, deny 匹配, 则 deny 优先
如果 allow 匹配, deny 不匹配, 则 allow 优先
如果 allow 不匹配, deny 不匹配, 则 deny 优先
没写规则就是 allow from all, deny from all
虚拟主机
视频系统 video.sunznx.com
论坛系统 bbs.sunznx.com
办公 oa.sunznx.com
让三个域名指向同一个 ip, 每个域名提供不同的功能
修改客户端的 host 文件 模拟 dns 解析
192.168.100.129 server1 192.168.100.129 video.server1 192.168.100.129 bbs.server1 192.168.100.129 oa.server1
在服务器端执行这样的操作 (192.168.100.129)
yum install -y httpd service httpd start iptables -F # 关闭防火墙 setenforce 0 # 关闭 selinux
现在在客户端打开 http://server1 测试是否可行
mkdir -p /www/{video,bbs,oa} ls /www echo bbs > www/bbs/index.html echo oa > www/oa/index.html echo video > www/video/index.html
配置虚拟主机
vi /etc/httpd/conf/httpd.conf
# DocumentRoot "/var/www/html" # 注释掉原来主机的家目录, 因为我们现在要使用的是 虚拟主机的
vi conf.d/virtual.conf
NameVirtualHost *:80 # 重要, httpd2.4 就不需要这句话 <VirtualHost *:80> ServerName video.server1 ServerAdmin test@localhost DocumentRoot /www/video </VirtualHost>
<VirtualHost *:80> ServerName bbs.server1 ServerAdmin test@localhost DocumentRoot /www/bbs </VirtualHost>
浏览器打开
http://video.server1
显示 video
显示 bbs
定义默认主页面
DirectoryIndex index.html index.php
路径别名
Alias alias "/path/to/somewhere"
意味着访问 http://Server_IP/alias 时, 其页面文件来自于/path/to/somewhere 中
error
#ErrorDocument 500 "The server made a boo boo." #ErrorDocument 404 /missing.html #ErrorDocument 404 "/cgi-bin/missing_handler.pl" #ErrorDocument 402 http://www.example.com/subscription_i nfo.html
用户目录 (跳过)
如果期望让每个用户都可以创建个人站点: http://Server_IP/~Username/
userdir disablied:禁止
userdir public_html:
public_html 是用户家目录下的目录名称, 所有位于此目录中的文件均可通过前述的访问路径进行访问
用户的家目录得赋予进行 httpd 进程的用户拥有执行权限
setfacl -m u:apache:x ~Username
配置日志功能 (跳过)
var/log/http
access.log: 访问日志, 其需要记录的内容需要自定义
error.log
访问日志:
CustomLog "/path/to/log_file" LogFormat
LogFormat 定义日志格式
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
%h:客户端地址
%l:远程的登录名, 通常为-
%u:认证时的远程用户名, 通常为-
%t: 接收到的请求时的时间, 为标准英文格式时间+时区
\" : 转义, 显示""
%r:请求报文的起始行
%>s: 响应状态码,
%b: 以字节响应报文的长度, 不包含 http 报文
%{Header_Name}i:记录指定请求报文首部的内容(value)
%u: 请求的 URL
详情请参考: http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
错误日志: ErrorLog
指定默认的字符集
AddDefaultCharset UTF-8
cgi
cgi Common Gateway Interface
缺点: 每次执行完一个请求之后就退出, 但请求多的时候就麻烦了
fast cgi
每次执行完一个请求之后不马上退出, 等待处理下一个请求
yum search php | grep -i cgi php-fpm.x86_64 : PHP FastCGI Process Manager systemctl enable php-fpm systemctl start php-fpm
让 apache 支持 fastcgi yum 模式 yum install mod_fcgid -y
编译模式 # wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz # make top_dir=/usr/lib64/httpd # make install top_dir=/usr/lib64/httpd
基于用户的访问控制 (跳过)
虚拟用户:不是系统用户,只是为了获取某种资源类型的一种虚拟的用户
文件/etc/httpd/conf/.htpasswd
SQL 数据库
dbm:
ldap:轻量级目录访问协议
认证类型(auth):
basic:基本认证,账号和密码明文发送
digest:摘要认证,hash 编码之后发送
认证提供者(authentication provider):账号和密码的存放位置
authn
授权机制(authorization):根据什么进行授权
案例:基于文件,做基本认证根据用户和组进行授权
1、编辑配置文件,为需要认证的目录配置认证机制
<Directory "/www/htdocs/fin">A
options None
AllowOverride AuthConfig 使用认证配置
AuthType Basic 使用基本认证
AuthName "Private Area" 质询时标题
AuthUserFile etc/http/conf.htpasswd 密码的存放位置
Require vaild-user 可访问的用户
</Directory>
2、使用 htpsswdm 命令使用生成认证库
htpasswd
-c 创建密码,创建第一个用户时使用
htpasswd -c -m etc/http/conf.htpasswd tom
-m MD5 格式存放
-b 批量模式
-D 删除用户
3、基于组认证
<Directory "/www/htdocs/fin">
options None
AllowOverride AuthConfig 使用认证配置
AuthType Basic 使用基本认证
AuthName "Private Area" 质询时标题
AuthgroupFile etc/http/conf.htpasswd 密码的存放位置
Require group GroupName 可访问的用户
</Directory>
先创建用户,在创建组
组文件:
组名:用户 1 用户 2 用户 3
服务器 status 页面 (跳过)
内生的 status 信息,且此信息可以通过 web 予以显示
基于 URL 访问属性
<Location [~] "">
</Location >
基于单个文件的访问属性
<File [~] "">
</File>
也可以使用<LocationMatch "">
</LocationMatch>来实现正则表达式的配置
如果要配置其属性的 URL 能映射到某具体文件系统路径,建议使用<Directory>
处理器:当文件被调用时,Apache 内部表现形式:一般每种文件类型都有其隐式处理器;否则需要自己定义
显式的定义使用的处理器:SetHandler
<Location /URL>
setHeandler server-status
</Location>
定义访问控制机制
基于 IP 控制
基于用户控制
示例:
<Location /server-status> SetHandler sever-status AuthType Basic AuthName "Sever Status" AuthUserFile "/etc/http/conf/.htpasswd" Require valid-user Order deny,allow Allow from all </Location>
使用 mod_deflate 模块压缩页面优化传输速度, 可以写为一行, 也可以写多行, 默认为 gzip
? vi /etc/httpd/conf.d/deflate.conf SetOutputFilter DEFLATE # mod_deflate configuration <IfModule mod_deflate.c> # 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)默认为 6 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 </IfModule>
扩展功能
apachectl, Apache HTTP 服务控制工具
ab, Apache HTTP 服务器性能测试工具
apxs, Apache 扩展工具
configure, 配置源代码
dbmmanage, 为基本认证创建和更新 DBM 格式的用户认证文件
htcacheclean, 清理磁盘缓存
htdigest, 为摘要认证创建和更新用户认证文件
htdbm, 操作 DBM 密码数据库
htpasswd, 为基本认证创建和更新用户认证文件
httxt2dbm, 为 RewriteMap 创建 dbm 文件
logresolve, 将 Apache 日志文件中的 IP 地址解析到主机名称
rotatelogs, 不关闭 Apache 而切换日志文件
suexec, 执行外部程序前切换用户
httpd-2.4 编译安装
apr 全程 apache portable runtime
yum -y install pcre-devel
cd
wget http://mirror.bit.edu.cn/apache//apr/apr-1.5.2.tar.gz
tar xf apr-1.5.2.tar.gz && cd apr-1.5.2
./configure –prefix=/usr/local/apr
make && make install
cd
wget http://mirror.bit.edu.cn/apache//apr/apr-iconv-1.2.1.tar.gz
tar xf apr-iconv-1.2.1.tar.gz && cd apr-iconv-1.2.1
./configure –prefix=/usr/local/apr-iconv –with-apr=/usr/local/apr
make && make install
cd
wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.5.4.tar.gz
tar xf apr-util-1.5.4.tar.gz && cd apr-util-1.5.4
./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr
make && make install
httpd2.4 新特性
- MPM 支持在运行时装载
–enable-mpms-shared=all –with-mpm=event 启用默认的 event
- 支持 event
- 异步读写
- 在每模块及每目录上指定日志级别
5)每请求配置:<If> <Elseif>
- 增强版的表达式分析器
- 毫秒级的 keepalive timeout
- 支持主机名的虚拟主机不在需要 NameVirtualHost 指令
- 支持使用自定义变量
新增一些模块:mod_proxy_fcgi,mod_ratelimit,mod_request,mod_remoteip
对于基于 IP 的访问做了修改,不在使用 order,allow,deny 这些机制;而是统一使用 require 进行
编译 httpd
wget http://apache.fayea.com//httpd/httpd-2.4.16.tar.bz2
tar xf httpd-2.4.16.tar.bz2
cd httpd-2.4.16
./configure –prefix=/usr/local/apache \
–sysconfdir=/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-modeles=most \
–enable-mpms-shared=all \
–with-mpm=event
make && make install
头文件
ln -sv /usr/local/appache/include /usr/include/httpd
库文件
ldconfig -p 显示当前系统的库文件
帮助文档
? vi /etc/man.config MANPATH /usr/local/apache/man
修改环境变量
? vi /etc/profile.d/httpd.sh export PATH=${PATH}:/usr/local/appache/bin/