http整理2
httpd相关:
- httpd程序版本:
。1.3 停止维护
。2.0
。 2.2 event为测试使用
。 2.4 event生产中可用;
- httpd的特性:
1.高度模块化:核心模块+功能模块
2.DSO:模块支持动态装卸载;
3.MPM:Multipath processing Modules多路处理模块;
-
prefork 多进程模型
一个主进程:负责接收请求;负责生成子进程和回收子进程;
多个子进程:每个子进程负责处理一个用户请求;
-
worker 多进程多线程模型:
一个主进程生成多个子进程;
每个子进程生成多个线程;
每个线程处理一个用户的请求;
-
event 事件驱动模型
一个主进程生成多个子进程;
每个子进程处理多个请求;
4.CGI:通用网关接口;
5.虚拟主机
6.反向代理
7.负载均衡
8.路径别名
9.丰富的认证机制:basic,digest
10.支持扩展的第三方模块;
- httpd的程序环境:
。 CentOS 6:httpd 2.2
。配置文件:/etc/httpd/conf/httpd.conf, /etc/httpd/conf.d/*.conf
。脚本配置文件:/etc/sysconfig/httpd
。主程序文件:/usr/sbin/httpd,/usr/sbin/httpd.event,/usr/sbin/httpd.worker
。日志文件目录:/var/log/httpd/{access,error}.log
。默认站点目录:/var/www/html
-CentOS 7:httpd 2.4
。配置文件:/etc/httpd/conf/httpd.conf ,/etc/httpd/conf.d/*.conf
。模块相关配置文件:/etc/httpd/conf.modules.d/*.conf
。主程序文件:/usr/sbin/httpd #2.4支持MPM动态切换;
。日志文件目录:/var/log/httpd/{access,error}.log
。默认站点目录:/var/www/html
- 服务启动和控制:
。 systemctl start httpd.service
。 systemctl enable httpd.service
- 配置httpd2.2
。主配置文件:/etc/httpd/conf/httpd.conf
- 分为三段:
1.全局环境
2.中心主机
3.虚拟主机
注意:中心主机和虚拟主机不能同时使用,即使用虚拟主机前,需将中新主机的DocumentRoot注释;
配置格式:指令 值
常用配置:
- 1.监听的端口,默认监听在本机的所有ip地址
Listen 80
Listen 8080
注意:修改监听的端口后必须重启服务后才会生效;
- 2.网站的根目录:
DocumentRoot "/var/www/html"
例如:http://www.mageud.com/log.jpg--->/var/www/html/log.jpg
- 3.保持连接:
tcp连接建立后,每个资源获取完成后不会断开连接,而是继续进行其他资源请求;为了避免大量的连接被占据,可以从数量和时间上进行限制;
KeepAlive On|Off
KeepAliveTimeout
MaxKeepAliveRequests
- 4.MPM
查看当前使用的MPM:#ps aux | grep httpd
切换MPM:vim /etc/sysconfig/httpd
重启服务后生效;
httpd -l 查看静态编译的模块
httpd -M 查看静态编译及动态编译的模块;
配置MPM:
StartServers 8 #httpd服务启动时,开启的进程数;
MinSpareServers 5 #最小空闲进程数;小于该值时,主控进程会开启一定的进程数,达到此处指定的个数;
MaxSpareServers 20 #最大空闲进程数;
ServerLimit 256 #允许启动的最大在线进程数量;
MaxClients 256 #最大并发响应数;应该小于ServerLimit中的值;
MaxRequestsPerChild 4000 #每个进程最多可以处理多少个请求,超过4000时销毁;
```
```
StartServers 4 #httpd服务启动时,启动的进程数;
MaxClients 300 #最大并发响应数
MinSpareThreads 25 #最小空闲线程数
MaxSpareThreads 75 #最大空闲线程数
ThreadsPerChild 25 #每个进程可以启动25个线程
MaxRequestsPerChild 0 #每个进程可以处理无限个请求
```
- 5.DOS
LoadModule xxx.so
- 6.基于站点的访问控制
```
#对/var/www/html目录下的所有资源进行访问控制;
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
```
```
Options:
indexes:指明的URL路径不存在时,返回列表给用户;建议关闭;
FollowSymLInks:允许跟踪符号链接文件所指向的原文件;
Includes:允许启用服务端包含;
SymLinksifOwnerMatch 原文件和链接文件的属主和属组相同时才允许跟踪访问;
ExecCGI 允许执行CGI脚本
MultiViews 允许执行内容协商;
None 全部都不;
ALL 所有都;
AllowOverride:与访问控制相关是否允许放在.htacesss文件中;None什么都不可以放,建议使用None;
```
- 7.基于ip地址的访问控制:
```
Order allow,deny #放在后面的为默认法则;
Allow from all
Deny from 来源地址ip或者网段;
网段地址格式:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
例:
Order allow,deny
Allow from 172.16 //仅允许172.16网段的地址访问;
```
- 8.定义站点主页面:
``DirectoryIndex index.html index.html.var``
当请求的资源不存在时,http服务器会有两种处理结果:
。返回404或者403
。将当前网页目录下的内容全部列出来;
- 9.定义路径别名:Alias
``DocumentRoot "/data/www"``
``Alias /download/ "/rpms/pub/" 注意:定义别名时,前后的斜杠应该保持一致,不然会出错,影响访问效果;``
``http://www.magedu.com/download/test.html --->/rpms/pub/test.html``
- 10.设定默认字符集
``AddDefaultCharset UTF_8``
- 11.日志相关
```
ErrorLog logs/error_log 错误日志
CustomLog logs/access_log combined 访问日志
LogFormat 定义日志格式
%% 使用的Method
%a 远程主机的ip地址
%A web服务器的ip地址
%B 响应豹纹的大小,不包含http响应首部;单位是字节;
%H 请求使用的协议
%l 远程登录的用户名,通常为一个‘-’
%{Referer} 当前页面是从哪个页面跳转过来的
%{User-Agent}客户端使用的浏览器
%m request method
%t 服务器收到请求时的时间,标准英文格式的时间;
%u 远程登录的用户名,非登录访问的时候,其为一个减号;
```
- 12.基于用户的访问控制:
```
1.定义安全域:
Options None
AllowOverride None
AuthType Basic
AuthName "dangerous" #该页面需要认证的原因说明;
AuthUserFile "/etc/httpd/conf/.htpasswd" #账号密码文件存放的位置
Require user username1 username2... 允许哪些用户登录
#Require user vaild-user #允许所有用户登录;
Require group grpname1 grpname2 ... 允许哪些组登录;
```
2.创建用户密码文件:
```
#htpasswd -c -m /etc/httpd/conf/.htpasswd Username
-c 第一次创建密码文件时使用;
-m 使用MD5算法
-D 删除一个用户;
注意:基于组的认证,不需要创建组,先创建用户;并将用户写入 /etc/httpd/conf/.htgroup 中;
格式: mygrp:username1 username2
```
13.虚拟主机配置:基于ip,基于port,基于FQDN
```
vim /etc/httpd/conf.d/vhost.conf
基于port:
Listen 8080
DocumentRoot /data/www/
ServerName www.a.com
ErrorLog logs/www.a.com-error_log
CustomLog logs/www.a.com-access_log common
DocumentRoot /data/www1/
ServerName www.b.com
ErrorLog logs/www.b.com-error_log
CustomLog logs/www.b.com-access_log common
基于FQDN:
NameVirtualHost 192.168.118.133:80 //2.2需要添加此项,2.4省略
DocumentRoot /data/www/
ServerName www.a.com
ErrorLog logs/www.a.com-error_log
CustomLog logs/www.a.com-access_log common
DocumentRoot /data/www1/
ServerName www.b.com
ErrorLog logs/www.b.com-error_log
CustomLog logs/www.b.com-access_log common
基于ip:
DocumentRoot /data/www/
ServerName www.a.com
ErrorLog logs/www.a.com-error_log
CustomLog logs/www.a.com-access_log common
DocumentRoot /data/www1/
ServerName www.b.com
ErrorLog logs/www.b.com-error_log
CustomLog logs/www.b.com-access_log common
```
- 14.开启httpd状态页面
```
1.确认status模块已经加载:
LoadModules status_module modules/mod_status.so
2.启动状态访问页面:
SetHandler server-status
Order deny,allow
Allow from 172.18.254.11 #仅允许此处指定的ip地址访问;
```
- 15.httpd运行的用户和组
``User apache``
``Group apache``
注意:如果是编译安装的httpd默认的用户和组都是daemon;
- 16.使用mod_deflate模块来压缩也买优化传输速度
```
1.确认已加载deflate模块:
# httpd -M | grep deflate
deflate_module (shared)
2.排除不适合压缩的资源
设置输出过滤器
添加需要压缩的文件类型
3.测试:访问页面,打开F12查看调试信息,Content-Encoding gzip
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml text/javascript application/xhtml+xml
```
配置https:
- HTTPS协议
。 Http Over SSL,TCP 443端口
。 HTTPS是二进制协议
>SSL协议会话过程:
客户端发送可供选择的加密方式,并向服务器请求证书;
服务器端发送证书以及选定的加密方式(公钥)给客户端;
客户端取得证书并进行证书验证,如果信任给其发证书的CA,则:
验证证书来源的合法性:用CA的公钥解密证书上的签名
验证证书内容合法性:完整性验证
检查证书的有效期
检查证书是否被吊销
证书中拥有者的名字,与访问目的主机要一致
客户端生产临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
服务用此密钥加密用户请求的资源,响应给客户端
注意:SSL会话是基于IP地址所创建,所以单IP的主机上,仅可以使用一个Https虚拟主机。
配置httpd支持https,主要步骤
```
1.创建私有CA
2.在服务器创建证书签署请求
3.CA签证
4.配置Httpd支持SSL及使用的证书
5.测试基于Https访问相应的主机
```
```
#创建CA服务器:
[root@www CA]# cd /etc/pki/CA/
[root@www CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
..........................................................................+++
...........................+++
e is 65537 (0x10001)
[root@www CA]# ll private/
total 4
-rw-------. 1 root root 1679 Nov 1 04:37 cakey.pem
[root@www CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem
[root@www CA]# touch serial index.txt
[root@www CA]# echo 01 > serial
##web服务器证书签署请求:
[root@www CA]# cd /etc/httpd/
[root@www httpd]# mkdir ssl
[root@www httpd]# cd ssl/
[root@www ssl]# (umask 077;openssl genrsa -out httpd.key 1024)
[root@www ssl]# openssl req -new -key httpd.key -out httpd.csr
[root@www ssl]# ls
httpd.csr httpd.key //此时可以将证书签署请求发送给CA
##CA服务器签署请求:
[root@www CA]# openssl ca -in /etc/httpd/ssl/httpd.csr -out certs/httpd.crt
#将生成的证书发送给Httpd服务器
[root@www CA]# ll /etc/httpd/ssl/
-rw-r--r--. 1 root root 3866 Nov 1 04:52 httpd.crt
1.Httpd安装mod_ssl模块
yum install mod_ssl
httpd -M | grep ssl
ssl_module (shared)
2.修改/etc/httpd/conf.d/ssl.conf配置文件
DocumentRoot "/var/www/html"
ServerName www.magedu.com
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
3.重启服务,测试https是否正常访问
```
### Httpd 2.4 的新特性:
。MPM支持运行运行DSO机制,以模块形式按需加载
。Event MPM生产环境可用
。异步读写机制
。 支持每模块及每目录的单独日志级别定义
。每请求相关的专用配置
。增强版的表达式分析式
。 毫秒级持久连接时长定义
。 基于FQDN的虚拟主机不再需要NameVirtualHost指令
。新指令,AllowOverrideList
。 支持用户自定义变量
。 更低的内存消耗
### Httpd 2.4新模块介绍
。mod_proxy_fcgi 支持PHP等动态语言
。 mod_proxy_scgi SCGI Protocol,支持Python
。 mod_remoteip 获取远端真实访问IP
```
1.MPM模式切换
编辑配置文件/etc/httpd/conf.modules.d/00-mpm.conf`
2.Httpd 2.4基于IP的访问控制
取消Allow,Deny,使用Require all granted/deny
要将规则放在一个容器内
基于域名的虚拟主机的实现,任何目录下的页面,只有显式授权才能被访问
允许特定的IP访问
Require IP IPADDR //授权指定来源的IP访问
Require not IP IPADDR //拒绝
控制特定的主机访问
Require host HOSTNAME //授权指定来源的主机访问,可以使用FQDN,也可以使用域名
Require not HOSTNAME //拒绝
3.基于FQDN的虚拟主机不需要NameVirtualHost指令
4.毫秒级KeepAlive
KeepAlive On
KeepAliveTimeout 30ms
MaxKeepAliveRequests 20
```
### Curl和Elinks命令:
。命令行访问工具:
- curl options http://www.xxx.com
- options:
。 -A STRING 设置用户代理
。 --basic 使用basic认证
。--referer URL 指定来源网址
。 --compressed 要求返回的是压缩的格式
。 -I 只返回响应报文中的首部信息
。 --limit-rate 设置传输速度
。 -m 设置最大传输时间
。 -k 不使用证书
``elinks options http://www.xxx.com ``
- options:
-anonymous 使用匿名账号方式
### LAMP:Linux+Apache+MySQL|Mariadb|MongoDB+PHP|Perl|Python
- httpd:处理静态资源
- PHP:处理动态资源
。静态资源:原始形式和响应内容一致;
。动态资源:客户端请求的是程序文件,需要服务器端执行后,将执行结果返回给客户端;
客户端技术:JavaScript
服务器端技术:PHP,JSP
### CGI:通用网关接口;
- 安装WordPress数据库基本操作:
```
mysql基本操作:
#mysql -uroot -h127.0.0.1
mysql>grant all privileges on *.* to username@'%' identified by 'walker';
mysql>flush privileges;
mysql>create database wpdb;
mysql>show databases;
mysql>grant all privileges on wpdb.* to wpuser@'%' identified by "walker";
浏览器中安装WordPress:
http://IP/wordpress
```
- 优化httpd:2.4版本默认是打开的;2.2手动打开;
```
vim /etc/httpd/conf/httpd.conf
EnableSendfile on 开启sendfile
减少内核态切换和用户数据的开销
加快静态文件的请求速度
减少CPU和内存开销
适用于大量的小文件;
```
- php-fpm
。5.3.3之前的version 如果想使用php-fpm需要对php打补丁;#patch
。 php-fpm的工作方式:类似于apache的worker模式;
>正向代理:教室内的网络通过一个ip地址访问外网
反向代理:通过代理服务器访问后面的web服务器;
- 自定义错误页面:
`` ErrorPage``
``Sendfile机制:直接在内核中分装http首部,发送给客户端,节省资源;``
```
减少内核态切换和用户数据的开销;
加快静态文件的请求速度;
减少CPU和内存开销;
适用于大量的小文件;
```
> 开启SendFile : vim /etc/httpd/conf/httpd.conf
EnableSendfile on 优化apache的方式之一;