TCP/IP协议

跨Internet的主机间通讯

在建立通信连接的每一端,进程间的传输要有两个标志:

IP地址和端口号,合称为套接字地址 socket address

客户机套接字地址定义了一个唯一的客户进程

服务器套接字地址定义了一个唯一的服务器进程

Socket套接字

客户/服务器程序的套接字函数

系统调用

套接字相关的系统调用:

socket(): 创建一个套接字
bind():绑定IP和端口
listen():监听
accept():接收请求
connect():请求连接建立
write():发送
read():接收
close():关闭连接

Socket通信示例:服务器端tcpserver.py

#!/usr/bin/python
import socket
HOST='0.0.0.0' #主机号
PORT= #端口号
BUFFER=
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind((HOST,PORT))
sock.listen()
print('tcpserver linten at: %s:%s\n\r' %(HOST,PORT))
while True:
client_sock,client_addr=sock.accept()
print('%s:%s connect' %client_addr)
while True:
recv=client_sock.recv(BUFFER)
if not recv:
client_sock.close()
break
print('[Client %s:%s said]:%s' %(client_addr[],client_addr[],recv))
client_sock.send('tcpServer has received your message')
sock.close()
~]# python tcpserver.py #运行python脚本
tcpserver linten at: 0.0.0.0: 192.168.130.8: connect
[Client 192.168.130.8: said]:hello,tcpserver! #客户端连接成功 ~]# ss -nlt | grep #查看服务器端口
LISTEN *: *:* #9527端口已开启

Socket通信示例:客户端tcpclient.py

#!/usr/bin/python
import socket
HOST='192.168.130.10' #连接的服务器IP
PORT=9527 #连接与服务器端相同的端口号
BUFFER=
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((HOST,PORT))
sock.send('hello,tcpserver!')
recv=sock.recv(BUFFER)
print('[tcpServer said]: %s' % recv)
sock.close()
~]# python tcpclient.py #运行python脚本
[tcpServer said]: tcpServer has received your message #连接成功

Web相关概念简述

http:Hyper Text Transfer Protocol 超文本传输协议

   持久连接:persistent connection 即TCP连接默认在一定时间内不关闭,可以被多个请求复用,在特点场景下可以有效降低资源消耗
  管道机制:pipelining 即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率
  复用的连接:交替传送请求和响应报文
  头信息压缩机制:header compression 头信息使用gzip或compress压缩后再发送
  HTTP常用请求方式:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

html:Hyper Text Markup Language 超文本标记语言

CSS:Cascading Style Sheet 层叠样式表

js:javascript

MIME:Multipurpose Internet Mail Extensions 多用途互联网邮件扩展

静态文件:无需服务端做出额外处理,直接返回给客户端所请求的页面,如文件后缀:.jpg, .html, .txt, .js,.css, .mp3, .avi 等

动态文件:服务端执行程序,返回执行的结果,如文件后缀:.asp, .php, .jsp

Web资源:web resource 一个网页由多个资源构成,打开一个页面,会有多个资源展示出来,但是每个资源都要单独请求。因此,一个“Web 页面”通常并不是单个资源,而是一组资源的集合

URI: Uniform Resource Identifier 统一资源标识,分为URL和URN

  URN: Uniform Resource Naming 统一资源命名

  URL: Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
- schame:方案,访问服务器以获取资源时要使用哪种协议
- user:用户,某些方案访问资源时需要的用户名
- password:密码,用户对应的密码,中间用:分隔
- Host:主机,资源宿主服务器的主机名或IP地址
- port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
- path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
- params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
- query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
- frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔

IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标

pv:page view 即页面浏览量,或点击量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。PV值的计算:当一个访问者访问网站的时候,记录他所访问的页面和对应的IP,然后确定这个IP今天访问了这个页面没有。如果你的网站到了23点,单纯IP有60万条的话,每个访问者平均访问了3个页面,那么PV表的记录就要有180(60×3)万条。

uv:user view 指访问某个站点或点击某条新闻的不同IP地址的人数。在同一天内,UV只记录第一次进入网站的具有独立IP的访问者,在同一天内再次访问该网站则不计数。独立IP访问者提供了一定时间内不同观众数量的统计指标,而没有反应出网站的全面活动。

网站统计:http://www.alexa.cn/rank/

QPS:request per second,每秒请求数;QPS = PV * 页⾯衍⽣连接次数 / 统计时间(86400),2亿pv的网站活动连接大约100W左右,qps大约1-2W

