NGINX功能详解

NGINX功能详解

一、proxy_pass

在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。

假设下面四种情况分别用 http://192.168.1.1/proxy/test.html 进行访问。

第一种:

location /proxy/ {

proxy_pass http://127.0.0.1/;

}

代理到URL:http://127.0.0.1/test.html

第二种(相对于第一种,最后少一个 / )

location /proxy/ {

proxy_pass http://127.0.0.1;

}

代理到URL:http://127.0.0.1/proxy/test.html

第三种:

location /proxy/ {

proxy_pass http://127.0.0.1/aaa/;

}

代理到URL:http://127.0.0.1/aaa/test.html

第四种(相对于第三种,最后少一个 / )

location /proxy/ {

proxy_pass http://127.0.0.1/aaa;

}

代理到URL:http://127.0.0.1/aaatest.html

第五种 配合upstream模块

如果一个域名可以解析到多个地址,那么这些地址会被轮流使用,此外,还可以把一个地址指定为 server group

upstream acs.gwmfc.com {

server 10.5.1.20:17007 max_fails=2 fail_timeout=15s;

server 10.5.1.21:17007 max_fails=2 fail_timeout=15s down;

ip_hash;

}

server {

listen 9000;

server_name ACS-NGINX-P01;

location / {

proxy_pass http://acs.gwmfc.com;

proxy_read_timeout 300;

proxy_connect_timeout 90;

proxy_send_timeout 300;

proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;

} X_Forward_For字段表示该条http请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了(显示真实访问ip)

二、rewrite

syntax: rewrite regex replacement [flag]

rewrite由ngx_http_rewrite_module标准模块支持是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到replacement,结尾是flag标记

简单的小例子:

1.rewrite ^/(.*) http://www.baidu.com/ permanent; # 匹配成功后跳转到百度,执行永久301跳转

常用正则表达式regex

字符 描述

将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用

^ 匹配输入字符串的起始位置

$ 匹配输入字符串的结束位置

* 匹配前面的字符零次或者多次

+ 匹配前面字符串一次或者多次

? 匹配前面字符串的零次或者一次

. 匹配除“ ”之外的所有单个字符

(pattern) 匹配括号内的pattern

rewrite 最后一项flag参数:

标记符号 说明

last 本条规则匹配完成后继续向下匹配新的location URI规则

break 本条规则匹配完成后终止,不在匹配任何规则

redirect 返回302临时重定向

permanent 返回301永久重定向

在反向代理域名的使用,在tomcat中配置多个项目需要挂目录的使用案例:

server {

listen 443;

server_name FLS-Nginx-P01;

ssl on;

ssl_certificate cert/214837463560686.pem;

ssl_certificate_key cert/214837463560686.key;

ssl_session_timeout 5m;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

location = / {

rewrite ^(.*)$ https://fls.orafl.com/fls/;

}

location / {

proxy_redirect http https;

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://10.6.3.4:8080;

}

}

公网域名解析fls.orafl.com

三、log_format

nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式;另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,可以参加ngx_http_log_module。一般在nginx的配置文件中日记配置(/usr/local/nginx/conf/nginx.conf)

log_format指令用来设置日志的记录格式,它的语法如下:

log_format name format {format ...}

其中name表示定义的格式名称,format表示定义的格式样式。

log_format有一个默认的、无须设置的combined日志格式设置,相当于Apache的combined日志格式,其具体参数如下:

log_format combined '$remote_addr-$remote_user [$time_local]'

‘"$request"$status $body_bytes_sent’

‘"$http_referer" "$http_user_agent"’

也可以自定义一份日志的记录格式,不过要注意,log_format指令设置的名称在配置文件中是不能重复的。

四、ssl证书加密配置

upstream acs.gwmfc.com {

server 10.5.1.*:17007 max_fails=2 fail_timeout=15s;

server 10.5.1.*:17007 max_fails=2 fail_timeout=15s down;

ip_hash; ----同一ip会被分配给固定的后端服务器,解决session问题

}

server {

listen 443;

server_name ACS-NGINX-P01;

ssl on;

ssl_certificate 214820781820381.pem; 证书路径:nginx.conf所在目录

ssl_certificate_key 214820781820381.key;

ssl_session_timeout 5m;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers on;

location / {

proxy_pass http://acs.gwmfc.com;

proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;

}

}

五、sendfile

sendfile: 设置为on表示启动高效传输文件的模式。sendfile可以让Nginx在传输文件时直接在磁盘和tcp socket之间传输数据。如果这个参数不开启,会先在用户空间(Nginx进程空间)申请一个buffer,用read函数把数据从磁盘读到cache,再从cache读取到用户空间的buffer,再用write函数把数据从用户空间的buffer写入到内核的buffer,最后到tcp socket。开启这个参数后可以让数据不用经过用户buffer。

六、keepalive_timeout

当上传一个发数据文件时,nginx往往会超时,此时需要调整keepalive_timeout参数,保持会话长链接

七、gzip

如果你是个前端开发人员,你肯定知道线上环境要把js,css,图片等压缩,尽量减少文件的大小,提升响应速度,特别是对移动端,这个非常重要。

gzip使用环境:http,server,location,if(x),一般把它定义在nginx.conf的http{…..}之间

gzip on

on为启用,off为关闭

gzip_min_length 1k

设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。

gzip_buffers 4 16k

获取多少内存用于缓存压缩结果,‘4 16k’表示以16k*4为单位获得

gzip_comp_level 5

gzip压缩比(1~9),越小压缩效果越差,但是越大处理越慢,所以一般取中间值;

gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php

对特定的MIME类型生效,其中'text/html’被系统强制启用

gzip_http_version 1.1

识别http协议的版本,早起浏览器可能不支持gzip自解压,用户会看到乱码

gzip_vary on

启用应答头"Vary: Accept-Encoding"

gzip_proxied off

nginx做为反向代理时启用,off(关闭所有代理结果的数据的压缩),expired(启用压缩,如果header头中包括"Expires"头信息),no-cache(启用压缩,header头中包含"Cache-Control:no-cache"),no-store(启用压缩,header头中包含"Cache-Control:no-store"),private(启用压缩,header头中包含"Cache-Control:private"),no_last_modefied(启用压缩,header头中不包含"Last-Modified"),no_etag(启用压缩,如果header头中不包含"Etag"头信息),auth(启用压缩,如果header头中包含"Authorization"头信息)

gzip_disable msie6

(IE5.5和IE6 SP1使用msie6参数来禁止gzip压缩 )指定哪些不需要gzip压缩的浏览器(将和User-Agents进行匹配),依赖于PCRE库

以上代码可以插入到 http {...}整个服务器的配置里,也可以插入到虚拟主机的 server {...}或者下面的location模块内

八、客户端上传文件限制

client_body_buffer_size 15M;

请求缓冲区在NGINX请求处理中起着重要作用。 在接收到请求时,NGINX将其写入这些缓冲区,此指令设置用于请求主体的缓冲区大小。 如果主体超过缓冲区大小,则完整主体或其一部分将写入临时文件。 如果NGINX配置为使用文件而不是内存缓冲区,则该指令会被忽略。 默认情况下,该指令为32位系统设置一个8k缓冲区,为64位系统设置一个16k缓冲区

client_body_temp_path clientpath 3 2;

关于client_body_temp目录的作用,简单说就是如果客户端POST一个比较大的文件,长度超过了nginx缓冲区的大小,需要把这个文件的部分或者全部内容暂存到client_body_temp目录下的临时文件。

后面的level1,2,3是什么意思?

因为如果所有上传的文件都放在一个文件夹下,不仅很容易文件名冲突,并且容易导致一个文件夹特别大。

所以有必要创建子目录

这里的level1,2,3如果有值就代表存在一级,二级,三级子目录。

目录名是由数字进行命名的,所以这里的具体的值就是代表目录名的数字位数

比如

client_body_temp_path /spool/nginx/client_temp 3 2;

可能创建的文件路径为

/spool/nginx/client_temp/702/45/00000123457

client_max_body_size 30M;

此指令设置NGINX能处理的最大请求主体大小。 如果请求大于指定的大小,则NGINX发回HTTP 413(Request Entity too large)错误。 如果服务器处理大文件上传,则该指令非常重要。

九、worker_processes和worker_connections

worker_processes:操作系统启动多少个工作进程运行Nginx。注意是工作进程,不是有多少个nginx工程。在Nginx运行的时候,会启动两种进程,一种是主进程master process;一种是工作进程worker process。例如我在配置文件中将worker_processes设置为4,启动Nginx后,使用进程查看命令观察名字叫做nginx的进程信息,我会看到如下结果:1个nginx主进程,master process;还有四个工作进程,worker process。主进程负责监控端口,协调工作进程的工作状态,分配工作任务,工作进程负责进行任务处理。一般这个参数要和操作系统的CPU内核数成倍数。可以设置为auto自动识别

worker_connections:这个属性是指单个工作进程可以允许同时建立外部连接的数量。无论这个连接是外部主动建立的,还是内部建立的。这里需要注意的是,一个工作进程建立一个连接后,进程将打开一个文件副本。所以这个数量还受操作系统设定的,进程最大可打开的文件数有关

十、stream模块

nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。这完全就是抢HAproxy份额的节奏,鉴于nginx在7层负载均衡和web service上的成功,和nginx良好的框架,stream模块前景一片光明

stream模块默认没有编译到nginx, 编译nginx时候 ./configure –with-stream 即可

stream模块用法和http模块差不多,关键的是语法几乎一致。熟悉http模块配置语法的上手更快

以下是一个配置了tcp负载均衡和udp(dns)负载均衡的例子, 有 server,upstream块,而且还有server,

hash, listen, proxy_pass等指令,如果不看最外层的stream关键字,还以为是http模块呢,下例是四层反代邮箱协议的例子,直写了25端口,其他端口方法相同

stream {

upstream smtp {

least_conn; ------把请求转发给连接数较少的后端,能够达到更好的负载均衡效果

server 10.5.3.17:25 max_fails=2 fail_timeout=10s;

}

server {

listen 25;

proxy_pass smtp;

proxy_timeout 3s;

proxy_connect_timeout 1s;

}

如果你现在在JAVA这条路上挣扎,也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,7个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来,q群号为:835638062

注:加群要求

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

上一篇:阿里云混合云重磅亮相中国信通院2021混合云大会


下一篇:Java并发基础:了解无锁CAS就从源码分析