当前位置: 首页 > news >正文

Nginx 学习笔记

1. Nginx简介

Nginx 是一个高性能的Http和反向代理服务器。也是一个IMAP/POP3/SMTP等邮件代理服务器。

特点:

  • 占有内存少
  • 并发能力强
  • 安装非常的简单
  • 配置文件非常简洁(还能够支持perl语法)
  • Bug非常少
  • 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。还能够不间断服务的情况下进行软件版本的升级。
  • Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。

提供的服务:

  • 动静分离(web 服务)
  • 负载均衡 (反向代理)
  • web 缓存
  • 内存少,并发能力强(支持50,000 个并发)

2. Nginx 安装(Linux 环境)

nginx官网
https://nginx.org/en/download.html
nginx下载地址
https://nginx.org/download/nginx-1.22.1.tar.gz

# 在/root目录建立service文件夹
mkdir service# 进入service目录
cd service# 在服务器上进行下载
curl -o nginx-1.22.1.tar.gz https://nginx.org/download/nginx-1.22.1.tar.gz# 解压
tar -zxvf nginx-1.22.1.tar.gz# 进入nginx目录
cd nginx-1.22.1# 安装nginx需要的环境
yum install pcre pcre-devel -y
yum install openssl openssl-devel -y
yum -y install gcc-c++# 检查配置文件
#配置HTTPS时使用
./configure --with-http_ssl_module
#配置GOLANG语言时使用
./configure --with-http_v2_module
#启用TCP/UDP代理时使用
./configure --with-stream# 编译
make# 安装
make install# 配置全局环境变量
vim /etc/profile
#在最后一行添加:(shift+g 定位到最后一行,按 o 在最后一行插入)
export PATH=$PATH:/usr/local/nginx/sbin
#按esc进入命令模式,:wq保存文件,退出vim# 使文件生效
source /etc/profile# 启动 nginx
nginx# 查看启动情况
netstat -ntlp# 如果修改了nginx的配置,需要执行以下指令,才能生效
nginx -s reload

启动后,进程id存放位置 /usr/local/nginx/nginx.pid

查看文件 cat nginx.pid

关闭方式 ./nginx -s stop 原生命令

杀死进程:
kill + 参数 + pid 形式
如 :
kill -9 pid 强制停止服务
kill -TERM pid 快速停止服务
kill -QUIT pid 平缓停止服务

信号处理命令:
./nginx -s + ( stop, quit, reopen, reload)

注意事项:nginx服务器,需要虚拟机开放80端口的访问
防火墙配置 (同样适用于开放8080 8081端口)
firewall-cmd --list-all 查看当前配置
firewall-cmd --add-service=http --permanent 开放http访问
firewall-cmd --add-port=80/tcp --permanent 开放80端口
firewall-cmd --reload 重启防火墙保存

3. Nginx配置

分为三部分,全局块、events块、http块。

3.1 全局块

全局指令,指定运行时的用户组、进程id存放位置、日志存放位置、worker process数量等等。

# 配置用户或者用户组
#user  nobody;# 允许生成的进程数
worker_processes  1;# 日志路径设置  可以配置级别
#  debug | info | notice | warn | error | crit 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;# 存储进程id的文件地址
#pid        logs/nginx.pid;

3.2 events块

影响nginx服务器和用户网络连接的配置,比如每个进程的最大连接数,选取哪种事件驱动模型,以及在网络连接过程中,是否开启多个,是否序列化等等。

events {# 每个进程的最大连接数worker_connections  1024;
}

3.3 http块

配置代理、缓存、日志等绝大部分功能的地方,可以嵌套多个server块,而不同的server可以对应不同的域名(虚拟主机)

4. 虚拟主机的配置

虚拟主机:同一台nginx服务器,可以支持多个网站的运行,每个虚拟主机之间都相互独立,具有完整功能。

http {# 对应虚拟主机的配置server{# 监听端口listen       80;# 监听域名server_name  localhost;# 定位出路径或文件地址location / {# 相对路径root   html;# 默认跳转的首页地址index  index.html index.htm;}}server{}
}

