反向代理

nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理。
proxy_pass 既可以是ip地址,也可以是域名,同时还可以指定端口 
  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location / {
  5. proxy_pass http://192.168.25.128:8080;
  6. proxy_set_header Host $host;
  7. proxy_set_header X-Real-IP $remote_addr;
  8. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;//暂时不配置,后面回演示
  9. }
  10. }   
Nginx反向代理实战
\1. 启动tomcat服务器
\2. nginx配置的统一维护,将Nginx.conf文件的内容修改成如下配置
  1. #user nobody;
  2. user root;
  3. worker_processes 1;
  4.  
  5. #error_log logs/error.log;
  6. #error_log logs/error.log notice;
  7. #error_log logs/error.log info;
  8.  
  9. #pid logs/nginx.pid;
  10.  
  11. events {
  12. worker_connections 1024;
  13. }
  14.  
  15. http {
  16. include mime.types;
  17. default_type application/octet-stream;
  18.  
  19. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  20. # '$status $body_bytes_sent "$http_referer" '
  21. # '"$http_user_agent" "$http_x_forwarded_for"';
  22.  
  23. #access_log logs/access.log main;
  24.  
  25. sendfile on;
  26. #tcp_nopush on;
  27.  
  28. keepalive_timeout 65;
  29. include extra/*.conf;
  30. }

  

\3. 在extra文件夹中添加proxy_demo.conf
  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location /{
  5. proxy_pass http://192.168.25.128:8080;
  6. }
  7. }
\4. ./nginx -s reload 重新加载
 
访问:http://192.168.20.130    会自动跳转到http://192.168.25.128:8080 tomcat的访问地址上,即tomcat的主页。。。然后我们可以在页面编辑加入标签 
  1. <h2><%=request.getRemoteAddr()%></h2>刷新页面拿到了代理的服务器地址

  如果想拿到客户端的地址则需要配置

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location /{
  5. proxy_pass http://192.168.25.128:8080;
  6. proxy_set_header Host $host;
  7. proxy_set_header X-Real-IP $remote_addr;
  8.           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;获取所有ip,包含多级代理情况下都可以获取到
  9. }
  10. }

  页面添加

  1. <h2><%=request.getHeader("X-Real-IP")%></h2>

  重新加载,刷新页面,可以看到客户端的ip

  其他参数配置:

  1. server {
  2.   listen 80;
  3.   server_name localhost;
  4.   location / {
  5.     proxy_pass http://192.168.25.128:8080; // 代理服务器的地址
  6.     proxy_set_header X-Real-IP $remote_addr; // 设置客户端的真实IP
  7.     proxy_set_header Host $hoxt; //当后端web服务器也配置了多个虚拟主机时,需要用该header来区分反向代理哪个主机名
  8.     proxy_set_header X-Forwarded-For $remote_addr //如果后端web服务器上的程序需要获取用户ip,可以从该header头获取
  9.     proxy_next_upstream http_502 http_504 http_503 error timeout invalid_header; //请求出错后,转向下一个节点
  10.     proxy_set_header http_user_agent $http_user_agent; //判断访问端是苹果,安卓,win还是mac
  11.     #proxy_body_buffer_size 64k;//用于指定客户端请求主体缓冲区大小,可以理解为先保存到本地在传给用户
  12.     #proxy_connect_timeout 60s;//表示与后端服务器连接的超时时间,即发起握手等候响应的超时时间
  13.     #proxy_send_timeout 60s;//表示后端服务器的数据回传时间,即在规定的时间内后端服务器必须传完所有的数据,否则,nginx将断开这个连接
  14.     #proxy_read_timeout 60s;//设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功之后,nginx等待后端服务器的响应时间,其实nginx已经进入后端的排队之中等候处理
  15.     #proxy_buffer_size 60k;//设置缓冲区大小,默认,该个、缓冲区大小等于指令proxy_buffers设置的大小
  16.     #proxy_buffers 60k;//设置缓冲区的数量和大小。nginx从代理的后端服务器获取的响应信息,会保存到缓冲区
  17.     #proxy_busy_buffers_size //用于设置系统忙碌时可以使用的proxy_buffers大小,官方推荐为proxy_buffers*2
  18.     #proxy_tmep_file_write_size //指定proxy缓存临时文件的大小
  19.     #add_header 'Access-Control-Allow-Origin' '*'; // 添加允许跨域头 允许来自所有的访问地址
  20.     #add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE'; // 支持的请求方式
  21.     #add_header 'Aceess-Control-Allow-Header' 'Content-Type,*'; // 支持的媒体类型<br> # ......
  22. }
  23. }

  

 

负载均衡

硬件负载(F5、Array)软件负载(nginx、lvs、HAProxy)
网络负载均衡的大致原理是利用一定的分配策略将网络负载平衡地分摊到网络集群的各个操作单元上,使得单个重
负载任务能够分担到多个单元上并行处理,使得大量并发访问或数据流量分担到多个单元上分别处理,从而减少用户的等待响应时间 
upstream

是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡
1. Upstream
语法: server address [paramters]
2. 负载均衡策略或者算法
轮询算法(默认), 如果后端服务器宕机以后,会自动踢出
ip_hash 根据请求的ip地址进行hash
权重轮询 
  1. upstream tomcat {
  2. server 192.168.20.130:8080 max_fails=2 fail_timeout=60s;
  3. server 192.168.20.128:8080;
  4. }
  5. server {
  6. listen 80;
  7. server_name localhost;
  8. location / {
  9. proxy_pass http://tomcat;
  10. proxy_set_header Host $host;
  11. proxy_set_header X-Real-IP $remote_addr;
  12. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  13. proxy_next_upstream error timeout http_500 http_503;
  14. proxy_connect_timeout 60s;
  15. proxy_send_timeout 60s;
  16. proxy_read_timeout 60s;
  17. add_header 'Access-Control-Allow-Origin' '*';
  18. add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE';
  19. add_header 'Aceess-Control-Allow-Header' 'Content-Type,*';
  20. }
  21. location ~ .*\.(js|css|png|svg|ico|jpg)$ {
  22. valid_referers none blocked 192.168.11.160 www.gupaoedu.com;
  23. if ($invalid_referer) {
  24. return 404;
  25. }
  26. root static-resource;
  27. expires 1d;
  28. }
  29. }

  

其他配置信息

proxy_next_upstream
语法:proxy_next_upstream [error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |
http_404 | offff ];
默认:proxy_next_upstream error timeout;
配置块:http、server、location
这个配置表示当向一台上有服务器转发请求出现错误的时候,继续换一台上后服务器来处理这个请求。
默认情况下,上游服务器一旦开始发送响应数据,Nginx反向代理服务器会立刻把应答包转发给客户端。因此,一旦Nginx开始向客户端发送响应包,
如果中途出现错误也不允许切换到下一个上有服务器继续处理的。这样做的目的是保证客户端只收到来自同一个上游服务器的应答。 
 
proxy_connect_timeout
语法: proxy_connect_timeout time;
默认: proxy_connect_timeout 60s;
范围: http, server, location
用于设置nginx与upstream server的连接超时时间,比如我们直接在location中设置proxy_connect_timeout  1ms, 1ms很短,如果无法在指定时间建立连接,就会报错。 
 
proxy_send_timeout
向后端写数据的超时时间,两次写操作的时间间隔如果大于这个值,也就是过了指定时间后端还没有收到数据,连接会被关闭 
 
proxy_read_timeout
从后端读取数据的超时时间,两次读取操作的时间间隔如果大于这个值,那么nginx和后端的链接会被关闭,如果
一个请求的处理时间比较长,可以把这个值设置得大一些
 
proxy_upstream_fail_timeout
设置了某一个upstream后端失败了指定次数(max_fails)后,在fail_timeout时间内不再去请求它,默认为10秒
语法 server address [fail_timeout=30s]
upstream backend { #服务器集群名字
#server 192.168.20.128:8080 weight=1 max_fails=2 fail_timeout=600s;
#server 192.168.20.130:8080 weight=1 max_fails=2 fail_timeout=600s;
 

Nginx动静分离

什么是动静分离
 
必须依赖服务器生存的我们称为动。不需要依赖容器的比如css/js或者图片等,这类就叫静
 

静态资源的类型

输入命令 :cat ../conf/mime.types

  1. types {
  2. text/html html htm shtml;
  3. text/css css;
  4. text/xml xml;
  5. image/gif gif;
  6. image/jpeg jpeg jpg;
  7. application/javascript js;
  8. application/atom+xml atom;
  9. application/rss+xml rss;
  10. text/mathml mml;
  11. text/plain txt;
  12. text/vnd.sun.j2me.app-descriptor jad;
  13. text/vnd.wap.wml wml;
  14. text/x-component htc;
  15. image/png png;
  16. image/svg+xml svg svgz;
  17. image/tiff tif tiff;
  18. image/vnd.wap.wbmp wbmp;
  19. image/webp webp;
  20. image/x-icon ico;
  21. image/x-jng jng;
  22. image/x-ms-bmp bmp;
  23. application/font-woff woff;
  24. application/java-archive jar war ear;
  25. application/json json;
  26. application/mac-binhex40 hqx;
  27. application/msword doc;
  28. application/pdf pdf;
  29. application/postscript ps eps ai;
  30. application/rtf rtf;
  31. application/vnd.apple.mpegurl m3u8;
  32. application/vnd.google-earth.kml+xml kml;
  33. application/vnd.google-earth.kmz kmz;
  34. application/vnd.ms-excel xls;
  35. application/vnd.ms-fontobject eot;
  36. application/vnd.ms-powerpoint ppt;
  37. application/vnd.oasis.opendocument.graphics odg;
  38. application/vnd.oasis.opendocument.presentation odp;
  39. application/vnd.oasis.opendocument.spreadsheet ods;
  40. application/vnd.oasis.opendocument.text odt;
  41. application/vnd.openxmlformats-officedocument.presentationml.presentation
  42. pptx;
  43. application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
  44. xlsx;
  45. application/vnd.openxmlformats-officedocument.wordprocessingml.document
  46. docx;
  47. application/vnd.wap.wmlc wmlc;
  48. application/x-7z-compressed 7z;
  49. application/x-cocoa cco;
  50. application/x-java-archive-diff jardiff;
  51. application/x-java-jnlp-file jnlp;
  52. application/x-makeself run;
  53. application/x-perl pl pm;
  54. application/x-pilot prc pdb;
  55. application/x-rar-compressed rar;
  56. application/x-redhat-package-manager rpm;
  57. application/x-sea sea;
  58. application/x-shockwave-flash swf;
  59. application/x-stuffit sit;
  60. application/x-tcl tcl tk;
  61. application/x-x509-ca-cert der pem crt;
  62. application/x-xpinstall xpi;
  63. application/xhtml+xml xhtml;
  64. application/xspf+xml xspf;
  65. application/zip zip;
  66. application/octet-stream bin exe dll;
  67. application/octet-stream deb;
  68. application/octet-stream dmg;
  69. application/octet-stream iso img;
  70. application/octet-stream msi msp msm;
  71. audio/midi mid midi kar;
  72. audio/mpeg mp3;
  73. audio/ogg ogg;
  74. audio/x-m4a m4a;
  75. audio/x-realaudio ra;
  76. video/3gpp 3gpp 3gp;
  77. video/mp2t ts;
  78. video/mp4 mp4;
  79. video/mpeg mpeg mpg;
  80. video/quicktime mov;
  81. video/webm webm;
  82. video/x-flv flv;
  83. video/x-m4v m4v;
  84. video/x-mng mng;
  85. video/x-ms-asf asx asf;
  86. video/x-ms-wmv wmv;
  87. video/x-msvideo avi;
  88. }
在Nginx的conf目录下,有一个mime.types文件
用户访问一个网站,然后从服务器端获取相应的资源通过浏览器进行解析渲染最后展示给用户,而服务端可以返回
各种类型的内容,比如xml、jpg、png、gif、flflash、MP4、html、css等等,那么浏览器就是根据mime-type来决定用什么形式来展示的
服务器返回的资源给到浏览器时,会把媒体类型告知浏览器,这个告知的标识就是Content-Type,比如Content-Type:text/html。 
 
演示代码
 
  1. location ~ .*\.(js|css|png|svg|ico|jpg)$ {
  2. valid_referers none blocked 192.168.20.130 www.gupaoedu.com;
  3. if ($invalid_referer) {
  4. return 404;
  5. }
  6. root static-resource;
  7. expires 1d;
  8. }   
动静分离的好处
第一个,Nginx本身就是一个高性能的静态web服务器;
第二个,其实静态文件有一个特点就是基本上变化不大,所以动静分离以后我们可以对静态文件进行缓存、或者压缩提高网站性能 
 
缓存 
当一个客户端请求web服务器, 请求的内容可以从以下几个地方获取:服务器、浏览器缓存中或缓存服务器中。这取决于服务器端输出的页面信息
浏览器缓存将文件保存在客户端,好的缓存策略可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担nginx缓存配置 
 
Nginx缓存配置
Nginx可以通过expires设置缓存,比如我们可以针对图片做缓存,因为图片这类信息基本上不会改变。
在location中设置expires
格式: expires 30s|m|h|d
location ~ .*.(jpg|jpeg|gif|bmp|png|js|css|ico)$ {
root static;
expires 1d;
压缩
Gzip 
我们一个网站一定会包含很多的静态文件,比如图片、脚本、样式等等,而这些css/js可能本身会比较大,那么在
网络传输的时候就会比较慢,从而导致网站的渲染速度。因此Nginx中提供了一种Gzip的压缩优化手段,可以对后
端的文件进行压缩传输,压缩以后的好处在于能够降低文件的大小来提高传输效率 " 
配置信息
Gzip on|offff 是否开启gzip压缩
Gzip_buffffers 4 16k #设置gzip申请内存的大小,作用是按指定大小的倍数申请内存空间。4 16k代表按照原始数据
大小以16k为单位的4倍申请内存。
Gzip_comp_level[1-9] 压缩级别, 级别越高,压缩越小,但是会占用CPU资源
Gzip_disable #正则匹配UA 表示什么样的浏览器不进行gzip
Gzip_min_length #开始压缩的最小长度(小于多少就不做压缩),可以指定单位,比如 1k
Gzip_http_version 1.0|1.1 表示开始压缩的http协议版本
Gzip_proxied (nginx 做前端代理时启用该选项,表示无论后端服务器的headers头返回什么信息,都无条件启用压缩)
Gzip_type text/pliain,application/xml 对那些类型的文件做压缩 (conf/mime.conf)
Gzip_vary on|offff 是否传输gzip压缩标识; 启用应答头"Vary: Accept-Encoding";给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
 
演示效果
  1. http {
  2. include mime.types;
  3. default_type application/octet-stream;
  4. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  5. # '$status $body_bytes_sent "$http_referer" '
  6. # '"$http_user_agent" "$http_x_forwarded_for"';
  7. #access_log logs/access.log main;
  8. sendfile on;
  9. #tcp_nopush on;
  10. keepalive_timeout 60;
  11. include extra/*.conf;
  12. gzip on;
  13. gzip_min_length 5k;
  14. gzip_comp_level 3;
  15. gzip_types application/javascript image/jpeg image/svg+xml;
  16. gzip_buffers 4 32k;
  17. gzip_vary on;
  18. }  

防盗链

一个网站上会有很多的图片,如果你不希望其他网站直接用你的图片地址访问自己的图片,或者希望对图片有版权保护。再或者不希望被第三方调用造成服务器的负载以及消耗比较多的流量问题,那么防盗链就是你必须要做的
防盗链配置
在Nginx中配置防盗链其实很简单,
语法: valid_referers none | blocked | server_names | string ...;
默认值: —
上下文: server, location 
“Referer”请求头为指定值时,内嵌变量$invalid_referer被设置为空字符串,否则这个变量会被置成“1”。查找匹配
时不区分大小写,其中none表示缺少referer请求头、blocked表示请求头存在,但是它的值被防火墙或者代理服务器删除、server_names表示referer请求头包含指定的虚拟主机名
\1. 配置如下
  1. location ~ .*.(gif|jpg|ico|png|css|svg|js)$ {
  2. valid_referers none blocked 192.168.20.130;
  3. if ($invalid_referer) {
  4.    return 404;
  5. }
  6.    root static;
  7. }

  

需要注意的是伪造一个有效的“Referer”请求头是相当容易的,因此这个模块的预期目的不在于彻底地阻止这些非法请求,而
是为了阻止由正常浏览器发出的大规模此类请求。还有一点需要注意,即使正常浏览器发送的合法请求,也可能没有“Referer”请求头。 
 

跨域访问

什么叫跨域呢?如果两个节点的协议、域名、端口、子域名不同,那么进行的操作都是跨域的,浏览器为了安全问题都是限制跨域访问,所以跨域其实是浏览器本身的限制。 
 
解决办法
  1. 修改proxy_demo.conf配置
  2. server{
  3. listen 80;
  4. server_name localhost;
  5. location / {
  6. proxy_pass http://192.168.20.130:8080;
  7. proxy_set_header Host $host;
  8. proxy_set_header X-Real-IP $remote_addr;
  9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  10. proxy_send_timeout 60s;
  11. proxy_read_timeout 60s;
  12. proxy_connect_timeout 60s;
  13. add_header 'Access-Control-Allow-Origin' '*'; // #允许来自所有的访问地址
  14. add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS'; //支持的请求方式
  15. add_header 'Access-Control-Allow-Header' 'Content-Type,*'; //支持的媒体类型
  16. }
  17. location ~ .*\.(gif|jpg|ico|png|css|svg|js)$ {
  18. root static;
  19. }
  20. }

  nginx还可以实现 限流,灰度发布等

Nginx(二)--nginx的核心功能的更多相关文章

  1. 快速掌握Nginx(二) —— Nginx的Location和Rewrite

    1 location详解 1.location匹配规则 Nginx中location的作用是根据Url来决定怎么处理用户请求(转发请求给其他服务器处理或者查找本地文件进行处理).location支持正 ...

  2. Nginx (二) Nginx的反向代理负载均衡以及日志切割

    Nginx是一个高并发,高性能的服务器,可以进行反向代理以及网站的负载均衡.这些功能的运用都在配置文件中,也就是Nginx安装目录下的conf/nginx.conf. nginx.conf 1. 先来 ...

  3. nginx(二)nginx的安装

    下载 nginx官网下载地址 把源码解压缩之后,在终端里运行如下命令: ./configure make make install 默认情况下,Nginx 会被安装在 /usr/local/nginx ...

  4. Nginx(二) nginx 无法启动

    有时候在客户端输入:nginx 但是终端会输出以下,显示启动失败 nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already i ...

  5. 二、 HBase核心功能模块。

      Hadoop 框架包含两个核心组件: HDFS 和 MapReduce 其中     HDFS                是文件存储系统,负责数据存储:     MapReduce     是 ...

  6. 【Nginx(二)】Nginx目录结构和常用的命令以及核心配置文件

    Nginx的目录结构: 默认的安装路径 : /usr/local/nginx 安装完成后,Nginx的目录结构如下: conf:   #所有配置文件的目录 nginx.conf  #默认的主要配置文件 ...

  7. 认识Nginx,理解原理和功能

    前端工程师在理解Nginx之后,就能更好的与后端工程师沟通,为了能提高工作效率,这两天抽空读了<Nginx高性能Web服务器实战教程>. 一.Nginx Nginx是一款高性能的Web服务 ...

  8. nginx配合modsecurity实现WAF功能

    一.准备工作 系统:centos 7.2 64位.nginx1.10.2, modsecurity2.9.1 owasp3.0 1.nginx:http://nginx.org/download/ng ...

  9. Nginx教程(二) Nginx虚拟主机配置

    Nginx教程(二) Nginx虚拟主机配置 1 虚拟主机管理 1.1 Nginx管理虚拟主机 虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主 ...

  10. nginx 反向代理 proxy_pass 及对比nginx与haproxy反向代理服务器功能、性能的优劣

    1.使用 proxy 去请求另一个域名下的资源,如果跨域资源也部署在同一台机器上,我们甚至可以 proxy 到 127.0.0.1,比如: location /api { proxy_pass htt ...

随机推荐

  1. 并发编程-硬件加持的CAS操作够快么?

    Talk is cheap CAS(Compare And Swap),即比较并交换.是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数--内存位置(V).预期原值(A)和新 ...

  2. JVM浅谈

    **前言** 由于先前也遇到过一些性能问题,OOM算是其中的一大类了.因此也对jvm产生了一些兴趣.自己对jvm略做了些研究.后续继续补充. **从oom引申出去** 既然说到oom,首先需要知道oo ...

  3. Python基础教程(第3版)学习笔记

    第1章.基础 1.几个小知识点 多用 help() 帮助文档 除法运算 / 除法运算,得到结果为浮点数: // 整除运算,得到整数值(向下取整): % 取余操作 (结果符号与除数符号相同),本质上: ...

  4. pod删除主要流程源码解析

    本文以v1.12版本进行分析 当一个pod删除时,client端向apiserver发送请求,apiserver将pod的deletionTimestamp打上时间.kubelet watch到该事件 ...

  5. NIO流的学习以及Buffer的相关操作

    NIO的使用 一).什么叫NIO? 定义:是一套新的Java I/O标准, 在java1.4中被纳入JDK中. 二).NIO的实现方法 NIO是基于块的, 以块为基本单位处理数据. 标准的I/O是基于 ...

  6. IPv6,无需操作就可升级?

    最近这段时间,5G 出现在你能看到的各种信息里,铺天盖地的宣传提醒着大家新一代互联网的到来.其实早在几年前 5G 就有所提及,可是为什么到现在才开始窜上热门呢?这就涉及到了 IPv6. 或许有不少朋友 ...

  7. HTTPS 原理分析——带着疑问层层深入

    HTTPS 随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议.大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关的概念有 SSL .非对称加 ...

  8. Chapter 02—Creating a dataset(Part1)

    一. 数据集 1. 在R语言中,进行数据分析的第一步是创建一个包含待研究数据并且符合要求的数据集. · 选择装数据的数据结构 · 把数据装入数据结构中 2. 理解数据集 (1)数据集通常是矩形的数据列 ...

  9. 你真的了解foreach吗?

    引言 有C#基础的,当问到循环有哪些,会毫不犹豫的说出的for.do while.foreach及while这几种,但是到具体实际开发中,我们遇到一些问题,比如:到底选择哪种?为什么选择这种?哪种好像 ...

  10. Qt的安装

    由于之前用的vs2017是集成c++环境的,加之dev c++ 编码管理起来不是很方便,Mytc (win10不支持) ,所以转而向Qt 开发工具,以下是大概安装过程 下载地址 清华源:https:/ ...