HTTP头域列表与解释 之 request篇

    HTTP 头域是HTTP协议中请求(request)和响应(response)中的头部信息,其实就是HTTP通信的操作参数,告诉web服务器和浏览器怎样处理这个通信。HTTP头从一个请求信息或者响应信息的第二行开始(第一行是请求行或者响应行),以两个CR-LF字符组结束(CR:回车符,\r,LF:换行符\n)而每个HTTP头是字符串形式的,用冒号分割的键值对,多个HTTP头之间用CR-LF字符组隔开。

    某些http头可以有注释,例如user-agent,server,via。但这些注释会被服务器或者浏览器忽略IETF组织已经将一些核心的HTTP头定义在RFC2616规范中,这些HTTP头是每个基于HTTP协议的软件必须实现的,而其他一些更新和扩展的头域也必须被基于HTTP的软件实现。当然,各个软件也可以定义自己的头域。

    另一方面,RFC2616规范中并没有限制每个HTTP头的长度,或者限制HTTP头的数量,但出于性能和安全的考虑,多数服务器都会自己作规定,例如apache2.3 就规定每个HTTP头不能超过8190个字节,每个请求不能超过100个HTTP头。

以下来看看发送一个请求(request)时候,可能包含的各个HTTP头和它的解释。

标准的请求头:

Accept:浏览器(或者其他基于HTTP的客户端程序)可以接收的内容类型(Content-types),例如 Accept: text/plain

Accept-Charset:浏览器能识别的字符集,例如 Accept-Charset: utf-8

Accept-Encoding:浏览器可以处理的编码方式,注意这里的编码方式有别于字符集,这里的编码方式通常指gzip,deflate等。例如 Accept-Encoding: gzip, deflate

Accept-Language:浏览器接收的语言,其实也就是用户在什么语言地区,例如简体中文的就是 Accept-Language: zh-CN

Accept-Datetime:(这个暂时没搞清楚什么意思)

Authorization:在HTTP中,服务器可以对一些资源进行认证保护,如果你要访问这些资源,就要提供用户名和密码,这个用户名和密码就是在Authorization头中附带的,格式是“username:password”字符串的base64编码,例如:Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==中,basic指使用basic认证方式, QWxhZGRpbjpvcGVuIHNlc2FtZQ==使用base64解码就是“Aladdin:open sesame”

Cache-Control:这个指令在request和response中都有,用来指示缓存系统(服务器上的,或者浏览器上的)应该怎样处理缓存,因为这个头域比较重要,特别是希望使用缓 存改善性能的时候,内容也较多,所以我想在下一篇博文中主要介绍一下。

Connection:告诉服务器这个user agent(通常就是浏览器)想要使用怎样的连接方式。值有keep-alive和close。http1.1默认是keep-alive。keep-alive就是浏览器和服务器 的通信连接会被持续保存,不会马上关闭,而close就会在response后马上关闭。但这里要注意一点,我们说HTTP是无状态的,跟这个是否keep-alive没有关系,不要认为keep-alive是对HTTP无状态的特性的改进。

Cookie:浏览器向服务器发送请求时发送cookie,或者服务器向浏览器附加cookie,就是将cookie附近在这里的。例如:Cookie:user=admin

Content-Length:一个请求的请求体的内存长度,单位为字节(byte)。请求体是指在HTTP头结束后,两个CR-LF字符组之后的内容,常见的有POST提交的表单数据,这个Content-Length并不包含请求行和HTTP头的数据长度。

Content-MD5:使用base64进行了编码的请求体的MD5校验和。例如:Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==

Content-Type:请求体中的内容的mime类型。通常只会用在POST和PUT方法的请求中。例如:Content-Type: application/x-www-form-urlencoded

阅读剩余部分 -

nginx反向代理时,X-Forwarded-For 如何设置

当nginx作为反向代理功能时,转发请求到后端服务器

通常需要使用如下命令为转发的请求增加请求头 X-Forwarded-For 

 

proxy_set_header X-Forwarded-For "特定的X-Forwarded-For值"

 

第一版配置:

proxy_set_header X-Forwarded-For $remote_addr;

#如上配置只能增加负载均衡ip地址,丢失了客户端真实ip和任意中间代理ip

 

第二版配置

 

proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $remote_addr";

#如上配置在原有请求头X-Forwarded-For字段的基础上增加了连接nginx的服务器ip地址

 

第三版配置(最为简单)

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#$proxy_add_x_forwarded_for已经实现了第二版的功能,直接使用该内置变量即可

阅读剩余部分 -

X-Forwarded-For 和 X-Real-IP 的区别?

做动静分离的时候这里有疑问所以请教度娘

网上摘得,觉得比较有用就记下了

一般来说,X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中

来自4.4.4.4的一个请求,header包含这样一行

X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3

代表 请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,而本次请求的来源IP4.4.4.4是第三层代理

而X-Real-IP,没有相关标准,上面的例子,如果配置了X-Read-IP,可能会有两种情况

// 最后一跳是正向代理,可能会保留真实客户端IP
X-Real-IP: 1.1.1.1
// 最后一跳是反向代理,比如Nginx,一般会是与之直接连接的客户端IP
X-Real-IP: 3.3.3.3

所以 ,如果只有一层代理,这两个头的值就是一样的

