玩转Nginx

Nginx是什么

Nginxengine x)是一款的Web服务器、反向代理服务器,能够实现前端Web应用的部署、请求反向代理及负载均衡处理等功能。

特点

  • 轻量,占用内存少
  • 高可靠
  • 高并发、高性能
  • 可扩展性好
  • 支持热部署
  • BSD许可证(开源、可修改再发布)

反向代理(Reverse Proxy)

  1. 客户端请求某个网络资源。
  2. 这个请求会发送到反向代理服务器。
  3. 反向代理服务器根据某种策略选择一个后端服务处理这个请求,并将处理结果返回给客户端。
    在这里插入图片描述

正向代理(Forward Proxy)

  1. 用户首先连接到正向代理服务器。
  2. 正向代理服务器再根据用户的请求内容和配置的代理地址请求相应服务器上的资源。
  3. 服务器的资源返回给正向代理服务器,然后再返回给用户。
    在这里插入图片描述

正向代理中,用户知道他们正在使用代理,并且知道代理到哪里;而在反向代理中,用户将请求的服务器理解为一个整体,并不能知道后边的请求是怎样流转的。

工作过程

  1. 启动:Nginx启动后会生成一个主进程(master process)和多个工作进程(worker process)。主进程并不处理网络请求,主要负责监控和管理工作进程。而工作进程则是实际处理网络请求的地方。
  2. 接受连接:主进程在指定的端口上监听传入的连接请求。当有新的连接请求到达时,主进程接受连接并将其分配给一个可用的子进程。
  3. 读取请求:接下来,Nginx会读取并解析这个HTTP请求。包括URI、参数、头部信息等等。
  4. 请求处理:根据配置文件中设置的规则(例如 server 块)将请求路由到相应的处理逻辑。比如静态文件直接返回,动态内容则可能需要转发给后端服务器处理。
  5. 输出响应:最后,将处理结果返回给客户端。如果此前有启用缓存,并且当前响应可以被缓存,则还会保存一份在本地。
  6. 关闭连接:完成响应之后关闭当前连接或者保持长链接等待下次使用。
  7. 日志记录:根据规则记录请求和响应的详细日志,以便于故障排除和分析。

版本介绍

  1. Nginx:2004年发布第一个版本v0.1.0,目前已更新至v1.25.2。
  2. Tengine:由阿里推出,在Nginx基础上添加了很多功能和特性,并且已经在淘宝,天猫等各大应用得到应用,相对较稳定。但是并不能跟着Nginx官方版本同步升级。
  3. openresty:支持lua脚本嵌入,可操作性更高。

绿色为Nginx共有模块,橙色为Tengine模块,紫色为OpenResty模块
在这里插入图片描述

