玩转Nginx

news2024/11/28 0:50:40

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;  #设置一个进程是否同时接受多个网络连接,默认为off
    worker_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_format

    sendfile        on;	 	#允许sendfile方式传输文件,默认为off,可以在http块,server块,location块使用
    #tcp_nopush     on; 	#该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输'效率'

    keepalive_timeout  65; 	#连接超时时间,默认为75s,可以在http,server,location块使用

    #gzip  on; 				#是否开启gzip压缩

    server {
        listen       8080;			#监听的端口
        server_name  localhost;		#监听的域名/ip,有多个server监听同一端口时可以通过server_name控制匹配到哪里,如果都没有匹配,则自动匹配端口的第一个
        #charset koi8-r; 			#字符集设置
        #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.html
        error_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 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }


    # HTTPS server
    server {
        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端口重定向到443
	server {
	    listen       80;
	    server_name  www.xxx.com;#填写绑定证书的域名
	    rewrite ^ https://$http_host$request_uri? permanent;    # 将http转到https
	 }
	 
	# 引入外部文件
    include servers/*;
}



内置变量

  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关键字配置,哪个服务器链接数少就会给分配谁

状态控制

状态概述
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.coloradmin.cn/o/1028645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

药品销售数据分析报告(报告资源-干货篇)

药品分析报告包含了药品研究分析报告、药品审评分析报告、药品市场分析报告、药品专利分析报告、药品上市分析报告、药品原料药分析报告、药品立项分析报告、药品投融资分析报告......所以我们在写作药品分析报告之前一定要明确需求者目的,如此方能针对核心内容进行…

Springboot登录验证的统一拦截处理

在进行Springboot项目开发的时候如何把每次请求都要验证的用户进行提取拦截统一处理 背景 如果不进行统一的拦截处理,其实这是一个非常痛苦的一件事情,因为每次用户请求你都要去进行用户的信息(用户信息存储在session中)的验证&…

【算法练习Day2】有序数组的平方长度最小子数组螺旋矩阵II

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 有序数组的平方暴力求解…

2023/9/20总结

maven maven本质是 一个项目管理工具 将项目开发 和 管理过程 抽象成 一个项目对象模型(POM) POM (Project Object Model) 项目对象模型 作用 项目构建 提供标准的自动化 项目构建 方式依赖管理 方便快捷的管理项目依赖的资源…

【SpringBoot项目】SpringBoot+MyBatis+MySQL电脑商城

在b站听了袁老师的开发课,做了一点笔记。 01-项目环境搭建_哔哩哔哩_bilibili 基于springboot框架的电脑商城项目(一)_springboot商城项目_失重外太空.的博客-CSDN博客 项目环境搭建 1.项目分析 1.项目功能:登录、注册、热销商品、用户管…

2023年8月京东户外鞋服市场(京东数据运营)

当前,户外活动的热潮使得户外鞋服市场备受青睐,带动了整个市场的高增长。 根据鲸参谋电商数据分析平台的相关数据显示,今年8月份,京东平台户外鞋服市场的销量为46万,同比增长约25%;销售额为9500万&#xf…

视觉检测系统可以检测太阳能电池片哪些方面的缺陷?

近年来,随着全球工业化进程的不断加快,能源与环境危机成为一个亟待解决的问题。为此,太阳能作为一种清洁可再生的能源,现已被广泛应用于各领域。太阳能电池片作为太阳能转换为电能的核心载体,其质量的好坏决定着电能的…

Cannot find module ‘core-js/modules/es6.regexp.constructor‘

npm run dev 之后报如下错误 解决方法:npm install core-js2 如果超时或者下载时间慢可以尝试 用cnpm install core-js2

【送书】实现可观测性平台的技术要点是什么?

文章目录 实现可观测性平台的技术要点是什么?兼容全域信号量所谓全域信号量有哪些?统一采集和上传工具统一的存储后台自由探索和综合使用数据总结 实现可观测性平台的技术要点是什么? 随着可观测性理念的深入人心,可观测性平台已经开始进入了落地阶段…

爸妈让我放弃百度,选择东软

作者:阿秀 InterviewGuide大厂面试真题网站:https://top.interviewguide.cn 这是阿秀的第「305」篇原创 小伙伴们大家好,我是阿秀。 目前已经是九月下旬了,秋招已经进入中后期了,很多公司已经开启秋招有一段时间了&…

C++实现WebSocket通信(服务端和客户端)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【postgresql】替换 mysql 中的ifnull()

数据库由mysql 迁移到postgresql,程序在执行查询时候报错。 HINT: No function matches the given name and argument types. You might need to add explicit type casts. CONTEXT: referenced column: ifnull 具体SQL: SELECT ifnull(phone,) FROM c_user p…

mysql限制用户登录失败次数,限制时间

mysql用户登录限制设置 mysql 需要进行用户登录次数限制,当使用密码登录超过 3 次认证链接失败之后,登录锁住一段时间,禁止登录这里使用的 mysql: 8.1.0 这种方式不用重启数据库. 配置: 首先进入到 mysql 命令行:然后需要安装两个插件: 在 mysql 命令行中执行: mysql> INS…

软件项目管理【UML-类图】

前言 UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作。一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。也就是说,掌握UML的20%,就能做…

Vivado中增加源文件界面中各选项的解释

文章目录 官方解释结论总结验证增加单个.v文件增加文件夹Copy sources into project 参考文献 本文对Vivado中增加源文件界面Add or Create Design Sources和Add or Create Smulaton sources中的选项Scan and add RTL include files into project、Copy sources into project和…

影响软文效果的三大因素,一定要牢记

在信息技术发展速度越来越快的今天,企业宣传时已经不再局限于传统的硬广,开始利用软文来提升曝光率,软文作为一种全新的宣传手段,具有覆盖面广、成本低且持续时间长,但是有三大因素稍不注意就会影响软文发布的效果&…

八月份跳槽了,历经华为测开岗4轮面试,不出意外,被刷了...

大多数情况下,测试员的个人技能成长速度,远远大于公司规模或业务的成长速度。所以,跳槽成为了这个行业里最常见的一个词汇。 前几天,我看到有朋友留言说,他在面试华为的测试开发工程师的时候,灵魂拷问三小…

buuctf web [极客大挑战 2019]LoveSQL

又是这样的界面,这糟糕的熟悉感,依旧使用上题套路 用户名: admin or 11# 密码: 1 有一串很像flag的字符,但是很可惜,这不是flag 看了一眼源代码,没有可以跳转的页面 要换个思路了&#xff0c…

C++ -- 学习系列 std::array 容器

1. std::array 是什么? array 容器是 C 11 标准中新增的序列容器,简单地理解,它就是在 C 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全,且效率并没有因此变差。 与数组一…

OmniPlan Pro 4 for Mac:引领项目管理的创新与高效

OmniPlan Pro 4是一款强大且高效的项目管理工具,专为Mac用户设计。它提供了一套综合性的解决方案,帮助用户在Mac上便捷地进行项目规划、追踪和管理。凭借其直观的界面,用户可以快速上手,并且能充分利用这款工具的各种功能。 规划…