Nginx 反向代理知识要点
Nginx反向代理知识要点
(官网示例)
ngx_http_proxy_module 模块
server {
listen
server_name
location / {
proxy_pass http://IP:80/;
}
}
(代理转发至后端IP机的80端口)
1. 格式:
location /url {
rewrite
proxy_pass http://back_server:port/newurl;
}
/url—> /newurl
location这种后端转发非常的灵活
2. 正则示例:
location ~*\.(jpg|png|gif) {
proxy_pass http://IP;
}
这里有这注意的要点,对于正则匹配的,不能进行后端url的替换,即匹配的都会加在proxy_pass后面的url后面。正则匹配情况下,proxy_pass后面的url不加任何自定义的url,否则语法错误。
例如 http://www.testnginx.com/1.jpg—(转发格式)—> http://IP/1.jpg
client<——
http://www.testnginx.com/images/1.jpg—(转发格式)—>http://IP/images/1.jpg
client<——
(将所有.jpg|png|gif图片格式,都转发给后端IP机)
代理向后端发送需要的值(日志中)
proxy_set_header 定义TCP首部
常用配置参数如下:
server {
listen80;
server_name www.testnginx.com;
access_log /home/work/log/nginx/www.testnginx.com.logmilog
location / {
proxy_set_header Host www.testnginx.com;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
proxy_pass http://www.testnginx.com.real_backend;
}
}
其实$remoad_addr是没有proxy_add_x_forwarded_for准确的,proxy_add_x_forwarded_for记录的是准确的client的IP,而$remoad_addr记录的准确是代理机的ip,并且多次代理他们直接也有差异。
官网给出的解释是:
英文版:
proxy_ssl_ciphers 等用来支持代理机到物理机之间的加密数据的传输,即内网环境下密码等信息的安全传输。
代理缓存(定义如何管理缓存空间缓存条目)
proxy_cache zone | off
(调用缓存)
缓存实则即为键值对。
proxy_cache_path path
(定义缓存的路径,只能用在http段)
官网实例:
levels‘:’表示几个子目录,如图所示,表示两个
levels的数字1,2表示子目录的目录名字符数,一级子目录名字字符数为1个,二级子目录名字字符数为2。
keys_zone:表示键存储的位置,大小为10m与proxy_cache的zone进行匹配,被prixy_cache调用
上图的实用实例:
proxy_cache_methods GET | HEAD;
(仅在客户端使用某种方法时缓存,默认GET,HEAD,其实还有POST等,但是没比较缓存提交的信息,大部分情况,不用定义)
proxy_cache_min_uses number;
(缓存生效的最小次数,默认为1)
proxy_cache_purge string;
(管理缓存空间中的缓存条目,如果某个缓存没到期,也没满,但是后端真实服务器数据更改了,那么可以在对应缓存条目上增加该项,等用户再次拿到缓存的时候会删掉该缓存。注意权限管理,具体配置方式请详见官网)
proxy_cache_revalidate on | off;
(当缓存到期了,询问后端服务器缓存数据是否改变,若没改变则修改缓存时间,继续使用原缓存,即过期后重新校验)
proxy_cache_use_stale error | timeout |invalid_header | updating | http_500 | http_502 …| off...
(缓存过期时并且后端服务器处于类似宕机或服务更新等以上后面参数的各种情况下,是否可以继续给客户端响应缓存内容,详见官网)
proxy_cache_valid [code …] time;
(按时间定义不同响应码的缓存时间)
proxy_cache_pypass string;
$cookie_nocache$arg_nocache $http_authorization
(设置在指定情况下nginx不会在cache中取数据)
proxy_connect_timeout;
(后端服务器连接的超时时间_发起握手等候响应超时时间)
proxy_hide_header;
(隐藏由Proxy响应客户端时响应的首部)
但是在生产环境好像是没有启用关于nginx cache的任何参数
ngx_http_upstream_module 模块
模块的主要功能:定义可由proxy_pass,fastcgi_pass,uwsgi_pass,scgi_pass和memcached_pass指令引用的服务器组。
示例:
upstream testnginx_backend {
server IP1/Domain:Portweight=[number] max_fails=[number] fails_timeout=30s;
server IP2/Domain:Port weight=[number] max_fails=[number] fails_timeout=30s;
}
(生产环境,一般server后面跟的是自己的内网ip)
server {
listen 80;
server_name www.testnginx.com;
…
location / {
proxy_pass http://testnginx_backend;
…
}
}
(调用方式,‘…’省略其它配置)
weight:表示权重,默认为1
max_fails:用作健康检查,表示fails_timeout(超时时间规定)情况出现几次,则将server从upstream队列中剔除。
fails_timeout:设定超时时间的长度,即规定超过多长时间未响应则判断为请求失败。
down:可以手动调为永久不可用,(类似情景用于灰度测试),通常和ip_hash一起使用
backup:可以标记为备用机使用,即当所有主服务器都不用时,启用这台服务器。
(等更多信息详见官网)
情景:由于用户在进行网站数据访问时的请求与数据返回一致性问题上,传统的ip_hash方式会造成某一台机器连接数巨大,并不利于upstream调度。所有引进cookie这中方式,根据tcp报文序列进行后端调度,这样基于cookie保证数据一致性,由于ip_hash这种基于单一机器的方式。
sticky cook name[expires=time] [domain=domain ] [httponly][secure] [path=path];
sticky route $variable…
sticky learn create=$variable lookup=$variable zone=name:size[timeout=time] [header];
(启用会话关联,致使来自同一客户端的请求被传递到一组服务器中的同一服务器)
cookie
(官网示例,详见官网)
route
(官网示例,详见官网)
learn
(官网示例,详见官网)
least_conn
(调度方法,最少链接)
keepalive connections;
(后端专用存储情况下,例如sql查询等,可以使用该方法保持与后端的连接,减少连接次数,提升效率。http模式的话,一般不建议使用)
(官网示例,详见官网)
upstream 还有几个内建模块,详见官网说明
ngx_http_headers_module 模块
(主要与自定义响应报文首部有关)
add_header name value[always];
(自定义响应报文首部)
例子:add_headerX-via$server_addr
(在浏览器中发起请求后返回的报文首部信息中,加上server的ip地址)
例子:add_headerX-Cache $upstream_cache_status;
(查看保持访问响应缓存的状态,状态可以是“MISS(未命中)”,“BYPASS”,“EXPIRED”,“HIT(命中)”,“STALE(过期)”等,查看缓存状态需要将cache功能启用,不然没有这个头部信息)
还有各种自定义的首部可自行官网学习
关于fastcgi使用来代理php页面的,暂时没有接触,请自行学习
一个nginx在生产环境中的完整案例:
user nobody nobody
worker_processes 4;#进程数
worker_rlimit_nofile 51200;#所能够同时打开的文件数
error_log logs/error.lognotice;
pid /var/run/nginx.pid
events {
use epoll;
worker_connections 51200;#每一个进程承载的最大连接数
}
http {
server_tokens off;#禁止版本号显示
include mime.type;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 20m;#每个用户报文body大小
client_boby_buffer_size 256k;#每个用户Nignx处理时在nginx中开辟的内存大小
proxy_connect_timeout 90;#连接建立的超时时间
proxy_send_timeout 90;#向后端服务器发送报文的超时时间
proxy_read_timeout 90;#响应报文的超时时间
proxy_buffer_size 128k;
proxy_buffers 464k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
default_type application/octet-stream;
charset utf-8;
client_body_temp_path /var/tmp/client_body_temp1 2; #这几个都是临时存储
proxy_temp_path /var/tmp/proxy_temp1 2; #或代理文件的路径
fastcgi_temp_path /var/tmp/fastcgi_temp 1 2;
uwsgi_temp_path /var/tmp/uwsgi_temp 1 2;
scgi_temp_path /var/tmp/scgi_temp 1 2;
ignore_invalid_headers on; #忽略无法理解的报文信息
server_names_hash_max_size 256; #server_name进行hash
server_names_hash_bucket_size 64;
client_header_buffer_size 8k;
large_client_header_buffers 432k;
connection_pool_size 256;
request_pool_size 64k;
output_buffers 2128k;
postpone_output 1460;
client_header_timeout 1m;
client_body_timeout 3m;
send_timeout 3m;
log_format_main ‘$remote_addr- $remote_user [$time_local] “$host|$request”’
‘$status $body_bytes_sent“$http_referer”’
‘”http_user_agent” “$http_x_forwarded_for”“$request_time” “$upstream_response_time”’;
open_log_file_cache max=1000 inactive=20s min_uses=1 valid=1m;
access_log logs/access.logmain;
log_not_found on;
sendfile on;
tcp_nodelay on;
tcp_nopush off;
reset_timeout_connection on;
keepalive_timeout 105;
keepalive_requests 100;
gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_proxied any;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_buffers 168k;
gzip_proxied expired no-cache no-store private auth no_last_modified no_eetag;
gzip_types text/plain application/x-javascipt text/cssapplication/xml application/json;
gzip_disable “MSIE [1-6]\.(?l.*SV1)”;
#其实从这一下的文件都可以使用include path;path是指定的所以server的文件目录,因为一般工作都需要有非常多的域名进行维护
upstream tomcat8080; {
ip_hash
server 172.18.100.101:8080 weight=1 max_fails=2;
server 172.18.100.102:8080 weight=1 max_fails=2;
server 172.18.100.103:8080 weight=1 max_fails=2;
}
server {
listen 80;
server_name www.testnginx.com
root /data/webapp/htdocs;
access_log /var/logs/webapp.access.logmain;
error_log /var/logs/webapp.error.lognotice;
location / {
location ~*^.*/favicon.ico$ {
root /data/webapps;
expires 180d; #图片缓存时长
break;
}
if(!-f$request_filename) {
proxy_pass http://tomcat8080;
break;
}
}
error_page 500 502 503 504 /50x.html
location = /50x.html {
root html;
}
}
server {
listen 8088;
server_name nginx_status;
location / {
access_log off;
deny all;
return 503;
}
location /status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 127.18.100.70;
}
}
}
Tengine了解
tengine.taobao.org