nginx完整配置文件例子
例一:
这是一个比较完整的nginx配置文件示例,下面的nginx.conf简单的实现nginx在前端做反向代理服务器的例子,处理js、png等静态文件,jsp等动态请求转发到其它服务器tomcat,以及负载均衡的配置。
user www www;
worker_processes 2;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
use epoll;
worker_connections 2048;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
# tcp_nopush on;
keepalive_timeout 65;
# gzip压缩功能设置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
# http_proxy 设置
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 75;
proxy_send_timeout 75;
proxy_read_timeout 75;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
# 设定负载均衡后台服务器列表
upstream backend {
#ip_hash;
server 192.168.10.100:8080 max_fails=2 fail_timeout=30s ;
server 192.168.10.101:8080 max_fails=2 fail_timeout=30s ;
}
# 很重要的虚拟主机配置
server {
listen 80;
server_name itoatest.example.com;
root /apps/oaapp;
charset utf-8;
access_log logs/host.access.log main;
#对 / 所有做负载均衡+反向代理
location / {
root /apps/oaapp;
index index.jsp index.html index.htm;
proxy_pass http://backend;
proxy_redirect off;
# 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
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_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
#静态文件,nginx自己处理,不去backend请求tomcat
location ~* /download/ {
root /apps/oa/fs;
}
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /apps/oaapp;
expires 7d;
}
location /nginx_status {
stub_status on;
access_log off;
allow 192.168.10.0/24;
deny all;
}
location ~ ^/(WEB-INF)/ {
deny all;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
## 其它虚拟主机,server 指令开始
}
例二:
#运行用户
user nobody;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;
#全局错误日志及PID文件
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6].";
#设定请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#设定虚拟主机配置
server {
#侦听80端口
listen 80;
#定义使用 www.nginx.cn访问
server_name www.nginx.cn;
#定义服务器的默认网站根目录位置
root html;
#设定本虚拟主机的访问日志
access_log logs/nginx.access.log main;
#默认请求
location / {
#定义首页索引文件的名称
index index.php index.html index.htm;
}
# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
}
}
例三:
user www www; #指定Nginx Worker进程运行用户以及用户组
worker_processes 2; #指定了Nginx要开启的进程数,多核CPU指定和核数一样多的进程数
pid logs/nginx.pid; #指定进程id的存储文件位置
worker_rlimit_nofile 65535; #指定单进程打开文件数,需与系统设定一致
events {
use epoll; #指定nginx工作模式,nginx主要的工作模式有select、poll、kqueue、epoll
其中select、poll是标准工作模式,kqueue、epoll为高效工作模式,epoll用在Linux系统中,而kqueue用在BSD系统中
worker_connections 65535;#指定单进程的最大连接数
}
HTTP部分
http {
include mime.types; #指定配置文件所包含的文件
default_type application/octet-stream; #指定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口
log_format main '$remote_addr - $remote_user [$time_local] "$request" '#设定日志格式
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';;
client_max_body_size 20m; #设置允许客户端请求的最大的单个文件字节数
client_header_buffer_size 16k;#指定来自客户端请求头的headerbuffer大小,如果自定义了消息头或有更大的cookie,可以在这里增加缓冲大小
large_client_header_buffers 4 32k;#指定客户端请求中较大的消息头的缓存最大数量和大小,4为个数,32k为大小,最大缓存为4个32kb
sendfile on;#开启高效传输模式
tcp_nopush on; # tcp_nopush,tcp_nodelay设置on,防止网络阻塞
tcp_nodelay on;
keepalive_timeout 65; #指定客户端连接保持活动的超时时间
client_header_timeout 10;#指定客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
client_body_timeout 10;#指定客户端请求主体读取超时时间,如果超过这个时间���客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
send_timeout 10;#指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接
gzip on; #开启gzip压缩,实时压缩输出数据流
gzip_min_length 1k; #设置允许压缩的页面最小字节数
gzip_buffers 4 16k; #指定内存空间来存贮压缩结果,这里指定4个单位为16k的内存来存储压缩结果,即总大小为64k
gzip_http_version 1.1;#指定识别HTTP协议版本,默认是1.1
gzip_comp_level 2;#指定gzip压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源
gzip_types text/plain application/x-javascript text/css application/xml;#指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩
gzip_vary on;#该选项开启可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Varnish缓存经过Nginx压缩的数据
server_tokens off;#隐藏Nginx版本号
server {
listen 8000; #指定Nginx监端口
server_name localhost;#用来指定IP或者域名
charset utf-8;#指定Nginx默认的字符集,只有utf-8支持中文字符
access_log logs/host.access.log main;#指定访问日志的名称及位置
location / {
index index.html index.htm;#设定默认首页
root /tom/webapps/ROOT;#指定网页根目录
}
location ~ (jsp|\?) { #指定url中包含jsp或者?的全部转发到192.168.0.10的80端口即tomcat处理
proxy_pass http://192.168.0.10:80;
}
补充阅读:http://blog.****.net/field_yang/article/details/52278390
状态监控模块:
0 目录
目录
环境及目的
nginx配置文件特点和结构
1 特性
2 主配置文件结构
常用全局配置
1 main段
2 events段
web服务相关配置
1 server_namerootlisten
11 listen指令常用选项
12 server_name定义方式
2 location
21 alias定义路径别名
3 index定义主页
4 error_page定义错误页面
5 长连接相关指令
6 限制响应报文发送速率
7 文件元数据信息缓存
8 访问控制
9 basic认证
10 limit_except
11 状态信息页面
12 防盗链
13 作为https服务端
14 日志相关
141 access_log
142 log_format
143 open_log_file_cache
144 error_log
15 模块ngx_http_rewrite_module
151 rewrite
1511 机制
1512 基本效果
1513 循环重定向问题
1514 替换为的路径是httphttps
1515 各flag
152 rewrite_log
153 if
1531 常用条件
1532 示例
154 return
155 set
16 响应报文压缩
17 模块ngx_http_fastcgi_module
171 lnmp
1711 fastcgi_param
1712 fastcgi_index
1713 lnmp安装discuz
172 为fastcgi的提供缓存功能
1721 fastcgi_cache_path
1722 fastcgi_cache_key
1723 fastcgi_cache_valid
1724 fastcgi_cache
1724 压测效果
18 sendfile
1 环境及目的
本文演示nginx作为web服务的常用配置,相对于httpd的配置说明。
nginx版本1.8,已编译安装完成。
安装目录及配置文件目录:
[[email protected] ~]% ls /usr/local/nginx
html logs nginx
[[email protected] ~]% ls /etc/nginx/
fastcgi.conf fastcgi_params.default mime.types nginx.conf.default uwsgi_params
fastcgi.conf.default koi-utf mime.types.default scgi_params uwsgi_params.default
fastcgi_params koi-win nginx.conf scgi_params.default win-utf1234567
安装使用的选项见 http://blog.****.net/wangzhenyu177/article/details/78633278 。
下面主要在nginx配置文件中使用不同配置,验证nginx作为web服务的各功能。
为方便起见,把nginx命令添加至PATH:
[[email protected] ~]% cat /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx:$PATH12
2 nginx配置文件特点和结构
2.1 特性
nginx是高度模块化的,编译时装载不同的模块,会在配置文件中引入不同的内置变量和指令;
除了内置变量还可自定义变量,格式”set NAME VALUE”,变量的设置和引用均需要”$”符号;
nginx由各指令配置,每个指令必须以分号结尾;
配置指令使用格式类似httpd的,都是”DIRECTIVE VALUE”;
不同模块的参考信息在官网 http://nginx.org/en/docs/ 模块参考项下。其中说明了各模块的内置变量和指令。大部分内置变量在http核心模块。
在nginx配置目录下有很多文件,基本见名知意。主配置文件为nginx.conf:
[[email protected] ~]% ls /etc/nginx/
fastcgi.conf fastcgi_params.default mime.types nginx.conf.default uwsgi_params
fastcgi.conf.default koi-utf mime.types.default scgi_params uwsgi_params.default
fastcgi_params koi-win nginx.conf scgi_params.default win-utf1234
2.2 主配置文件结构
nginx主配置文件结构大致形如:
【main段】
events{
【events段】
}
http{
【http段】
}
……1234567891011
本文编译nginx时没有使用”–with-mail”,所以配置文件中没有mail段。
和httpd类似,nginx的配置文件也可使用指令include把指定文件包含进来,这样可把配置定义在不同的文件中,便于编辑和维护。
主配置文件中,main配置段是直接写在配置文件中,events包括其他所有配置段,都需写在对应的大括号中。
main段和events段对全局有效,称为全局配置。
3 常用全局配置
3.1 main段
main配置段主要定义了nginx运行的各属性,默认为:
#user nobody; # 运行worker进程的用户。由于本机上的nginx在编译时指定了用户nginx,这里nobody是注释
worker_processes 1; # 启动的worker进程数
#error_log logs/error.log; # 错误日志的路径和级别
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; # pid文件路径12345678
main配置段指令由核心模块引入。常用指令:
指令
意义
user USER [GROUP]
指定运行worker进程的用户和组(注意master进程要由root运行,因为要监听套接字)。如不指定组,则就是用户所在的组
pid PATH
指定nginx的pid文件
worker_rlimit_nofile
指定一个worker进程最多打开的文件数
worker_processes NUM
指定启动的worker进程数1,默认值1。在较新版本中,参数可指定为”auto”,令其自动设置
worker_cpu_affinity CPU_MASK
用于定义worker进程和哪颗CPU有”亲和性”,worker进程就会只在指定的CPU上运行了。CPU使用CPU掩码指定2。也可在CPU掩码前加入”auto”令其自动在指定CPU设置亲和性
worker_priority NUM
设置worker进程的nice值以调整其优先级,默认值0。这个指令的参数范围也就是nice值范围(-20至19)
查看上述配置效果:
验证worker进程绑定CPU效果:
1、本虚拟机有2CPU核心:
[[email protected] ~]% lscpu | grep "CPU(s)"
CPU(s): 2
On-line CPU(s) list: 0,1
NUMA node0 CPU(s): 0,11234
2、启动nginx,因为默认worker进程数是1,所以只启动1个worker进程:
[[email protected] ~]% nginx
[[email protected] ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx 1986 1
nginx: worker process 1987 012345
3、设置worker_processes为2,效果:
worker_processes 2;1
[[email protected] ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 1996 0
nginx: worker process 1997 11234
由于只有2核心,所以master和某个worker运行在同1核心上了。
4、使两worker进程绑定在不同核心:
worker_processes 2;
worker_cpu_affinity 01 10;12
[[email protected] ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 2017 0
nginx: worker process 2018 11234
前者worker运行于CPU0,后者运行于CPU1。
5、更换绑定的核心:
worker_processes 2;
worker_cpu_affinity 10 01;12
[[email protected] ~]% ps axo command,pid,psr | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 2062 1
nginx: worker process 2063 01234
前者worker运行于CPU1,后者运行于CPU0。
验证调整worker进程优先级效果:
1、默认情况下,nice值为0:
[[email protected] ~]% ps axo command,pid,ni | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 2062 0
nginx: worker process 2063 01234
2、调整nice值为-5:
worker_priority -5;1
[[email protected] ~]% ps axo command,pid,ni | grep nginx | grep -v grep
nginx: master process nginx 1986 0
nginx: worker process 2078 -5
nginx: worker process 2079 -51234
3.2 events段
默认配置:
events {
worker_connections 1024; # 定义每个worker进程最大并发连接数
}123
events段常用指令:
指令
意义
worker_connections NUM
指定每个worker进程的最大并发连接数3。
accept_mytex on|off
多个worker进程负载均衡,轮流处理请求,否则是由较快的worker进程处理新请求。默认开启
lock_file PATH
如果多个worker进程负载均衡,需要锁文件。该选项用于指定锁文件路径。编译安装时也可通过./configure的选项指定
4 web服务相关配置
http段用于定义nginx作为web服务的配置。
http段结构:
http{
……
server{
【server1配置】
}
server{
【server2配置】
}
……
}12345678910111213
server就相当于httpd中的虚拟主机。不同之处是nginx没有中心主机,即便只有一个站点,也要使用一个server段定义。
在server段外定义的配置,对所有server生效。
server段常用配置指令(如无特别说明在,则指令均来自http核心模块):
4.1 server_name、root、listen
指令
意义
server_name
指定虚拟主机名。相当于httpd虚拟主机段中的ServerName
root
指定页面文件根目录,如果使用相对路径,则相对的是编译安装目录(编译时–prefix指定的路径)。类似于httpd中的DocumentRoot,但不尽相同,root在location段中也常使用。定义root后,各指令所指定的相对路径,就是相对于root了
listen IP [:PORT] [OPTIONS]
指定监听的地址、端口
这是一个server最简单配置所必须的3指令。
注意:
httpd中如果是基于IP区分的各虚拟主机,可不定义主机名。对于nginx,监听的地址、端口和server_name一般都要定义。
比如,定义两虚拟主机,监听在192.168.0.106主机的6666和8888端口:
server {
listen 6666; # 不指定IP表示监听在本机所有IP的6666端口
server_name www.6666.com;
root /var/www/6666;
}
server {
listen 8888;
server_name www.8888.com;
root /var/www/8888;
}1234567891011
对应的不同主页内容:
[[email protected] ~]% cat /var/www/6666/index.html
Index Page from 192.168.0.106:6666
[[email protected] ~]% cat /var/www/8888/index.html
Index Page from 192.168.0.106:88881234
访问效果:
4.1.1 listen指令常用选项
listen指令格式为:listen IP [:PORT] [OPTIONS],其后可以跟众多选项。常用options为:
选项
意义
default_server
设置默认虚拟主机,即当没有虚拟主机符合请求时,使用默认虚拟主机响应
rcvbuf=SIZE
接收缓冲区大小
sndbuf=SIZE
发送缓冲区大小
ssl
限制仅能通过ssl连接进行服务,即提供https服务。这时监听的端口应指定为443
4.1.2 server_name定义方式
定义server_name,用于使用户可根据主机名访问不同主机4。
定义主机名有以下几种方式:
方式
示例
精确主机名
www.test.com
左侧使用通配
*.test.com
右侧使用通配
www.test.*
正则表达式匹配
~www.test.com$~。要使用波浪线括起来
如果客户端在浏览器键入的主机名可以被上述方式中的多种匹配到,则优先级是:精确主机名–>左侧使用通配–>右侧使用通配–>正则表达式匹配。
4.2 location
使用格式:location [ = | ~ | ~* | ^~ ] uri { ... }。表示对匹配到的URI,做指定配置。
使用范围:server段、location段
匹配URI的方式,按优先级依次为:
方式
意义
=PATH
精确匹配路径
^~PATH
使用正则表达式匹配URI的前半段
~PATH
使用正则表达式匹配URI,区分大小写
~*PATH
使用正则表达式匹配URI,不区分大小写
PATH
直接使用PATH匹配,表示在PATH路径下的资源
即优先级是先匹配小范围,再匹配大范围。
官方文档的示例:
location = / { # 仅当URI为"/"时,使用A配置
[ configuration A ]
}
location / { # URI为"/"下包含的路径时,使用B配置
[ configuration B ]
}
location /documents/ { # URI为"/documents/"下包含的路径时,使用C配置
[ configuration C ]
}
location ^~ /images/ { # URI靠前部分为"/images/",使用D配置
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ { # URI结尾是gif、jpg或jpeg时,使用E配置
[ configuration E ]
}12345678910111213141516171819
按上述定义,和优先级规则。比如:
“www.test.com/”匹配A配置;
“www.test.com/test”、”www.test.com/example”匹配B配置,因为URI都在”/”下;
“www.test.com/documents/test.html”匹配C配置,虽然它也符合B配置,但能匹配到的越长优先级越高;
“www.test.com/images/test.html”匹配D配置,虽然它也符合B配置,但正则表达式匹配前端字符优先级高;
“www.test.com/documents/test.jpg”匹配E配置,虽然它也符合C配置,但正则表达式匹配高于普通字符串。
4.2.1 alias定义路径别名
指令alias,仅能定义在location段中,用于把location指定的URI定义别名。
比如:
location /test/ {
alias /data/test/;
}123
表示把uri中的”/test”替换为”/data/test”。
以具体请求为例,上述的效果是把”http://www.test.com/test/index.html“访问的资源替换为服务端文件系统路径的”/data/test/index.html”,而不是”http://www.test.com/data/test/index.html“。也就是,alias的参数是服务端资源的文件系统路径,不是在原URI上做的替换5。
以106主机为例,配置server:
server{
listen 80;
server_name www.host.com;
root /var/www/;
access_log /var/log/nginx/access_log;
}123456
分别有文件:
[[email protected] ~]% cat /var/www/host1/host.html
@host1
[[email protected] ~]% cat /var/www/host2/host.html
@host21234
访问效果:
修改配置文件,添加路径别名:
server{
listen 80;
server_name www.host.com;
root /var/www/;
access_log /var/log/nginx/access_log;
location /host1/ {
alias /var/www/host2/;
}
}12345678910
效果,访问host1,返回的是host2目录下的host.html:
特别地,当alias定义的某路径A的别名为/PATH/A,即把某路径A的别名定义为指定路径下的A,则功能同root。比如:
location /test/ {
alias /var/www/test/;
}123
相当于:
location /test/ {
root /var/www;
}123
即把指定路径作为location的URI的根路径。如果出现这种情况,最好就使用root了。
4.3 index定义主页
指令index来自模块ngx_\http_index_module。用于定义主页。
使用范围:http段、server段、location段。定义在不同的段有不同的生效范围。默认值是index.html
比如server段配置为:
server{
listen 80;
server_name www.host.com;
root /var/www/;
access_log /var/log/nginx/access_log;
index host1/host.html;
}12345678
[[email protected] ~]% cat /var/www/host1/host.html
@host112
直接访问IP,效果:
4.4 error_page定义错误页面
指令error_page,用于自定义错误页面。
使用格式:error_page code ... [=[response]] uri。表示根据响应码code(可指定多个),返回给客户端uri指定的页面。
使用范围:http段、server段、location段、location段中的if语句
比如,在106主机定义文件,用于响应码为404的情况:
[[email protected] ~]% cat /var/www/error/404.html
The 404 page from 192.168.0.10612
在server段定义:
server{
listen 80;
server_name www.host.com;
root /var/www/;
error_page 404 /error/404.html; # 参数是URI,所以写的不是绝对路径
}1234567
效果:
有的访问不到,可能是浏览器原因,360、qq浏览器都显示的是它们定义的错误页面。
1、上述的404.html也是个页面文件,且正常显示了,那么是否响应码就成200了?
打开浏览器调试界面,可以看到响应码就是404,虽然返回的是一个页面文件6。
不过如果需要专门修改错误页面的响应码,则使用error_page指令的”=response”即可。
比如server段的error_page改为:
error_page 404 =200 /error/404.html;1
效果是返回自定义的404错误页面,状态码是200:
不过最好还是使用默认的,状态码乱改容易出问题。
2、error_page的实质是把对指定URI的错误请求,重定向至一个自定义页面。相当于客户端重新访问了服务端(只是相当于。其实这个过程客户端并不参与,由nginx自动进行),只不过请求的资源被重定向为了自定义的错误页面。
为此,要避免出现如下情况。比如在106主机的server段定义:
server{
listen 80;
server_name www.host.com;
root /var/www/;
location /test1 {
error_page 404 /test1_error.html;
}
}123456789
定义错误页面:
[[email protected] ~]% cat /var/www/test1_error.html
<h1>test1_error</h1>12
由于是在/test1的location中自定义了错误页面,所以访问test1路径才会有:
如果在server段中增加一个location,要避免造成循环。即:
location1中定义的error_page符合location2指定的URI;
location2中定义的error_page恰好又符合location1指定的URI。
如果触发location1的error_page,于是重新匹配到location2中的错误页面,而后又重定向到location1的……最终可能会返回500。
避免这种情况,主要是要定义好location指定的URI,个人认为如果能使用精确匹配,最好使用精确匹配,这样应该较不容易出现循环。
这种情况就不演示了,在下文rewrite指令中有类似情况详细说明。
4.5 长连接相关指令
指令
意义
keepalive_timeout
用于指定长连接超时时长。默认值75秒。只要该指令指定数字不为0则表示启用了长连接,0为关闭
keepalive_requests
用于指定一次长连接所能获取的资源数量,默认100个。意义同httpd的
keepalive_disable
用于指定对哪些浏览器禁用长连接。因为有的浏览器不支持长连接。默认是对ie6禁用
tcp_nodelay on|off
仅在长连接时生效,指定是否不延迟(因缓存小数据的tcp报文造成的延迟)tcp报文,默认开启
其他容易理解,主要说下tcp_nodelay。
需先说明tcp的一个机制:
tcp连接在有用户请求小数据(比如1个字节大小)且是长连接时,如果给这种数据单独封装报文发送,往往浪费开销(各首部大小就已经大于数据大小了)。
默认情况下,tcp协议对这种场景有优化机制:自动将其先缓存下来,待有多个小数据报文等待发送时,把他们封装成一个报文一并发送,以节约带宽。
这种机制对于web服务器可能不适用,造成的结果是:用户如果请求的就是一个小数据,可能半天等不到,需要请求多个资源才会响应。
tcp_nodelay就是指定不使用这种机制。当然它默认是开启的,一般也无需关注。
4.6 限制响应报文发送速率
指令limit_rate,用于限制响应报文的发送速率(比如用于下载站点限速)。
使用范围:http段、server段、location段、location段中的if语句
使用格式:limit_rate NUM,参数的单位是字节/秒。默认是0,表示不限制速率。
使用对应的变量来配置,也具有相同的意义:
server {
if ($slow) {
set $limit_rate 4k; # 这种方式通常用于,是否限速依赖于指定条件的时候
}
...
}12345678
验证效果:
1、106主机server段配置为:
server {
listen 80;
server_name www.test.com;
root /var/www;
location /test {
limit_rate 10k;
}
}123456789
2、把/var/log/messages目录复制到/var/www/test下,并开启读权限。
3、使用wget下载,速率大约就限制在10k:
4.7 文件元数据信息缓存
缓存用户请求的文件的元数据信息(文件描述符、大小、最近修改时间等),作用是在再次响应相同文件时能够快速响应(尤其是根据最近修改时间,可知请求的资源是否发生过变化)。
相关指令:
指令、格式
意义
open_file_cache max=N [inactive=time]
指定是否开启文件元数据缓存,默认off。如启用需指定max=NUM,表示指定缓存最大记录数;inactive指定非活动时长(默认60秒),经过该时长未被访问到的记录(或低于open_file_cache_min_uses指定的次数)被视为非活动缓存
open_file_cache_errors on|off
如果开启文件元数据缓存,则该指令指定是否缓存访问失败的信息(包括没有指定资源、没有权限等)。默认off
open_file_cache_min_uses
与openssh_file_cache指令中的incative参数关系密切,它定义的是在incative定义的时间内,未达到指定访问次数的记录,均被视为非活动(即需清除)。默认为1
open_file_cache_valid
设置多长周期检查一次缓存,以清除非活动缓存记录。默认60秒
如果启用文件元数据缓存,则这几个指令一般一起使用。官方文档示例:
open_file_cache max=1000 inactive=20s; # 最大记录数1000,非活动时长20秒
open_file_cache_valid 30s; # 每30秒检查、清理非活动缓存记录
open_file_cache_min_uses 2; # inactive期间被访问低于2次,就被视为非活动缓存记录
open_file_cache_errors on; # 缓存访问失败的文件信息1234
4.8 访问控制
指令allow、deny用于访问控制,来自模块ngx_http_access_module。
使用范围:http段、server段、location段、limit_except指令。
官方文档示例:
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}123456
检查次序由上而下。
上述规则允许访问请求的源IP为192.168.1.0/24网段(但拒绝192.168.1.1)、10.1.1.0/16网段。其他均拒绝。
访问控制效果同httpd的,此处不赘述了。
4.9 basic认证
nginx也支持http basic认证协议,通过用户名、密码认证用户,同httpd中的一样。基于模块ngx_http_auth_basic_module。
相关指令:
指令
意义
使用范围
auth_basic STRING | off
设置是否启用basic认证。STRING表示启用,并且就是提示框中的信息
http段、server段、location段、limit_except指令
auth_basic_user_file
指定用户名、密码存储的文件(可用htpasswd或openssl passwd等生成)
http段、server段、location段、limit_except指令
演示效果:
1、创建用户、密码存放的认证文件,并添加用户user1:
[[email protected] ~]% htpasswd -c -m /var/www/auth_basic user1
New password:
Re-type new password:
Adding password for user user11234
2、在nginx配置文件中设置:
server {
listen 80;
server_name www.test.com;
root /var/www;
location / {
auth_basic "You must input password.";
auth_basic_user_file /var/www/auth_basic; # 注意,参数是服务端的文件绝对路径,而不是相对于root的URI
}
}12345678910
3、访问时需键入用户名、密码:
输入正确后可访问:
不输入则返回401:
4.10 limit_except
使用范围:location段
可对指定请求方法的报文做限制。请求方法有很多,特别地,只要GET请求方法被允许,则HEAD也自动被允许。
注意,该命令本身不具备限制功能,要结合标题4.8、4.9的各访问控制指令、认证指令才能完成。该命令只是匹配对应请求方法的报文
使用格式:limit_except method ... { ... }
比如,在某location中定义:
limit_except GET {
allow 192.168.1.0/32;
deny all;
}1234
意义为,只要请求报文的请求方法不是GET(和HEAD),则:
仅allow网段192.168.1.0/32发来的请求
拒绝其他所有主机的请求
所以,命令limit_except可看作一个限制请求方法的容器。起到控制作用的是,定义在其中的访问控制或basic认证指令。
示例:
1、192.168.0.106主机运行nginx,定义server段中的location如下:
location / {
limit_except GET {
deny 192.168.0.106;
allow 192.168.0.61;
}
}123456
2、106主机和61主机分别访问效果:
在106主机:
[[email protected] ~]% curl http://192.168.0.106/test.html
<h1>test [email protected]</h1>12
在61主机:
[[email protected] ~]% curl http://192.168.0.106/test.html
<h1>test [email protected]</h1>12
因为限制的方法是除GET以外的方法,所以GET请求没有受影响,都是允许访问的
3、 改为限制除PUT以外的方法的报文,则GET请求就会受影响了:
location / {
limit_except PUT {
deny 192.168.0.106;
allow 192.168.0.61;
}
}123456
效果就是106被拒绝、61可访问:
[[email protected] ~]% curl http://192.168.0.106/test.html
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.8.1</center>
</body>
</html>