如何调整nginx和apache服务器的header限制的大小

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调整nginx和apache服务器的header限制的大小相关的知识,希望对你有一定的参考价值。

现在主流的apache和nginx服务器他们都可以自由设置header的头信息上限大小。我们通过配置文件修改来达到目的。

nginx默认的header长度上限是4k,如果超过了这个值
如果header头信息请求超过了,nginx会直接返回400错误
可以通过以下2个参数来调整nginx的header上限
client_header_buffer_size 16k;
large_client_header_buffers 4 16k;

看起来是,nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取
引用client_header_buffer_size
syntax: client_header_buffer_size size
default: 1k
context: http, server
Directive sets the headerbuffer size for the request header from client.
For the overwhelming majority of requests it is completely sufficient a buffer size of 1K.
However if a big cookie is in the request-header or the request has come from a wap-client the header can not be placed in 1K, therefore, the request-header or a line of request-header is not located completely in this buffer nginx allocate a bigger buffer, the size of the bigger buffer can be set with the instruction large_client_header_buffers.

引用large_client_header_buffers
syntax: large_client_header_buffers number size
default: large_client_header_buffers 4 4k/8k
context: http, server
Directive assigns the maximum number and size of buffers for large headers to read from client request.
The request line can not be bigger than the size of one buffer, if the client send a bigger header nginx returns error "Request URI too large" (414).
The longest header line of request also must be not more than the size of one buffer, otherwise the client get the error "Bad request" (400).
Buffers are separated only as needed.
By default the size of one buffer is equal to the size of page, depending on platform this either 4K or 8K, if at the end of working request connection converts to state keep-alive, then these buffers are freed.

对于apache2来说,它默认值是8k
可以调整以下2个参数
LimitRequestLine 16k
LimitRequestFieldSize 16k

LimitRequestLine 指令设置的是每一个header长度的上线
引用LimitRequestLine 指令
说明 限制接受客户端发送的HTTP请求行的字节数
语法 LimitRequestLine bytes
默认值 LimitRequestLine 8190
作用域 server config
状态 核心(C)
模块 core
bytes将设置HTTP请求行的字节数限制。
LimitRequestLine指令允许服务器管理员增加或减少客户端HTTP请求行允许大小的限制。因为请求行包括HTTP方法、URI、协议版本,所以LimitRequestLine指令会限制请求URI的长度。服务器会需要这个值足够大以装载它所有的资源名,包括可能在GET请求中所传递的查询部分的所有信息。
这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。

LimitRequestFieldSize指令设置的是所有header总长度的上限值
引用LimitRequestFieldSize 指令
说明 限制客户端发送的请求头的字节数
语法 LimitRequestFieldsize bytes
默认值 LimitRequestFieldsize 8190
作用域 server config
状态 核心(C)
模块 core
bytes指定了HTTP请求头允许的字节大小。
LimitRequestFieldSize指令允许服务器管理员增加或减少HTTP请求头域大小的限制。一般来说,服务器需要此值足够大,以适应普通客户端的任何请求的头域大小。一个普通头域的大小对于不同的客户端来说是有很大差别的,一般与用户配置他们的浏览器以支持更多的内容协议密切相关。SPNEGO的认证头最大可能达到12392字节。
这个指令给了服务器管理员更大的可控性以控制客户端不正常的请求行为。这有助于避免某些形式的拒绝服务攻击。注:该设置在apache root/manual/mod/core.xml中进行设置
参考技术A

可以通过2个参数来调整nginx的header上限。

    client_header_buffer_size 16k。

    arge_client_header_buffers 4 16k。

    LimitRequestLine 指令设置的是每一个header长度的上线。

    引用LimitRequestLine 指令。

    限制接受客户端发送的HTTP请求行的字节数。

    语法 LimitRequestLine bytes。

    默认值 LimitRequestLine 8190。

    作用域 server config。

    状态 核心(C)。

    模块 core。

    bytes将设置HTTP请求行的字节数限制。

    LimitRequestLine指令允许服务器管理员增加或减少客户端HTTP请求行允许大小的限制。

    LimitRequestFieldSize指令设置的是所有header总长度的上限值

    引用LimitRequestFieldSize 指令

    语法 LimitRequestFieldsize bytes

    默认值 LimitRequestFieldsize 8190

    作用域 server config

    状态 核心(C)

    模块 core

    bytes指定了HTTP请求头允许的字节大小。

    LimitRequestFieldSize指令允许服务器管理员增加或减少HTTP请求头域大小的限制。

