qidao123.com技术社区-IT企服评测·应用市场

标题: 百万架构师第四十三课:Nginx:Nginx 应用实战|JavaGuide [打印本页]

作者: 飞不高    时间: 2025-2-25 18:47
标题: 百万架构师第四十三课:Nginx:Nginx 应用实战|JavaGuide
百万架构师系列文章阅读体验感更佳

原文链接:https://javaguide.net

公众号:不止极客

课程目标:

反向代理


​        我们把请求发送到 proxy (代理服务器),转发到后端的服务器上,返回到代理,返回到欣赏器,去做一个解析。
作用:
nginx.conf
  1. #keepalive_timeout  0;
  2. keepalive_timeout  65;
  3. # 扫描这个目录下的配置文件(配置在 HTTP 里边)
  4. include extra/*.conf;
复制代码
注意: 扫描目录的路径一定要设置正确!(相对路径,相对于 nginx.conf 的路径)
  1. [root@Darian1 nginx]# vim conf/nginx.conf
  2. [root@Darian1 nginx]# mkdir extra
  3. [root@Darian1 nginx]# cd extra/
  4. [root@Darian1 extra]# vim proxy_dem o.conf
  5. server{
  6.         listen 80;
  7.         server_name localhost;
  8.         location /{
  9.                 proxy_pass http:192.168.40.128:8080;   
  10.         }
  11. }
复制代码
​        nginx 反向代理的指令不需要新增额外的模块,默认自带 proxy_pass 指令,只需要修改设置文件就可以实现反向代理。
​         proxy_pass 既可以是ip地址,也可以是域名,同时还可以指定端口
Nginx反向代理实战
NginxTomcat
proxy_demo.conf
  1. server {
  2.     listen 80;
  3.     server_name localhost;
  4.     location /  {
  5.         proxy_pass http://192.168.40.128:8080;
  6.         # 拿到端口
  7.         proxy_set_header Host $host;
  8.         # 拿到远端的 IP,真实的IP
  9.         proxy_set_header X-Real-IP $remote_addr;
  10.         # 这个可以让 tomcat 拿到所有代理服务器的地址。如果有多个,那么他就可以拿到多个
  11.         proxy_set_header X-Forworded-For $proxy_add_x_forwarded_for;
  12.     }
  13. }
复制代码

Nginx 可以利用 Http 的 header 来转达一些信息。
负载均衡

​        网络负载均衡的大致原理是利用一定的分配计谋将网络负载平衡地分摊到网络集群的各个操作单元上,使得单个重负载任务能够分担到多个单元上并行处理,使得大量并发访问或数据流量分担到多个单元上分别处理,从而减少用户的等候相应时间
负载均衡器

​        upstream 是 Nginx 的 HTTP Upstream 模块,这个模块通过一个简朴的调度算法来实现客户端IP到后端服务器的负载均衡
  1. .nginx -s reload
复制代码
JSP 页面的设置

修改 JSP 来提示自己
  1.     <h1>${pageContext.servletContext.serverInfo}</h1>
  2. <h1 > 请求的地址:  <%=request.getRemoteAddr()%></h1>
  3. <h1 > 请求的真实IP:  <%=request.getHeader("X-Real-IP")%></h1>
  4. <h1 > 请求的转发的代理:  <%=request.getHeader("X-Forworded-For")%></h1>
  5.    
复制代码
演示效果
  1. upstream tomcat{
  2.     # 对应我们后端服务器真实的 IP 地址
  3.     server 192.168.40.128:8080;
  4.     server 192.168.40.131:8080;
  5. }
  6. server {
  7.     listen 80;
  8.     server_name localhost;
  9.     location /  {
  10.         proxy_pass http://tomcat;
  11.         # 拿到端口
  12.         proxy_set_header Host $host;
  13.         # 拿到远端的 IP,真实的IP
  14.         proxy_set_header X-Real-IP $remote_addr;
  15.         # 这个可以让 tomcat 拿到所有代理服务器的地址。如果有多个,那么他就可以拿到多个
  16.         proxy_set_header X-Forworded-For $proxy_add_x_forwarded_for;
  17.     }
  18. }
复制代码
随机访问。会转发到差别的 Tomcat 上边。
其他设置信息

proxy_next_upstream

​        这个设置表示当向一台上游服务器转发请求出现错误的时候,继续换一台上游服务器来处理这个请求。
​        默认情况下,上游服务器一旦开始发送相应数据, Nginx 反向代理服务器会立刻把应答包转发给客户端。因此,一旦Nginx开始向客户端发送相应包,如果中途出现错误也不允许切换到下一个上游服务器继续处理。这样做的目的是保证客户端只收到来自同一个上游服务器的应答。
proxy_connect_timeout

用于设置nginx与upstream server的连接超时时间,比如我们直接在location中设置
proxy_connect_timeout
1ms, 1ms很短,如果无法在指定时间建立连接,就会报错。
proxy_send_timeout

​        向后端写数据的超时时间,两次写操作的时间间隔如果大于这个值,也就是过了指定时间后端还没有收到数据,连接会被关闭
proxy_read_timeout
  1. upstream tomcat{
  2.     # 如果想要用 ip hash 算法
  3.     # ip_hash;
  4.     # 对应我们后端服务器真实的 IP 地址
  5.     # 允许他的失败次数
  6.     # 失败以后多长时间以内不再去请求它
  7.     server 192.168.40.128:8080 max_fails=2 fail_timeout=60s ;
  8.     server 192.168.40.131:8080 ;
  9. }
  10. server {
  11.     listen 80;
  12.     server_name localhost;
  13.     location /  {
  14.         proxy_pass http://tomcat;
  15.         # 拿到端口
  16.         proxy_set_header Host $host;
  17.         # 拿到远端的 IP,真实的IP
  18.         proxy_set_header X-Real-IP $remote_addr;
  19.         # 这个可以让 tomcat 拿到所有代理服务器的地址。如果有多个,那么他就可以拿到多个。
  20.         proxy_set_header X-Forworded-For $proxy_add_x_forwarded_for;
  21.         # 当我们的 niginx 对后端的请求进行转发的时候,哪些场景下允许进行切换。
  22.         proxy_next_upstream error timeout http_500 http_503;
  23.         # Nginx 和我们后端上游的服务器之间的连接超时时间————发起握手等候响应超时时间
  24.         proxy_connect_timeout 60s;
  25.         #  后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
  26.         proxy_send_timeout 60;
  27.         # 连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器>处理请求的时间)
  28.         proxy_read_timeout
  29.     }
  30. }
复制代码
从后端读取数据的超时时间,两次读取操作的时间间隔如果大于这个值,那么nginx和后端的连接会被关闭,如果一个请求的处理时间比力长,可以把这个值设置得大一些
proxy_upstream_fail_timeout

设置了某一个upstream后端失败了指定次数(max_fails)后,在fail_timeout时间内不再去请求它,默认为10秒
语法 server address [fail_timeout=30s]
  1. upstream backend {
  2.     #服务器集群名字
  3.     #server 192.168.218.129:8080 weight=1 max_fails=2 fail_timeout=600s;
  4.     #server 192.168.218.131:8080 weight=1 max_fails=2 fail_timeout=600s;
  5. }
复制代码
Nginx动静分离

什么是动静分离

​        后端的应用一定会存在动态资源和静态资源。必须依赖服务器生存的我们称为动态资源。不需要依赖容器的比如 css/js 或者图片等,这类就叫静态资源。
​        我们可以把静态资源放在 Nginx 上。静态资源不会频仍变动。

静态资源的类型
  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
​        在 Nginx 的 conf 目录下,有一个 mime.types 文件
​        用户访问一个网站,然后从服务器端获取相应的资源通过欣赏器进行解析渲染末了展示给用户,而服务端可以返回各种类型的内容,比如 xml、jpg、png、gif、flash、MP4、html、css 等等,那么欣赏器就是根据 mime-type 来决定用什么形式来展示的
​        图片可以放在 CDN ,(许多都是放在 阿里云 上)
​        服务器返回的资源给到欣赏器时,会把 媒体类型 告知欣赏器,这个告知的标识就是 Content-Type ,比如 Content-Type:text/html 。
演示代码
  1. location ~ .*\.(js|css|png|svg|ico|jpg)$ {
  2.     valid_referers none blocked 192.168.11.160 www.gupaoedu.com;
  3.     if ($invalid_referer) {
  4.         return 404;
  5.     }
  6.     root static-resource;
  7.     expires 1d;
  8. }
复制代码

动静分离的好处


缓存

Cache-Control / Pragma / Expries
服务端可以告诉客户端,有没有这些信息,需不需要缓存。

​        谷歌欣赏器,拿到服务器的信息,自动缓存。什么时候过期是由欣赏器决定的。实际过程中,仍然需要我们自己去决定缓存。
​        当一个客户端请求web服务器,请求的内容可以从以下几个地方获取:服务器、欣赏器缓存中或缓存服务器中。这取决于服务器端输出的页面信息。
​        欣赏器缓存将文件保存在客户端,好的缓存计谋可以减少对网络带宽的占用,可以提高访问速度,提高用户的体验,还可以减轻服务器的负担nginx缓存设置
Nginx缓存设置

​        Nginx可以通过expires设置缓存,比如我们可以针对图片做缓存,因为图片这类信息根本上不会改变。
在location中设置expires
格式: expires 30s|m|h|d
  1. location ~ .*.(jpg|jpeg|gif|bmp|png|js|css|ico)$ {
  2.     root static;
  3.     expires 1d;
  4. }
复制代码
压缩

Gzip

​        我们一个网站一定会包含许多的静态文件,比如图片、脚本、样式等等,而这些 css/js 可能本身会比力大,那么在网络传输的时候就会比力慢,从而导致网站的渲染速度。因此 Nginx中提供了一种 Gzip 的压缩优化手段,可以对后端的文件进行压缩传输,压缩以后的好处在于能够降低文件的大小来提高传输服从。
我们在一些网络上打开某些 CSS,然后实际大小一样平常大于它的传输大小。

设置信息

演示效果

nginx.conf
  1. # 扫描这个目录下的配置文件
  2. include    extra/*.conf;
  3.         # 是否打开 gzip
  4.     gzip on;
  5.     # 超过多长长度再进行压缩
  6.     gzip_min_length 5K;
  7.     # 压缩的等级越高,压缩后的文件越小,占用的 CPU 越高
  8.     gzip_comp_level 3;
  9.     # 对哪些文件做压缩
  10.     gzip_types application/javascript image/jpeg;
  11.     # 设置缓冲区,按照我们我们指定大小的倍数去申请内存,
  12.     # 按照我们原始文件的大小,以 32K 为单位的四倍去申请内存。
  13.     gzip_buffers 4 32k;
  14.     # 是否传输 “vary: Accept-Encoding” 的文件头标志
  15.     # 根据客户端的头去判断我们是不是要去做压缩。
  16.     gzip_vary on;
  17. }  
复制代码
​        有些文件是很难压缩的。 有些文件是没有必要做压缩的。比如说 图片,视频 等。肯定要对图片做压缩,末了会失真的。
​        图片一样平常要放在 CDN 上的。
防盗链

​        一个网站上会有许多的图片,如果你不希望其他网站直接用你的图片地址访问自己的图片,或者希望对图片有版权保护。再或者不希望被第三方调用造成服务器的负载以及消耗比力多的流量问题,那么防盗链就是你必须要做的。
​        CSDN 上的文章,粘贴下来,图片展示不出来,微信公众号的文章粘贴出来,图片也表现不出来。
refer 是可以进行修改的。
防盗链设置

在Nginx中设置防盗链其实很简朴,
语法: valid_referers none | blocked | server_names | string ...;
默认值: —
上下文: server, location
​        “Referer”请求头为指定值时,内嵌变量 $invalid_referer 被设置为空字符串,否则这个变量会被置成“1”。查找匹配时不区分大小写,此中 none 表示缺少 referer 请求头、 blocked 表示请求头存在,但是它的值被防火墙或者代理服务器删除、server_names表示referer请求头包含指定的虚拟主机名。
  1. location ~ .*.(gif|jpg|ico|png|css|svg|js)$ {
  2.     valid_referers none blocked 192.168.11.153;
  3.     if ($invalid_referer) {
  4.         return 404;
  5.     }
  6.     root static;
  7. }
复制代码
​        需要注意的是伪造一个有效的“Referer”请求头是相当容易的,因此这个模块的预期目的不在于彻底地阻止这些非法请求,而是为了阻止由正常欣赏器发出的大规模此类请求。还有一点需要注意,即使正常欣赏器发送的合法请求,也可能没有“Referer”请求头。
​        主要是防止转载,COPY 来 COPY 去的,量级的增长是很恐怖的。
跨域访问

​        他不光可以办理请求转发的问题。动静分离、防盗、限流。做集群。
​        什么叫跨域呢?如果两个节点的协议、域名、端口、子域名差别,那么进行的操作都是跨域的,欣赏器为了安全问题都是限制跨域访问,所以跨域其实是欣赏器本身的限制。
阿里云的图片库也是跨域的,需要实现对应的方法。

办理办法

修改 proxy_demo.conf 设置
  1. server{
  2.     listen 80;
  3.     server_name localhost;
  4.     location / {
  5.         proxy_pass http://192.168.11.154: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.         proxy_send_timeout 60s;
  10.         proxy_read_timeout 60s;
  11.         proxy_connect_timeout 60s;
  12.         # 允许来自所有的访问地址
  13.         add_header 'Access-Control-Allow-Origin' '';
  14.         # 支持的请求方式
  15.         add_header 'Access-Control-Allow-Methods' 'GET,PUT,POST,DELETE,OPTIONS';
  16.         #  支持的媒体类型   
  17.         add_header 'Access-Control-Allow-Header' 'Content-Type,';
  18.     }
  19.     location ~ .*.(gif|jpg|ico|png|css|svg|js)$ {
  20.         root static;
  21.     }
  22. }
复制代码
QA

百万架构师系列文章阅读体验感更佳

原文链接:https://javaguide.net

公众号:不止极客

泉源于:  https://javaguide.net
微信公众号:不止极客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4