安装&使用

  • MAC使用Homebrew安装

    1. 安装Homebrew(如已安装,请跳过)

      /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
      brew -v # 查看Homebrew版本
      brew update # 更新Homebrew
      
    2. 安装nginx

      brew install nginx
      
    3. 查看版本&启动nginx

      nginx -v #查看版本
      nginx #启动nginx
      
    4. nginx脚本及配置文件地址

      配置文件目录 /opt/homebrew/etc/nginx
      脚本位置 /opt/homebrew/bin/nginx

    5. 启动后在浏览器输入http://localhost:8080,看到如下画面,说明安装启动成功
      在这里插入图片描述

  • Linux使用编译方式安装

    1. 环境安装

      • 安装gcc环境(编译环境)
        yum -y install gcc gcc-c++ autoconf automake make
        
      • 安装pcre(nginx重写功能
        yum -y install pcre pcre-devel
        
      • 安装zlib(nginx 使用 zlib 对 http 包内容进行 gzip 压缩)
        yum -y install zlib zlib-devel make libtool
        
      • 安装openssl(用于nginx使用https)
        yum -y install openssl openssl-devel
        
    2. nginx下载&编译

      • 从官网下载nginx,建议下载最新的stable版本
        wget https://nginx.org/download/nginx-1.24.0.tar.gz
        
      • 解压
        tar -zxvf nginx-1.24.0.tar.gz
        
      • 编译
        cd nginx-1.24.0
        # 编译目录
        ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --user=nginx --group=nginx
        make  #编译
        make install  #安装
        

        参数说明:
        –prefix=/usr/local/nginx #编译安装目录
        –user=nginx #所属用户nginx
        –group=nginx #所属组nginx
        –with-http_stub_status_module #该模块提供nginx的基本状态信息
        –with-http_ssl_module #支持HTTPS

    3. nginx脚本及配置文件位置

      跟编译目录阶段配置的-prefix有关
      配置文件目录 /usr/local/nginx/conf
      脚本位置 /usr/local/nginx/sbin/nginx

    4. 启动nginx

      /usr/local/nginx/sbin/nginx
      

      启动后在浏览器输入http://localhost:8080,看到欢迎页面,说明安装启动成功

  • Nginx常用命令

    nginx 			# 启动nginx
    nginx -t 		# 检测nginx配置是否有误
    nginx -s reload # 重载nginx
    nginx -s quit 	# 从容停止
    nginx -s stop 	# 强制停止
    nginx -v 		# 查看版本
    nginx -V 		# 查看nginx详细信息,包括安装位置,已安装的模块
    

配置介绍

nginx 总配置文件地址:/opt/homebrew/etc/nginx/nginx.conf(MAC)、/usr/loca/nginx/conf/nginx.conf(Linux),配置介绍如下:

#daemon on; 			# 启用或禁用守护进程模式。
#user  nobody; 			# worker进程运行的用户和组,如果没有提供则使用nginx的master进程的用户和用户组。   
worker_processes  1; 	# 定义worker进程数量一般和cpu核数一致,默认为1。# 制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别枚举:debug|info|notice|warn|error|crit|alert|emerg
#error_log  logs/error.log  error;#pid        logs/nginx.pid; # 存放nginx守护进程的pid文件路径。events {#accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on (惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。)#multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为offworker_connections  1024; # 定义一个worker进程能够同时连接的数量,默认为512.
}http {include       mime.types; #文件扩展名与文件类型映射表default_type  application/octet-stream; #默认文件类型,默认为text/plain# 定义log格式log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  logs/access.log  main; # 使用定义好的log_formatclient_max_body_size 20M; # 客户端允许上传的文件最大为20Mkeepalive_timeout  65; 	#连接超时时间,默认为75s,可以在http,server,location块使用#gzip  on; 				#是否开启gzip压缩server {listen       8080;			#监听的端口server_name  localhost;		#监听的域名/ip,有多个server监听同一端口时可以通过server_name控制匹配到哪里,如果都没有匹配,则自动匹配端口的第一个charset utf-8; 			#字符集设置access_log  logs/host.access.log  main;	#为该server设置log#前端资源路径location / {root   html; 					#静态文件路径,一般是前端的dist目录index  index.html index.htm;	#index文件匹配try_files $uri $uri/ =404;		#定尝试查找静态文件的顺序。可以使用 try_files 指令来指定查找静态文件的顺序,如果找不到则返回指定的错误码。一般用于history模式add_header Cache-Control "public, max-age=604800"; #通过add_header添加header,比如进行缓存控制expires 7d;						#缓存过期时间etag on;						#使用etag协商缓存gzip on;						#开启gizp压缩gzip_types text/plain text/css application/javascript; #使用gzip的文件类型}#error_page  404              /404.html;# redirect server error pages to the static page /50x.htmlerror_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}# 接口反向代理location ~^ /api {proxy_pass   http://127.0.0.1;}}#负载均衡upstream mysvr {   server 127.0.0.1:7878;server 192.168.10.121:3333 backup;  #热备}server {keepalive_requests 120; #单连接请求上限次数。listen       4545;   #监听端口server_name  127.0.0.1;   #监听地址       location ^~ /vue {alias   /Users/chenjialin/Desktop/WorkSpace/test/vue-test/dist/; 	# 前端静态资源路径index  index.html index.htm;}location  ~^ /api {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。#root path;  #根目录#index vv.txt;  #设置默认页proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表proxy_send_timeout 1800s;  # 响应超时时间deny 127.0.0.1;  #拒绝的ipallow 172.18.5.54; #允许的ip           } }# HTTPS serverserver {listen       443 ssl;server_name  localhost;ssl_certificate      cert.pem; 		# 证书位置ssl_certificate_key  cert.key;		# 证书key位置ssl_protocols TLSv1.2;				# SSL 协议版本ssl_session_timeout  5m;location / {root   html;index  index.html index.htm;}}# 80端口重定向到443server {listen       80;server_name  www.xxx.com;#填写绑定证书的域名rewrite ^ https://$http_host$request_uri? permanent;    # 将http转到https}# 引入外部文件include hosts/*.conf;
}

内置变量

  1. $remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
  2. $remote_user :用来记录客户端用户名称;
  3. $time_local : 用来记录访问时间(服务器的时间);
  4. $request : 用来记录请求的url与http协议;
  5. $status : 用来记录请求状态;成功是200;
  6. $request_body : 客户端请求的body;
  7. $bytes_sent :记录发送给客户端的字节数;
  8. $body_bytes_sent :记录发送给客户端body的字节数;
  9. $content_type :请求头字段;
  10. $http_referer :用来记录从那个页面链接访问过来的;
  11. $http_user_agent :记录客户端浏览器的相关信息;
  12. $pid : 工作进程pid;