如何设置nginx和apache

参考技术A 我们依然尽可能采用yum来安装我们需要的软件,由系统官方维护的软件,其安全性和稳定性都值得信赖,并且容易管理,升级方便,但是在CentOS和
RHEL的官方yum源中暂时没有Nginx等软件包,所以我们需要使用EPEL的yum源。EPEL是什么,EPEL的yum源怎么添加,点击这里查
看。

本文将要介绍的Nginx+Apache结构,其实就是Nginx做前端,Apache做后端,充分发挥他们各自的优势之处。Nginx对于高并发性能出
众,Proxy功能强效率高,占用系统资源少,而Apache在高并发时对队列的处理比FastCGI(Nginx需要通过fastcgi等方式运行
php)更好,并且在处理动态php页面时,mod_php也比php-cgi更稳定更高效。

也就是说,我们的目的是,由Nginx来接收客户端的请求,如果是动态页面请求,就交给Apache处理,然后经由Nginx再返回给客户端,其余的请
求,则由Nginx自己处理,然后把结果返回给客户端,。当然了,你完全可以让Nginx只做Proxy功能,所有的请求都交给
Apache,Tomcat等处理,本文使用前者。

但是,在本文中,我们实现的是在一台服务器里一个Nginx加一个Apache的简单结构,在实际应用中,可能前端是由一台或多台Nginx组成的代理服务器,后端则是多台Apache或其他Web服务器,再加上多种第三方软件而组成的集群。

前提约定:假设我们系统默认主站点名是www.server110.com,网站根目录是/var/www/server110

第一步,安装并配置Nginx,安装完之后,配置文件都在/etc/nginx目录下,主设置文件/etc/nginx/nginx.conf:
[root@test ~]# yum -y install nginx
[root@test ~]# vi /etc/nginx/nginx.conf
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events
use epoll;
worker_connections 2048;