配置指定域名(www.test123.com),访问到虚拟机上的页面

1)在安装目录下,创建文件夹,如: mkdir test123

  1. 创建页面, index.html
  2. 更改配置
http {# 对应虚拟主机的配置server{# 监听端口listen       80;# 监听域名server_name  test123.com;# 定位出路径或文件地址location / {# 相对路径root   test123;# 默认跳转的首页地址index  index.html;}}}
  1. 给域名配置ip地址的映射
    更改hosts文件 (C:\Windows\System32\drivers\etc)

5)浏览器输入虚拟机地址或者域名 duyi123.com ,均能返回自定义页面

5. 日志配置

通过日志,可以获取到用户地址信息、跳转来源、终端、以及url访问量等等。

    #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;

日志demo

192.168.1.11 - - [04/Mar/2020:13:03:39 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36"
用途
remote_addr客户端的ip地址
remote_user客户端的用户名称
time_local访问时间和时区
request请求方法
status响应状态码 如:200
body_bytes_sent主体内容字节数 如:612
http_referer记录是从哪个链接访问过来的
http_user_agent用户使用的代理(浏览器)
http_x_forwarded_for通过代理服务器来记录客户端的ip地址

可以通过脚本实现日志切割(每天生成一份日志)
重命名日志文件,让nginx重新从配置中读取日志文件名,在新的日志文件中记录日志

6. 正向代理和反向代理

正向代理:客户端client知道服务器地址,但不能直接访问,需要通过代理服务器proxy去访问远程服务器server。

使用场景:

  1. 可以访问原来无法访问的资源
  2. 做缓存使用,加快访问速度
  3. 对客户端授权或记录访问信息等

反向代理:代理服务器接收用户发送的请求,然后再转发给内部网络的服务器,将服务器的结果返回给客户端,这个过程用户是感受不到的。

使用场景:

1)保证内网的安全,阻止web攻击。
2)负载均衡,优化网站的负载(处理能力)

7. 反向代理配置

前提:系统中安装好jdk和tomcat(配置好环境变量)

已安装的目录地址:
1) jdk路径 /usr/local/java/
2) tomcat路径 /usr/local/tomcat/
启动方式 /usr/local/tomcat/bin 执行 ./startup.sh
关闭方式 执行./shutdown.sh
验证方式 虚拟机ip:8080 可以看到tomcat页面

原需求
访问域名test123.com 显示 nginx路径/test123/index.html页面
现需求
访问域名test123.com 显示 tomcat 首页

实现方式

	location / {#root   test123;proxy_pass  http://127.0.0.1:8080;#index  index.html;}

注意:更改配置文件nginx.conf后,执行重加载命令
./nginx -s reload

进阶需求
一台nginx连接多台tomcat,当域名下对应不同路径时,分发给不同的tomcat处理

实现方式

a) 拷贝一个tomcat安装目录,修改server.xml配置中的三处端口
b) 分别在webapps目录下,创建tomcat1和tomcat2目录,放置index.html(显示不同的tomcat以及其端口),启动两个tomcat
c) 通过浏览器访问
ip:8080/tomcat1/index.html
ip:8081/tomcat2/index.html
这两个地址都可以展示出内容
d) 修改nginx配置文件并重加载

	location ~ /tomcat1/ {proxy_pass  http://127.0.0.1:8080;}location ~ /tomcat2/ {proxy_pass  http://127.0.0.1:8081;}

e) 浏览器验证,访问
http://duyi123.com/tomcat1/index.html http://duyi123.com/tomcat2/index.html
均能找到对应页面。

最终实现通过不同的路径,映射到不同的tomcat目录下

8. 负载均衡

什么是负载均衡?

  • 当客户端发送请求时,会先到Nginx,然后Nginx会将请求分发到后台不同的服务器上。
  • 如果后台的服务器群中有一个宕机了,那么Nginx会自动忽略这台服务器,不会将请求再次分发到这台服务器上。
  • 如果有新加入的服务器,Nginx也会将请求分发到这台服务器上。

早期使用DNS(域名解析系统)做负载,具体而言,给客户端解析不同的ip地址,让流量直接到达服务器。

