简单概括,正向代理是局域网内机器访问外网资源的中介,反向代理是外网机器访问局域网内的资源;
正向代理指令
- resolver address … [valid=time] 用于指定dns服务器的ip地址;
address:dns的ip地址,不指定端口,默认使用53; time:设置数据包在网络中的有效时间;
- resolver_timeout time dns解析超时时长;
- proxy_pass url 设置代理服务器协议和地址;
注意:1.正向代理可以加在http,server,location配置,但是一般在server中, 注意在server中不要出现server_name指令,即不要设置虚拟主机的名称或ip; 2.resolver指令是必须的,不然无法处理接收的域名; 3.nginx不支持正向代理https站点;
server {
resolver 6.6.6.6;
listen 80;
location / {
proxy_pass http://$http_host$resuest_uri;
}
}
反向代理
- proxy_pass url 被代理的服务器地址;还可以是服务器组,此时用的upstream;
注意以下2种写法:
upstream serverlist{
server http://192.168.1.2:8080/url/
server http://192.168.1.3:8080/url/
}
server {
location / {
proxy_pass serverlist
}
}
upstream serverlist{
server 192.168.1.2:8080/url/
server 192.168.1.3:8080/url/
}
server {
location / {
proxy_pass http://serverlist
}
}
url中是否包含uri,nginx处理方式是不同的;如果不包含,nginx不会改变原地址的uri,如果包含, nginx会用新的uri替换原来的uri,所以如果不想改变原地址的uri,就不要再url变量中配置uri;
server_name www.web.com
location /server/{
proxy_pass http://192.168.1.1 #1
proxy_pass http://192.168.1.1/local #2
}
请求是http://www.web.com/server,使用#1 ,nginx会把地址指向http://www.web.com/server;
使用#2,指向http://www.web.com/local
location /server/{
proxy_pass http://192.168.1.1 #1 http://www.web.com/server/index
proxy_pass http://192.168.1.1/ #2 http://www.web.com/index
}
- proxy_hide_header filed nginx发送响应是,隐藏指定头信息;
- proxy_pass_header filed 默认nginx在发送响应时,报文头不包含date,server等来自被代理服务器的头信息,该指令可以设置这些头信息被发送;
- proxy_pass_request_body on/off 是否将客户端的请求体发送给被代理服务器;
- proxy_pass_request_header on/off 是否将客户端的请求头发送给被代理服务器;
- proxy_set_header key value 更改客户端的头信息,将新的头信息发给被代理服务器;
proxy_set_header Host $http_host #host值填充为客户端的地址 proxy_set_header Host $host #host值填充为server_name的值 proxy_set_header Host $proxy_host #host值填充为nginx的地址,默认值
- proxy_set_body value 更改客户端发送的请求体,发送修改后的给被代理服务器;
- proxy_bind address 在配置多个基于名称或ip的主句的情况下,如果希望代理连接由指定的主机处理,可以用它配置;
- proxy_connect_timeout time nginx与被代理服务器建立连接的超时时间,默认60s;
- proxy_read_timeout time nginx向被代理服务器发出read请求后等待响应的超时时间,默认60s;
- proxy_send_timeout time nginx向被代理服务器发出write请求后等待响应的超时时间,默认60s;
- proxy_http_version 1.0/1.1 http协议版本,默认1.0
- proxy_method method nginx请求被代理服务器使用的方法;设置以后,客户端的请求方法会被忽略;
- proxy_ignore_client_abort on/off 设置在客户端中断网络请求时,nginx是否中断对被代理服务器的请求; 默认是off,客户端中断,nignx也中断;
- proxy_ignore_headers field … 设置http响应呕吐信息,nginx收到被代理服务器的响应数据后,不会处理被设置的头信息;
- proxy_redirect redirect replacement 修改被代理服务器返回响应头信息中location和refresh字段,与proxy_pass配合使用。
redirect 匹配location头信息值的字符串,支持变量和正则;
replacement,替换redirect的字符串,支持变量;
例如,nginx通过proxy_pass将客户端请求重写为被代理服务器的地址,nginx返回给客户端的响应中location应该和客户端请求的地址对应,
而不是被代理服务器返回的地址信息,这个指令就是把被代理服务器返回的地址改为需要的地址;
假设,被代理服务器响应头location头信息是:location:http://localhost:8080/a/b/c/
指令是 proxy_redirect:http://localhost:8080/a/ http://www.xx.com/p/
nignx最后响应的头信息是:location:http://www.xx.com/p/b/c
- proxy_intercept_reeors on/off on时,如果被代理服务器返回的状态码>=400,则nginx使用自己定义的错误页(error_page指令), off时,nginx直接将被代理服务器返回的http状态返回给客户端;
- proxy_header_hash_max_size size 存放http报文头的哈希表的最大容量;默认512个字符;
nginx 为了能够快速检索http报文头中各项信息,如服务器名称,mime类型,使用哈希表存储这些信息。nginx申请存放这些报文头的空间时,通常是固定的单位申请的,大小由下面的指令配置proxy_header_hash_bucket_size;
- proxy_header_hash_bucket_size size 设置存放报文头的哈希表容量的单位大小;默认64个字符;
- proxy_next_upstream status 一组遵循upstream轮询规则的服务器,在发生异常时,将请求顺次交给下一个组内服务器处理;
status值:error:在建立连接,向被代理的服务器发送请求或者读取响应头时服务器发生连接错误; timeout:在建立连接,向被代理的服务器发送请求或者读取响应头时服务器发生超时; invalid_header:被代理的服务器返回的响应头为空或无效; http_500/http_502/http_503/http_504/http_404,被代理的服务器返回以上状态码; off,无法将请求发给被代理服务器; 与被代理服务器在数据传输过程中发送错误的请求,不包含在该指令支持的状态内;
- proxy_ssl_session_reuse on/off 是否支持https连接被代理服务器;
proxy buffer
下面要介绍的proxy buffer相关指令的配置都是针对每一个请求起作用的,不是全局概念,即每个请求都会按照这些指令的配置来配置各自的buffer,nginx不会生成一个公共的proxy buffer供代理使用; proxy buffer启用后,nginx会异步的将被代理服务器的响应数据传递给客户端; nginx首先尽可能的从被代理服务器接收响应数据,放到proxy buffer中,buffer大小由proxy_buffer_size指令和proxy_buffers指令确定; 如果在接收过程中发现buffer没有不够大来接收一次响应数据,nginx会将部分数据临时存放到磁盘的临时文件中;临时文件路径可以通过proxy_temp_path设置; 临时文件大小由proxy_max_temp_file_size和proxy_temp_file_write_size决定。一次响应数据被接收完或者buffer装满后,nginx开始向客户端传输数据; 每个proxy buffer装满以后,在从开始向客户端传输数据到数据全部发送完,都处于busy状态,期间对它进行任何操作都会失败。 同时处于busy状态的proxy buffer总大小由proxy_busy_buffers_size限制。 当proxy buffer关闭时,nginx服务器只要接收到响应数据就会同步的传递给客户端,它本身不会读取完整的响应数据;
- proxy_buffering on/off 是否启用proxy buffer,默认on;
- proxy_buffers number size 接收一次被代理服务器响应数据的proxy buffer个数和每个buffer的大小;
由于这个指令可以得到接收一次呗代理服务器响应数据的proxy buffer总大小是number*size,改指令的默认设置proxy_buffers 8 4k/8k;
- proxy_buffer_size size 配置从被代理服务器获取的第一部分响应数据的大小,
该数据一般包括http响应头,nginx通过它获取响应数据和被代理服务器的一些必要信息;
- proxy_busy_buffers_size size 限制同时处于busy状态的proxy buffer总大小;默认8kb或16kb;
- proxy_temp_path path levelN
levelN:设置在path变量设置的路径下第几级目录中存放临时文件;
例如:proxy_temp_path /nginx/web/fool/temp 1 2
临时文件存放在/nginx/web/fool/temp路径下的第二级目录中,基于该配置的一个临时文件路径可能是
/nginx/web/fool/temp/1/10/0001001
- proxy_max_temp_file_size size 所有临时文件的总体积,默认1024MB;
- proxy_max_temp_file_write_size size 配置同时写入临时文件的数据量的总大小,默认8kb或16kbm一般与平台的内存页大小相同;
proxy cache
buffer主要用于传输效率不同步或者优先级别不同的设备传输数据,一般通过对一方数据临时存放,再统一发送的办法传递给另一方,以降低进程间的等待时间,保证速度较快的进程不发生间断;cache主要用于将硬盘上已有的数据在内存中建立缓存数据,提高数据的访问效率,对于过期不用的数据可以随时销毁,但不会销毁硬盘上的数据;proxy cache机制依赖proxy buffer,只有proxy buffer开启,proxy cache才会起作用;nginx还提供了proxy store,与proxy cache区别是,它对来自被代理服务器的响应数据尤其是静态数据,只进行简单的缓存,不支持缓存过期更新,内存建立索引等功能,但是支持设置用户或用户组对缓存数据的访问权限。
- proxy_cache zone/off用于配置一块公用的内存区域的名称,该区域可以存放缓存的索引数据。
这些数据在nginx服务器启动时由缓存索引重建进程负责建立,在nginx整个运行过程中由缓存进程负责定期检查过期数据、检索等管理工作。默认off,关闭cache功能;
- proxy_cache_bypass string 配置nginx服务器向客户端发送响应数据时不从缓存中获取的条件;
string为条件变量,支持设置多个,当至少有一个字符串指令不为空或!=0时,响应数据不从缓存中取;例如, proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment 以上都是nginx配置文件的变量,参考后面;
- proxy_cache_key string nginx在内存为缓存数据建立索引是使用的关键字,支持变量;
例如,希望缓存数据包含服务器主机名等关键字,proxy_cache_key “$scheme$host”
- proxy_cache_lock on/off 是否开启缓存的锁功能;
在缓存中,某些数据项可以同时被多个请求返回的响应数据填充。开启次功能后,nginx服务器同时只能有一个请求填充缓存的某一数据项,相对于给该数据项上锁,不允许其它请求操作。其它请求若也想填充该项,必须等待锁释放,等待时长由proxy_cache_lock_timeout time决定,time默认5s;
- proxy_cache_path path 设置缓存数据的路径和索引相关内容;
- proxy_cache_use_stale error/timeout/updating/http_500/off … nginx在访问被代理服务器的过程中出现被代理服务器无法访问或者访问错误等现象时,nginx可以使用历史缓存响应客户端请求;
- proxy_cache_valid code time 针对不同的http响应状态设置不同的缓存时间;
proxy_cache_valid 200 302 10m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; //any 是非以上状态
- proxy_no_cache string string 含义通proxy_cache_bypass的string;
- proxy_store on/off/string 是否在本地磁盘缓存来自被代理服务器的响应数据; 此指令多用在被代理服务器发生错误的情况下,用来缓存被代理服务器的响应数据;
- proxy_store_access users:permissions 设置缓存的访问权限;
location /fetch/{
paoxy_pass http://xxxxx;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
root /html;
}