那一般在后端取值(比如nodejs通过nginx代理)是用哪个值呢?我看sf上看一般推荐是用X-Forwarded-For,直接用 X-Real-IP岂不是更方便点?

X-Forwarded-For确实是一般的做法
1. 他在正向(如squid)反向(如nginx)代理中都是标准用法,而正向代理中是没有x-real-ip相关的标准的,也就是说,如果用户访问你的 nginx反向代理之前,还经过了一层正向代理,你即使在nginx中配置了x-real-ip,取到的也只是正向代理的IP而不是客户端真实IP
2. 大部分nginx反向代理配置文章中都没有推荐加上x-real-ip ,而只有x-forwarded-for,因此更通用的做法自然是取x-forwarded-for
3. 多级代理很少见,只有一级代理的情况下二者是等效的
4. 如果有多级代理,x-forwarded-for效果是大于x-real-ip的,可以记录完整的代理链路

按照HTTP 请求头中的 X-Forwarded-For这篇文章的例子,如果在Nginx的反向代理中添加了配置“proxy_set_header X-Real-IP $remote_addr”,X-Real-IP的值为”3.3.3.3“

阅读剩余部分 -

Nginx 编码设置

有的网页是 utf-8 编码而有的是 gb2312 编码,如果Nginx编码没有设置正确的话,都会引起页面乱码,解决方法如下:
 
# vim /usr/local/nginx/conf/nginx.conf
……
server
{
listen 80;
server_name www.sexqu.net sexqu.net;
index index.html index.htm index.php;
root /home/sexqu.net;
charset utf-8;  # gbk,utf-8,gb2312,gb18030 可以实现多种编码识别
}
……

阅读剩余部分 -

修改EmEditor新建文件的默认编码

由于文件经常要由Linux系统使用,而EmEditor默认编码的系统是GB2312,Dos和Windows换行格式采用回车+换行(CR+LF)表示下一行,所以必须修改一下默认编码,否则保存时总必须选择编码,有时会出错。

 

阅读剩余部分 -

使用cat命令和EOF标识输出多行文件

   在某些场合,可能我们需要在脚本中生成一个临时文件,然后把该文件作为最终文件放入目录中。(可参考ntop.spec文件)这样有几个好处,其中之一就是临时文件不是唯一的,可以通过变量赋值,也可根据不同的判断生成不同的最终文件等等。
一、cat和EOF
cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容的;
EOF是“end of file”,表示文本结束符。
结合这两个标识,即可避免使用多行echo命令的方式,并实现多行输出的结果。
二、使用
看例子是最快的熟悉方法:

# cat << EOF > test.sh
> #!/bin/bash
> #you Shell script writes here.
> EOF


结果:

引用
# cat test.sh
#!/bin/bash
#you Shell script writes here.


可以看到,test.sh的内容就是cat生成的内容。
三、其他写法
1、追加文件

# cat << EOF >> test.sh


2、换一种写法

# cat > test.sh << EOF


3、EOF只是标识,不是固定的

# cat << HHH > iii.txt
> sdlkfjksl
> sdkjflk
> asdlfj
> HHH


这里的“HHH”就代替了“EOF”的功能。结果是相同的。

引用
# cat iii.txt
sdlkfjksl
sdkjflk
asdlfj

阅读剩余部分 -

MySQL Server参数优化 - innodb_file_per_table(独立表空间)

1 简介
    Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间。
    共享表空间以及独立表空间都是针对数据的存储方式而言的。
   共享表空间:  某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下。 默认的文件名为:ibdata1  初始化为10M。
   独立表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
2 二者优缺点
    2.1 共享表空间:

    优点:
    可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同的文件上)。数据和文件放在一起方便管理。
    缺点:
    所有的数据和索引存放到一个文件中,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。
    2.2 独立表空间:
    在配置文件(my.cnf)中设置: innodb_file_per_table
    优点:
    1.每个表都有自已独立的表空间。
    2.每个表的数据和索引都会存在自已的表空间中。
    3.可以实现单表在不同的数据库中移动。
    4.空间可以回收(除drop table操作处,表空不能自已回收)
        a.Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。
        b.对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。
        c.对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
    缺点:
    单表增加过大,如超过100个G。
    相比较之下,使用独占表空间的效率以及性能会更高一点。

阅读剩余部分 -

InnoDB 引擎独立表空间 innodb_file_per_table

使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构、表索引、表数据空间。我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作。然而当你使用InnoDB的时候,一切都变了。

InnoDB 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用mysqldump 导出,然后再导入解决这个问题。

在MySQL的配置文件[mysqld]部分,增加innodb_file_per_table参数。

可以修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。

独立表空间:

优点:

1.  每个表都有自已独立的表空间。
2.  每个表的数据和索引都会存在自已的表空间中。
3.  可以实现单表在不同的数据库中移动。
4.  空间可以回收(除drop table操作处,表空不能自已回收)

a)         Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableName engine=innodb;回缩不用的空间。

b)         对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。

c)         对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。

缺点:

单表增加过大,如超过100个G。

结论:

共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整一 下:innodb_open_files 。

InnoDB Hot Backup(冷备)的表空间cp不会面对很多无用的copy了。而且利用innodb hot backup及表空间的管理命令可以实现单现移动。

 

阅读剩余部分 -

meiyoutongji