clientN - 负载均衡器(load balancer) - 调度算法 - serverN

优点:
1) 通过健康检查,避免单点故障
2) 当发现节点故障时,从集群中移除,保证应用的高可用

四层负载均衡,在OSI模型的传输层,主要是转发。
七层负载均衡,在OSI模型的应用层,主要是代理。

负载均衡器可以处理四大类型的请求,HTTP/HTTPS/TCP/UDP等。

负载均衡的调度算法

1) 轮询, 相当于将服务器从第1台到最后1台,行成一个环状,每接收一笔请求,则从1台开始循环遍历。
2)最小连接,优先选择连接数最少的服务器,适用于会话时间较长的业务处理。
3)ip映射,根据请求的ip地址进行散列,让同一ip下的请求都映射到同一服务器上,可以解决session问题。(粘性会话)

实现

当访问 192.168.1.20/lb/index.html时,通过负载均衡,让请求平均分配到8080和8081端口中

1) 分别找到两个tomcat的安装目录,如/usr/local/tomcat/webapps
创建lb目录, mkdir lb
创建访问页面, cp tomcat1/index.html lb
查看页面内容, cat lb/index.html

2) nginx.conf配置的修改

    # http块的层级下upstream myserver{# server列表的地址和端口server 192.168.1.20:8080;server 192.168.1.20:8081;}server {listen       80;server_name  192.168.1.20;#charset koi8-r;#access_log  logs/host.access.log  main;location / {# 将请求映射到负载均衡器中   参数为配置的upstream名称proxy_pass http://myserver;}}

3) 浏览器访问 http://192.168.1.20/lb/index.html

以上,是默认的轮询调度算法。

如果需要额外设置权重,某个服务器处理的更多些,使用weight,默认值是1。

   upstream myserver{# server列表的地址和端口server 192.168.1.20:8080 weight=2;server 192.168.1.20:8081 weight=1;}

如果需要根据ip地址,固定server处理,可以使用ip_hash。

   upstream myserver{server 192.168.1.20:8080  weight=2;server 192.168.1.20:8081  weight=1;ip_hash;}

9. 动静分离

将动态和静态请求分离开,不能单纯的理解为动态页面和静态页面的物理分离。

如果是静态资源请求,直接查找nginx上的静态资源地址。
如果是动态资源请求,通过反向代理,映射到tomcat路径下的资源。

实现方式:
1) 单独把静态文件放在独立的服务器及独立的域名下,推荐方案;
2) 将动态资源和静态资源混合在一起,通过nginx来分开。

需求:
访问图片等静态资源时,可以直接从nginx中获取
访问jsp等动态资源时,通过tomcat返回结果

处理流程:
1) 准备动态资源,来到/usr/local/tomcat/webapps , 通过rz命令上传本地的index.jsp
2) 准备静态资源,来到/usr/local/nginx/image, 通过rz命令上传本地的test.png

  1. nginx.conf配置
	# 动态资源配置location ~ .*.jsp$ {proxy_pass http://myserver;}# 静态资源配置location ~ .*\.(gif|jpg|png|css)$ {root /usr/local/nginx/image;# 在浏览器端使用缓存  设置过期时间expires 3d;}

4) 浏览器验证,分别访问
http://192.168.1.20/jsp/index.jsp http://192.168.1.20/test.png

10. location块

匹配规则:

1)location = /uri 精确匹配

2)location ^~ /uri 前缀匹配,顺序在正则之前
location /uri 前缀匹配,顺序在正则匹配之后

注意:两种前缀匹配不能同时出现 否则启动会报错

3)location ~ pattern 区分大小写的正则匹配
location ~* pattern 不区分大小写的正则匹配

4)location / 通用匹配,接收未匹配到其他location的请求

匹配顺序:
首先会进行精确匹配,然后会进行前缀匹配,具体顺序按照指令长度,从长到短的顺序依次匹配,但是在正则匹配时,是按照配置文件的顺序依次匹配的,如果不希望前缀匹配后进行正则匹配,那么使用^~

情况一:

# 前缀匹配 前缀匹配,顺序在正则之前
location ^~ /helloworld {return 601;
}

