3.1 nginx.conf的默认配置
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name http://localhost:8080/testConfig;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
3.2 配置项详细解释
3.2.1 块
nginx.conf 是由 main全局设置、events块、http块、server块、upstream块、location块 组成
- main块 设置的指令将影响其他所有设置;
- server块 的指令主要用于指定主机和端口;
- upstream块 主要用于负载均衡,设置一系列的后端服务器;
- location块 用于匹配网页位置。
块之间的关系:
- main全局设置 包含 events块 http块
- http块 包含 多个server块 和 upstream块
- server块包含 多个location块
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
3.2.2 全局设置
user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
- user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行
- worker_processes是个主模块指令, 指定了Nginx要开启的进程数。每个Nginx进程平均耗费10M~12M内存。建议指定和CPU的数量一致即可。
- error_log是个主模块指令,用来定义全局错误日志文件. 日志级别:debug|info|notice|warn|error|crit|alert|emerg
- pid是个主模块指令,用来指定进程pid的存储文件位置。
3.2.3 events块
events {
#use epoll;
#accept_mutex on;
#multi_accept on;
worker_connections 1024; #设置最大连接数
}
use是一个事件模块指令,用来指定nginx的工作模式。可选的值有 select|poll|kqueue|epoll|resig|/dev/poll|eventport。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。
-
worker_connections是一个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。
最大的客户端连接数
max_clients = worker_processes*worker_connections
在作为反向代理的时
max_clients = worker_processes * worker_connections/4
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效
accept_mutex 用于设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept 用于设置一个进程是否同时接受多个网络连接,默认为off
3.2.4 http块
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;
#client_max_body_size 300m;
#client_header_buffer_size 32k;
#client_body_buffer_size 512k;
#large_client_header_buffers 8 128k;
#client_header_timeout 60;
#client_body_timeout 60;
sendfile on;
#sendfile_max_chunk 100k;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#proxy_connect_timeout 90;
#proxy_read_timeout 180;
#proxy_send_timeout 180;
#proxy_buffer_size 256k;
#proxy_buffers 4 256k;
#gzip on;
#gzip_min_length 1k;
#gzip_buffers 4 16k;
#gzip_http_version 1.1;
#gzip_comp_level 2;
#gzip_types text/plain application/x-javascript text/css application/xml;
#gzip_vary on;
}
include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于Apache中的include方法;
default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口;
-
log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用;
变量 说明 $remote_addr 记录客户端的ip地址 $remote_user 记录客户端用户的名称 $time_local 记录访问时间与时区 $request 记录请求的url与http协议 $status 记录请求状态;成功是200 $body_bytes_sent 记录发送给客户端文件主体内容大小 $http_referer 记录从那个页面链接访问过来的 $http_user_agent 记录客户端浏览器的相关信息 $http_x_forwarded_for 记录客户端的ip地址
access_log 用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;
client_max_body_size 用来设置允许客户端请求的最大的单个文件字节数(设置通过nginx上传文件的大小);
client_header_buffer_size用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K(该值必须设置为“系统分页大小”的整倍数);
client_body_buffer_size 512k;如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误large_client_header_buffers客户请求头缓冲大小, “8”为个数,“128K”为大小,最大缓存量为4个128K;nginx默认会用client_header_buffer_size这个buffer来读取header值,如果header过大,它会使用large_client_header_buffers来读取;
client_header_timeout设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误;
client_body_timeout设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60;
sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime;
sendfile_max_chunk 100k; 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限
keepalive_timeout设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接;
tcp_nopush on 此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用;
proxy_connect_timeout 90; 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_read_timeout 180;连接成功后等候后端服务器响应时间其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_send_timeout 180;后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_buffer_size 256k;设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小;
proxy_buffers 4 256k;设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
-
proxy_temp_path /data0/proxy_temp_dir; proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
- proxy_intercept_errors on; 表示使nginx阻止HTTP应答代码为400或者更高的应答。
- gzip on; 设置是否开启GZIP压缩,实时压缩输出数据流;
- gzip_min_length 1k; #设置允许压缩的页面最小字节数 页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字节数,小于1K可能会越压越大;
- gzip_buffers 4 16k; #表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果;
- gzip_http_version 1.1; #用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
- 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压缩的页面,例如用Squid缓存经过Nginx压缩的数据。
3.2.5 upstream块
1.轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream tomcatserver{
server 192.168.0.11:8080;
server 192.168.0.12:8080;
}
2.weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
upstream tomcatserver{
server 192.168.0.11:8080 weight=1;
server 192.168.0.12:8080 weight=1;
}
3.ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream tomcatserver{
ip_hash;
server 192.168.0.11:8080;
server 192.168.0.12:8080 down;
server 192.168.0.13:8080 max_fails=3 fail_timeout=20s;
server 192.168.0.14:8080;
}
4.fair按后端服务器的响应时间来分配请求,响应时间短的优先分配.(Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块;)
upstream tomcatserver {
server 192.168.0.11:8080;
server 192.168.0.12:8080;
fair;
}
5.url_hash按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效.(Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。)
upstream tomcatserver {
server 192.168.0.11:8080;
server 192.168.0.12:8080;
hash $request_uri;
hash_method crc32;
}
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
- down:表示当前的server暂时不参与负载均衡;
- weight: weight越大,负载的权重就越大。
- backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻;
- max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;
- fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
client_body_in_file_only: 设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path: 设置记录文件的目录 可以设置最多3层目录
location: 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
注意:
当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
nginx支持同时设置多组的负载均衡,用来给不用的server来使用
3.2.6 server块
server{
listen 80;
server_name 192.168.8.18 test.com;
index index.html index.htm index.php;
root /root/
charset gb2312;
access_log logs/access.log main;
}
server{
listen 80;
proxy_pass tomcatserver;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm index.php;
root /root/
charset gb2312;
access_log logs/access.log main;
}
- listen: 用于指定虚拟主机的服务端口
- server_name: 用来指定IP地址或者域名,多个域名之间用空格分开。
- index:用于设定访问的默认首页地址,
- root:用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
- Charset:用于设置网页的默认编码格式。
- access_log:用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。
- proxy_pass: 设置被代理服务器的端口或套接字,以及URL;
- proxy_set_header: 设置请求头部或者将代理服务器收到的请求头部的信息传到真实服务器上;
3.2.7 location块
通过指定模式来与客户端请求的URI相匹配,基本语法如下:location [=||*|^~|@] pattern{……}
# 1.没有修饰符 表示:必须以指定模式开始
location /abc {
.....
}
如下都能匹配:
http://baidu.com/abc
http://baidu.com/abc?p1
http://baidu.com/abc/
http://baidu.com/abcde
# 2.=表示:必须与指定的模式精确匹配
location = /abc {
.....
}
如下能匹配:
http://baidu.com/abc
http://baidu.com/abc?p1
如下不能匹配:
http://baidu.com/abc/
http://baidu.com/abcde
# 3.~ 表示:指定的正则表达式要区分大小写
location ~ ^/abc$ {
.....
}
如下能匹配:
http://baidu.com/abc
http://baidu.com/abc?p1=11&p2=22
如下不能匹配:
http://baidu.com/ABC
http://baidu.com/abc/
http://baidu.com/abcde
# 4.~* 表示:指定的正则表达式不区分大小写
location ~* ^/abc$ {
.....
}
如下能匹配:
http://baidu.com/abc
http://baidu..com/ABC
http://baidu..com/abc?p1=11&p2=22
如下不能匹配:
http://baidu..com/abc/
http://baidu..com/abcde
5、^~ 类似于无修饰符的行为,也是以指定模式开始,不同的是,如果模式匹配,那么就停止搜索其他模式了。
location ^~ /abc {
root /web/wwwroot;
expires 30d;
}
6、@ 定义命名location区段,这些区段客户段不能访问,只可以由内部产生的请求来访问,如try_files或error_page等
error_page 404 = @fallback;
location @fallback {
proxy_pass http://www.baidu.com;
}
location匹配命令
- ~ # 波浪线表示执行一个正则匹配,区分大小写
- ~* # 表示执行一个正则匹配,不区分大小写
- ^~ # ^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
- = # 进行普通字符精确匹配
- @ # "@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
location匹配命令查找顺序和优先级
- 精确匹配(=)
- 没有修饰符的精确匹配
- 多个正则表达式匹配之间按照他们在配置文件中定义的顺序
- 带有
^~
修饰符的普通字符匹配 - 带有“~” 或“~*” 修饰符的正则表达式匹配
- 没有修饰符的模糊匹配(与URL的前面一部分匹配)
nginx.conf文件中location示例的解释:
# 定义错误提示页面
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;
}
StubStatus模块配置
StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用此功能。
以下指令实指定启用获取Nginx工作状态的功能。
location /NginxStatus {
stub_status on;
access_log logs/NginxStatus.log;
auth_basic "NginxStatus";
auth_basic_user_file ../htpasswd;
}
stub_status:设置为“on”表示启用StubStatus的工作状态统计功能。
access_log: 用来指定StubStatus模块的访问日志文件。
auth_basic:是Nginx的一种认证机制。
auth_basic_user_file:用来指定认证的密码文件,由于Nginx的auth_basic认证采用的是与Apache兼容的密码文件,因此需要用Apache的htpasswd命令来生成密码文件,例如要添加一个test用户,可以使用下面方式生成密码文件:
/usr/local/apache/bin/htpasswd -c /opt/nginx/conf/htpasswd test
然后输入两次密码后确认之后添加用户成功。
root 、alias指令区别
location /img/ {
alias /var/www/image/;
}
#若按照上述配置的话,则访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件
location /img/ {
root /var/www/image;
}
#若按照这种配置的话,则访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。
alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。而root则可有可无。
3.2.8 配置符号参考
容量符号缩写
k,K | 千字节 |
---|---|
m,M | 兆字节 |
例如, "8k", "1m" 代表字节数计量.
时间符号缩写
ms | 毫秒 |
---|---|
s | 秒 |
m | 分钟 |
h | 小时 |
d | 日 |
w | 周 |
M | 一个月, 30天 |
y | 年, 365 天 |
例如, "1h 30m", "1y 6M". 代表 "1小时 30分", "1年零6个月".
3.2.9 变量
Ngx_http_core_module模块支持内置变量,他们的名字和apache的内置变量是一致的。
首先是说明客户请求title中的行,例如http_cookie等等。
此外还有其它的一些变量
$args此变量与请求行中的参数相等
$content_length等于请求行的“Content_Length”的值。
$content_type等同与请求头部的”Content_Type”的值
$document_root等同于当前请求的root指令指定的值
$document_uri
与$uri
一样
$host与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样
$limit_rate允许限制的连接速率
$request_method等同于request的method,通常是“GET”或“POST”
$remote_addr客户端ip
$remote_port客户端port
$remote_user等同于用户名,由ngx_http_auth_basic_module认证
$request_filename当前请求的文件的路径名,由root或alias和URI request组合而成
$request_body_file
$request_uri含有参数的完整的初始URI
$query_string
与$args
一样
; Redirect;`
$server_protocol等同于request的协议,使用“HTTP/或“HTTP/
$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。
$server_name请求到达的服务器名
$server_port请求到达的服务器的端口号
$uri等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index