码迷,mamicode.com
首页 > 其他好文 > 详细

Nginx HTTP Server相关

时间:2014-05-09 17:02:14      阅读:488      评论:0      收藏:0      [点我收藏+]

标签:style   ext   http   c   int   strong   

一、Nginx安装:

采取手动编译安装

对多种重要的选项进行配置

安装前提:常用工具和库,GCC PCRE(Rewrite模块需要) pcre-devel(源码) zlib zlib-devel(源码) OpenSSL openssl-devel(源码)

配置选项

./configure --help列出有效的配置开关变量

--prefix= 指定安装Nginx的基础目录 ,默认值/usr/local/nginx. 在配置是使用了相对路径,则连接到基础目录。例如--conf-path=conf/nginx.conf

--sbin-path= nginx二进制文件的安装的路径。<prefix>/sbin/nginx

--config-path= 主要配置文件的放置目录。 <prefix> /conf/nginx.conf

--erro-log-path=错误日志存放的路径。<prefix>/logs/error.log

--pid-path=Nginx的pid文件路径<prefix>/logs/nginx.pid 对于Nginx来说用于确定该进程没有被启动两次

--with-perl_modules_path= 定义 Perl 模块的路径。如果需要包含另外的Perl模块,必须定义该参数

--with-perl=..perl 二进制文件的路径,用于执行Perl脚本。如果想执行一个Perl脚本,必须设置该路径

--http-log-path = ...定义被访问文件的日志存放路径。<prefix>/logs/access.log

--http-client-body-temp-path=...改目录存储客户端请求产生的临时文件 <prefix>/client_body_temp

--http-proxy-temp-path=...该目录用于代理存储临时文件<prefix>/proxy_temp

--http-fastcgi-temp-path=...指定用于Fast FastCGI 模块使用的临时文件的存放 <prefix>/fastcgi_temp

--builddir=...指定创建应用程序的位置

先决条件选项:

编译选项:

--with-cc=.. 指定一个备用的C编译器位置

--with-cpp ~C预处理器~

--with-cc-opt=.. 定义一个额外的选项,然后在命令行传递给C编译器

--with-ld-opt ~传递给C连接器~

--with-cpu-opt=.. 指定不同的目标处理器结构

 

PCRE选项:

--without-pcre 不使用pcre库

--with-pcre 强制使用pcre库

--with-pcre=.. 允许指定pcre库的源代码

--with-pcre-opt= 用于建立pcre库的其他选项

 

MD5选项:

--with-md5= 指定MD5源代码路径

--with-md5-opt=

--with-md5-asm=建立MD5库使用汇编语言源代码

SHA1选项:

--with-sha1=

--with-sha1-opt=

--with-sha1-asm=

zlib选项:

--with-zlib=

--with-zlib-opt=

--with-zlib-asm=

openssl选项:

--with-openssl=

--with-openssl-opt=

 

模块选项:

(一些模块是默认开启,一些需要手动开启)

默认开启的模块:

--without-http_charset_module 禁用Charset模块,该模块用于对网页重新编码

--without-http_gzip_module 禁用Gzip压缩模块

--without-http_ssi_module 禁用服务器端包含模块

--without-http_userid_module 禁用用户ID模块,该模块为用户通过cookie验证身份

--without-http_access_module 禁用访问模块,对于指定的IP段,允许访问配置

--without-http_auth_basic_module 禁用基本的认证模块

--without-http_autoindex_module 禁用自动索引模块

--without-http_geo_module 禁用Geo模块,该模块允许你定义依赖于IP地址段的变量。

--without-http_map_module 禁用Map模块,该模块允许你声明map区段

--without-http_referer_module 禁用Referer控制模块

--without-http_rewrite_module 禁用Rewrite模块

--without-http_proxy_module 禁用代理模块,该模块用于向其他服务器传输请求

--without-http_fastcgi_module 禁用FastCGI模块。该模块是用于与FastCGI进程配合工作

--without-http_memcached_module 禁用Memcached 模块。该模块是用于与memcached守护进程配合工作。

--without-http_limit_zone_module 禁用Limit Zone 模块。该模块是用于根据定义的Zone来限制约束对资源的使用