匹配规则

模式含义
location = /uri= 表示精确匹配,只有完全匹配上才能生效
location ^~ /uri^~ 开头对URL路径进行前缀匹配,并且在正则之前
location ~ pattern开头表示区分大小写的正则匹配
location ~* pattern开头表示不区分大小写的正则匹配
location /uri不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location /通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

匹配优先级:

  1. 精确匹配 =
  2. 前缀匹配 ^~,或者不加任何修饰符
  3. 按文件中顺序的正则匹配
  4. / 通用匹配
  5. 当有匹配成功时候,停止匹配,按当前匹配规则处理请求

注意:前缀匹配,如果有包含关系时,按最大匹配原则进行匹配。比如在前缀匹配:location /alocation /a/b,如有请求 http://localhost/a/b/file 将最终匹配到 location /a/b

扩展

一、root还是alias?

root和alias是nginx中配置资源路径的两种写法,但在使用时要注意他们的区别:

  1. root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
    root的处理结果是:root路径+location路径
    alias的处理结果是:使用alias路径替换location路径
    # root, 如果一个请求的URI是/a/a.html时,web服务器将会返回服务器上的/www/root/html/a/a.html的文件。
    location ^~ /a/ {root /www/root/html/;
    }
    # alias 如果一个请求的URI是/b/b.html时,web服务器将会返回服务器上的/www/root/html/b.html的文件。注意这里是直接访问html中的文件,因为alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。
    location ^~ /b/ {alias /www/root/html/;
    }
    
  2. root配置段:http、server、location、if,而alias只能在location中;
  3. 使用alias时,结尾一定要带 ‘/’,否则会找不到文件,而root后可有可无。

二、负载均衡调度策略及状态控制、

在这里插入图片描述

  1. 轮循
    upstream balanceUp {server 127.0.0.1:3003;server 127.0.0.1:3004;server 127.0.0.1:3005;
    }
    
  2. 加权
    upstream balanceUp2 {server 127.0.0.1:3003 weight=1;server 127.0.0.1:3004 weight=2;server 127.0.0.1:3005 weight=3;
    }
    
  3. IP分配:可通过ip_hash关键字进行配置,按照访问IP的hash结果分配,会导致来自同一IP的请求访问固定的一个后台服务器
    upstream balanceUp3 {server 127.0.0.1:3003;server 127.0.0.1:3004;server 127.0.0.1:3005;ip_hash;
    }
    
  4. URL分配: 通过url_hash关键字进行配置,按照访问URL的hash结果分配资源
  5. 最少连接数:通过least_conn关键字配置,哪个服务器链接数少就会给分配谁
  6. lua脚本:可以使用lua脚本对请求进行处理,并负载到不同的机器上

状态控制

状态概述
down当前的server暂不参与负载均衡
backup预留的备份服务器,当其他服务器都挂掉的时候,启用
max_fails允许请求失败的次数 ,如果请求失败次数超过限制,则进过fail_timeout 时间后从虚拟服务池中kill掉该服务器
fail_timeout经过max_fails失败后,服务暂停时间,max_fails设置后,必须设置fail_timeout 值
max_conns限制最大的连接数,用于服务器硬件配置不同的情况下
upstream	balanceUp4	{server 127.0.0.1:3003 down;server 127.0.0.1:3004 backup;server 127.0.0.1:3005 max_fails=1 fail_timeout=10s;
}

三、proxy_set_header和add_header的区别

在这里插入图片描述

# CORS
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Headers' 'X-Requested-With';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS'# 告诉服务端用户真实请求的IP
proxy_set_header            Host $host;
proxy_set_header            X-real-ip $remote_addr; # 存放用户的真实ip
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for; # 每经过一个反向代理,就会把反向代理IP存放在X-Forwarded-For里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/138445.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用FFmpeg+ubuntu系统转化flac无损音频为mp3

功能需求如上题,我们来具体的操作一下: 1.先在ubuntu上面安装FFmpeg:sudo apt install ffmpeg 2.进入有flac音频文件的目录使用下述命令: ffmpeg -i test.FLAC -c:a libmp3lame -q:a 2 output.mp3 3.如果没有什么意外的话,你就能看到你的文件夹里面已经有转化好的mp3文件了 批…

Python —— excel文件操作(超详细)

背景 很多公司还是用excel去管理测试用例的,所以为了减少重复繁琐的导出导出工作,学会如何用代码操作excel表格很实用~ 1、读取excel文件基本步骤 1、操作excel的一些库 1、xlrd:读取库,xlwt:写入,现在…

