百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

[每日一记]Nginx基础

bigegpt 2024-08-07 17:41 2 浏览

nginx特点

处理速度快(异步非阻塞IO,零拷贝,mmap,缓存机制)

扩展性好(模块化设计)

内存性能好(模块化设计)

内存消耗低(异步非阻塞,多阶段处理)

具有很高的可靠性(无数次的生产验证,很多头部公司都在用)

热部署

高并发连接(事件驱动模型,多进程机制)

自由的DSD许可协议(可以自己修改代码后发布,包容性极强)

nginx模块

核心模块

标准HTTP模块

可选HTTP模块

邮件服务模块

第三方模块

nginx常见应用场景

反向代理

负载均衡

缓存

限流

黑/白名单

静态资源服务器

动静分离

防盗链

跨域

高可用

nginx.conf指令块

全局模块

events块

http块

server块

location块

upstream块

location 路由匹配规则(nginx根据用户请求的URI来匹配对应的location模块)

location配置语法:location [修饰符] pattern {…}

常见匹配规则如下:

修饰符 作用

空 无修饰符的前缀匹配,匹配前缀是 你配置的(比如说你配的是 /aaa) 的url

= 精确匹配

~ 正则表达式模式匹配,区分大小写

~* 正则表达式模式匹配,不区分大小写

^~ ^~类型的前缀匹配,类似于无修饰符前缀匹配,不同的是,如果匹配到了,那么就停止后续匹配

/ 通用匹配,任何请求都会匹配到(只要你域名对,所有请求通吃!)

关于location 匹配优先级

=(精确匹配) > ^~(前缀匹配) > 正则 > 无修饰符的前缀匹配 > /(通用匹配)

反向代理

通过upstream指令块来定义我们的上游服务(即被代理的服务)