--without-http_limit_req_module 禁用Limit Request 模块。该模块允许你限制每个用户请求的总数

--without-http_empty_gif_module 禁用Empty Gif 模块,该模块用于在内存中提供一个空白的GIF图像

--without-http_browser_module 禁用Browser模块,该模块用于解释用户代理字符串

--without-http_upstream_ip_hash_module 禁用Upstream 模块,该模块用于配置负载均衡结构

 

默认禁用的模块:

--with-http_ssl_module 开启SSL模块,支持使用HTTPS协议的网页

--with-http_realip_module 开启Real IP的支持,该模块用于从客户端请求的头数据读取real IP地址。

--with-http_addition_module 开启Addition 模块,该模块允许你追加或前置数据(prepend data)到响应的主体部分

--with-http_xslt_module 开启XSLT模块的支持,该模块实现XSL转化XML文档

--with-http_image_filter_module 开启Image Filter模块,该模块是让你修改图像。注意:如果想编译该模块,需要在系统中安装libgd库

--with-http_geoip_module 开启GeoIP模块,该模块通过使用MaxMind‘s GeoI 二进制数据库来获取客户端在地里上的分布。需要安装libgeoip库

--with-http_sub_module 开启Substitution模块,该模块用于在网页中替换文本

--with-http_dav_module 开启WebDAV模块(Distribute Authoring and Versioning via Web)

--with-http_flv_module 开启FLV模块,该模块用于专门处理.flv(falsh视频)文件

--with-http_gzip_static_module 开启Gzip静态模块,该模块用于发送预压缩的文件

--with-http_random_index_module 开启Random Index模块,该模块用于挑选一个随机的文件作为该目录的Index

--with-http_secure_link_module 开启Secure Link模块,该模块用于在URL中检测关键字的存在

--with-http_stub_status_module 开启Stub Status模块,该模块会产生一个服务器状态和信息页

--with-google_perftools_module 开启Google性能工具模块

杂项(例如邮件代理服务功能或时间管理功能)

--------------

Nginx命令行选项

启动和停止守护进程

nginx -s stop 立即停止守护进程(使用TERM信号)

nginx -s quit 温和地停止守护进程(使用QUIT信号)

nginx -s reopen 重新打开日志文件

nginx -s reload 重新载入配置文件

测试配置文件是否有效:nginx -t -c(测试临时的配置文件)

nginx -g 用于指定额外的配置命令

 

将Nginx添加为系统服务

建立Nginx的init脚本,保存到init.d目录下

安装Nginx的init脚本,授予该脚本可执行权限

让脚本自动启动:

基于Debian的发布: update -rc.d -f nginx defaults

基于Red hat的发布:chkconfig --add nginx (--list nginx)检查该服务的运行级别

 

配置文件

配置机制:指令、模块(block)、整体逻辑结构

在http区段,可以声明一个或多个server区段,一个server允许配置一个虚拟主机。

在server区段,可以插入一个或多个location区段,当需要对特定URI进行匹配时,这些location区段允许对这些路径单独设置。

在一个区段嵌套的其他区段,那么被嵌套的区段会继承其父区段的设置。

指令值单位 字节单位和时间单位

变量

字符串值:包含特殊符号,用引号括起来

基本模块指令

基本模块:提供的指令允许你定义的Nginx基本功能的变量,在编译时不能被禁用,因此他们提供的指令和区段总是有效

核心模块(Core module):基本特征和指令,例如进程管理和安全

事件模块(Events module):可以在Nginx内部机制配置网络使用能力

配置模块(Configuration module):提供包含机制

Nginx的进程结构

启动Nginx,有一个独一无二的内存--master主进程。master进程本身不处理任何客户端的请求,它的功能是用来产生进程----worker进程,这些worker进程以在配置文件中指定的用户和用户组来运行,可以大量worker进程以及每个worker进程的最大连接数。

核心模块指令必须放置在文件根部(配置文件的开始部分),而且只能使用一次

Events模块:与该模块提供的指令可以用来配置网络机制,指令的一些参数会对Nginx应用程序的性能产生重要影响

Configuration模块:是一个简单的模块,它提供的include指令能够将其他文件包含在Nginx配置文件中。