active connetion:活动连接数,在负载均衡层上看连接数

并发连接数 = QPS * HTTP平均响应时间

峰值时间:每天80%的访问集中在20%的时间里,这20%时间为峰值时间峰值时间每秒请求数 = ( 总PV数 * 页⾯衍⽣连接次数 * 80% ) / ( 每天秒数 * 20% )

单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应

多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求

复用I/O结构:启动一个进程,同时响应N个连接请求复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求

一次完整的http请求处理过程

  1. 解析请求:客户通过FQDN访问,先由DNS服务器解析为IP地址,返回给客户端目标IP地址
  2. 建立连接:接收连接请求
  3. 接收请求:接收客户端请求报文中对某资源的一次请求的过程
  4. 处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
  5. 获取资源:服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源
  6. 构建响应报文:一旦Web服务器识别除了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中 包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体
  7. 发送响应报文:Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束了
  8. 记录日志:最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务

Apache HTTP Server介绍

​ 简称Apache,是Apache软件基金会的一个开放源代码的网页服务器软件,可以在大多数计算机操作系统中运行。由于其跨平台和安全性,被广泛使用,是最流行的Web服务器软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。

特性:

1、高度模块化:core + modules

2、DSO: Dynamic Shared Object 动态加/卸载

3、MPM:multi-processing module多路处理模块

4、prefork:多进程I/O模型,每个进程响应一个请求,默认模型

  一个主进程:生成和回收n个子进程,创建套接字,不响应请求

  多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个

5、worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型

  一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

6、event:事件驱动模型(worker模型的变种)

  一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力

7、虚拟主机:IP,Port,FQDN

8、CGI:Common Gateway Interface,通用网关接口

9、反向代理

10、支持第三方模块

httpd的安装

1、yum管理器安装

安装:yum -y install httpd