访问 test123.com/helloworld/test
返回601

情况二:

# 前缀匹配,顺序在正则匹配之后
location /helloworld {return 602;
}
# 区分大小写的正则匹配
location ~ /helloworld {return 603;
}

访问 test123.com/helloworld/test
返回603

情况三:

# 前缀匹配,顺序在正则匹配之后
location /helloworld {return 602;
}
# 区分大小写的正则匹配
location ~ /helloworld {return 603;
}
# 区分大小写的正则匹配
location ~ /helloworld/test {return 604;
}

访问 test123.com/helloworld/test/a.html
返回603

情况四:

# 前缀匹配,顺序在正则匹配之后
location /helloworld {return 602;
}
# 区分大小写的正则匹配
location ~ /helloworld/test {return 604;
}
# 区分大小写的正则匹配
location ~ /helloworld {return 603;
}

访问 test123.com/helloworld/test/a.html
返回604

11. URL重写

对url的规范化处理,域名更换时的新旧跳转,一些额外的参数调整等等

server{listen 80;server_name test123.com;rewrite ^/(.*) http://www.test123.com/$1 permanent;
}
# 访问 test123.com   地址栏会变成www.test123.com

相关文章:

Nginx 学习笔记

1. Nginx简介 Nginx 是一个高性能的Http和反向代理服务器。也是一个IMAP/POP3/SMTP等邮件代理服务器。 特点: 占有内存少并发能力强安装非常的简单配置文件非常简洁(还能够支持perl语法)Bug非常少启动特别容易,并且几乎可以做到…...

软甲测试定义和分类

软件测试定义 使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验他是否满足规定的需求或弄清预期结果与实际结果之间的差别 软件测试目的 为了发现程序存在的代码或业务逻辑错误 – 第一优先级发现错误为了检验产品是否符合用户需求 – 跟用户要求实…...

Vue 3+Vite+Eectron从入门到实战系列之(二)一Elementplus及VueRouter的配置

为了后续开发方便,在没有 UI 设计师配合的情况下,让我们的界面更加美观,我们使用 elementplus 组件库,并配置路由。 删除不需要的默认文件夹及文件,src 配置如下 实现效果 安装 elementplus,vue-router npm install element-plus --save npm install vue-router --save在…...

STL-list

1.list 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 3. l…...

2024 7.29~8.4 周报