平滑升级Nginx(避免丢失连接)

 

HTTP配置

HTTP核心模块

http 该区段嵌入嵌入配置文件的根部,在这个区段中允许定义指令和嵌入HTTP相关模块的区段。

server 这个区段允许你声明一个站点 。该区段只能用在http区段中

location 定义一组设置,应用于网站的一个特定位置。该区段能够用于server区段,也能够嵌套在其它location中

在这三个层次中的每一个层次中,都可以插入指令,这些指令将影响web服务器的行为。

Nginx提供的服务,可以通过三个级别调整配置文件:在协议级别(http区段)、在server级别(server区段)及在请求的URI级别(location区段)

location 修饰符:

= URI 的定位必须与指定的模式精确匹配。该模式在这里限定为一个简单的文本字符串,不能用正则表达式。

(无) URI的定位必须以指定模式开始,不可以使用正则表达式

~ 客户端请求的URI与指定的正则表达式匹配,必须区分大小写

~* 对客户端请求的URI与指定的正则表达式匹配,必须不区分大小写

^~ 类似于无标志行为,URI的定位必须以指定模式开始。不同的,如果模式匹配,那么Nginx就停止搜索其他模式

@定义命名location区段,这些区段客户端不能访问,只可以由内部的请求来访问。

 

 

模块变量:

客户端请求头的值

发送响应头中的值

Nginx产生的各种变量

 

Rewrite 模块:

正则表达式:
元字符,量词,捕获

这些被捕获的数据(这些数据均放在缓冲区中),可以用于后面的指令。

 

 内部请求:Nginx区分外部请求和内部请求。外部请求直接源于客户端,URI尽量与location区段匹配。

内部请求会被Nginx通过特定的指令触发。在默认的Nginx模块中,有些内部指令有能力处理内部请求:error_page,index,rewrite,

try_files,add_before_body,add_after_body,include,SSI命令,等等。

 

两种不同类型的内部请求:

内部重定向:Nginx在内部重定向客户端的请求。

子请求:另外一种触发内部请求而产生内容的是子请求。

error_page

rewrite

如果希望Nginx在改写的URI中不包含参数那么在替代的URI结尾插入一个“?”字符

服务器端包含SSI

 

条件结构:rewrite模块引进了一组新的指令和区段,其中之一就是if条件结构

 

限制与约束

auth_basic模块

 Access 模块

两个重要指令:allow 和 deny,允许你通过指定IP或IP范围来允许或拒绝被访问的资源。

语法:

 allow  IP | CIDR | all     CIDR:IP范围。all 表示所有客户端的IP。

规则的处理顺序为自上而下(开始的指令优先)

Limit zone模块

允许定义一个zone,然后通过限制该zone而达到限制服务器的最大并发连接数。

Limit request 模块

允许你限制被定义的zone的请求总数

 

内容与编码

 empty_gif模块:从内存提供一个1x1的透明gif图片

FLV模块

HTTP Header模块:该模块提供了两个指令,它们会影响发送到客户端的响应头

 add_header name value

 expires 允许控制发送到客户端 Expires和 Cache-Control HTTP header的值

Addition模块:允许你(通过简单指令)在HTTP响应之前或者之后添加内容

 Substitution模块:顺着前面模块的路线,Substitution 模块允许你从响应体中查找和直接替换文本

 Gzip filter 模块:该模块允许你在将响应体发送到客户端之前将响应体利用Gzip 算法压缩

 Gzip static模块:该模块为Gzip过滤机制添加一个简单的功能--当gzip_static指令(on 或 off)开启,Nginx将自动查找.gz文件,先查找下,是否有该文件

的压缩形式文件。

Charset filter模块:可以更精确地控制响应体的字符集

Memcached模块:Memcached是一个通过守护进程方式来运行的应用程序,它能够通过套接字连接。提供一个高效的分布式键/值的内存缓存系统。

Image filter 模块: 提供图像处理功能

XLST模块:允许对XML文件或者后台服务器(代理和FastCGI)收到的响应应用XSLT转换

 

--------------------------------------------

CGI 通用网关接口:CGI是一个协议,它描述了web服务器与应用程序网关(PHP、python,等等)之间的信息交换。

