httpd常见特性
1.事先创建空闲进程。
2.按需维持适当的进程。
3.使用模块化设计,核心比较小,各种功能都以模块方式添加。
4.支持运行时配置,支持单独编译模块。
5.支持多种方式的虚拟主机配置。
6.支持https协议,通过mod_ssl模块实现。
7.支持用户认证
8.支持基于IP或主机名的ACL
9.支持基于每目录的访问控制。
10.支持URL重写。
MPM(Mulit Path Modules)多道处理模块。
mpm_winnt windows上专用的线程处理机制。
perfork
预先生成多个进程,一个进程响应单个请求。
稳定性高,性能差。
单个进程崩溃不会影响到其他进程,但是会消耗大量的系统资源,特别是并发处理时要进行大量的进程切换。
worker
启动多个进程,每个进程下生成多个线程响应多个请求。单个线程响应单个请求。
效率高,多个线程共享一个资源。但是会产生资源竞争问题。目前在linux上性能不如perfork高。
event
基于事件驱动,一个进程同时处理多个请求。一个进程响应多个请求。
httpd更改所使用的模型,修改/etc/sysconfig/httpd。
虚拟主机:
物理服务器只有1个。
web程序只有1个。
却可以服务多个不同的站点。
常见类型:
默认主机,若使用此必须定义在第一个。
_default_:PORT
_default_:* 监听任意端口
_default_:80 监听80端口
基于IP的虚拟主机
IP1:PORT
IP2:PORT
基于端口的虚拟主机
IP:PORT1
IP:PORT2
基于域名的虚拟主机
IP:PORT
*:PORT 全部主机都监听同一个端口
ServerName不同
httpd:
安装:
httpd受SElinux控制的,所以需要先设置为permssive。
1.rpm包
#yum -y install httpd
2.源码编译
相关文件目录:
/usr/sbin/httpd 执行进程服务
主导进程(master process)
属主为root,属组为root。第一个进程,负责维护空闲进程。
工作进程(worker process)
属主为apache,属组为apache。
/etc/rc.d/init.d/httpd 服务脚本
启动后占用TCP的80端口,https占用TCP的443端口。
/etc/sysconfig/httpd
为httpd服务脚本的配置文件。
/etc/httpd
以rpm包安装后的工作根目录,相当于程序的安装目录。
/etc/httpd/conf 配置文件目录
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/*.conf
主配置文件的组成部分。在主配置文件中使用include包含此目录下的文件
welcome.conf 欢迎界面的配置文件。
/etc/httpd/modules
模块路径,此路径为链接,指向/lib/httpd/。
/etc/httpd/logs
日志目录,此路径为链接,指向/var/log/httpd/。
访问日志:access_log
客户端发起的请求及服务端响应的结果。
错误日志:err_log
错误的访问、服务器错误信息等。
/var/www/html 静态页面所在路径
/var/www/cgi-bin
动态内容所在路径,CGI:Common Gateway Interface 通用网关接口。
/var/www/error/*
错误页面文件位置,可以自定义。
/etc/sysconfig/httpd
#HTTPD=/usr/sbin/httpd.worker 默认是使用perfork模式。若修改则取消注释并修改。
/etc/httpd/conf/httpd.conf
指令结构:
指令(directive) 值(value)
指令不区分字符大小写,值则根据需要进行是否区分大小写。
全局配置(Global Enviroment)
Servertokens OS|... 指定显示httpd显示详细信息的程度。
Serverroot "/etc/httpd" 指定httpd的根路径。
PidFile run/httpd.pid 指定pid文件的路径,此路径为相对路径。
Timetou 120 指定TCP三次握手建立连接,第一次握手成功成功等待第二次确认的超时时间。
KeepAlive on 是否启动长连接。
MaxKeepAliveRequests 100 指定长连接响应的个数,0表示无限制。
KeepAliveTimeout 15 长连接的断开时间为15秒。
<IfModule perfork.c>
StartServers 8 启动服务后生成空闲进程个数。
MinSpareServers 5 最少空闲进程,保证服务运行中最少空闲进程的个数。如不够则生成新空闲进程。
MaxSpareServers 20 最大空闲进程,如果空闲进程大于设定,则关闭多余进程。
ServerLimit 256 指定MaxClient的上限值。
MaxClient 256 最大客户端数,允许同时连接服务器的客户端个数。
MaxRequestsPerChild 4000 单个进程最大响应次数。超过此则结束进程重新生成。
</IfModule>
<IfModule worker.c>
StartServers 2 启动的进程数。
MaxClient 150 最大客户端数。
MinSpareThreads 25 最小空闲总线程数。
MaxSpareThreads 75 最大空闲总线程数。
TheardsPerChild 25 每个进程生成的最大线程数。
MaxRequestsPerChild 0 每个进程的最大响应数。这里因为使用线程,所以无法限定。
</IfModule>
Listen 80 指定监听端口,可监听多端口。
LoadModule MODNAME MODDIR 需要加载加载模块,指定模块名称和路径。
Include conf.d/*.conf 将该目录下的.conf文件的配置信息包含进来。
User apache 指定普通进程的属主。
Group apache 指定普通进程的属组。
中心服务器配置('Main' server configuration)
ServerAdmin MAILADDR 定义管理员的邮箱地址。
#ServerName SSERVERNAME:PORT 若注释掉,则则启动服务时会尝试反解析主机名,如果解析不到则报错。
DocumentRoot "/var/www/html" 指定网页文件存放位置。
<directory "/var/www/html">
Options OPTION
None 不支,km持任何选项。
Indexes 允许以目录索引的方式显示文件。一般用作提供文件下载的场景下使用。
FollowSymLinks 允许跟随符号链接,允许访问符号链接对应的源文件。会带来安全性问题,一般建议不使用。
Includes 允许执行服务器端包含,允许执行SSI格式网页文件,会带来安全问题,一般建议不使用。
SymLinksifOwnerMatch 对FollowSymLinks更进一步限定,允许执行符号链接,但是链接的的属主要同执行httpd进程的用户相同。一般建议不使用
ExecCGI 允许执行CGI脚本。
MultiViews 允许多视图。根据客户端来源的语言和文字判定显示对应的网页。
ALL 启用所有选项。
AllowOverride OPTION 允许覆盖ACL
All
None
AuthConfig 使用自定义的账号验证文件进行验证。
Limit
FileInfo
Order allow,deny 指定ACL的模式为白名单(allow,deny)或者是黑名单(deny,allow)。
Allow form all 定义ACL列表,基于IP、主机名、网络地址
#Deny from
AuthType Basic 指定认证类型
AuthName "DESCRIPTION" 显示描述信息
AuthUserFile DIR 指定认证用户账号文件存放路径,例如/user/local/apache/passwd/paaaswords
AuthGroupFile DIR 指定认证用户组组文件路径,文件格式为GROUPNAME:USER1 USER2 ...
Require all granted 允许全部访问
Require all denied 全部禁止访问
Require user USERNAME 允许单个用户。
Require group GROUPNAME 允许某个组中的用户。
Require valid-user 认证用户账号中出现的账号都允许登陆
</directory>
DiretcoryIndex index.html index.html.var 定义默认显示的访问页面,优先级从左自右匹配。
AccessFileName .htaccess 定义基于每目录的访问控制。
<file ~ "^\.ht"> 匹配以.ht开头的文件
Order allow,deny
Deny from all
</file>
TypeConfig /etc/mime.types 指定定义mime类型的文件
DefaultType text/plain 指定默认类型
HostnameLookups off 是否在日志中记录主机名的反解析信息
Errorlog logs/error_log 指定错误日志文件
LogLevel LEVEL 指定日志级别
LogFormat FORMAT TYPENAME 指定日志格式和名称
%h 远程主机地址
%l 远程主机登录名称
%u 登陆网站认证的用户名
%t 日志事件产生的时间
%r 请求报文的第一行
%s 最后一次请求的状态码
%b 相应报文的大小
%{Foobar}i 对应Foobar指定行的内容
CustomLog logs/access_log combind 定义访问日志文件以及要应用的日志格式。
Alias /ALIASNAME "DIR" 为某个路径设定别名。
虚拟主机(Virtual Hosts)
ServerName SERVERNAME
ServerAlias HOSTNAME 指定虚拟主机的主机别名
ScriptAlias SCRIPTNAME 指定脚本的别名
<Location "URLDIR"> 定义访问URL地址的权限方法等。
SetHandler server-status 实现匹配到的文件由对应的处理器进行处理动作。
Order Deny,allow
Deny form all
Allow from .foo.com
</Location>
<VirtualHost HOST> 这里HOST根据类型不同有不同写法,具体看上边对虚拟主机的相关。
</VirtualHost>
#DocumentRoot 若要启动虚拟主机则要在主服务器配置中禁用次项。
或者在/etc/httpd/conf.d/下新建单独的配置文件。
例如,创建虚拟主机,使用3种模式,同时分离日志,启动访问策略,禁止192.168.1.4访问。iaa.com访问的时候需要提供账号密码。:
#cd /etc/httpd/conf.d
#vim vh.conf
<VirtualHost 192.168.1.3:80>
ServerName www.test.com
DocumentRoot "/www/test.com"
CustomLog /var/log/httpd/test.com/access_log combind
</VirtualHost>
<VirtualHost _default_:80>
ServerName _default_
DocumentRoot "/www/default80"
</VirtualHost>
<VirtualHost 192.168.1.4:80>
ServerName abc.iaa.com
DocumentRoot "/www/iaa.com"
CustomLog /var/log/httpd/iaa.com/access_log combind
<Directory "/www/iaa.com">
Options none
AllowOverride authconfig
AuthType Basic
AuthName "loggin"
AuthUserFile "/etc/httpd/.htpasswd"
Require valid-user
</Directory>
</VirtualHost>
<VirtualHost 192.168.1.4:8080>
ServerName www.ibb.net
DocumentRoot "/www/ibb.net"
CustomLog /var/log/httpd/ibb.net/access_log combind
</VirtualHost>
NameVitualHost 192.168.1.4:80
<VirtualHost 192.168.1.4:80>
ServerName www.idd.gov
DocumentRoot "/www/idd.gov"
CustomLog /var/log/httpd/idd.gov/access_log combind
<Directory "/www/idd.gov">
Opitons none
AllowOverride none
Order deny,allow
Deny from 192.168.1.14
</Diretctor>
</VirtualHost>
#cd /etc/httpd/conf/
#mkdir -pv /www{test.com,iaa.com,bii.net,idd.gov,default80}
#vim /www/test.com/index.html
#vim /www/iaa.com/index.html
#vim /wwww/ibb.net/index.html
#vim /wwww/idd.gov/index.html
#vim /wwww/default80/index.html
#ip addr add 192.168.1.4/24 device eth0
#vim httpd.conf
Listen 8080
#vim /etc/hosts
#cd /var/log/httpd/
#mkdir test.com iaa.com ibb.net idd.gov
#htpasswd -c -m /etc/httpd/.htpasswd tom
#htpasswd -m /etc/httpd/.htpasswd jerry
#systemclt restart httpd
注意:基于主机的访问,若直接输入ip地址,则会先显示www.iaa.com。即先返回配置文件中第一个符合的主机。
#httpd [OPTION]
[OPTION]
-l 列出当前支持模块。
-t 检测配置文件语法正确性。
-M 显示所有额外装载的模块。
#httpd.work 显示使用worker模型下支持的模块。
#httpd.envet 显示使用event模型下支持的模块。
#elinks [OPTION] URL 纯文本界面下的浏览器
[OPTION]
-dump 显示网页后立即退出,不在进入交互模式。
-source 显示网页源代码
#htpasswd [OPTION] FILE USERNAME [PASSWORD] 创建AuthConfig用户认证文件。
[OPTION]
-c 创建文件,只有第一次创建时使用,若文件已存在则会被清空
-n 用户的密码以md5方式存放的
-D 删除用户
压力测试工具:
ab
LoadRunner
SElinux:
配置文件:
/etc/selinux/config
/etc/sysconfig/selinux
#getenforce 查看SElinux状态
#setenforce NUM 临时设置SELinux状态
NUM
0 permissive
1 enforcing
FireWall
#systemctl stop firewalld 停止防火墙
#systemclt disable firewalld 禁用防火墙服务
基于openssl的httpd服务配置
mod_ssl ssl的模块包,使用yum安装httpd必须要安装此包。
证书服务器上:
生成私钥:
#cd /etc/pki/CA
#(umask 077;openssl genrsa -out private/cakey.pem 2048)
编辑证书默认信息:
#vim ../tls/openssl.cnf
生成自签证书:
#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
修改配置文件:
#vim ../tls/openssl.cnf
dir=/etc/pki/CA
#mkdir certs crl newcerts 根据配置文件的内容创建相关的文件夹和文件
#touch index.txt
#echo 00 > serial
签署证书:
#openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -dyas 3650
httpd服务器上:
放置证书:
#cd /etc/httpd/
#mkdir ssl
#cd ssl
#(umask 077;openssl genrsa 1024 > httpd.key )
#openssl req -new -key httpd.key -out httpd.csr 生成证书请求。
Common Name: 要使用证书的虚拟主机的名称。
将生成的证书请求文件复制到证书服务器:
#scp httpd.scr [email protected]:/tmp
将颁发的证书复制到本机:
#scp 192.168.100.4:/tmp/httpd.crt ./
#ll
httpd.crt
httpd.csr
httpd.key
配置ssl模块配置文件:
#cd /etc/httpd/conf.d/
#vim ssl.conf
SSLEngine on 启用ssl功能
SSLCertificateFile /etc/httpd/ssl/httpd.crt 指定ssl证书文件
SSLCertificateKeyFile /etc/httpd/ssl/http.key 指定私钥文件。
验证效果:
使用https://SERVER 访问即可查看证书信息