http服务器程序
httpd 服务名称
apache 软件包名
特性:
高度模块化: core + modules
DSO: Dynamic Shared Object 动态加/卸载
MPM: multi-processing moudule 多路处理模块
MPM工作模式:
1. prefork 多进程IO模型,每个进程响应一个请求,默认模型
一个主进程: 生成和回收N个子进程,创建套接字,不响应请求
多个子进程: 工作work进程,每个子进程处理一个请求,系统初始化时候,预先生成多个空闲进程,等待请求,最大不超过1024个(系统打开文件描述符的最大极限)
2. worker 复用的多进程IO模型,多进程多线程
一个主进程: 生成m个子进程,每个子进程负责生成n个线程,每个线程响应一个请求,并发响应请求 m*n
3.event 事件驱动模型(worker模型的变种)
一个主进程: 生成m个子进程,每个子进程生成n个线程,在n个线程中有个单独的线程专门来管理其它的(keep-alive)线程,当有真实的请求时候管理线程会将真实请求传递给服务线程,执行完毕后,又允许释放执行任务的线程继续执行下一个请求任务
4.线(进)程的的角色切换
监听 (从空闲队列中取出一个线程进行监听) 》 工作(处理用户请求) 》 空闲(加入空闲线程队列)
每个线程和进程工作一段时间后会被回收掉,然后生成一个新的线程或者进程来响应用户请求.
HTTPD服务配置
检查配置文件语法是否正确 httpd -t
1.如果在/var/www/html目录下没有index.html的话,就会去找/etc/httpd/conf.d/welcome.conf配置的页面,如果没有welcome.conf的配置文件,那么访问网站的根路径就会显示出文件列表,此种情况适合搭建yum源,但不适合其它网站应用(会把所有的文件数据展示给用户,没有安全保障)
1.根目录下的index.html > 2.welcome.conf配置下的noindex.html > 3.根目录下的文件列表(默认情况)
2.隐藏服务器响应头中系统版本号 servertokens prod
1.添加httpd服务的配置不建议直接在主配置文件中直接修改,可以在/etc/httpd/conf.d添加一个以.conf结尾的配置文件,写好配置项后直接重启服务即可生效
3.修改端口只能修改主配置文件的端口,在其它配置文件中添加端口配置相当于启动了两个监听端口.
4.修改Listen配置项目 不仅仅是设置监听端口,还可设置监听的IP
5.配置持久连接
6.配置多路处理模块 /etc/httpd/conf.modules.d/00-mpm.conf
1.prefork 开启的进程数就是等于用户的连接数
7.如果需要访问一个文件夹,必须要给此文件夹授权访问,如果没有授权,将无法访问此文件夹的任何文件
8.网站根目录中可以存在子文件夹,软连接等
搭建https服务器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1.搭建CA证书 在CA服务器端执行 1.cd /etc/pki/CA 2.创建私钥 (umask 077;openssl genrsa -out private/cakey.pem 2048 ) 3.自签名证书 openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 4.touch index.txt 5.echo 01 > serial 2.在httpd服务端执行CA客户端 1.mkdir /etc/httpd/conf.d/ssl 2.生成私钥 (umask 077;openssl genrsa -out httpd.key 1024) 3.生成申请文件 openssl req -new -key httpd.key -out httpd.csr 4.scp httpd.csr 复制到 CA服务器上 5.在CA服务器上颁发CA证书 openssl ca -in httpd.csr -out certs/ca.yxh.com.crt -days 720 6.把证书拷贝到httpd服务器主机 scp certs/ca.yxh.com.crt 192.168.231.7:/etc/httpd/conf.d/ssl/ scp cacert.pem 192.168.231.7:/etc/httpd/conf.d/ssl/ 7.yum install mod_ssl 8.[root@node7 ssl]# ls cacert.pem CA服务器自签名证书 ca.yxh.com.crt CA服务器颁发给客户端的CA证书 httpd.csr 客户端的CA申请证书 httpd.key 私钥 9.修改 /etc/httpd/conf.d/ssl.conf SSLCertificateFile /etc/httpd/conf.d/ssl/ca.yxh.com.crt SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem
将http重定向到https
1、打开url重定向支持
(1)在apache目录下找到httpd.conf文件,并且找到#LoadModule rewrite_module modules/mod_rewrite.so 去掉#号
(2)找到<Directory "/var/www/html">字段,如下所示:
<Directory "/var/www/html">
AllowOverride None 改为 AllowOverride ALL
</Directory>
(3)修改后重启apache服务
2、在网站根目录下,即"/var/www/html" 目录下新建文件,文件名为(.htaccess)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
https会话过程解析
SSL会话的简化过程
(1) 客户端发送可供选择的加密方式,并向服务器请求证书
(2) 服务器端发送证书以及选定的加密方式给客户端
(3) 客户端取得证书并进行证书验证
如果信任给其发证书的CA
(a) 验证证书来源的合法性;用CA的公钥解密证书上数字签名
(b) 验证证书的内容的合法性:完整性验证
(c) 检查证书的有效期限
(d) 检查证书是否被吊销
(e) 证书中拥有者的名字,与访问的目标主机要一致
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器, 完成密钥交换
(5) 服务器用此密钥加密用户请求的资源,响应给客户端
注意:SSL是基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机
访问控制配置
配置文件有冲突的话,后面的配置文件优先级高会覆盖前面的配置文件
如果想访问某个目录或者目录下的文件,必须给这个目录授权,否则默认是不能访问的
documentroot "/data/website"
<Directory "/data/website">
Require all granted
</Directory>
访问控制
不能有失败,至少有一个成功匹配才成功,即失败优先
<Directory "/data/website">
<RequireAll>
Require all granted
Require not ip 192.168.231.1
</RequireAll>
</Directory>
多个语句有一个成功,则成功,即成功优先
<Directory "/data/website">
<RequireAny>
Require all denied
require ip 172.16.1.1 允许特定IP
</RequireAny>
</Directory>
基于IP的访问控制:
无明确授权的目录,默认拒绝
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all denied
控制特定的IP访问:
Require ip IPADDR:授权指定来源的IP访问
Require not ip IPADDR:拒绝特定的IP访问
控制特定的主机访问:
Require host HOSTNAME:授权特定主机访问
Require not host HOSTNAME:拒绝
HOSTNAME:
FQDN:特定主机
domin.tld:指定域名下的所有主机
配置服务监听注意项
配置监听一般不仅仅是可以配置服务的监听端口,还有监听的网卡IP
0-1023端口 只能给管理员用,普通用户是无法使用这些端口的
127.0.0.1 80 这个时候只有本机可以访问80端口,其它任何主机是不能访问的
192.168.30.7 80 只有30网段的机器机器可以访问这台主机的80端口
0.0.0.0 80 可以通过服务器主机的任何一个IP来访问服务器的80端口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
root@centos7 ~]# ss -ntul Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:41579 *:* udp UNCONN 0 0 *:41881 *:* udp UNCONN 0 0 192.168.122.1:53 *:* udp UNCONN 0 0 *%virbr0:67 *:* udp UNCONN 0 0 *:68 *:* udp UNCONN 0 0 *:5353 *:* udp UNCONN 0 0 :::55387 :::* tcp LISTEN 0 128 *:111 *:* tcp LISTEN 0 5 192.168.122.1:53 *:* tcp LISTEN 0 128 *:22 *:* tcp LISTEN 0 128 127.0.0.1:631 *:* tcp LISTEN 0 100 127.0.0.1:25 *:* tcp LISTEN 0 128 :::111 :::* tcp LISTEN 0 128 :::22 :::* tcp LISTEN 0 128 ::1:631 :::* tcp LISTEN 0 100 ::1:25 :::*
基于身份验证配置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
htpasswd -c /etc/httpd/conf.d/.httpuser user1 htpasswd /etc/httpd/conf.d/.httpuser user2 [root@node7 conf.d]# cat .httpuser user1:$apr1$/vggiUOi$Svh202puSmvzrpn5zuX/10 user2:$apr1$II5vUPxh$m4vzva.dzpJ6Sv4xlBIqT0 vi /etc/httpd/conf.d/yxh.conf <Directory "/data/website"> AuthType Basic AuthName "welcome to access admin website" AuthUserFile "/etc/httpd/conf.d/.httpuser" Require user user1 </Directory>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
authconfig和.htaccess两者必须配合使用 <Directory "/data/website"> allowoverride authconfig </Directory> cd /data/website && vi .htaccess AuthType Basic AuthName "welcome to access admin website" AuthUserFile "/etc/httpd/conf.d/.httpuser" Require user user1
查看apache服务器的状态
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<Location "/status"> SetHandler server-status Require all granted </Location>
打开浏览器输入地址: http://192.168.231.7/status
虚拟主机配置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
touch /data/website1/index.html touch /data/website2/index.html touch /data/website3/index.html <Directory "/data"> Require all granted </Directory> listen 81 listen 82 listen 83 <VirtualHost *:81> DocumentRoot "/data/website1" ServerName www.a.com ErrorLog "logs/a.com.err_log" TransferLog "logs/a.com-access_log" </VirtualHost> <VirtualHost *:82> DocumentRoot "/data/website2" ServerName www.b.com ErrorLog "logs/b.com.err_log" TransferLog "logs/b.com-access_log" </VirtualHost> <VirtualHost *:83> DocumentRoot "/data/website3" ServerName www.c.com ErrorLog "logs/c.com.err_log" TransferLog "logs/c.com-access_log" </VirtualHost>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
ip a add 192.168.231.8/24 dev ens33 ip a add 192.168.231.9/24 dev ens33 <Directory "/data"> Require all granted </Directory> <VirtualHost 192.168.231.8:80> DocumentRoot "/data/website1" ServerName www.a.com ErrorLog "logs/a.com.err_log" TransferLog "logs/a.com-access_log" </VirtualHost> <VirtualHost 192.168.231.9:80> DocumentRoot "/data/website2" ServerName www.b.com ErrorLog "logs/b.com.err_log" TransferLog "logs/b.com-access_log" </VirtualHost> <VirtualHost 192.168.231.10:80> DocumentRoot "/data/website3" ServerName www.c.com ErrorLog "logs/c.com.err_log" TransferLog "logs/c.com-access_log" </VirtualHost>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
修改客户端hosts文件或者搭建dns解析 192.168.231.7 www.a.com 192.168.231.7 www.b.com 192.168.231.7 www.c.com 修改httpd服务端的配置文件 <VirtualHost *:80> DocumentRoot "/data/website1" ServerName www.a.com ErrorLog "logs/a.com.err_log" TransferLog "logs/a.com-access_log" </VirtualHost> <VirtualHost *:80> DocumentRoot "/data/website2" ServerName www.b.com ErrorLog "logs/b.com.err_log" TransferLog "logs/b.com-access_log" </VirtualHost> <VirtualHost *:80> DocumentRoot "/data/website3" ServerName www.c.com ErrorLog "logs/c.com.err_log" TransferLog "logs/c.com-access_log" </VirtualHost>
Sendfile机制
不用 sendfile 的传统网络传输过程:
硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈
上面4个步骤有4次上下文切换,有4次拷贝,如果能减少切换次数和拷贝次数将会有效提升性能
使用sendfile
sendfile() 不但能减少切换次数而且还能减少拷贝次数
硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈
系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer
反向代理
正向代理 离客户端近
反向代理 离服务端近
fastcgi apache是反向代理 把用户的请求转发给fastcgi服务端 浏览器发送请求 .php 》 apapche 》 fastcgi 响应