定义:按照RFC3875的规定(CGI protocol v1.1),通用网关接口(CGI)允许一个HTTP服务和CGI脚本负担责任------响应客户端的requests.[...].

服务器(Nginx)响应管理连接、数据传送、传输及客户端相关的网络问题,而CGI脚本处理诸如数据访问和文档处理等应用程序问题。

CGI 存在的缺点(如每个请求产生一个唯一进程),产生了由CGI到FastCGI的演变。

FastCGi与Nginx的和谐共处有FastCGI模块来完成。

FastCGI模块 主要指令:

fastcgi_pass:使用环境location,if       指定什么请求应该传递给 FastCGI 服务器

fastcgi_param:   location,http,server  允许配置传递给FastCGI 服务器的请求参数

fastcgi_pass_header  指定传递到FastCGI服务器额外的头(header)信息。

fastcgi_hide_header 指定FastCGI服务器应该隐藏的头信息(即Nginx没有转发的头信息)

fastcgi_index FastCGI  不支持自动目录索引----如果URI请求以/结尾,Nginx会将fastcgi_index指定的值附加在 / 之后

fastcgi_ignore_client_abort  

fastcgi_intercept_errors  定义Nginx 是否处理网关返回的错误或直接向客户端返回错误页

fastcgi_read_timeout     定义应用程序 FastCGI 的响应超时时间。如果在这个时间段内 Nginx没有收到响应,则返回 “504 Gateway Timeout”

的HTTP 错误。

fastcgi_connect_timeout  定义后端服务器连接超时

fastcgi_send_timeout 定义发送数据到后台服务器的超时时间

fastcgi_split_path_info  这个指令对于以下形式的URL 特别有用

fastcgi_store 用于开启或禁用简单的缓存存储,用于存储FastCGI应用程序的响应,作为文件存储在驱动器上,再有同样的URI请求时,文档就直接从缓存中提供,而不用再将请求发送到FastCGI应用程序。

fastcgi_store_access 该指令定义在使用环境中对缓存文件的访问权限。

fastcgi_temp_path 设置临时文件和缓存文件的路径

fastcgi_max_temp_file_size 指定临时文件的最大值。

fastcgi_max_temp_write_size  提供使用存储驱动器上的临时文件时,需要设置写缓冲区的大小,该指令就是来完成这个工作的

fastcgi_buffers 设置缓冲区的数量和大小,用于从FastCGI应用程序读取响应数据

fastcgi_buffers_size 设置缓冲区的大小,用于读取从FastCGI应用程序响应数据包开始的部分,通常包含简单的头数据

......

FastCGI 缓存

fastcgi_cache 定义一个cache区域(zone)。对区域(zone)定义标识符为了进一步在其他指令中使用

fastcgi_cache_key 定义缓存key,为了区分不同的缓存条目

fastcgi_cache_min_uses 定义一个请求有资格缓存之前被击中的最少次数,默认一个请求的响应一次被击中就会被缓存

fastcgi_cache_path 指定用于存储缓存文件的目录。也包括其他参数

fastcgi_cache_use_stale 定义Nginx在某些情况下(关于网关)是否提供过期的缓存数据。

fastcgi_cache_valid 允许你对不同的响应代码定制不同的缓存时间

 

Upstream模块:

该模块允许你声明命名upstream区段来定义一个服务器列表(负载均衡)

存在session共享的问题 

 要确定同一个访问者发出的请求总是由同一个后端服务器来处理,可以使用ip_hash选项,在upstream区段中声明即可.

(ip_hash并不能完全保证客户端总能连接到同一台upstream服务器)

 

server指令:参数

weight=n 表示这个服务器的权重

max_fails=n 定义可以发生通信错误的最大次数(在fail_timeout定义的时间参数内)

fail_timeout=n 

down 标记一个后端服务器为离线状态 ,不使用该服务器

backup 标记一个后端服务器为备份服务器,Nginx不会使用该服务器直到其他服务器全部宕机或无效时才启用

 

Nginx作为反向代理

反响代理机制

Nginx 放在前端,作为前端服务器(换句话说,作为反向代理),接收从外面进来的所有请求,他会对请求进行过滤,如果请求的资源是静态文件,则直接由Nginx提供给客户端,请求的资源是动态页面,则转发给后端服务器。