通过location指令块中的 proxy_pass指令,指定该location要路由到哪个upstream(注意上边的 proxy_pass http://mybackendserver/ 后边这个斜线加的话不会拼接/backend , 而不加的话会拼接 /backend)

负载均衡

负载均衡就是从 upstream 模块定义的后端服务器列表中按照配置的负载策略选取一台服务器接受用户的请求。

nginx常用的负载策略:

负载策略 描述 特点

轮询 默认方式

weight 权重方式

ip_hash 依据ip的hash值来分配

least_conn 最少连接方式

fair(第三方) 响应时间方式

url_hash(第三方) 依据URL分配方式

跨域

产生跨域问题的主要原因就在于同源策略。同源策略主要是指三点相同即:协议+域名+端口 相同的两个请求,则可以被看做是同源的,但如果其中任意一点存在不同,则代表是两个不同源的请求,同源策略会限制不同源之间的资源交互从而减少数据安全问题。

nginx解决跨域

解决跨越就得避免不同源,让前后端统一使用一个端口,一个server_name,server支持多个location配置呀(一个location处理前端,一个location转发后端)

缓存

nginx缓存配置参数

proxy_cache、proxy_cache_valid、proxy_cache_key、proxy_cache_path、proxy_cache_bypass、proxy_cache_min_uses、proxy_cache_use_stale、proxy_cache_lock、proxy_cache_lock_timeout、proxy_cache_methods、...,事实上,ngx_http_proxy_module模块中代理缓存proxy_cache相关的指令远不止这些。

黑白名单

nginx黑白名单比较简单,allow后配置你的白名单,deny后配置你的黑名单。

nginx限流

Nginx主要有两种限流方式:按并发连接数限流(ngx_http_limit_conn_module)、按请求速率限流(ngx_http_limit_req_module 使用的令牌桶算法)

其他一些比较常用的指令与说明

https配置

压缩

rewrite

if

nginx全局变量

auto_index

root&alias(指定静态资源root拼接根路径&alias不拼接)

upstream 中常用的几个指令

重试策略

关于backup

最后,贴出完整nginx.conf文件

user nginx;

worker_processes auto;

error_log /var/log/nginx/error.log notice;

pid /var/run/nginx.pid;

events {

worker_connections 1024;

}

http {

include /etc/nginx/mime.types;

default_type application/octet-stream;

# log_format debug '$remote_addr - $remote_user [$time_local] "$request" '

# '$status $body_bytes_sent "$http_referer" '

# '"$http_user_agent" "$http_x_forwarded_for"';

#

log_format debug ' $remote_user [$time_local] $http_x_Forwarded_for $remote_addr $request '

'$http_x_forwarded_for '

'$upstream_addr '

'ups_resp_time: $upstream_response_time '

'request_time: $request_time';

access_log /var/log/nginx/access.log debug;

sendfile on;

#tcp_nopush on;

keepalive_timeout 65;

upstream mybackendserver {

server 172.30.128.64:8081 fail_timeout=60s max_fails=3; # 60秒内 如果请求某一个应用失败3次,则认为该应用宕机 时间到后再有请求进来继续尝试连接宕机应用且仅尝试 1 次,如果还是失败,则继续等待 60 秒...以此循环,直到恢复

server 172.30.128.64:8082;

server 172.30.128.64:8083 backup; # 设置8083位备机

}

# 开启/关闭 压缩机制

gzip on;

# 根据文件类型选择 是否开启压缩机制

gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/jpg image/gif image/png application/json;

# 设置压缩级别,越高资源消耗越大越耗时,但压缩效果越好

gzip_comp_level 9;

# 设置是否携带Vary:Accept-Encoding 的响应头

gzip_vary on;

# 处理压缩请求的 缓冲区数量和大小

gzip_buffers 32 64k;

# 对于不支持压缩功能的客户端请求 不开启压缩机制

gzip_disable "MSIE [1-6]\."; # 比如低版本的IE浏览器不支持压缩

# 设置压缩功能所支持的HTTP最低版本

gzip_http_version 1.1;

# 设置触发压缩的最小阈值

gzip_min_length 2k;

# off/any/expired/no-cache/no-store/private/no_last_modified/no_etag/auth 根据不同配置对后端服务器的响应结果进行压缩

gzip_proxied any;

# 指定缓存存放目录为/usr/local/nginx/test/nginx_cache_storage,并设置缓存名称为mycache,大小为64m, 1天未被访问过的缓存将自动清除,磁盘中缓存的最大容量为1gb

proxy_cache_path /usr/local/nginx/test/nginx_cache_storage levels=1:2 keys_zone=mycache:64m inactive=1d max_size=1g;

# 对请求速率限流

#limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=5r/s;

# 对请求连接数限流

limit_conn_zone $binary_remote_addr zone=myConnLimit:10m;


# --------------------HTTP 演示 配置---------------------

server {

listen 80 default;

charset utf-8;

server_name www.hzznb-xzll.xyz hzznb-xzll.xyz;

#location /static/ {

# root /usr/local/nginx/test; # /usr/local/nginx/test/static/xxx.jpg

#}

location /static { # 注意一般 alias的 url都不带后边的/

alias /usr/local/nginx/test/; # 使用alias时 这里的目录最后边一定要加/ 否则就404

}

# 测试autoindex效果

location /book/ {

root /usr/local/nginx/test;

autoindex on; # 打开 autoindex,,可选参数有 on | off

autoindex_format html; # 以html的方式进行格式化,可选参数有 html | json | xml

autoindex_exact_size on; # 修改为off,会以KB、MB、GB显示文件大小,默认为on以bytes显示出?件的确切??

autoindex_localtime off; # 显示?件时间 GMT格式

}


# 临时重定向

location /temp_redir {

rewrite ^/(.*) https://www.baidu.com redirect;

}

# 永久重定向

location /forever_redir {


rewrite ^/(.*) https://www.baidu.com permanent;

}

# rewrite last规则测试

location /1 {

rewrite /1/(.*) /2/$1 last;

}

location /2 {

rewrite /2/(.*) /3/$1 last;

}

location /3 {

alias '/usr/local/nginx/test/static/';

index location_last_test.html;

}

}

# --------------------HTTP配置---------------------

server {

listen 80;

charset utf-8;

#server_name www.xxxadminsystem.com;

server_name www.hzznbc-xzll.xyz hzznbc-xzll.xyz;

# 重定向,会显示跳转的地址server_name,如果访问的地址没有匹配会默认使用第一个,即www.likeong.icu

return 301 https://$server_name$request_uri;

# # 指定 username 参数中只要有字母 就不走nginx缓存

# if ($arg_username ~ [a-z]) {

# set $cache_name "no cache";

# }

# # 前端页面资源

# location /page {

# alias '/usr/local/nginx/test/static/';

# index index_page.html;

# allow all;

# }

# # 后端服务

# location /interface {

# proxy_pass http://mybackendserver/;

# # 使用名为 mycache 的缓存空间

# proxy_cache mycache;

# # 对于200 206 状态码的数据缓存2分钟

# proxy_cache_valid 200 206 1m;

# # 定义生成缓存键的规则(请求的url+参数作为缓存key)

# proxy_cache_key $host$uri$is_args$args;

# # 资源至少被重复访问2次后再加入缓存

# proxy_cache_min_uses 3;

# # 出现重复请求时,只让其中一个去后端读数据,其他的从缓存中读取

# proxy_cache_lock on;

# # 上面的锁 超时时间为4s,超过4s未获取数据,其他请求直接去后端

# proxy_cache_lock_timeout 4s;

# # 对于请求参数中有字母的 不走nginx缓存

# proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,没有值则进行缓存

# # 在响应头中添加一个缓存是否命中的状态(便于调试)

# add_header Cache-status $upstream_cache_status;


# limit_conn myConnLimit 12;

# limit_req zone=myRateLimit burst=5 nodelay;

# limit_req_status 520;

# limit_req_log_level info;

#}

}

# --------------------HTTPS 配置---------------------

server {

#SSL 默认访问端口号为 443

listen 443 ssl;

#填写绑定证书的域名

server_name www.hzznb-xzll.xyz hzznb-xzll.xyz;

#请填写证书文件的相对路径或绝对路径

ssl_certificate /usr/local/nginx/certificate/hzznb-xzll.xyz_bundle.crt;

#请填写私钥文件的相对路径或绝对路径

ssl_certificate_key /usr/local/nginx/certificate/hzznb-xzll.xyz.key;

#停止通信时,加密会话的有效期,在该时间段内不需要重新交换密钥

ssl_session_timeout 5m;

#服务器支持的TLS版本

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

#开启由服务器决定采用的密码套件

ssl_prefer_server_ciphers on;


# 指定 username 参数中只要有字母 就不走nginx缓存

if ($arg_username ~ [a-z]) {

set $cache_name "no cache";

}

# 前端页面资源

location /page {

alias '/usr/local/nginx/test/static/';

index index_page.html;

allow all;

}

# 后端服务

location /interface {

proxy_pass http://mybackendserver/;

# 指定哪些错误状态才执行 重试

proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404;

# 使用名为 mycache 的缓存空间

proxy_cache mycache;

# 对于200 206 状态码的数据缓存2分钟

proxy_cache_valid 200 206 1m;

# 定义生成缓存键的规则(请求的url+参数作为缓存key)

proxy_cache_key $host$uri$is_args$args;

# 资源至少被重复访问2次后再加入缓存

proxy_cache_min_uses 3;

# 出现重复请求时,只让其中一个去后端读数据,其他的从缓存中读取

proxy_cache_lock on;

# 上面的锁 超时时间为4s,超过4s未获取数据,其他请求直接去后端

proxy_cache_lock_timeout 4s;

# 对于请求参数中有字母的 不走nginx缓存

proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,没有值则进行缓存

# 在响应头中添加一个缓存是否命中的状态(便于调试)

add_header Cache-status $upstream_cache_status;


limit_conn myConnLimit 12;

# limit_req zone=myRateLimit burst=5 nodelay;

# limit_req_status 520;

# limit_req_log_level info;

}

# 后端服务

location /interface2 {

proxy_pass http://mybackendserver;

# 使用名为 mycache 的缓存空间

proxy_cache mycache;

# 对于200 206 状态码的数据缓存2分钟

proxy_cache_valid 200 206 1m;

# 定义生成缓存键的规则(请求的url+参数作为缓存key)

proxy_cache_key $host$uri$is_args$args;

# 资源至少被重复访问2次后再加入缓存

proxy_cache_min_uses 3;

# 出现重复请求时,只让其中一个去后端读数据,其他的从缓存中读取

proxy_cache_lock on;

# 上面的锁 超时时间为4s,超过4s未获取数据,其他请求直接去后端

proxy_cache_lock_timeout 4s;

# 对于请求参数中有字母的 不走nginx缓存

proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,没有值则进行缓存

# 在响应头中添加一个缓存是否命中的状态(便于调试)

add_header Cache-status $upstream_cache_status;


limit_conn myConnLimit 12;

# limit_req zone=myRateLimit burst=5 nodelay;

# limit_req_status 520;

# limit_req_log_level info;

}

}

# include /etc/nginx/conf.d/*.conf;

}

相关推荐

VS Code上也能玩转Jupyter Notebook,这是一份完整教程

点击上方"码农真经"关注,星标或者置顶22点24分准时推送,第一时间送达来源:公众号机器之心|编辑:真经君码农真经(ID:coder_experience)第115次推文图源:...

看开发一款AR眼镜产品都需要那些东东?

开发AR眼镜应用时,使用的操作系统和编程语言主要取决于目标设备和开发平台。以下是主流AR眼镜的开发系统和语言总结:一、操作系统WindowsHolographic设备:微软HoloLens系列特点:...

ONNX Runtime 黑科技曝光:一行 C++ 代码让 ResNet 起飞,GitHub 已爆星

1.ONNXRuntime简介ONNXRuntime(ORT)是由微软开发的高性能推理引擎,支持跨平台(Windows/Linux/macOS)运行ONNX格式的深度学习模型。其核心优势...

海康工业相机SDK开发介绍

这篇文章,我来介绍一下海康工业相机SDK的使用方法。如果是老手,你可以跳过,如果是新手,可以看看,欢迎拍砖要使用海康的工业相机SDK,要先下载机器视觉工业相机SDKV3.2.0版本Runtime组...

深圳机器视觉相机USB3.0数字相机及千兆网口相机有什么特点?

四元数机器视觉相机的目的是将通过镜头投影到传感器的图像传送到能够储存、分析和(或者)显示的机器设备上。那么深圳机器视觉相机USB3.0数字相机及千兆网口相机有什么特点?相信不少人是有疑问的,今天深圳四...

蚁利智慧工地展厅控制系统:多媒体交互软件及中控系统开发方案

来源:蚁利科技以下是一篇关于隆兰智慧工地安全体验数字展厅多媒体互动软件及中控系统开发技术的技术方案框架,包含核心代码示例和实现思路:---#隆兰智慧工地安全体验数字展厅开发技术方案##一、系统架构...

C#程序员在工控行业到底有没有立足之地

当年忐忑的从互联网卷到工控圈时也一脸懵逼,结果发现咱C#程序员在工控界简直是万金油!今天就用我踩坑几年的经验给你们盘一盘转行路线。一、能撸哪些岗位?上位机开发工程师(工控圈入场券):天天和PLC、传感...

C#一行代码搞定OCR

本文将介绍如何使用C#代码来实现OCR功能。一、在VS中新建一个控制台应用,选择.net框架,.net6.0~8.0均可。创建好的项目如下图,然后在配置管理器中修改活动解决方案平台为x64,以及项目平...

在 C# WinForms 中 OpenCvSharp 进行边缘检测:Laplacian 算子介绍

边缘检测在计算机视觉和图像处理领域中具有非常重要的作用,它是物体识别、特征提取的基础。Laplacian算子是一种经典且常用的边缘检测方法,它对噪声非常敏感,能够很好地检测到图像中的细节和边缘。本文...

C# OpenCV机器视觉:对位贴合

在热闹非凡的手机维修街上,阿强开了一家小小的手机贴膜店。每天看着顾客们自己贴膜贴得歪歪扭扭,不是膜的边缘贴不整齐,就是里面充满了气泡,阿强心里就想:“要是我能有个自动贴膜的神器,那该多好啊,就可以让顾...

C# OpenCV机器视觉:缺陷检测

在一个阳光明媚的早晨,阿强正准备享受他的一杯咖啡,突然接到了老板的电话。“阿强,我们的生产线出现了问题!有几个产品的质量不合格,客户投诉不断!你能不能想办法解决这个问题?”阿强一听,心中一紧,随即灵光...

CHAPTER II 第二章

CHAPTERIICHAPTERII第二章Iresistedalltheway:anewthingforme...

万字图文,将"类加载器"与"双亲委派机制"一网打尽

引子大家想必都有过平时开发springboot项目的时候稍微改动一点代码,就得重启,就很烦网上一般介绍2种方式spring-boot-devtools,或者通过JRebel插件来实现"...

Java:Java中的微服务

  如果你想使用Java中的云原生微服务快速实现大规模可扩展性,那么不需要重新发明轮子。一些创新工具可以帮助你。通过Java培训课程,在Java(软件开发中最常用的编程语言)方面打下坚实的基础,更好地...

"类加载器"与"双亲委派机制"一网打尽

引子大家好,我是呼噜噜,大家想必都有过平时开发springboot项目的时候稍微改动一点代码,就得重启,就很烦网上一般介绍2种方式spring-boot-devtools,或者通过JRebel插件...