httpd服务
httpd简介
httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。
通常,httpd不应该被直接调用,而应该在类Unix系统中由apachectl调用,在Windows中作为服务运行
版本信息
目前主要的版本有2个:
CentOS6系列的版本默认提供的是httpd-2.2版本的rpm包
CentOS7系列的版本默认提供的是httpd-2.4版本的rpm包
工作模型与工作方式
工作模型 | 工作方式 |
---|---|
prefork | 多进程模型,预先生成进程,一个请求用一个进程响应一个主进程负责生成n个子进程,子进程也称为工作进程。每个子进程处理一个用户请求,即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,最大不会超过1024个 |
worker | 基于线程工作,一个请求用一个线程响应(启动多个进程,每个进程生成多个线程) |
event | 基于事件的驱动,一个进程处理多个请求 |
httpd基础
httpd自带的工具程序
工具 | 功能 |
---|---|
htpasswd | basic认证基于文件实现时,用到的帐号密码生成工具 |
apachectl | httpd自带的服务控制脚本,支持start,stop,restart |
apxs | 由httpd-devel包提供的,扩展httpd使用第三方模块的工具 |
rotatelogs | 日志滚动工具 |
suexec | 访问某些有特殊权限配置的资源时,临时切换至指定用户运行的工具 |
ab | apache benchmark,httpd的压力测试工具 |
rpm包安装的httpd程序环境
文件/目录 | 功能 |
---|---|
/var/log/httpd/access.log | 访问日志 |
/var/log/httpd/error_log | 错误日志 |
/var/www/html/ | 站点文档目录 |
/usr/lib64/httpd/modules/ | 模块文件路径 |
/etc/httpd/conf/httpd.conf | 主配置文件 |
/etc/httpd/conf.modules.d/*.conf | 模块配置文件 |
/etc/httpd/conf.d/*.conf | 辅助配置文件 |
curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议
//用法
curl -o 下载下来取名 下载的位置
httpd命令
//语法:
httpd [options]
选项:
-l //查看静态编译的模块,列出核心中编译了哪些模块。它不会列出使用LoadModule指令动态加载的模块
-M //输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块
-v //显示httpd的版本,然后退出
-V //显示httpd和apr/apr-util的版本和编译参数,然后退出
-X //以调试模式运行httpd。仅启动一个工作进程,并且服务器不与控制台脱离
-t //检查配置文件是否有语法错误
编译安装httpd-2.4
[root@zlb ~]# yum -y install openssl-devel pcre-devel expat-devel libtool //安装必要的软件包
[root@zlb ~]# yum groupinstall -y "Development Tools" //安装工具
[root@zlb ~]# groupadd -r apache //创建组
[root@zlb ~]# useradd -r -M -s /sbin/nologin -g apache apache
[root@zlb ~]#
//事先下载好依赖包,我这里已经下载了
[root@zlb ~]# ls
anaconda-ks.cfg apr-1.6.3.tar.bz2 apr-util-1.6.1.tar.bz2 httpd-2.4.34.tar.bz2
[root@zlb ~]# tar xf apr-1.6.3.tar.bz2 //解压这些包
[root@zlb ~]# tar xf apr-util-1.6.1.tar.bz2
[root@zlb ~]# tar xf httpd-2.4.34.tar.bz2
[root@zlb ~]# ls
anaconda-ks.cfg apr-1.6.3.tar.bz2 apr-util-1.6.1.tar.bz2 httpd-2.4.34.tar.bz2
apr-1.6.3 apr-util-1.6.1 httpd-2.4.34
[root@zlb ~]# mv apr-1.6.3 /usr/src/ //移动到相应的目录中
[root@zlb ~]# mv apr-util-1.6.1 /usr/src/
[root@zlb ~]# cd /usr/src/
[root@zlb src]# ls
apr-1.6.3 apr-util-1.6.1 debug kernels
[root@zlb src]# cd apr-1.6.3/
[root@zlb apr-1.6.3]# vim configure
cfgfile=${ofile}T
trap "$RM \"$cfgfile\"; exit 1" 1 2 15
$RM "$cfgfile" //删除此行或者注释掉
cat <<_LT_EOF >> "$cfgfile"
[root@zlb apr-1.6.3]# ./configure --prefix=/usr/local/apr //编译安装,指定位置
[root@zlb apr-1.6.3]# make && make install
[root@zlb apr-1.6.3]# cd /usr/src/apr-util-1.6.1/
[root@zlb apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@zlb apr-util-1.6.1]# make && make install
[root@zlb ~]# cd httpd-2.4.34
[root@zlb httpd-2.4.34]#
[root@zlb httpd-2.4.34]# ./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-modules=most \
> --enable-mpms-shared=all \
> --with-mpm=prefork
[root@zlb httpd-2.4.34]# make && make install
[root@zlb ~]# vim /etc/httpd24/httpd.conf
# Require all granted
Require ip 192.168.26.2 //加入主机
</Directory>
[root@zlb ~]# apachectl stop
[root@zlb ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@zlb ~]# apachectl start
[root@zlb ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@zlb ~]#
虚拟主机
分成三类:
- 相同IP不同端口
- 不同IP相同端口
- 相同IP相同端口,不同域名
下面分别对这三个示例进行配置:
相同IP不同端口:
[root@zlb ~]# vim /etc/httpd24/httpd.conf
<VirtualHost 192.168.26.9:80>
ServerName www.xxx.com
DocumentRoot "/usr/local/apache/htdocs/xxx"
ErrorLog "logs/xxx_error_log"
CustomLog "logs/xxx_access_log" combined
<Directory /usr/local/apache/htdocs/xxx>
<RequireAll>
Require ip 192.168.26.1
</RequireAll>
</Directory>
</VirtualHost>
<VirtualHost 192.168.26.9:8080>
ServerName www.xxx2.com
DocumentRoot "/usr/local/apache/htdocs/xxx2"
ErrorLog "logs/xxx2_error_log"
CustomLog "logs/xxx2_access_log" combined
<Directory /usr/local/apache/htdocs/xxx2>
<RequireAll>
Require ip 192.168.26.1
</RequireAll>
</Directory>
</VirtualHost>
[root@zlb ~]# vim /etc/httpd24/httpd.conf //这里要添加监听端口
Listen 80
Listen 8080
[root@zlb ~]# cd /usr/local/apache/htdocs/
[root@zlb htdocs]# ls
index.html
[root@zlb htdocs]# mkdir xxx //创建目录
[root@zlb htdocs]# mkdir xxx2
[root@zlb htdocs]# echo "This is xxx" > xxx/index.html //创建文件
[root@zlb htdocs]# echo "This is xxx2" > xxx2/index.html
[root@zlb htdocs]# cat xxx
xxx/ xxx2/
[root@zlb htdocs]# cat xxx/index.html
This is xxx
[root@zlb htdocs]# cat xxx2/index.html
This is xxx2
[root@zlb htdocs]#
[root@zlb ~]# apachectl stop
[root@zlb ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@zlb ~]# apachectl start
[root@zlb ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::8080 :::* //这里的8080端口已经加上去了
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@zlb ~]#
[root@zlb ~]# vim /etc/httpd24/httpd.conf
<VirtualHost 192.168.26.9:80>
ServerName www.xxx.com
DocumentRoot "/usr/local/apache/htdocs/xxx"
ErrorLog "logs/xxx_error_log"
CustomLog "logs/xxx_access_log" combined
<Directory /usr/local/apache/htdocs/xxx>
<RequireAll>
Require ip 192.168.26.1
</RequireAll>
</Directory>
</VirtualHost>
<VirtualHost 192.168.26.5:80>
ServerName www.xxx2.com
DocumentRoot "/usr/local/apache/htdocs/xxx2"
ErrorLog "logs/xxx2_error_log"
CustomLog "logs/xxx2_access_log" combined
<Directory /usr/local/apache/htdocs/xxx2>
<RequireAll>
Require ip 192.168.26.1
</RequireAll>
</Directory>
[root@zlb ~]# vim /etc/httpd24/httpd.conf
#Listen 12.34.56.78:80
Listen 80
[root@zlb ~]# ip addr add 192.168.26.5/24 dev ens32 //这里要添加一个IP
[root@zlb ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:4c:8c:36 brd ff:ff:ff:ff:ff:ff
inet 192.168.26.9/24 brd 192.168.26.255 scope global ens32
valid_lft forever preferred_lft forever
inet 192.168.26.5/24 scope global secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::efce:6c39:35ae:6692/64 scope link
valid_lft forever preferred_lft forever
[root@zlb ~]#
[root@zlb ~]# apachectl stop
[root@zlb ~]# apachectl start
[root@zlb ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::80 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@zlb ~]#
相同的IP和端口,域名不同
[root@zlb ~]# vim /etc/httpd24/httpd.conf
<VirtualHost 192.168.26.9:80> //2处的IP和端口相同
ServerName www.xxx.com //域名不能相同
DocumentRoot "/usr/local/apache/htdocs/xxx"
ErrorLog "logs/xxx_error_log"
CustomLog "logs/xxx_access_log" combined
<Directory /usr/local/apache/htdocs/xxx>
<RequireAll>
Require ip 192.168.26.1
</RequireAll>
</Directory>
</VirtualHost>
<VirtualHost 192.168.26.9:80>
ServerName www.xxx2.com
DocumentRoot "/usr/local/apache/htdocs/xxx2"
ErrorLog "logs/xxx2_error_log"
CustomLog "logs/xxx2_access_log" combined
<Directory /usr/local/apache/htdocs/xxx2>
<RequireAll>
Require ip 192.168.26.1
</RequireAll>
</Directory>
</VirtualHost>
//在Windows的c盘上要添加主机名,具体路径为c盘>Windows>System32>drivers>etc/hosts
[root@zlb ~]# apachectl stop //每次更改配置文件必须重启Apache服务
[root@zlb ~]# apachectl start
[root@zlb ~]#