一、上周工作 2024 7.22~7.28周报-CSDN博客 二、本周计划 修改论文 三、完成情况 3.1 论文修改 3.1.1 摘要 问题:所写问题是一般性的深度网络问题(过拟合),并没有针对FWI的问题(边缘不清晰、深层不清晰、速度慢…...

随身助手271个可用api接口网站php源码(随身助手API)

源码简介: 随身助手API,本次更新了271个可用接口,现在开源给大家使用,无后门无加密,放心使用。 {“标题”:”看图猜成语接口”,”小标题”:”随身助手API”,”地址”:”tianyi/LookIdiom.php”,”状态”:”正常”} {…...

珠江电缆,顺应全球变化,实现高质量出海

在全球经济快速变化的今天,越来越多的企业将目光投向了国际市场。特别是对于线缆行业来说,顺应全球变化、应对机遇与挑战,实现高质量出海已成为长期发展的战略目标之一。珠江电缆作为一家集研发、制造和销售为一体的大型专业电线电缆企业&…...

redis面试(四)持久化

什么是持久化? 由于redis是基于内存操作的轻量型数据库,所以如果发生宕机重启这种事情,存储的数据就会直接丢失,如果在里面存储了没有备份的数据,那么确实会对我们的业务造成一定影响。 所以我们要通过持久化的手段&a…...

构建数据桥梁:Pandas如何简化API到DataFrame的转换

在数据科学的广阔天地中,API如同一把钥匙,为我们打开了通往丰富数据资源的大门。无论是追踪最新的股市动态,还是分析社交媒体趋势,API都能提供我们需要的实时数据。今天,我们将一起探索如何利用Python的pandas库&#…...

echarts制作grafana 面板之折线图

最近有需求需要制作grafana 来实现自己的需求,于是开始研究 实现效果如下 实现代码 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom, dark); var option;function getLast30Days() {let da…...

技术男的审美反击:UI配置化新纪元

之前常常被甲方的领导说,我们全是一群钢铁直男,一点不懂审美,其实我们心里边想的 “您说得对啊!!!!” 这个可能和理工科有关系吧,理工男好像都差不多,所以这次我们就把很…...

73.结构体指针参数传递

目录 一.结构体指针参数传递 二.视频教程 一.结构体指针参数传递 结构体指针也可以作为参数传递&#xff0c;相对于结构体变量参数传递&#xff0c;结构体指针变量作为函数参数传递速度更快&#xff0c;效率更高。 举例&#xff1a; #include <stdio.h> #include <…...

面向对象编程与Scala:掌握核心概念与应用

面向对象编程与Scala&#xff1a;掌握核心概念与应用 1. 引言 Scala 是一种融合了面向对象编程&#xff08;OOP&#xff09;和函数式编程&#xff08;FP&#xff09;特性的编程语言。它为开发者提供了强大的工具来创建高效且灵活的软件。面向对象编程是一种编程范式&#xff…...

《Advanced RAG》-07-探索 RAG 中表格数据的处理方案

摘要 本文详细讨论了实现 Retrieval-Augmented Generation&#xff08;RAG&#xff09;时对表格进行处理的挑战&#xff0c;特别是在非结构化文档中自动准确地提取和理解表格信息。 首先介绍了RAG中管理表格的关键技术&#xff0c;包括表格解析和索引结构设计。 接着&#xff0…...

Dubbo源码深度解析(二)

接着《Dubbo源码深度解析(一)》继续讲&#xff0c;上篇博客主要讲Dubbo提供的三个注解的作用&#xff0c;即&#xff1a;EnableDubbo、DubboComponentScan、EnableDubboConfig。其中后两个注解是在EnableDubbo上的&#xff0c;因此在启动类上加上EnableDubbo注解&#xff0c;等…...

RocketMQ 的高可用性:主从复制与多副本保证

RocketMQ 是一款开源的分布式消息队列系统&#xff0c;广泛应用于大规模分布式应用中。高可用性是 RocketMQ 的核心特性之一&#xff0c;通过主从复制和多副本保证&#xff0c;RocketMQ 能够确保消息的可靠传递和系统的高可用性。 什么是高可用性&#xff1f; 高可用性&#…...

Linux系统驱动(四)自动创建设备节点

自动创建设备节点 &#xff08;一&#xff09;创建设备节点的机制 1. mknod 将驱动编译到内核中&#xff0c;在内核启动时驱动自动被安装执行 2.devfs&#xff08;2.4内核&#xff09; 3. udev&#xff08;2.6内核至今&#xff09; 注&#xff1a;hotplug — 热插拔 &…...

Webpack、Vite区别知多少?

前端的项目打包&#xff0c;我们常用的构建工具有Webpack和Vite&#xff0c;那么Webpack和Vite是两种不同的前端构建工具,那么你们又是否了解它们的区别呢&#xff1f;我们在做项目时要如何选择呢&#xff1f; 一、工具定义 1、Webpack&#xff1a;是一个强大的静态模块打包工…...

《剑指编程之巅:大学新生,以诗心驭代码》

《剑指编程之巅&#xff1a;大学新生&#xff0c;以诗心驭代码》 月华如水&#xff0c;洒落书窗&#xff0c;吾辈学子&#xff0c;正逢盛世&#xff0c;编程之术&#xff0c;已成必修之课。然则&#xff0c;编程语言如繁星点点&#xff0c;学习资源浩瀚如海&#xff0c;新生初…...

【八股文】网络基础

1.简述一下TCP和UDP的区别&#xff1f; 特性TCP&#xff08;Transmission Control Protocol&#xff09;UDP&#xff08;User Datagram Protocol&#xff09;连接类型面向连接&#xff0c;需要建立三次握手连接无连接&#xff0c;发送数据无需建立连接数据传输提供可靠的数据传…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...