本文最后更新于:2024年3月18日 凌晨
Nginx 配置
Nginx的配置文件默认为程序目录下conf文件夹的nginx.conf
文件。
在nginx.conf
文件的注释符号为#
每个指令必须有分号结束。
查看与检测配置文件
1 2 3 $ nginx -t nginx: the configuration file /www/server/nginx/conf/nginx.conf syntax is ok nginx: configuration file /www/server/nginx/conf/nginx.conf test is successful
配置文件结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 worker_processes 1 ;events { worker_connections 1024 ; }http { include mime.types; default_type application/octet-stream; sendfile on ; keepalive_timeout 65 ; server { listen 8000 ; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { ... } }
全局块 :配置影响nginx全局的指令,一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
events块 :配置影响nginx服务器或与用户的网络连接,有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
http块 :可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置,如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
server块 :配置虚拟主机的相关参数,一个http中可以有多个server
location块 :配置请求的路由,以及各种页面的处理情况。
全局变量
自定义变量
可以在sever,http,location等标签中使用set命令(非唯一)声明变量,语法如下。
注意 :nginx中的变量必须都以$开头。
nginx的配置文件中所有使用的变量都必须是声明过的,否则nginx会无法启动并打印相关异常日志。
作用域
在不同层级的标签中声明的变量性的可见性规则如下。
location标签中声明的变量中对这个location块可见。
server标签中声明的变量对server块以及server块中的所有子块可见。
http标签中声明的变量对http块以及http块中的所有子块可见。
内置预定义变量
变量名
定义
$arg_PARAMETER
GET请求中变量名PARAMETER参数的值
$args
这个变量等于GET请求中的参数,例如,foo=123&bar=blahblah;这个变量只可以被修改
$binary_remote_addr
二进制码形式的客户端地址
$body_bytes_sent
传送页面的字节数
$content_length
请求头中的Content-length字段
$content_type
请求头中的Content-Type字段
$cookie_COOKIE
cookie COOKIE的值
$document_root
当前请求在root指令中指定的值
$document_uri
与$uri
相同
$host
请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称(处理请求的server的server_name指令的值),值为小写,不包含端口
$hostname
机器名使用 gethostname系统调用的值
$http_HEADER
HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值)
$sent_http_HEADER
HTTP响应头中的内容,HEADER为HTTP响应中的内容转为小写,-变为_(破折号变为下划线),例如:$sent_http_cache_control
, $sent_http_content_type
…
$is_args
如果$args设置,值为"?“,否则为”"
$limit_rate
这个变量可以限制连接速率
$nginx_version
当前运行的nginx版本号
$query_string
与$args相同
$remote_addr
客户端的IP地址
$remote_port
客户端的端口
$remote_user
已经经过Auth Basic Module验证的用户名
$request_filename
当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_body
这个变量(0.7.58+)包含请求的主要信息,在使用proxy_pass或fastcgi_pass指令的location中比较有意义
$request_body_file
客户端请求主体信息的临时文件名
$request_completion
如果请求成功,设为"OK",如果请求未完成或者不是一系列请求中最后一部分则设为空
$request_method
这个变量是客户端请求的动作,通常为GET或POST,包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作
$request_uri
这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI
$scheme
所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect
$server_addr
服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数
$server_name
服务器名称
$server_port
请求到达服务器的端口号
$server_protocol
请求使用的协议,通常是HTTP/1.0或HTTP/1.1
$uri
请求中的当前URI(不带请求参数,参数位于args),不同 于浏 览器 传递 的 args),不同于浏览器传递的args),不同于浏览器传递的request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,不包括协议和主机名,例如/foo/bar.html
全局块
全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。
通常包括配置运行Nginx服务器的用户(组),允许生成的worker process数,Nginx进程PID存放路径,日志的存放路径和类型以及配置文件引入等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
events块
events块涉及的指令主要影响Nginx服务器与用户的网络连接,常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数等。
这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
http块
http块是Nginx服务器配置中的重要部分,代理,缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块中。
前面已经提到,http块中可以包含自己的全局块,也可以包含server块,server块中又可以进一步包含location块,在本书中我们使用"http全局块”来表示http中自己的全局块,即http块中不包含在server块中的部分。
可以在http全局块中配置的指令包括文件引入,MIME-Type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数上限等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
server块
server块和"虚拟主机”的概念有密切联系。
虚拟主机,又称虚拟服务器,主机空间或是网页空间,它是一种技术,该技术是为了节省互联网服务器硬件成本而出现的,这里的"主机”或"空间”是由实体的服务器延伸而来,硬件系统可以基于服务器群,或者单个服务器等,虚拟主机技术主要应用于HTTP,FTP及EMAIL等多项服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源,从用户角度来看,一台虚拟主机和一台独立的硬件主机是完全一样的。
在使用Nginx服务器提供Web服务时,利用虚拟主机的技术就可以避免为每一个要运行的网站提供单独的Nginx服务器,也无需为每个网站对应运行一组Nginx进程,虚拟主机技术使得Nginx服务器可以在同一台服务器上只运行一组Nginx进程,就可以运行多个网站。
在前面提到过,每一个http块都可以包含多个server块,而每个server块就相当于一台虚拟主机,它内部可有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务(或网站)
和http块相同,server块也可以包含自己的全局块,同时可以包含多个location块,在server全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或IP配置。
listen
server块中最重要的指令就是listen指令,这个指令有三种配置语法。
这个指令默认的配置值是:listen *:80 | *:8000
只能在server块种配置这个指令。
1 2 3 4 5 6 7 listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on |off ] [reuseport] [so_keepalive=on |off |[keepidle]:[keepintvl]:[keepcnt]];listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on |off ] [reuseport] [so_keepalive=on |off |[keepidle]:[keepintvl]:[keepcnt]];listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on |off |[keepidle]:[keepintvl]:[keepcnt]];
listen指令的配置非常灵活,可以单独制定ip,单独指定端口或者同时指定ip和端口。
1 2 3 4 5 listen 127.0.0.1:8000 ; listen 127.0.0.1 ; listen 8000 ; listen *:8000 ; listen localhost:8000 ;
关于上面的一些重要参数做如下说明:
address
:监听的IP地址(请求来源的IP地址),如果是IPv6的地址,需要使用中括号"[]”括起来,比如[fe80::1]等。
port
:端口号,如果只定义了IP地址没有定义端口号,就使用80端口,这边需要做个说明:要是你压根没配置listen指令,那么那么如果nginx以超级用户权限运行,则使用\*
:80,否则使用\*
:8000 ,多个虚拟主机可以同时监听同一个端口,但是server_name需要设置成不一样。
default_server
:假如通过Host没匹配到对应的虚拟主机,则通过这台虚拟主机处理,具体的可以参考这篇文章 ,写的不错。
backlog=number
:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511
accept_filter=filter
:设置监听端口对请求的过滤,被过滤的内容不能被接收和处理,本指令只在FreeBSD和NetBSD 5.0+平台下有效,filter可以设置为dataready或httpready,感兴趣的读者可以参阅Nginx的官方文档。
bind
:标识符,使用独立的bind()处理此address:port,一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接。
ssl
:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关。
server_name指令
基本语法
对于name 来说,可以只有一个名称,也可以由多个名称并列,之间用空格隔开。
每个名字就是一个域名,由两段或者三段组成,之间由点号.
隔开,比如。
1 server_name myserver.com www.myserver.com
在该例中,此虚拟主机的名称设置为myserver.com或www. myserver.com
Nginx服务器规定,第一个名称作为此虚拟主机的主要名称。
通配符
在name 中可以使用通配符"*”,但通配符只能用在由三段字符串组成的名称的首段或尾段,或者由两段字符串组成的名称的尾段,如:
1 server_name myserver.* *.myserver.com
匹配规则
另外name还支持正则表达式的形式。
由于server_name指令支持使用通配符和正则表达式两种配置名称的方式,因此在包含有多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配成功,那么,来自这个名称的请求到底要交给哪个虚拟主机处理呢?Nginx服务器做出如下规定:
对于匹配方式不同的,按照以下的优先级选择虚拟主机,排在前面的优先处理请求。
准确匹配server_name
通配符在开始时匹配server_name成功。
通配符在结尾时匹配server_name成功。
正则表达式匹配server_name成功。
在以上四种匹配方式中,如果server_name被处于同一优先级的匹配方式多次匹配成功,则首次匹配成功的虚拟主机处理请求。
绑定多ip
有时候我们希望使用基于IP地址的虚拟主机配置,比如访问192.168.1.31由虚拟主机1处理,访问192.168.1.32由虚拟主机2处理。
这时我们要先网卡绑定别名,比如说网卡之前绑定的IP是192.168.1.30,现在将192.168.1.31和192.168.1.32这两个IP都绑定到这个网卡上,那么请求这个两个IP的请求才会到达这台机器。
绑定别名后进行以下配置即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 http { { listen: 80; server_name: 192.168.1.31; ... } { listen: 80; server_name: 192.168.1.32; ... } }
location块
每个server块中可以包含多个location块,在整个Nginx配置文档中起着重要的作用,而且Nginx服务器在许多功能上的灵活性往往在location指令的配置中体现出来。
location块的主要作用是,基于Nginx服务器接收到的请求字符串(例如,server_name/uri-string),对除虚拟主机名称(也可以是IP别名,后文有详细阐述)之外的字符串(前例中"/uri-string”部分)进行匹配,对特定的请求进行处理,地址定向,数据缓存和应答控制等功能都是在这部分实现,许多第三方模块的配置也是在location块中提供功能。
基本语法
1 location [ = | ~ | ~* | ^~ ] uri { ... }
其中,uri变量是待匹配的请求字符串,可以是不含正则表达的字符串,如/myserver.php
等,也可以是包含有正则表达的字符串,如 .php$
等。
其中方括号里的部分,是可选项,用来改变请求字符串与 uri 的匹配方式,在介绍四种标识的含义之前,我们需要先了解不添加此选项时,Nginx服务器是如何在server块中搜索并使用location块的uri和请求字符串匹配的。
在不添加方括号中的部分时,Nginx服务器首先在server块的多个location块中搜索是否有标准uri和请求字符串匹配,如果有多个可以匹配,就记录匹配度最高的一个。
然后,服务器再用location块中的正则uri和请求字符串匹配,当第一个正则uri匹配成功,结束搜索,并使用这个location块处理此请求,如果正则匹配全部失败,就使用刚才记录的匹配度最高的location块处理此请求。
了解了上面的内容,就可以解释可选项中各个标识的含义了:
=
:用于标准uri前,要求请求字符串与uri严格匹配,如果已经匹配成功,就停止继续向下搜索并立即处理此请求。
^~
:用于标准uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
~
:用于表示uri包含正则表达式,并且区分大小写。
~*
:用于表示uri包含正则表达式,并且不区分大小写,注意如果uri包含正则表达式,就必须要使用~
或者~*
标识。
!~
和!~*
:分别为区分大小写不匹配及不区分大小写不匹配的正则。
/
:通用匹配,任何请求都会匹配到。
在浏览器传送URI时对一部分字符进行URL编码,比如空格被编码为%20
,问号被编码为%3f
等,^~
有一个特点是,它对uri中的这些符号将会进行编码处理,比如,如果location块收到的URI为/html/%20/data
,则当Nginx服务器搜索到配置为^~/html/ /data
的location时,可以匹配成功。
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 location = / { }location = /login/ { }location ^~ /static/ { }location ~ \.(gif|jpg|png|js|css)$ { }location ~* \.png$ { }location !~ \.xhtml$ { }location !~* \.xhtml$ { }location / { }
expire指令
expires指令控制HTTP应答中的Expires
和Cache-Control
Header头部信息,启动控制页面缓存的作用。
基本语法
1 2 expires [time|epoch|max|pff]
time
:表示过多久过期。
Expires
的值将通过当前系统时间加上设定time值来设定。
time值还控制Cache-Control
的值:
负数表示no-cache
正数或零表示max-age=time
epoch
:指定Expires
的值为 1 January,1970,00:00:01 GMT
max
:指定Expires
的值为31 December2037 23:59:59GMT,Cache-Control
的值为10年。
off
:不修改Expires
和Cache-Control
的值。
实例
控制图片过期时间为30天。
1 2 3 4 location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ { root /var/www/img/; expires 30d ; }
alias指令
定义路径别名。
此指令只能在location块中配置。
基本语法
注意 :使用alias时,目录名后一定要加/
实例
1 2 3 location ^~ /static/ { alias /webroot/img/; }
如果一个请求的URI是http://www.test.com/static/1.png
时,web服务器将会返回服务器上的/webroot/img/1.png
的文件。
注意这里是img
,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
deny和allow指令
允许/禁止某个ip或者一个ip段访问,如果指定unix:,那将允许/禁止Socket的访问。
配置段:http
, server
, location
, limit_except
基本语法
1 2 allow address | CIDR | unix: | all;deny address | CIDR | unix: | all;
实例
1 2 3 4 5 6 7 location / {deny 192.168.1.1 ;allow 192.168.1.0 /24 ;allow 10.1.1.0 /16 ;allow 2001 :0db8::/32 ;deny all; }
先禁止192.16.1.1,接下来允许了3个网段,其中包含了一个ipv6,最后未匹配的IP全部禁止访问。
root指令
设置请求寻找资源的根目录。
此指令可以在http块,server块或者location块中配置。
由于使用Nginx服务器多数情况下要配置多个location块对不同的请求分别做出处理,因此该指令通常在location块中进行设置。
基本语法
path变量中可以包含Nginx服务器预设的大多数变量,只有document_root
和realpath_root
不可以使用。
实例
1 2 3 4 5 6 location ^~ /static/ { root /webroot/; }location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /webroot/res/; }
如果请求的URI是http://www.test.com/static/1.png
时,web服务器将会返回服务器上的/webroot/static/1.png
文件。
rewrite指令
该指令是通过正则表达式的使用来改变URI,可以同时存在一个或多个指令,需要按照顺序依次对URL进行匹配和处理。
该指令可以在server块或location块中配置。
基本语法
1 rewrite regex replacement [flag];
rewrite 的含义:该指令是实现URL重写的指令。
regex 的含义:用于匹配URI的正则表达式。
replacement :将regex正则匹配到的内容替换成 replacement
flag :标记。
last :本条规则匹配完成后,继续向下匹配新的location URI 规则,(不常用)
break :本条规则匹配完成即终止,不再匹配后面的任何规则(不常用)
redirect :返回302临时重定向,浏览器地址会显示跳转新的URL地址。
permanent :返回301永久重定向,浏览器地址会显示跳转新的URL地址。
实例
1 rewrite ^/(.*) http://www.baidu.com/$1 permanent ;
说明
rewrite 为固定关键字,表示开始进行rewrite匹配规则。
regex 为 ^/(.*),这是一个正则表达式,匹配完整的域名和后面的路径地址。
replacement 就是http://www.baidu.com/$1
,其中$1
是取regex部分()里面的内容,如果匹配成功后跳转到的URL
flag 就是 permanent,代表永久重定向的含义,即跳转到 http://www.baidu.com/$1 地址上。
if指令
该指令用来支持条件判断,并且根据条件判断结果来选择不同的nginx的配置。
可以在server块或location块中配置该指令。
基本语法
condition
:是布尔值 true/false
实例
判断$http_user_agent
值中是否含有 MSIE 字符串,如果包含则执行代码块中的代码。
1 2 3 if ($http_user_agent ~ MSIE) { }
判断请求的文件是否存在
-f
:如果请求的文件存在,那么该条件为true
!-f
:如果该文件的目录存在,该文件不存在,那么返回true,如果该文件和目录都不存在,则为false
1 2 3 4 5 6 7 if (-f $request_filename) { // 判断请求的文件是否存在。 }if (!-f $request_filename) { // 判断请求的文件是否不存在。 }
判断请求的目录是否存在
-d
:如果请求的目录存在,则返回true,否则返回false
!-d
:如果请求的目录不存在,但是该请求的上级目录存在,则返回true,如果该上级目录不存在,则返回false
1 2 3 4 5 6 7 if (-d $request_filename) { // 判断请求的目录是否存在。 }if (!-d $request_filename) { // 判断请求的目录是否不存在。 }
index指令
指定网站的初始页。
如果包括多个文件,Nginx会根据文件的前后顺序来检查,直到查找的文件存在。
文件可以是相对路径也可以是绝对路径,绝对路径需要放在最后。
文件可以使用变量$来命名。
该指令拥有默认值,index index.html,即,如果没有给出index,默认初始页为index.html
1 index index.$geo.html index.0 .html /index.html;
注意
index指令并不是查到文件之后,就直接拿来用了。
如果文件存在,则使用文件作为路径,发起内部重定向。
直观上看上去就像再一次从客户端发起请求,Nginx再一次搜索location一样。
既然是内部重定向,域名+端口不发生变化,所以只会在同一个server下搜索。
同样,如果内部重定向发生在proxy_pass反向代理后,那么重定向只会发生在代理配置中的同一个server
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 server { listen 80 ; server_name example.org www.example.org; location / { root /data/www; index index.html index.php; } location ~ \.php$ { root /data/www/test; } }
上面的例子中,如果你使用example.org或www.example.org直接发起请求,那么首先会访问到/
的location,结合root与index指令,会先判断/data/www/index.html
是否存在,如果不,则接着查看/data/www/index.php
如果存在,则使用/index.php
发起内部重定向,就像从客户端再一次发起请求一样,Nginx会再一次搜索location,毫无疑问匹配到第二个~ \.php$
,从而访问到/data/www/test/index.php
error_page指令
当发生错误的时候能够显示一个预定义的uri,比如。
基本语法
1 error_page code [ code ... ] [ = | =answer-code ] uri | @named_location
实例
用户访问产生502,503的时候给用户的返回状态是200,内容是50x.html
1 2 3 4 error_page 502 503 =200 /50x.html;location = /50x.html { root /usr/share/nginx/html; }
配置文件
/www/server/nginx/conf/nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 user www www;worker_processes 8 ;error_log /usr/local/nginx/logs/error.log info ;pid /usr/local/nginx/logs/nginx.pid;worker_rlimit_nofile 65535 ;events { use epoll ; worker_connections 65535 ; keepalive_timeout 60 ; client_header_buffer_size 4k ; open_file_cache max=65535 inactive=60s ; open_file_cache_valid 80s ; open_file_cache_min_uses 1 ; open_file_cache_errors on ; }http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128 ; client_header_buffer_size 32k ; large_client_header_buffers 4 64k ; client_max_body_size 8m ; sendfile on ; autoindex on ; tcp_nopush on ; tcp_nodelay on ; keepalive_timeout 120 ; fastcgi_connect_timeout 300 ; fastcgi_send_timeout 300 ; fastcgi_read_timeout 300 ; fastcgi_buffer_size 64k ; fastcgi_buffers 4 64k ; fastcgi_busy_buffers_size 128k ; fastcgi_temp_file_write_size 128k ; gzip on ; gzip_min_length 1k ; gzip_buffers 4 16k ; gzip_http_version 1 .0 ; gzip_comp_level 2 ; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on ; upstream jh.w3cschool.cn { server 192.168.80.121:80 weight=3 ; server 192.168.80.122:80 weight=2 ; server 192.168.80.123:80 weight=3 ; } server { listen 80 ; server_name www.w3cschool.cn w3cschool.cn; index index.html index.htm index.php; root /data/www/w3cschool; location ~ .*.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000 ; fastcgi_index index.php; include fastcgi.conf; } location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d ; } location ~ .*.(js|css)?$ { expires 1h ; } log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for' ; access_log /usr/local/nginx/logs/host.access.log main; access_log /usr/local/nginx/logs/host.access.404 .log log404; location / { proxy_pass http://127.0.0.1:88; proxy_redirect off ; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; client_max_body_size 10m ; client_body_buffer_size 128k ; proxy_intercept_errors on ; proxy_connect_timeout 90 ; proxy_send_timeout 90 ; proxy_read_timeout 90 ; proxy_buffer_size 4k ; proxy_buffers 4 32k ; proxy_busy_buffers_size 64k ; proxy_temp_file_write_size 64k ; } location /NginxStatus { stub_status on ; access_log on ; auth_basic "NginxStatus" ; auth_basic_user_file confpasswd; } location ~ .(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; } location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d ; } } }