后端服务器只与Nginx通信。它可以与前端服务器位于同一台计算机上,也可以在不同的机器上使用多个后端服务器(使用upstream区段)以便负担负载

两个进程的通信兵没有使用FastCGI,Nginx充当的是一个简单的代理服务器:它从客户端收到HTTP请求并且转发到后端服务器(充当一个HTTP客户端)。因此这里没有使用新的协议或复杂的软件,这种机制由Nginx提供的代理(Proxy)模块来实现。

Nginx代理模块

主要指令:

proxy_pass 在location指定转发到后端服务器的请求

proxy_method 允许主要的http请求方法转发到后端服务器

proxy_hide_header 转发至客户端响应时,隐藏更多的客户端头行

proxy_pass_header 结合前面的命令。该指令强制一些被忽略的头传递到客户端

proxy_redirect  允许改写出现在HTTP头却被后端服务器触发重定向的URL

    off 重定向被转到实际的位置

proxy_next_upstream proxy_pass连接到一个upstream块的时候,该指令指定在某种情况,请求资源放弃并且重新发送到下一个该区段的下一个upstream server

缓存、缓冲和临时文件

proxy_buffer_size   设置缓冲区的大小,该缓冲区用于存放读取来自后端服务器响应数据的开始部分,通常包含简单的头数据

proxy_buffering  定义是否缓冲后端服务器的响应,如果设置为on,那么Nginx将把响应存储在内存中,使用内存空间来提供缓冲.如果缓冲用完,响应数据就存储到临时文件。

proxy_buffers 设置缓冲数量和大小,用于存放从后端服务器读取的响应数据

proxy_busy_buffers_size 在缓冲区中,收到的后端数据堆积超过该指令指定的数值时缓冲区会被刷新,并且数据被发送到客户端

proxy_cache 定义一个缓存zone。指定zone的标识符,以便将来的指令使用

proxy_cache_key 定义缓存key

proxy_cache_path 指出用于存放缓存文件的目录

proxy_cache_methods 定义有资格缓存的HTTP方法

proxy_cache_min_uses 定义一个请求有资格缓存之前被击中的最少次数

。。。。

限制、超时设定和错误 指令

proxy_connect_timeout 定义后端服务器连接超时

。。。

其它指令

。。。

 

高级配置:

 

可以新建一个proxy.conf文件,用include导入

对于一些设置的建议值

proxy_redirect off; 设置为off后,让Nginx以 “as it is ” 方式重定向到客户端,即对响应本身不做任何处理。

proxy_set_header Host $host; 转发到后端服务器的请求中的Host HTTP头默认为代理的主机名。这样的设置令Nginx可以换而使用客户端请求中的原始主机名

proxy_ser_header X-Real-IP $remote_addr; 由于后端服务器从Nginx收到请求,所以这是与后端服务器通讯的IP将是Nginx的IP地址而不是原始客户端的IP地址,使用这种设置能够转发真实的客户端IP地址,使用这种设置能够转发真实的客户端IP地址到一个新的头,即X-Real-IP头

 proxy_set_header  X-Forwarded-For $proxy_add_x_forworded_for; 来确保用于套接字通信的IP地址,可能是原始客户端的IP地址(代理后面的客户端)转交到后端服务器

client_max_body_size 10m; 限制客户端请求体的最大值为10M。这里设置的值只是一个参考值,请确保调整的值与后端服务器的水平相同。否则一个正确收到请求的(被Nginx处理后)将不能够成功的转发到后端服务器。

client_body_buffer_size 128k; 定于用于持有请求体(Request body)内存缓冲区的大小,超过该值后,内容就被保存到临时文件中

 proxy_connect_timeout 15;如果与代理服务器协同工作的后端服务器在本地网络,请务必保持此值尽可能低(这个值取决于平均负荷),指令的最大值是75秒

proxy_send_timeout 15;

proxy_read_timeout 15;

 

241

 

 

Nginx HTTP Server相关,布布扣,bubuko.com

Nginx HTTP Server相关

标签:style   ext   http   c   int   strong   

原文地址:http://www.cnblogs.com/aveenzhou/p/3582178.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!