Golang Linux 安装与环境变量配置

下载 Go 二进制包 wget https://dl.google.com/go/go1.21.1.linux-amd64.tar.gz 解压文件并将其移至 /usr/local 目录 sudo tar -C /usr/local -xzf go1.20.1.linux-amd64.tar.gz -C 选项解压文件到 /usr/local 目录,查看 /usr/local/go 目录的内容 将 Go 二进…

token登录的实现

token登录的实现 我这种token只是简单的实现token,就是后端利用UUID 生成简单随机码,利用随机码作为在Redis中的键,然后存储的用户信息作为值,在每次合理请求的时候对token的有效时间进行刷新(利用拦截器)&…

IP风险查询:抵御DDoS攻击和CC攻击的关键一步

随着互联网的普及,网络攻击变得越来越普遍和复杂,对企业和个人的网络安全构成了重大威胁。其中,DDoS(分布式拒绝服务)攻击和CC(网络连接)攻击是两种常见且具有破坏性的攻击类型,它们…

python实现命令tree的效果

把所有的文档都传到了git上,但是内容过多找起来不方便,突发奇想如果能在readme中,递归列出所有文件同时添加上对应的地址,这样只需要搜索到对应的文件点击就能跳转过去了… 列出文件总得有个显示格式,所以就按照tree的来了… 用python实现命令tree的效果 首先,这是tree的效果…

【力扣每日一题】2023.9.21 收集树中金币

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一棵树,不过这棵树不是普通的树,而是无向无根树。给我们一个二维数组表示节点之间的连接关系&#xff…

Open3D 进阶(11)使用GMM-Tree算法对点云配准

GMM-Tree算法 一、算法原理1、主要函数2、参考文献二、代码实现三、结果展示1、点云初始位置2、配准后的位置四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、

快速用Python进行数据分析技巧详解

概要 一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可以节省时间,还可能挽救“生命”。 一个小小的快捷方式或附加组件有时真是天赐之物,并且可以成为真正的生产力助推器。所以&#xff0…

解密list的底层奥秘

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…

Android之MediaMetricsService实现本质(四十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

王江涛十天搞定考研词汇

学习目标: 考研词汇 学习内容: 2023-9-17 第一天考研词汇 学习时间: 开始:2023-9-17 结束:进行中 学习产出: 2023-9-17intellect智力;知识分子intellectual智力的;聪明的intellectualize使...理智化&a…

JsonUtils

1、工具类 package com.atguigu.utils;import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.Deserialization…

flink集群与资源@k8s源码分析-回顾

本章是分析系列最后一章,作为回顾,以运行架构图串联起所有分析场景 1 启动集群,部署集群(提交k8s),新建作业管理器组件 2 构建和启动flink master组件 3 提交作业,N/A

RocketMQ 消费者分类与分组

文章目录 消费者分类PushConsumerPushConsumer 内部原理使用注意事项 SimpleConsumerinvisibleDuration 消息不可见时间 消费者分组(消费者负载均衡)广播消费和共享消费负载均衡策略多个消费者消费顺序消息多消费者消费顺序消息示例 消费者分组管理关闭自…

IDEA最新激 20活23码

人狠话不多 大家好,最近Intelli Idea官方的校验规则进行了更新,之前已经成功激20活23的Idea可能突然无法使用了。 特地从网上整理了最新、最稳定的激20活23码分享给大家,希望可以帮助那些苦苦为寻找Idea激20活23码而劳累的朋友们。 本激23…

外国固定资产管理系统功能有哪些

很多公司都在寻找提高自己资产管理效益的方法。为了满足这一要求,国外的固定资产管理系统已经发展成多种形式。以下是国外一些常见的固定资产管理系统的特点:自动化和智能化:许多现代固定资产管理系统采用自动化和数字化技术,以简化流程,减少…

Windows本地mysql 的安装教程(一步一步进行安装)

目录 1 下载安装包2 安装 1 下载安装包 下载网址: https://dev.mysql.com/downloads/ 选择这个 2 安装 编写MySQL配置文件 在解压目录下新建my.ini文件 将下面文本拷贝进my,ini文件中 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 ----------…

18.备忘录模式(Memento)

意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样就可以在以后将该对象恢复到原先保存的状态。 上下文:某些对象的状态在转换过程中,可能由于某种需要,要求…

Qt重写QTreeWidget实现拖拽

介绍 此文章记录QTreeWidget的重写进度,暂时停滞使用,重写了QTreeWidget的拖拽功能,和绘制功能,自定义了数据结构,增加复制,粘贴,删除,准备实现动态刷新数据支持千万数据动态刷新&a…