配置文件:/etc/httpd/conf/httpd.conf 和 /etc/httpd/conf.d/*.conf 下所有以.conf结尾的文件

服务控制:systemctl start|restart|stop|reload httpd

站点网页文档根目录:/var/www/html

模块文件路径:/usr/lib64/httpd/modules

主程序文件:/usr/sbin/httpd

主进程文件:/run/httpd/httpd.pid

日志文件目录:/var/log/httpd

离线帮助文档包:yum -y install httpd-manual ,重启服务后在浏览器中输入 http://IP/manual/即可使用

2、编译安装

系统环境:CentOS6.
arp版本:1.6 # wget http://mirror.bit.edu.cn/apache//apr/apr-1.6.3.tar.gz
arp-util版本:1.6 # wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
httpd版本:2.4 # wget http://mirrors.shu.edu.cn/apache//httpd/httpd-2.4.33.tar.gz

​ 1)安装需要的包

~]# yum -y groupinstall "Development tools"
~]# yum -y install openssl-devel expat-devel pcre-devel

​ 2)配置编译安装

~]# tar xf apr-1.6..tar.gz
~]# tar xf apr-util-1.6..tar.gz
~]# tar xf httpd-2.4..tar.gz
~]# cp -a apr-util-1.6. httpd-2.4./srclib/apr-util
~]# cp -a apr-1.6. httpd-2.4./srclib/apr
~]# cd httpd-2.4.
httpd-2.4.]# ./configure --prefix=/data/httpd24 \
> --enable-so \
> --enable-ssl \
> --enable-cgi \
> --enable-rewrite \
> --with-zlib \
> --with-pcre \
> --with-included-apr \
> --enable-modules=most \
> --enable-mpms-shared=all \
> --with-mpm=prefork
httpd-2.4.]# make -j && make install

​ 3)配置环境变量

~]# echo 'export PATH=/data/httpd24/bin:$PATH' > /etc/profile.d/httpd.sh
~]# echo 'MANPATH /data/httpd24/man' >> /etc/man.config

​ 4)启动服务并测试

~]# apachectl start

httpd 2.4 常用配置

yum安装后默认配置文件

~]# cat /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
ServerName www.example.com:80
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
AllowOverride None
Require all granted
</Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
配置格式:directive value;directive 不区分字符大小写;value 为路径时,是否区分大小写,取决于文件系统。

1、显示服务器版本信息

ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

ServerTokens Prod  #建议关闭显示服务器版本号

2、修改监听的IP和Port

Listen [ip:]port 省略ip表示本机所有IP都监听,至少要有一个监听,此指令可重复出现多次

Listen 

3、持久连接

Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接

KeepAlive On  #启用长连接功能
KeepAliveTimeout #保持连接15秒
MaxKeepAliveRequests #断开条件

4、MPM多路处理模块

~]# httpd -M |grep mpm
mpm_prefork_module (shared) #默认prefork处理模式
~]# vim /etc/httpd/conf.modules.d/-mpm.conf #在此文件中配置使用那种处理模块
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so

5、DSO加载动态模块配置

配置指定实现模块加载格式: LoadModule <mod_name> <mod_path>

示例::
~]# vim /etc/httpd/conf.modules.d/-base.conf
LoadModule auth_basic_module modules/mod_auth_basic.so

6、定义'Main' Server的文档页面路径

DocumentRoot "/path" 指向的路径为URL路径的起始位置

DocumentRoot "/var/www/html"
<Directory "/var/www/html">
Require all granted #授权可以访问
</Directory>

7、定义站点主页面

<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>

8、站点访问控制常见机制

​ 基于文件系统路径:

<Directory  “/path">  #控制文件夹
...
</Directory> <File “/path/file”> #控制指定文件
...
</File> <FileMatch "PATTERN"> #支持正则表达式
...
</FileMatch>

​ 基于URL路径:

<Location  "">
...
</Location> <LocationMatch "PATTERN">
...
</LocationMatch>

1)Options [+|-]option [[+|-]option] ... :后跟1个或多个以空白字符分隔的选项列表在选项前的 +,- 表示增加或删除指定选项,默认Options FollowSymlinks

  • Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
  • FollowSymLinks:允许访问符号链接文件所指向的源文件
  • All:全部允许
  • None:全部禁用

2)AllowOverride All|None|directive-type [directive-type] ... :与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令;只对<directory>语句有效

  • All: 所有指令都有效
  • None:.htaccess 文件无效
  • AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都无法覆盖

3)Order Deny,Allow :定义生效次序;写在后面的表示默认法则,2.4版本不再支持

  • Allow from和Deny from:定义客户端地址,拒绝或允许

例:拒绝访问站点下所有以.conf结尾的文件

DocumentRoot "/data/website"
<Directory "/data/website">
Require all granted
</Directory>
<Files "*.conf">
Require all denied
</Files>

​ 例:允许访问符号链接文件所指向的源文件,但是不允许返回索引列表给用户

<Directory "/data/website">
Require all granted
Options -Indexes +FollowSymLinks
</Directory>

9、<Directory>中“基于源地址”实现访问控制

​ 不允许指定的主机访问

DocumentRoot "/data/website"
<Directory "/data/website">
<RequireALL>
Require all granted
Require not ip 192.168.0.2 #不允许0.2的主机访问
</RequireALL>
</Directory>

​ 只允许指定主机访问

DocumentRoot "/data/website"
<Directory "/data/website">
<RequireAny>
Require all denied
Require ip 192.168.0.2 #只允许0.2主机访问
</RequireAny>
</Directory>

10、日志设定

~]# vim /etc/httpd/conf/httpd.conf
ErrorLog "logs/error_log" #错误日志记录文件
LogLevel warn #默认warn级别的错误记录
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined #默认日志记录方式
</IfModule>

错误日志的 LogLevel 可选:debug, info, notice, warn, error,crit, alert, emerg

访问日志:

%h 客户端IP地址
%l 远程用户,启用mod_ident才有效,通常为减号“-”
%u 验证(basic,digest)远程用户,非登录访问时,为一个减号“-”
%t 服务器收到请求时的时间
%r First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本
%>s 响应状态码
%b 响应报文的大小,单位是字节;不包括响应报文http首部
%{Referer}i 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的
%{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的应用程序

建议:自定义日志记录格式

<IfModule log_config_module>
LogFormat "%h %l %u %{%F %T}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" custlog
CustomLog "logs/access_log" custlog
</IfModule>

11、设定默认字符集

AddDefaultCharset utf-  #设置默认字符集为utf-,默认为AddDefaultCharset Off
<Directory "/data/website">
Require all granted
AddDefaultCharset utf-
</Directory>

12、定义路径别名

格式: Alias /URL/ "/PATH/"

Alias /web2 /data/website2
<Directory "/data/website2">
Require all granted
</Directory>

访问:http://192.168.130.8/web2 则是访问/data/website 这个目录下的站点

13、基于用户的访问控制

允许账号文件中的所有用户登录访问:Require valid-user

例:基于单用户认证

​ 1)定义安全域

Alias /admin "/data/admin"
<Directory "/data/admin">
AuthType Basic
AuthName "please input your user and password!"
AuthUserFile "conf.d/.htuser"
Require user admin
</Directory>

​ 2)提供账号和密码存储(文本文件)

~]# htpasswd -mc /etc/httpd/conf.d/.htuser admin
~]# cat /etc/httpd/conf.d/.htuser
admin:$apr1$Yfglmncl$BC1hebCpPjn1Sn.azt/Zu.
~]# systemctl restart http

​ 3)测试访问 :http://192.168.130.8/admin/,输入用户名密码即可访问

例:基于组账号进行认证

1)定义安全域

Alias /admin "/data/admin"
<Directory "/data/admin">
AuthType Basic
AuthName "please input your user and password!"
AuthUserFile "conf.d/.htuser"
AuthGroupFile "conf.d/.htgroup"
Require group gadmin gadmin2
</Directory>

2)提供账号和密码存储(文本文件)

~]# htpasswd -c /etc/httpd/conf.d/.htuser tom
~]# htpasswd /etc/httpd/conf.d/.htuser jerry
~]# htpasswd /etc/httpd/conf.d/.htuser maria
~]# echo 'gadmin: tom jerry' > /etc/httpd/conf.d/.htgroup
~]# echo 'gadmin2: tom maria' >> /etc/httpd/conf.d/.htgroup

3)测试访问 :http://192.168.0.7/admin/,输入用户名密码即可访问

14、基于模块mod_userdir.so实现用户家目录的http共享

~]# vim /etc/httpd/conf.d/userdir.conf
<IfModule mod_userdir.c>
#UserDir disabled
UserDir public_html
</IfModule>
<Directory "/home/user1/public_html">
AuthType Basic
AuthName "user1 home dir"
AuthUserFile "conf.d/.htuser"
Require user user1
</Directory>
~]# htpasswd -c /etc/httpd/conf.d/.htuser user1
~]# systemctl restart httpd
~]# su -user1
~]$ mkdir public_html
~]$ echo "user1 home dir" > public_html/index.html
~]$ setfacl -m u:apache:x /home/user1/

访问:http://192.168.0.7/~user1/ 站点,输入密码即可登录

15、ServerSignature On | Off | EMail

​ 当客户请求的网页并不存在时,服务器将产生错误文档,如果于打开了ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息;如果不对外显示这些信息,就可以将这个参数设置为Off;设置为Email,将显示ServerAdmin 的Email提示;2.4版本默认值关闭,2.2版本默认开启

16、status页面

LoadModule status_module modules/mod_status.so 确认此模块已加载

httpd]# vim conf.d/myhttp.conf
<Location "/status">
SetHandler server-status
Require all granted
</Location>
~]# systemctl restart httpd

访问http://192.168.0.7/status查看服务器状态信息

  • "**_**" Waiting for Connection 等待的连接
  • "S" Starting up
  • "R" Reading Request
  • "W" Sending Reply 有回应的连接
  • "K" Keepalive (read)
  • "D" DNS Lookup
  • "C" Closing connection
  • "L" Logging
  • "G" Gracefully finishing
  • "I" Idle cleanup of worker
  • "." Open slot with no current process 空闲sock个数

17、虚拟主机

注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机;注释中心主机的DocumentRoot指令即可。

2.4版本基于FQDN的虚拟主机不再需要NameVirutalHost指令

data]# mkdir website{..}
data]# echo '<h1>website 1</h1>' > website1/index.html
data]# echo '<h1>website 2</h1>' > website2/index.html
data]# echo '<h1>website 3</h1>' > website3/index.html
~]# vim /etc/httpd/conf/httpd.conf
#Listen
#DocumentRoot "/var/www/html"

三种实现方案:

  • 基于PORT:为每个虚拟主机使用至少一个独立的PORT
~]# vim /etc/httpd/conf.d/virtualhost.conf
Listen
Listen
Listen
<Directory "/data">
Require all granted
</Directory>
<VirtualHost *:>
DocumentRoot "/data/website1"
ServerName www.web1.com
ErrorLog "logs/web1_error_log"
TransferLog "logs/web1_access_log"
</VirtualHost>
<VirtualHost *:>
DocumentRoot "/data/website2"
ServerName www.web2.com
ErrorLog "logs/web2_error_log"
TransferLog "logs/web2_access_log"
</VirtualHost>
<VirtualHost *:>
DocumentRoot "/data/website3"
ServerName www.web3.com
ErrorLog "logs/web3_error_log"
TransferLog "logs/web3_access_log"
</VirtualHost>
~]# systemctl restart httpd

分别访问:http://192.168.130.10:81 和 http://192.168.130.10:82 和 http://192.168.130.10:83

  • 基于IP:为每个虚拟主机准备至少一个IP地址
~]# ip a a 192.168.0.11/ dev eth0
~]# ip a a 192.168.0.12/ dev eth0
~]# ip a a 192.168.0.13/ dev eth0
~]# vim /etc/httpd/conf.d/virtualhost.conf
Listen
<Directory "/data">
Require all granted
</Directory>
<VirtualHost 192.168.130.11:>
DocumentRoot "/data/website1"
ServerName www.web1.com
ErrorLog "logs/web1_error_log"
TransferLog "logs/web1_access_log"
</VirtualHost>
<VirtualHost 192.168.130.12:>
DocumentRoot "/data/website2"
ServerName www.web2.com
ErrorLog "logs/web2_error_log"
TransferLog "logs/web2_access_log"
</VirtualHost>
<VirtualHost 192.168.130.13:>
DocumentRoot "/data/website3"
ServerName www.web3.com
ErrorLog "logs/web3_error_log"
TransferLog "logs/web3_access_log"
</VirtualHost>
~]# systemctl restart httpd

分别访问:192.168.130.11192.168.130.12192.168.130.13

  • 基于FQDN:为每个虚拟主机使用至少一个FQDN
~]# vim /etc/httpd/conf.d/virtualhost.conf
Listen
<Directory "/data">
Require all granted
</Directory>
<VirtualHost *:>
DocumentRoot "/data/website1"
ServerName www.web1.com
ErrorLog "logs/web1_error_log"
TransferLog "logs/web1_access_log"
</VirtualHost>
<VirtualHost *:>
DocumentRoot "/data/website2"
ServerName news.web2.com
ErrorLog "logs/web2_error_log"
TransferLog "logs/web2_access_log"
</VirtualHost>
<VirtualHost *:>
DocumentRoot "/data/website3"
ServerName bbs.web3.com
ErrorLog "logs/web3_error_log"
TransferLog "logs/web3_access_log"
</VirtualHost>
~]# systemctl restart httpd

客户端测试:

~]# vim /etc/hosts  添加以下内容
192.168.130.8 www.web1.com news.web2.com bbs.web3.com
~]# curl www.web1.com
~]# curl news.web2.com
~]# curl bbs.web3.com

18、使用mod_deflate模块压缩页面优化传输速度

LoadModule deflate_module modules/mod_deflate.so 模块默认已经加载

# httpd -M |grep deflate
deflate_module (shared)
conf.d]# vim myhttpd.conf
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
DeflateCompressionLevel #压缩比为

19、启用Sendfile功能

~]# vim /etc/httpd/conf/httpd.conf
EnableSendfile On

https的实现

​ 1)CA服务器端,生成自签证书

[root@ca ~]# cd /etc/pki/CA/
[root@ca CA]# (umask ; openssl genrsa -out private/cakey.pem )
[root@ca CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days
[root@ca CA]# touch index.txt
[root@ca CA]# echo > serial

​ 2)HTTP服务器端,生成签署请求

[root@www ~]# mkdir /etc/httpd/conf.d/ssl
[root@www ~]# cd /etc/httpd/conf.d/ssl
[root@www ssl]# (umask ; openssl genrsa -out httpd.key )
[root@www ssl]# openssl req -new -key httpd.key -out httpd.csr
[root@www ssl]# scp httpd.csr 192.168.0.2:/etc/pki/CA/

​ 3)CA服务器端,签署

[root@ca CA]# openssl ca -in httpd.csr -out certs/httpd.crt -days
[root@ca CA]# scp certs/httpd.crt cacert.pem 192.168.0.7:/etc/httpd/conf.d/ssl/

​ 4)HTTP服务器端,配置https

[root@www ssl]# ls -
cacert.pem
httpd.crt
httpd.csr
httpd.key
[root@www ~]# yum install mod_ssl -y
[root@www ~]# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key
SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem

测试访问:https://192.168.130.8 ,导入根证书即可信任此网站

​ 5)配置http重定向到https,将http请求转发至https的URL:俩种实现方式,推荐使用HSTS

  • Redirect [status] URL-PATH URL 这种方法不适合,会反复重定向

  • HSTS:HTTP Strict Transport Security

​ 服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部做307跳转到HTTPS。而无需任何网络过程

HSTS preload list:Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表

[root@www ~]# vim /etc/httpd/conf.d/myhttpd.conf
Header always set Strict-Transport-Security "max-age=31536000"
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]

测试访问http://会自动跳转到https://

http的反向代理功能

不推荐使用

启用反向代理:

特定URL反向代理:

~]# vim /etc/httpd/conf.d/myhttpd.conf
ProxyPass "/" "http://192.168.130.8/"
ProxyPassReverse "/" "http://192.168.130.8/"

web相关工具

1、curl命令

​ curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling),还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大。

用法:curl [options][URL...]

选项:

-A string 设置用户代理(浏览器)发送给服务器
-e URL 伪装来源网站
--cacert file 指定使用ca证书
-k 允许忽略证书进行 SSL 连接
--compressed 要求返回是压缩的格式
-H 自定义首部信息传递给服务器
-i 显示页面内容,包括报文首部信息
-I 只显示响应报文首部信息
-D file 将url的header信息存放在指定文件中
--basic 使用HTTP基本认证
-u user:password 设置服务器的用户和密码
-L 如果有3xx响应码,重新发请求到新位置
-O 使用URL中默认的文件名保存文件到本地
-o file 将网络文件保存为指定的文件中
--limit-rate 限制传输速度
-0 数字0,使用HTTP/1.0协议
-v 显示详细信息
-C 选项可对文件使用断点续传功能
-c 将url中cookie存放在指定文件中
-x proxyhost:port 指定代理服务器地址
-X COMMAND 向服务器发送指定请求方法
-U user:password 代理服务器用户和密码
-T 选项可将指定的本地文件上传到FTP服务器上
-d 方式指定使用POST方式传递数据
-b name=data 从服务器响应set-cookie得到值,返回给服务器

2、htpasswd

basic认证基于文件实现时,用到的账号密码文件生成工具

用法:htpasswd [options] /PATH/HTTPD_PASSWD_FILE username

-c:自动创建文件,仅应该在文件不存在时使用
-p:明文密码
-d:CRYPT格式加密,默认
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户
# htpasswd -mc /etc/httpd/conf.d/.htuser admin

3、apachectl

httpd自带的服务控制脚本,支持start、stop和restart等选项

4、rotatelogs:日志滚动工具

5、ab命令

httpd的压力测试工具,来自httpd-tools包

用法:ab [options] URL

-n:总请求数
-c:模拟并发数
-k:以持久连接模式测试

TCP/IP通信传输流程

比如说我想看百度网页:流程如下:

  客户端在应用层发出一个想看某个Web页面的HTTP请求的时候;

  接着为了传输方便,在传输层把应用层收到的数据进行分割,并在各个报文上打上标记序号及端口号后转发给网络层;

  在网络层增加作为通信目的的MAC地址后转发给链路层,这样一来发送网络的通信请求就准备齐全了;

  接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层;

  当传输到应用层,才能算真正接收到由客户端发送过来的HTTP请求了。

发送端在层与层之间传输数据时,每经过一层时必定会打上一个该层的首部信息。接收端没经过一层,会把消去。这种数据信心包装叫做封装。

TCP/IP传输是三次握手,四次断开。

HTTP协议

​ HTTP协议的版本有:http/0.9, http/1.0, http/1.1, http/2.0;HTTP协议是无状态的,服务器无法持续追踪客户端的来源,解决HTTP协议无状态的方法有Cookie和Session;一次访问的过程请求(request)和响应(response)为HTTP事务

  • httpq请求报文

  • http响应报文

1、http报文

  • request报文
<method> <request-URL> <version>
<headers>
<entity-body>
  • response报文
<version> <status> <reason-phrase>
<headers>
<entity-body>

method: 请求方法,标明客户端希望服务器对资源执行的动作

GET:从服务器获取一个资源
HEAD:只从服务器获取文档的响应首部
POST:向服务器输入数据,通常会再由网关程序继续处理
PUT:将请求的主体部分存储在服务器中,如上传文件
DELETE:请求删除服务器上指定的文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法

status:标记请求处理过程中发生的情况,如200,301, 302, 404, 502

200: 成功,请求数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302: 响应报文Location指明资源临时新位置;Moved Temporarily
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway
503: 服务不可用,临时服务器维护或过载,服务器无法处理请求
504: 网关超时

reason-phrase:状态码所标记的状态的简要描述

headers:每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着是一个值

entity-body:请求时附加的数据或响应时附加的数据

2、HTTP 首部字段

  1. HTTP 首部字段包含的信息最为丰富。首部字段同时存在于请求和响应报文内,并涵盖 HTTP 报文相关的内容信息。使用首部字段是为了给客服端和服务器端提供报文主体大小、所使用的语言、认证信息等内容;
  2. 首部字段结构HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔;
  3. 字段值对应单个 HTTP 首部字段可以有多个值;
  4. 报文首部中出现了两个或以上具有相同首部字段名的首部字段时,在规范内尚未明确,根据浏览器内部处理逻辑的不同,优先处理的顺序可能不同,结果可能并不一致。
  • 通用首部:请求报文和响应报文两方都会使用的首部

Date:报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点(代理,网关)
Cache-Control:控制缓存,如缓存时长
MIME-Version:发送端使用的MIME版本
Warning:错误通知

  • 请求首部:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、请求内容相关优先级等信息

请求首部:
Accept:通知服务器自己可接受的媒体类型
Accept-Charset: 客户端可接受的字符集
Accept-Encoding:客户端可接受编码格式,如gzip
Accept-Language:客户端可接受的语言
Client-IP: 请求的客户端IP
Host: 请求的服务器名称和端口号
Referer:跳转至当前URI的前一个URL
User-Agent:客户端代理,浏览器版本

条件式请求首部:
Expect:允许客户端列出某请求所要求的服务器行为
If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改
If-Unmodified-Since:与上面相反
If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配
If-Match:与上面相反

安全请求首部:
Authorization:向服务器发送认证信息,如账号和密码
Cookie:客户端向服务器发送cookie
Cookie2:用于说明请求端支持的cookie版本

代理请求首部:
Proxy-Authorization:向代理服务器认证

  • 响应首部:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息

信息性:
Age:从最初创建开始,响应持续时长
Server:服务器程序软件名称和版本
协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其它首部列表
安全响应首部:
Set-Cookie:向客户端设置cookie
Set-Cookie2: 以上面相似
WWW-Authenticate:来自服务器对客户端的质询列表

  • 实体首部:针对请求报文和响应报文的实体部分使用的首部。补充了资源内
    容更新时间等与实体有关的的信息

​ Allow: 列出对此资源实体可使用的请求方法
Location:告诉客户端真正的实体位于何处
Content-Encoding:对主体执行的编码
Content-Language:理解主体时最适合的语言
Content-Length: 主体的长度
Content-Location: 实体真正所处位置
Content-Type:主体的对象类型,如text
缓存相关:
ETag:实体的扩展标签
Expires:实体的过期时间
Last-Modified:最后一次修改的时间

  • 扩展首部

3、Cookie

​ HTTP 是一种无状态协议。协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。可是随着 Web 的不断发展,很多业务都需要对通信状态进行保存。于是引入了 Cookie 技术。使用 Cookie 的状态管理Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息

Set-cookie首部字段示例:

~]# curl -v pan.baidu.com
Set-Cookie: BAIDUID=0D82F2DA4E71EFDE069D8C6BC7D7F22E:FG=; expires=Fri, -Jun- :: GMT; max-age=; path=/; domain=.baidu.com; version=

NAME=VALUE 赋予 Cookie 的名称和其值,此为必需项
expires=DATE Cookie 的有效期,若不明确指定则默认为浏览器关闭前为止
path=PATH 将服务器上的文件目录作为Cookie的适用对象,若不指定则默认为文档所在的文件目录
domain=域名 作为 Cookie 适用对象的域名,若不指定则默认为创建Cookie的服务器的域名
Secure 仅在 HTTPS 安全通信时才会发送 Cookie
HttpOnly 加以限制使 Cookie 不能被 JavaScript 脚本访问

示例:查看cookie

~]# yum install httpd php -y
~]# vim /var/www/html/setcookie.php
<?php
setcookie("title","hello world")
?>
~]# vim /var/www/html/index.php
<?php
echo $_COOKIE["title"];
var_dump($_COOKIE);
?>
~]# systemctl start httpd

先访问:http://192.168.130.8/setcookie.php

再访问:http://192.168.130.8/index.php

显示:hello worldarray(1) { ["title"]=> string(11) "hello world" }则说明cookie已经生效

httpd Apache服务的更多相关文章

  1. CentOS 7.2配置Apache服务httpd小伙伴们可以参考一下

    这篇文章主要为大家详细介绍了CentOS 7.2配置Apache服务 httpd上篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 一.Perl + mod_perl 安装mod_perl使Per ...

  2. Apache服务停止:信号灯超时时间已到,指定的网络名不再可用

    环境说明:Apache2.4.10,Windows Server 2008 R2 问题说明: apache服务用于下载文件,但是在运行一段时间后,突然挂了. 其错误提示如下所示: [error] (7 ...

  3. Mac下配置Apache服务

    这篇文章主要是针对Mac用户,第一次搭建本地开发环境的同学,已经搭建过的同学可以忽略. Mac自带的Apache还是XAMPP? That is a question. 其实自带的apache也够用了 ...

  4. WampServer Apache 服务无法启动解决办法

    问题:WampServer 安装后mysql服务可以启动,但Apache服务启动不了(前提是已经安装Apache Server) 解决办法: 1.端口冲突,改Apache里httpd.conf中的端口 ...

  5. Android开发--Apache服务器安装,解决Apache服务无法启动的问题

    昨天学习Android XML解析的时候,想在自己的电脑上搭建一个最简单的Web服务器来存放一段XML文本,然后在Android程序中解析,查找了一些资料后,看到Apache服务器比较容易上手,使用范 ...

  6. 第10章 使用Apache服务部署静态网站

    章节简述: 本章节中通过对比目前热门的网站服务程序来说明Apache服务程序的优势,并新增主机空间选购技巧小节. 了解SELinux服务的3种工作模式,小心谨慎的使用semanage命令和setseb ...

  7. RHEL7-使用Apache服务部署静态网站

    1. 安装Apache服务程序 1.1 在虚拟机中选中光盘镜像,并设置连接 1.2 将光盘设备挂载到/media/cdrom目录 [root@localhost ~]# mkdir -p /media ...

  8. 《Apache服务用户身份验证管理》RHEL6.3

    1.安装apache软件包 Yum install httpd 2.启动apache服务 /etc/init.d/httpd restart 3.创建一个目录,内编辑一个index.html文件 4. ...

  9. Apache服务

    Apache服务的安装: Apache服务程序的软件包名称是:httpd 安装方法: rpm软件包安装.源码编译安装.yum安装 yum install httpd 安装完成后启动: revice h ...

随机推荐

  1. 面试题之String s="a"+"b"+"c"+"d";

    今天遇到了一个面试题的选择,我当时真的没怎么在意,其实挺好玩的. 1.这条语句String s="a"+"b"+"c"+"d&qu ...

  2. JoinableQueue类与线程

    生产者消费者的问题及其解决办法 问题 在之前的生产者消费者模型中,生产者和消费者只有一个, 那么生产者往队列里put几次,消费者就get几次,但是存在一个问题, 生产者不一定只有一个,消费者也不一定只 ...

  3. K2 BPM_万翼科技携手上海斯歌,全面启动K2平台升级项目_十年专注业务流程管理系统

    2019年7月25日,万翼科技和上海斯歌在深圳召开了“2019年K2平台升级项目启动会”.万翼科技核心合伙人何建春.管金华,协同管理支撑组负责人贾磊,K2平台产品负责人黄平显,上海斯歌总裁李明,技术研 ...

  4. 页面中的div居中

    div的居中 一.页面的水平居中 #article{ position: relative; margin: 0 auto; width: 80%; background-color: aquamar ...

  5. macOS 在终端中使用 adb命令,每次都要source ~/.bash_profile 才生效

    macOS下已经配置好Android开发环境,环境变量也添加了,但是在终端中使用adb命令每次都需要source .bash_profile之后才能识别, 否则就提示  zsh: command no ...

  6. Ubuntu-Python2.7安装 scipy,numpy,matplotlib (转)

    sudo apt-get install python-scipy sudo apt-get install python-numpy sudo apt-get install python-matp ...

  7. 结对编程作业(python实现)

    一.Github项目地址:https://github.com/asswecanfat/git_place/tree/master/oper_make 二.PSP2.1表格: PSP2.1 Perso ...

  8. 【leetcode】575. Distribute Candies

    原题 Given an integer array with even length, where different numbers in this array represent differen ...

  9. zabbix初级进阶

    目录 一.理论概述 zabbix功用 运行条件 缺点 zabbix组件 部署 web安装zabbix 优化 总结 这篇文章主要对zabbix有一个全面且简单的了解 一.理论概述 zabbix功用 检测 ...

  10. sql 发生死锁

    SELECT request_session_id spid , OBJECT_NAME(resource_associated_entity_id) tableName FROM sys.dm_tr ...