nginx学习总结

article/2025/10/16 21:55:38

简介

静态资源服务器,反向代理,负载均衡等,这些场景下,nginx无处不在。但是本人是在解决单个tomcat承受不了并发量的前提下,才走进的nginx。以下都是个人的总结,如果有不对的话,可以指出来,毕竟是自学的。。。

下载nginx

http://nginx.org/en/download.html 这个就不多说了,直接下载就行了。

一、静态资源服务器

使用nginx实现静态资源服务器,我们可以通过nginx来访问静态资源。修改nginx配置(conf/nginx.conf)文件为:

  server {listen       80;server_name  www.tuesdayma.com;location / {root   html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

listen: 这个参数大家应该都不陌生,就是监听的端口号。
server_name: 浏览器上输入的域名。
location: 表示url匹配,/表示全部匹。
root: 表示匹配成功之后进入的目录。
index: 表示默认的页面。
效果显示:

我们在html这个目录下放一个mzd.html,然后开发浏览器访问。
这里写图片描述
这里写图片描述
扩展:

默认的文件夹(html文件夹)是可以改变的,nginx默认访问的是nginx.exe同一级别目录的html文件夹,我们可以修改location和root来修改这个访问的文件夹。

 location /nginx_static{root   F:/;index  index.html index.htm;    }

只要浏览器访问的是www.tuesdayma.com/nginx_static/XXXX将会访问F盘中nginx_static文件夹下面的静态资源。如果只想改变默认的访问文件夹,那么只要修改root即可。

二、根据域名访问不同路径

本地测试的话,可以修改host文件,我准备了两个域名:www.tuesdayma.com和static.tuesdayma.com。修改nginx配置文件为:

   server {listen       80;server_name  static.Tuesdayma.com;location / {root   extend/static;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}server {listen       80;server_name  www.Tuesdayma.com;location / {root   extend/www;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

效果显示:
这里写图片描述
这里写图片描述

三、反向代理

实质: 个人理解反向代理就是nginx拦截动态请求之后转发给某个tomcat。这个在集群和分布式都可以使用这个来进行配置转发。

作用: 隐藏真实的访问ip地址。我们可以看到流程图中我们访问的最多也就是公网的ip,但是具体tomcat在那个ip是不知道的,这样就能减少tomcat被攻击,提高了服务器的安全性。

流程图(个人版本):
这里写图片描述
配置文件修改:

     server {listen       80;server_name  www.tuesdayma.com;location / {proxy_pass   http://127.0.0.1:8090;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

proxy_pass: 127.0.0.1可以换成任何一个通的内网地址,这个ip表示你要真实访问的tomcat所在的位置,proxy_pass的值就表示你真正访问的域名是什么(站在公网服务器角度来说)。

四、location匹配模式及顺序

表示描述
location = /uri地址=开头表示精确匹配,只有完全匹配上才能生效。
location ^~ /uri地址^~ 开头对URL路径进行前缀匹配,并且在正则之前。
location ~ 正则表达式~开头表示区分大小写的正则匹配。
location ~* 正则表达式~*开头表示不区分大小写的正则匹配。
location /uri地址不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
location /通用匹配,拦截所有,但是优先级最低,只有前面都没有被拦截的情况下,才会被拦截到这里。

五、动静分离

静态资源: html、js、css、图片、音乐、视频等。

动态资源: 我的理解就是我们所说的接口。这里需要注意的是:themleaf、freemark这些模板引擎的html不是静态资源而应该属于动态资源(个人认为)。

实现动静分离的两种方法: 通过不同域名来拦截和location来拦截。

不同域名来拦截: 用大白话来说就是,动态请求和静态请求使用不同的域名。比如所有的静态资源都使用static.tuesdayma.com域名来访问,所有的接口都使用www.tuesdayma.com来请求。

  #动态请求拦截server {listen       80;server_name  www.Tuesdayma.com;location / {# 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;  proxy_pass   http://127.0.0.1:8080;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}#静态请求拦截server {listen       80;server_name  static.Tuesdayma.com;location /nginx_static{root   F:/;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}  }

优点:扩展性比较强,静态资源是什么都可以。

缺点:存在跨域问题,所有的html全靠ajax请求来请求接口,后端域名和前端不一致导致跨域问题。

解决:1、在nginx中把注释掉的放开;2、将tomcat的所有接口配置成域名跨域访问(这个东西个人建议可以在tomcat中写个拦截器进行拦截,然后统一处理)。

 response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");response.setHeader("Access-Control-Max-Age", "3600");response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

location来拦截: 这个只配置一个server,然后配置两个location,一个通过正则表达式拦截静态资源,还有一个拦截.do结尾的接口请求。

优点:不存在跨域问题。

缺点:扩展性太差,静态资源的类型不可确定,每增加一种类型都需要重新修改配置文件并且重启nginx。

六、负载均衡

定义: 为了解决高并发问题,负载均衡服务器拦截所有的请求,采用负载均衡算法,分配到不同的tomcat上。

作用: 减少单台tomcat的压力

upstram XXX: 表示负载均衡服务器,也是通常再说的上游服务器

三种基本的负载均衡算法: 轮询、权重、ip绑定。

轮询: 这是nginx默认的负载均衡算法,简单来说就是从上到下按顺序轮流(127.0.0.1:8082轮完就轮到127.0.0.1:8081,127.0.0.1:8081轮完就轮到127.0.0.1:8082)。注意:mzd的地方需要保持一致。。。

 upstream  mzd {server 127.0.0.1:8082;server 127.0.0.1:8081;}server {listen       80;server_name  www.tuesdayma.com;location / {proxy_pass  http://mzd;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

权重: 我的理解就是哪台服务器配置好就多轮几次,或者你就想某个服务器多轮几次。简单来说就是轮到次数的比例,数字越大表示轮到的概率越大。(个人认为weight都设置为1的时候和轮询没什么区别)

 upstream  mzd {server 127.0.0.1:8082 weight=2;server 127.0.0.1:8081 weight=3;}server {listen       80;server_name  www.tuesdayma.com;location / {proxy_pass  http://mzd;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

ip绑定: 我的理解就是你第一次访问的时候,nginx会根据你的ip通过哈希算法,算出某个值,然后取分配哪个tomcat,当你第二次访问,第三次访问。。。之后的任何一次访问都是去请求那个第一次访问的tomcat。

 upstream  mzd {server 127.0.0.1:8082 ;server 127.0.0.1:8081 ;ip_hash;}server {listen       80;server_name  www.tuesdayma.com;location / {proxy_pass  http://mzd;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

问题1: 可能在测试负载均衡的时候,你可能会发现浏览器一直在访问同一个tomcat,这时候你第一反应就是我的负载均衡配置的有问题。。。其实这是正常的反应,不过按上面的方法配的应该是没问题的,其实有两种可能:一就是确认一下所有的服务器都能不能正常访问;二不要点浏览器上面的刷新按钮或者什么重新加载之类的,还有Ctrl+F5,这都可能会导致这个问题(本人被坑了一下午,还以为是负载均衡哪里配错了。。。)。

问题2:故障转移问题,我想应该都会有一个疑问,就是负载均衡的时候,其中一个请求被分配到的那个tomcat挂了之后,会怎么样???上面说的三种模式结果都是这样。。。。
这里写图片描述
其实nginx有默认故障转移机制的,但是很慢(本人测了一下,默认好像是要60秒左右,一分钟后就有自动发送到其他tomcat上去了,其实就是proxy_connect_timeout的默认值)。。。个人觉得生产环境根本不可能用nginx默认的故障转移机制的,是在等待太久了。。。

解决: 设置这些参数之后就能快点。。。

    server {listen       80;server_name  www.tuesdayma.com;location / {proxy_pass  http://mzd;proxy_connect_timeout 3s;proxy_read_timeout 5s;proxy_send_timeout 3s;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

proxy_connect_timeout: nginx向tomcat发起连接,即第一次握手等待tomcat回应的超时时间,tomcat的这次回应只是说明能正常连接,并没有响应具体请求的内容。

proxy_send_timeout: nginx将请求发送给tomcat的超时时间,应该是确认能正常连接之后向tomcat发送真正的业务请求。

proxy_read_timeout: tomcat接受到真正业务请求之后,nginx等待tomcat响应具体请求的内容的超时时间。差不多可以理解tomcat处理具体请求时间的最大值,也就是tomcat必须在这个时间内做完业务逻辑处理。

注意: 以上三个参数的都是个人的理解,因为网上对着三个参数什么都有。。。个人觉得proxy_read_timeout应该设置为20秒左右,因为针对于不同的业务处理,如果比较复杂,则耗时会比较长。


http://chatgpt.dhexx.cn/article/NSVLWfmt.shtml

相关文章

Nginx入门学习

Nginx快速入门 Nginx快速入门,了解什么是Nginx,正向代理,反向代理,负载均衡的概念,学会Nginx的安装和常用的命令,并且能实际场景应用Nginx 什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和…

Nginx学习

目录 1. Nigix简介1.1 什么是 Nginx?1.2 Nginx的作用?1.3 正向代理和反向代理1.4 Windows上安装Nginx1.5 Linux上安装Nginx 2. Nginx常用命令docker 部署nginx 1. Nigix简介 1.1 什么是 Nginx? Nginx是一个高性能的HTTP和反向代理web服务器(随着客户…

Nginx教程(小白必看,看了必会,不看血亏),

Notice 测试请打开浏览器禁止缓存 Notice:再使用前,请打开浏览器 F12 然后网络 然后点禁用缓存,避免nginx配置后磁盘缓存的情况。而且,请确认host没问题。 备注:你本地设置的host对服务器反向代理后的就没用了 一、介绍 概述 Nginx是lgor…

学习Nginx,看完这篇超详细的文章就够了

目录 本文简介一、Nginx的基本概念1.1、Nginx是什么?1.2、Nginx能帮助我们做些什么?1.3、Nginx的特性 二、Nginx的安装2.1、环境介绍2.2、安装Nginx2.3、Docker安装运行Nginx 三、Nginx的常用命令介绍3.1、操作Nginx【Centos6和7通用】3.2、命令总结 四、…

html img调用js,html调用js变量 如何在html中输出js文件中的变量

html页面代码中怎么调用js变量?html页面代码中怎么调用js变量,例如 在html代码中插入js代码: a=取浏览你把index1.js 中的onReady 去掉,把index1.js改成 function index1() { 请确定他们在一个文件夹下,然后就可以直接调用了 直接把两段代码合并 。 希望能给你帮助。 要实现…

如何在html中使用js

1.使用script标签&#xff0c;将js代码写入标签(html和js没有分离) 在 HTML 中&#xff0c;JavaScript 代码必须位于 <script> 与 </script> 标签之间。 <script>console.log(Number.MAX_VALUE)var s hello worldvar n 10var u undefinedvar l nullvar …

html中script相互调用,HTML调用JavaScript

仅使用HTML和CSS创建动态网页很困难。例如&#xff0c;仅使用CSS是无法很好完成下拉菜单和滑入式页面的&#xff0c;这是一项很难的技术。此时就需要使用JavaScript&#xff0c;那么如何在HTML中调用JavaScript&#xff1f;下面本篇文章就来给大家介绍一下在HTML中调用JavaScri…

html5文档加载前调用函数,html调用javascript外部文件显示函数未定义

在html的head标签中调用了外部js文件&#xff0c;路径没有错&#xff0c;浏览器中也没有报错。但是触发事件调用函数的时候却显示loginWarm函数未定义。怎么回事&#xff0c;查了很久都没有一个正确的解决办法 οninput"setCustomValidity();" οnchange"loginW…

html引入css js,html中如何调用css和js?

html中如何调用css和js&#xff1f;下面本篇文章就来给大家介绍一下在html中调用css和js的方法。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对大家有所帮助。 在HTML中调用css的方法 行内样式 在HTML标签的style属性中设定CSS样式 行内样式 内嵌式…

在HTML文档中使用JavaScript的方法详解

在HTML文档中使用JavaScript的方法详解 本文详细介绍&#xff0c;在HTML文档&#xff08;也称为HTML页面或网页&#xff09;中使用JavaScript脚本代码的多种方法。 假设要用JS生成字符☆直角三角形 实现JavaScript代码为&#xff1a; function RightTriangle(){ for(var j1;j&…

html中怎么引用js语言,HTML怎么引用javascript?

仅使用HTML和CSS创建动态网页很困难&#xff1b;例如&#xff0c;仅使用CSS是无法很好完成下拉菜单和滑入式页面的。此时就需要使用JavaScript。下面本篇文章就来给大家介绍一下在html中引用javascript的方法&#xff0c;希望对大家有所帮助。 在HTML中引用JavaScript的方法有两…

html中调用javascript函数,如何在HTML中调用JavaScript函数

如何在HTML中调用JavaScript函数? 在HTML文档中有很多方法可以调用JavaScript函数,这也不是一件容易的事。首先,我们使用了最简单的方法之一来调用HTML文档中的JavaScript函数: 在这种方法中,我们将在HTML文档的头部创建并定义一个函数。要在html文档中调用此函数,我们必…

html怎么引入JavaScript代码

学习了HTML入门教程之后&#xff0c;我们都知道HTML页面是静态的&#xff0c;要实现某些动态效果&#xff0c;就要引入JavaScript。本节课就来给大家讲解一下怎样在HTML页面中引入JavaScript。 这节课不涉及太多编程方面的知识&#xff0c;先给大家说一下引用方式&#xff0c;这…

IOS逆向之frida安装

首先手机要越狱&#xff0c;这个就不说了&#xff0c;博主就是咸鱼搞了个160的苹果6&#xff0c; 自己刷到苹果6支持最新的12.5.7版本后越狱&#xff1b; 谁让他低版本&#xff0c;不支持 CrackerXI砸壳呢&#xff0c;当时你要是使用 frida-ios-dump 也是可以的&#xff1b; …

android ios 逆向工程,iOS 逆向工程--懒人的砸壳方法

iOS 砸壳教程(iOS 9.0) 砸壳后可以对APP进行反编译, 可以看到ipa内头文件, 具体请查看我之前写的:反编译 iOS APP .当然, 关于逆向工程有太多的教程了, 但一般都比较复杂, 本着能偷懒就偷懒, 能不造轮子就不造轮子的坚定理念, 我正努力地学习偷懒... 声明:本文纯粹技术上的探讨…

iOS逆向——带你深入了解LLDB调试

写在前面 日常开发中经常会用到LLDB调试&#xff0c;可能用的最多的命令就是po&#xff0c;而在逆向领域中根本不可能让你在代码中下断点调试&#xff0c;于是乎LLDB就成了非常重要的手段 一、LLDB LLDB&#xff08;Low Lever Debug&#xff09;的缩写&#xff0c;是默认内置…

ios逆向小记

ios逆向小记 定位关键点 抓包 利用charles进行抓包来定位一些关键字符串&#xff0c;其中抓包配置如下&#xff1a; reveal reveal分析图层界面&#xff0c;找到图层所属类&#xff0c;利用frida-trace hook该类进行栈回溯确定关键点&#xff0c;同时可以通过图层类名称来推…

iOS逆向 和班尼特福迪一起攻克难关(unity)

Getting Over It这款游戏发布都五年了&#xff0c;热度也不是那么低&#xff0c;我寻思怎么就没人折腾iOS的goi呢&#xff0c;改个重力啥的我到现在都没发现。。 项目地址 dnSpy il2cppdumper IDA Pro 汇编码转机器码工具 密码:i36p 先从安卓goi里面拿到Assembly-CSharp.dl…

IOS逆向需用到的工具汇总

1、Mac 上自带的一些命令工具 file&#xff1a;查看Mach-O的文件类型 file 文件路径 otool&#xff1a;查看Mach-O特定部分和段的内容 otool -L Mach-O文件 # 查看当前 Mach-O 文件的动态链接库。 lipo&#xff1a;常用于多架构Mach-O文件的处理 查看架构信息&#xff1a;lip…

IOS 逆向分析基础篇

一、环境准备 已经越狱的IOS手机一台&#xff0c;如果使用的是Windows笔记本另外需要mac 虚拟机 1、IOS 手机越狱及环境配置 IOS12.0 以前版本&#xff0c;可以用impactor 写入签名&#xff0c;安装越狱IPA包 IOS 12以上版本&#xff0c;并小于IOS12.1.2&#xff0c;此时需要…