nginx 配置文件详解
1:nginx配置文件的结构:
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
2、原配置文件(nginx.conf) 说明:
#user nobody; #开启进程数 <=CPU数 worker_processes 1; #错误日志保存位置 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #进程号保存文件 #pid logs/nginx.pid; #每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024 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压缩 #gzip on; #client_header_buffer_size 4k; 设定请求缓冲, 客户端请求头部的缓冲区大小。 这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k, 不过由于一般系统分页都要大于1k,所以这里设置为分页大小。 分页大小可以用命令getconf PAGESIZE 取得。 [root@web001 ~]# getconf PAGESIZE 4096 但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。 #client_header_buffer_size 4k; #large_client_header_buffers 4 4k; #设定负载均衡的服务器列表 #upstream myproject { #weigth参数表示权值,权值越高被分配到的几率越大 #max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查 #fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器 #} #webapp #upstream myapp { # server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s; # server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s; #} #配置虚拟主机,基于域名、ip和端口 server { #监听端口 listen 9000; #监听域名 server_name localhost; #charset koi8-r; #nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式) #access_log logs/host.access.log main; #返回的相应文件地址 location / { #负载均衡反向代理 #proxy_pass http://myapp; #返回根路径地址(相对路径:相对于/usr/local/nginx/) 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: 配置文件详细参数说明:
1 main全局配置:
woker_processes 2
在配置文件的顶级main部分,worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数:
可以使用:grep ^processor /proc/cpuinfo | wc -l 查看cpu核数
,
也是 auto 值,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。如果nginx服务器还有其它服务,可以考虑适当减少。
#全局错误日志及PID文件
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# pid用来指定进程id的存储文件位置
#pid logs/nginx.pid;
日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少
2、nginx.conf 配置解析之 events配置
worker_connections 1024;
定义每个 work_process 同时开启的最大连接数,即允许最多只能有这么多连接。
accept_mutex on;
当某一个时刻只有一个网络连接请求服务器时,服务器上有多个睡眠的进程会被同时叫醒,这样会损耗一定的服务器性能。
Nginx中的accept_mutex设置为on,将会对多个Nginx进程(worker processer)接收连接时进行序列化,防止多个进程争抢资源。
默认就是on。
multi_accept on;
nginx worker processer可以做到同时接收多个新到达的网络连接,前提是把该参数设置为on。
默认为off,即每个worker process一次只能接收一个新到达的网络连接。
use epoll;
Nginx服务器提供了多个事件驱动器模型来处理网络消息。
其支持的类型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。
select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用
poll: Nginx默认首选,但不是在所有系统下都可用
kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的
epoll: 这种方式是在Linux 2.6+内核中最高效的方式
rtsig: 实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中
/dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操作系统最高效的方式
eventport: Solaris 10最高效的方式
keepalive_timeout 60
keepalive超时时间。 这里指的是http层面的keep-alive 并非tcp的keepalive 。
client_header_buffer_size 4k
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为系统分页大小。查看系统分页可以使用 getconf PAGESIZE 命令
3、http服务器相关属性的配置:
1、 include: 是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于Apache中的include方法。
2、 default_type: 属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。
3、 log_format:是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log
4、 client_max_body_size: 用来设置允许客户端请求上传的最大的单个文件字节数; 默认 1M,表示 客户端请求服务器最大允许大小,在“Content-Length”请求头中指定。如果请求的正文数据大于client_max_body_size,HTTP协议会报错 413 Request Entity Too Large。就是说如果请求的正文大于client_max_body_size,一定是失败的。如果需要上传大文件,一定要修改该值。
用nginx来做webserver的时,上传大文件时需要特别注意client_max_body_size这个参数,client_max_body_size 500m; 500m表示最大上传500M,需要多大设置多大。
5、 client_body_buffer_size: Nginx分配给请求数据的Buffer大小,如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中,在哪个临时文件中呢?
client_body_temp 指定的路径中,默认该路径值是/tmp/.
所以配置的client_body_temp地址,一定让执行的Nginx的用户组有读写权限。否则,当传输的数据大于client_body_buffer_size,写进临时文件失败会报错。
6、 client_header_buffer_size 32k: 用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K。
7、 large_client_header_buffers 4 128k;: 用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个128K。
8、 sendfile on : 参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
tcp_nopush on;
tcp_nodelay on;
9、 keepalive_timeout:设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
10、 client_header_timeout:设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误。
11、 client_body_timeout:设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60。
nginx优化缓冲缓存
1. proxy_buffering
语法:proxy_buffering on|off
默认值:proxy_buffering on
上下文:http,server,location
作用:该指令开启从后端被代理服务器的响应body缓冲。
如果proxy_buffering开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers 指定的缓冲区里边.
如果响应body无法放在内存里边,那么部分内容会被写到磁盘上。
如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。nginx不尝试计算被代理服务器整个响应body的大小,nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size指定的。
对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作。
但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的
2. proxy_buffers
语法:proxy_buffers 数量 size
默认值:proxy_buffers 256 8k
上下文:http,server,location
作用:设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小。
具体的意思是说,开辟256个长度为8k大小的read_buf用来存储body,当然不是连接建立初始化时就开辟256个,而是当当前buf不够存响应body时才会新申请一个,最多申请256个buf。
3. proxy_buffer_size
语法:proxy_buffer_size size
默认值:proxy_buffer_size 4k/8k
上下文:http,server,location
作用:Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。
4. proxy_busy_buffer_size
语法:proxy_busy_buffer_size size
上下文:http,server,location
作用:proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。
nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。
proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。
1)如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给客户端;
2)如果完整数据大小不小于busy_buffer大小,则装满busy_buffer后,马上传给客户端;
5. proxy_temp_path
语法:proxy_temp_path path [level1 level2 level3]
默认值:proxy_temp_path proxy_temp
上下文:http,server,location
作用:定义proxy的临时文件存在目录以及目录的层级。
6. proxy_max_temp_file_size
语法: proxy_max_temp_file_size大小;
默认值: proxy_max_temp_file_size 1G;
上下文: http,服务器,位置(如果)
从以下版本开始可用:0.1.8
作用:设置临时文件的总大小
7. proxy_temp_file_wirte_size
语法: proxy_temp_file_write_size大小;
默认值: proxy_temp_file_write_size proxy_buffer_size * 2;
上下文: http,服务器,位置(如果)
作用:设置同时写入临时文件的数据量的总大小。通常设置为8k或者16k。
nginx中超时设置、请求超时、响应等待超时配置:
proxy_connect_timeout :后端服务器连接的超时时间_X
proxy_read_timeout:连接成功后_Y
proxy_send_timeout :后端服务器数据回传时间_Z
nginx使用proxy模块时,默认的读取超时时间是60s。
HttpGzip模块配置:
/nginx/sbin/nginx -V
nginx version: nginx/0.7.65
configure arguments: --with-http_stub_status_module --with-http_gzip_static_module --prefix=/opt/nginx
通过/nginx/sbin/nginx -V命令可以查看安装Nginx时的编译选项,由输出可知,我们已经安装了HttpGzip模块。
如果没有安装:请到原来的nginx解压的目录下重新执行:
./configure --with-http_stub_status_module --with-http_gzip_static_module
make && make install
下面是HttpGzip模块在Nginx配置中的相关属性设置:
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压缩的数据。
负载均衡配置
下面设定负载均衡的服务器列表。
upstream ixdba.net{
ip_hash;
server 192.168.12.133:80;
server 192.168.12.134:80 down;
server 192.168.12.135:8009 max_fails=3 fail_timeout=20s;
server 192.168.12.136:8080;
}
upstream 是Nginx的 HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称ixdba.net。这个名称可以任意指定,在后面需要的地方直接调用即可。
Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方的调度方法:
轮询(默认): 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。
Weight: 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash: 每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
fair: 比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
url_hash: 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
down: 表示当前的server暂时不参与负载均衡。
backup: 预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails: 允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout: 在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
注意 : 当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
server虚拟主机配置
下面介绍对虚拟主机的配置。建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过include指令包含进来,这样更便于维护和管理。
server{
listen 80; # 监听端口
server_name 192.168.12.188 www.ixdba.net;
index index.html index.htm index.jsp;
root /web/wwwroot/www.ixdba.net
charset gb2312;
access_log logs/www.ixdba.net.access.log main;
}
server: 标志定义虚拟主机开始,
listen: 用于指定虚拟主机的服务端口,
server_name:用来指定当前主机的IP地址或者绑定的域名,多个域名之间用空格分开。
Index:用于设定访问的默认首页地址,
root: 指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
Charset:用于设置网页的默认编码格式。
access_log:用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。
URL匹配配置
URL地址匹配是进行Nginx配置中最灵活的部分。 location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理。
以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理,而expires用来指定静态文件的过期时间,这里是30天。
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
root /web/wwwroot/www.ixdba.net;
expires 30d;
}
以下这段设置是将upload和html下的所有文件都交给nginx来处理,当然,upload和html目录包含在/web/wwwroot/www.ixdba.net目录中。
location ~ ^/(upload|html)/ {
root /web/wwwroot/www.ixdba.net;
expires 30d;
}
在最后这段设置中,location是对此虚拟主机下动态网页的过滤处理,也就是将所有以.jsp为后缀的文件都交给本机的8080端口处理。
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}
在最后这段设置中,设置了虚拟主机的错误信息返回页面,通过error_page指令可以定制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的返回页面,特别需要注意的是,这些错误信息的返回页面大小一定要超过512K,否者会被ie浏览器替换为ie默认的错误页面。
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
url匹配的优先级顺序:
(localtion =) > (localtion完整url) > (localtion ^~) > (localtion ~,~*) > (lcoaltion部分起始路径) > (/)
= 表示精确匹配
^~ 表示指定的路径开头
~ 表示区分大小写的正则匹配
~* 表示不区分大小写的正则匹配
/ 通用匹配,所有的URL都是以此为开头
例子:
1:反向代理配置
简单配置
1.1 、比如 www.dengwei.com 转发到 http://www.baidu.com
server {
listen 80;
server_name www.dengwei.com;# 当前服务器ip地址或绑定域名
location / { # 访问80端口后的所有路径都转发到 proxy_pass 配置的ip中
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass https://www.baidu.com; # 配置反向代理的ip地址和端口号 【注:url地址需加上http:// 或 https://】
}
}
1.2、比如 : www.dengwei.com/api1 转发到 http://www.baidu.com:9000/api1
www.dengwei.com/api2 转发到 http://www.baidu.com:9000/api2
server {
listen 80;
server_name www.dengwei.com;# 当前服务器ip地址或绑定域名
location /api1 { # ^~/api1 表示匹配前缀为api1的请求
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass https://www.baidu.com:9000/api1; # 配置反向代理的ip地址和端口号 【注:url地址需加上http:// 或 https://】
}
location ^~/api2 { # ^~/api2 表示匹配前缀为api2的请求
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass https://www.baidu.com:9000/api2; # 配置反向代理的ip地址和端口号 【注:url地址需加上http:// 或 https://】
}
}