httpd服务
httpd
1、httpd简介
httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。
通常,httpd不应该被直接调用,而应该在类Unix系统中由apachectl调用,在Windows中做为服务运行。
2、httpd版本
主要介绍httpd的两大版本:
- httpd-2.2
- httpd-2.4
2.1 httpd的特性
- httpd-2.2 特性:
事先创建进程
按需维持适当的进程
模块化设计,核心比较小,各种功能通过模块添加(包括PHP),支持运行时配置,支持单独编译模块
支持多种方式的虚拟主机配置,如基于ip的虚拟主机,基于端口的虚拟主机,基于域名的虚拟主机等
支持https协议(通过mod_ ssI模块实现)
支持用户认证
支持基于IP或域名的ACL访问控制机制
支持每目录的访问控制(用户访问默认主页时不需要提供用户名和密码,但是用户访问某特定目录时需要提供用户名和支持URL重写
支持MPM (Multi Path Modules,多处理模块)。用于定义httpd的工作模型(单进程、 单进程多线程、多进程、多进程单线程、多进程多线程) - httpd-2.4 特性:
MPM支持运行DSO机制(Dynamic Share Object,模块的动态装/卸载机制),以模块形式按需加载
支持event MPM, event MPM模块生产环境可用
支持异步读写
支持每个模块及每个目录分别使用各自的日志级别
每个请求相关的专业配置,使用来配置
增强版的表达式分析器
支持毫秒级的keepalive timeout
基于FQDN的虚拟主机不再需要Name Virtual Host指令
支持用户自定义变量
支持新的指令(Allow Override List)
降低对内存的消耗
3、httpd基础
3.1 httpd 自带的工具程序
工具 | 功能 |
---|---|
htpasswd | basic 认证基于文件实现,用到的账户密码生成工具 |
apachectl | httpd自带的服务控制脚本,支持start,stop,restart |
apxs | 由httpd-devel 包提供的,扩展httpd使用第三方模块的工具 |
rotatelogs | 日志滚动工具 |
suexec | 访问某些有特殊权限配置的资源时,临时切换至指定的用户运行的工具 |
ab | apache benchmark ,httpd的压力测试工具 |
3.2 web 相关的命令
1.curl 命令
-
curl是基于URL语法在命令行方式下的传输工具,它支持FTP,FTPS,HTTP,HTTPS等协议
-
curl 支持的功能:
·https 认证
·http 的POST/PUT 等方法
·ftp 上传
·kerberos 认证
·http 上传
·代理服务器
·cookies
·用户名/密码认证
·下载文件断点传续
·socks5 代理服务器
·通过http 代理服务器上传文件到ftp服务器 -
语法
//语法:curl [option] […]
常用的option:
-A……//设置用户代理发送给服务器
-basic……//使用Http 基本认证
–tcp-nodelay …… //使用TCP_NODELAY选项
-e …… //来源网址
–cacert ……//CA证书
–compressed ……//要求返回时压缩格式
-H……//自定义请求首部信息传递服务器
-I ……//只显示响应报文首部信息
–limit-rate ……//设置传输速度
-o……//把输出写到文件中
2.httpd 命令
-l……//查看静态编译模块,列出核心中编译了那些模块
-M……//输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块
-v……//显示httpd版本,然后退出
-V……//显示httpd和apr/apr-util的版本和编译参数,然后退出
-X……//以调试模式运行httpd
-t……//检查配置文件是否有错误
4、 编译安装 httpd-2.4
//关闭防火墙与SELINUX
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost ~]# setenforce 0
**//安装前请确保本地仓库或网络源有一个可以用**
**//安装开发环境**
[root@localhost ~]# yum groupinstall "Development Tools"
……安装过程略
[root@localhost ~]# groupadd -r apache
[root@localhost ~]# useradd -r -g apache apache
[root@localhost ~]# yum -y install openssl-devel pcre-devel expat-devel libtool
……安装过程略
**//下面下载安装包请确保电脑有网(如果有下载好的安装包可直接上传即可。)**
**//下载并安装apr-1.4+和apr-util-1.4+**
[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget http://mirrors.shu.edu.cn/apache//apr/apr-1.6.5.tar.bz2
……下载过程略
[root@localhost src]# wget http://mirrors.shu.edu.cn/apache//apr/apr-util-1. 6.1.tar.bz2
……下载过程略
[root@localhost src]# ls
apr-1.6.5.tar.bz2 apr-util-1.6.1.tar.bz2 debug kernels
[root@localhost src]# tar xf apr-1.6.5.tar.bz2
[root@localhost src]# tar xf apr-util-1.6.1.tar.bz2
[root@localhost src]# ls
apr-1.6.5 apr-1.6.5.tar.bz2 apr-util-1.6.1 apr-util-1.6.1.tar.bz2 debug kernels
[root@localhost src]# cd apr-1.6.5
[root@localhost apr-1.6.5]# vim configure
........
cfgfile="${ofile}T"
trap "$RM \"$cfgfile\"; exit 1" 1 2 15
# $RM "$cfgfile" //将此行添加注释
.........
[root@localhost apr-1.6.5]# ./configure --prefix=/usr/local/apr
……配置过程略
[root@localhost apr-1.6.5]# make && make install
……编译安装过程略
[root@localhost apr-1.6.5]# cd /usr/src/apr-util-1.6.1
[root@localhost apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
……配置过程略
[root@localhost apr-util-1.6.1]# make && make install
……编译安装过程略
**//下载httpd(如有下载完成的安装包可直接上传)**
[root@localhost ~]# wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.4.38 .tar.bz2
……下载过程略
[root@localhost ~]# ls
httpd-2.4.38.tar.bz2
[root@localhost ~]# tar xf httpd-2.4.38.tar.bz2
[root@localhost ~]# ls
httpd-2.4.38.tar.bz2 httpd-2.4.38
[root@localhost ~]# cd httpd-2.4.38
[root@localhost httpd-2.4.38]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd38 --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@localhost httpd-2.4.37]# make && make install
……编译安装过程略
**//创建软连接**
[root@localhost ~]# echo "export PATH=/usr/local/apache/bin:$PATH" > /etc/profile.d/httpd.sh
[root@localhost ~]# source /etc/profile.d/httpd.sh
[root@localhost ~]# ln -s /usr/local/apache/include/ /usr/include/httpd
[root@localhost ~]# echo 'MANPATH /usr/local/apache/man' >> /etc/man.config
**//取消ServerName前面的注释**
[root@localhost ~]# sed -i '/#ServerName/s/#//g' /etc/httpd38/httpd.conf
**//启动服务(80端口为httpd服务端口)**
[root@localhost ~]# apachectl start
[root@server ~]# 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 :::81 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::* :::*
5、httpd 常用配置
模块 | 功能 |
---|---|
prefork | 多进程模型,预先生成进程,一个请求用一个进程响应,一个主进程负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求, 即使没有用户请求,也会预先生成多个空闲进程 |
worker | 基于线程工作,一个请求用一个线程响应(启动多个进程,每个进程生成多个线程 |
event | 基于事件的驱动,一个进程处理多个请求 |
5.1 控制访问法则
法则 | 功能 |
---|---|
Require all granted | 允许所有主机访问 |
Require all deny | 拒绝所有主机访问 |
Require ip IPADDR | 授权指定来源地址的主机访问 |
Require not ip IPADDR | 拒绝指定来源地址的主机访问 |
Require host HOSTNAME | 授权指定来源主机名的主机访问 |
Require not host HOSTNAME | 拒绝指定来源主机名的主机访问 |
6、虚拟主机
虚拟主机有三类::
- 相同IP不同端口
- 不同IP相同端口
- 相同IP相同端口不同域名
6.1 相同IP不同端口
[root@localhost ~]# vim /etc/httpd38/httpd.conf
.......
**//在最后一行加入以下内容**
<VirtualHost *:80>
DocumentRoot "/usr/local/apache/htdocs/aaa"
ServerName zhao.example.com
ErrorLog "logs/11-error_log"
CustomLog "logs/11-access_log" common
</VirtualHost>
<VirtualHost *:81>
DocumentRoot "/usr/local/apache/htdocs/bbb"
ServerName wen.example.com
ErrorLog "logs/22-error_log"
CustomLog "logs/22-access_log" common
</VirtualHost>
**//末行模式下搜索:/Listen**
**//在添加一个端口(默认端口为80)**
#
#Listen 12.34.56.78:80
Listen 80
Listen 81
.....
[root@localhost ~]# cd /usr/local/apache/htdocs/
[root@localhost htdocs]# mkdir aaa bbb
[root@localhost htdocs]# ls
aaa bbb index.html
[root@localhost htdocs]# cd aaa/
[root@localhost aaa]# echo "123456789" > index.html
[root@localhost htdocs]# cd bbb/
[root@localhost bbb]# echo "987654321" > index.html
[root@localhost ~]# apachectl -t
Syntax OK
[root@localhost ~]# apachectl restart
[root@localhost ~]# 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 :::81 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
6.2 不同IP相同端口
[root@localhost ~]# vim /etc/httpd38/httpd.conf
.......
**//在最后一行加入以下内容**
<VirtualHost 192.168.206.129:80>
DocumentRoot "/usr/local/apache/htdocs/aaa"
ServerName zhao.example.com
ErrorLog "logs/11-error_log"
CustomLog "logs/11-access_log" common
</VirtualHost>
<VirtualHost 192.168.206.100:80>
DocumentRoot "/usr/local/apache/htdocs/bbb"
ServerName wen.example.com
ErrorLog "logs/22-error_log"
CustomLog "logs/22-access_log" common
</VirtualHost>
[root@localhost ~]# apachectl -t
Syntax OK
**//临时添加一个ip**
[root@localhost ~]#ip addr add 192.168.206.100/24 dev eth0
[root@localhost ~]# cd /usr/local/apache/htdocs/
[root@localhost htdocs]# mkdir aaa bbb
[root@localhost htdocs]# ls
aaa bbb index.html
[root@localhost htdocs]# cd aaa/
[root@localhost aaa]# echo "123456789" > index.html
[root@localhost htdocs]# cd bbb/
[root@localhost bbb]# echo "987654321" > index.html
[root@localhost ~]# apachectl restart
6.3 相同IP相同端口不同域名
[root@localhost ~]# vim /etc/httpd38/httpd.conf
.......
**//在最后一行加入以下内容**
<VirtualHost *:80>
DocumentRoot "/usr/local/apache/htdocs/aaa"
ServerName zhao.example.com
ErrorLog "logs/11-error_log"
CustomLog "logs/11-access_log" common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/usr/local/apache/htdocs/bbb"
ServerName wen.example.com
ErrorLog "logs/22-error_log"
CustomLog "logs/22-access_log" common
</VirtualHost>
[root@localhost ~]# apachectl -t
Syntax OK
[root@localhost ~]# cd /usr/local/apache/htdocs/
[root@localhost htdocs]# mkdir aaa bbb
[root@localhost htdocs]# ls
aaa bbb index.html
[root@localhost htdocs]# cd aaa/
[root@localhost aaa]# echo "123456789" > index.html
[root@localhost htdocs]# cd bbb/
[root@localhost bbb]# echo "987654321" > index.html
[root@localhost ~]# apachectl restart
**//下面的操作需要先返回电脑桌面**
1、点击桌面上的‘我的电脑’
2、点击进入:C:\windows\systemd32\drivers\etc\
3、把里面的hosts文件拖到电脑桌面上双击用记事本打开
4、在hosts文件里的最后一行加上你ip和你的域名(域名就是你上面设置的 ServerName)
192.168.206.xxx xxx.xxx.com
192.168.206.xxx xxx.xxx.com
5、关闭并保存文件,然后把文件拖回原来的位置
6、刷新一下‘我的电脑’