http
include /etc/nginx/mime.types;
include /etc/nginx/proxy.conf;
include /etc/nginx/gzip.conf;
default_type application/octet-stream;
index index.html index.htm index.php;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
tcp_nopush on;
server_tokens off;
keepalive_timeout 60;
server_names_hash_bucket_size 128;
server
listen 80;
server_name www.server110.com;
root /var/www/server110;
location ~* .*\.(gif|jpg|jpeg|png|bmp|ico|css|js|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$
expires 2d;

# 如果你需要客户端缓存的内容以及媒体,图片等文件固定放置一些目录下的话,就把上面那个
# location注释掉,用下面这种方式
# location ~ ^/(images|javascript|js|css|flash|media|static)/
# expires 2d;
#
location ~ .*\.(php?|cgi|pl|py)$
proxy_pass http://127.0.0.1:8888;

location ~ /\.ht
deny all;

location ~ /.+\.(inc|conf|cnf)
deny all;

access_log /var/log/nginx/server110-access.log main;
#access_log off

# Load config files from the /etc/nginx/conf.d directory
include /etc/nginx/conf.d/*.conf;

[root@test ~]# vi /etc/nginx/proxy.conf
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 32 4k;
proxy_busy_buffers_size 64k;
[root@test ~]# vi /etc/nginx/gzip.conf
gzip on;
gzip_http_version 1.0;
gzip_disable "MSIE [1-6]\.";
gzip_disable "Mozilla/4";
gzip_comp_level 3;
gzip_proxied any;
gzip_vary on;
gzip_buffers 4 16k;
gzip_min_length 1100;
gzip_types text/plain text/xml text/css application/xml application/xhtml+xml application/rss+xml application/atom_xml application/javascript application/x-javascript;

为了让nginx.conf简洁,我把一些相关的共通设定放到同一个专门的文件里,然后在主配置文件nginx.conf里加载。如果你使用了VirtualHost运营多个站点,你可以根据不同站点的需求而配置不同的设定文件,然后分别在各自的server域里加载。

第二步,安装并配置Apache,配置文件在/etc/httpd/下,我们修改主配置文件/etc/httpd/conf/httpd.conf,配置文件太长,我只写我需要改的地方:
[root@test ~]# yum -y install httpd
[root@test ~]# vi /etc/httpd/conf/httpd.conf
Listen 80
↓改成
Listen 127.0.0.1:8888
DocumentRoot "var/www/html"
↓改成
DocumentRoot "/var/www/server110"
<Directory "/var/www/html">
↓改成
<Directory "/var/www/server110">
Options Indexes FollowSymLinks
↓改成如下,允许CGI,SSI
Options Includes ExecCGI FollowSymLinks
AllowOverride None
↓改成如下,支持.htaccess
AllowOverride All
Order allow,deny
Allow from all
</Directory>
ServerSignature On
↓改成如下,在现实错误页面的时候不会显示服务器和apache的版本
ServerSignature Off
#AddHandler cgi-script .cgi
↓改成如下,cgi脚本使用.cgi,.pl,.py
AddHandler cgi-script .cgi .pl .py

第三步,设置VirtualHost(如果你需要在本机上运营多个站点,否则略过此步):
1.修改/etc/httpd/conf/httpd.conf:
#NameVirtualHost *:80
↓改成如下
NameVirtualHost 127.0.0.1:8888
#追加下面4行,www.server110.com是我们的默认主站
<VirtualHost 127.0.0.1:8888>
ServerName www.server110.com
</VirtualHost>
Include virtual/*.conf

2.修改/etc/nginx/nginx.conf,在server域的后面追加如下一句:
include /etc/nginx/virtual/*.conf;

3.假设我们还要在本机上运行一个站点叫www.cooliter.com:
[root@test ~]# mkdir /etc/nginx/virtual/
[root@test ~]# mkdir /etc/httpd/virtual/
[root@test ~]# vi /etc/nginx/virtual/www.cooliter.com.conf
server
listen 80;
server_name www.cooliter.com;
root /var/www/cooliter;
location ~* .*\.(gif|jpg|jpeg|png|bmp|ico|css|js|txt|flv|swf|mid|doc|ppt|xls|pdf|txt|mp3|wma)$
expires 24h;

location ~ .*\.(php?|cgi|pl|py)$
proxy_pass http://127.0.0.1:8888;

location ~ /\.ht
deny all;

location ~ /.+\.(inc|conf|cnf)
deny all;

access_log /var/log/nginx/cooliter-access.log main;
#access_log off

[root@test ~]# vi /etc/httpd/virtual/www.cooliter.com.conf
<VirtualHost 127.0.0.1:8888>
ServerAdmin webmaster@cooliter.com
DocumentRoot /var/www/cooliter
ServerName www.cooliter.com
UseCanonicalName Off
ErrorLog logs/www.cooliter.com-error_log
CustomLog logs/www.cooliter.com-access_log common
</VirtualHost>

第四步,安装MySql,参照这篇教程。

第五步,安装php及其他常用组件:
[root@test ~]# yum -y install php php-mysql php-gd php-xml php-mbstring php-mcrypt

第六步,安装php加速器eaccelerator和php-pecl-memcached模块,提高性能:
[root@test ~]# yum install php-eaccelerator php-pecl-memcached

设定文件分别是/etc/php.d/eaccelerator.ini和/etc/php.d/memcached.ini,如果你采用默认设置,就不需要修改设定文件了。

第七步,安装并配置Zend提供的php加速、解密软件,yum源里没有,直接从官方下载即可,不需要编译,下载的时候注意根据你的系统选择32位或者64位的版本。
1:如果你用的php是php5.3.x版本,需要安装的是Zend Guard Loader:
[root@test ~]# tar -xzvf ZendGuardLoader-php-5.3-linux-glibc23-i386.tar.gz
[root@test ~]# ls ZendGuardLoader-php-5.3-linux-glibc23-i386/
README.txt php-5.3.x
#小提示,看解压目录下的README.txt里有使用说明
[root@test ~]# mv -T ZendGuardLoader-php-5.3-linux-glibc23-i386 /usr/lib/php/ZendGuardLoader-php-5.3
[root@test ~]# vi /etc/php.d/zend.ini
#添加如下内容,保存退出
[Zend Guard Loader]
zend_extension="/usr/lib/php/ZendGuardLoader-php-5.3/php-5.3.x/ZendGuardLoader.so"
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3

2:如果你用的php是php5.2或更早的版本,需要安装的是Zend Optimizer:
[root@test ~]# tar -xzvf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz
[root@test ~]# ls ZendOptimizer-3.3.9-linux-glibc23-i386
EULA-ZendOptimizer Inventory.xml LICENSE README-ZendOptimizer data md5
#小提示1,看解压目录下的README-ZendOptimizer里有使用说明
[root@test ~]# ls ZendOptimizer-3.3.9-linux-glibc23-i386/data
4_2_0_comp 4_3_x_comp 5_0_x_comp 5_2_x_comp
4_2_x_comp 4_4_x_comp 5_1_x_comp poweredbyoptimizer.gif
#小提示2,解压目录下的data目录下根据不同的php版本提供了不同的so文件,假设我们的版本是php5.1.x的
[root@test ~]# mv -T ZendOptimizer-3.3.9-linux-glibc23-i386 /usr/lib/php/ZendOptimizer-3.3.9
[root@test ~]# vi /etc/php.d/zend.ini
#添加如下内容,保存退出
[Zend Optimizer]
zend_optimizer.optimization_level=1
zend_extension = "/usr/lib/php/ZendOptimizer-3.3.9/data/5_1_x_comp/ZendOptimizer.so"

第八步,启动Apache和Nginx,并测试(MySql就不测试了):
[root@test ~]# /etc/init.d/httpd start
[root@test ~]# /etc/init.d/nginx start
[root@test ~]# chkconfig httpd on
[root@test ~]# chkconfig nginx on
[root@test ~]# mkdir /var/www/server110
[root@test ~]# echo "hello,server110" > /var/www/server110/index.html
[root@test ~]# echo -e "<?php\nphpinfo();" > /var/www/server110/index.php

打开浏览器分别访问一下index.html和index.php,然后关闭Apache,再分别访问一下(php页面应该就访问不了了)。

测试gzip是否有效,因为我们设置了gzip_min_length为1100,所以低于1100bytes的页面不会压缩,你测试的页面内容最好大于1100bytes。
[root@test ~]# curl -I -H "Accept-Encoding:gzip,deflate" http://www.cooliter.com/test.txt
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 22 Jul 2011 04:45:30 GMT
Content-Type: text/plain
Last-Modified: Fri, 22 Jul 2011 04:40:30 GMT
Connection: keep-alive
Vary: Accept-Encoding
Expires: Sun, 24 Jul 2011 04:45:30 GMT
Cache-Control: max-age=172800
Content-Encoding: gzip <---证明服务器支持gzip压缩

后话,本文旨在介绍这种结构的搭建方法,所以用到的配置参数比较少,关于更详细的参数设置和优化,需要读者你自己根据实际情况结合官方帮助文档进一步去测试。

以上是关于如何调整nginx和apache服务器的header限制的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何配置高性能的web服务器apache,nginx

如何正确设置nginx中remote

如何监控Apache性能及调整Apache的并发连接数

WEB服务器如何选择 Apache or Nginx?

(转)一次压测对nginx/tomcat配置的调整

如何将路径从 apache 更改为 nginx